İkili giriş için GPIO kullanma

Genel amaçlı G/Ç (GPIO) pinleri, elektrik sinyallerini giriş olarak alacak şekilde yapılandırılabilir. En temel düzeyde bu, bir bağlantı hattının açılmasını/kapatılmasını algılayan senaryolar için yararlıdır. Bu tür devreler, bir bağlantı hattını tamamlayarak ikili (açık/kapalı) değerleri temsil eden basmalı düğmeler, geçiş anahtarları, reed anahtarları, basınç anahtarları ve diğer cihazları içerebilir.

Bu öğreticide bir bağlantı hattının açılıp kapatılmasını algılamak için .NET ve Raspberry Pi'nizin GPIO pinlerini kullanacaksınız.

Önkoşullar

  • ARM tabanlı (ARMv7 veya üzeri) tek kartlı bilgisayar (SBC)
  • Jumper telleri
  • Breadboard (isteğe bağlı)
  • Raspberry Pi GPIO tartışma panosu (isteğe bağlı)
  • .NET SDK 7 veya üzeri

Not

Bu öğretici, hedef cihazın Raspberry Pi olduğu varsayılarak yazılmıştır. Ancak bu öğretici Orange Pi, ODROID ve daha fazlası gibi .NET'i destekleyen linux tabanlı SBC'ler için kullanılabilir.

Cihazınızda SSH'nin etkinleştirildiğinden emin olun. Raspberry Pi için Raspberry Pi belgelerinde SSH Sunucusu Ayarlama bölümüne bakın.

Donanımı hazırlama

Aşağıdaki diyagramda gösterildiği gibi bağlantı hattını oluşturmak için donanım bileşenlerini kullanın:

Yer raptiyesini 21'e bağlayan bağlantı hattını gösteren diyagram.

Yukarıdaki görüntüde yer raptiyesi ile pin 21 arasındaki doğrudan bağlantı yer almaktadır.

İpucu

Diyagramda görsel amaçlarla bir breadboard ve GPIO tartışması gösterilmiştir, ancak Raspberry Pi'ye bir zemin raptiyesi bağlayıp 21'i jumper kablosuyla sabitlemek için çekinmeyin.

Gerektiğinde aşağıdaki sabitleme diyagramına bakın:

Raspberry Pi GPIO üst bilgisinin sabitlemesini gösteren diyagram. Görüntü, Raspberry Pi Foundation'ın izniyle.
Görüntü, Raspberry Pi Foundation'ın izniyle.

Uygulama oluşturma

Tercih ettiğiniz geliştirme ortamında aşağıdaki adımları tamamlayın:

  1. .NET CLI veya Visual Studio kullanarak yeni bir .NET Konsol Uygulaması oluşturun. Buna InputTutorial adını verin.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Projeye System.Device.Gpio paketini ekleyin. Proje dizininden veya Visual Studio'dan.NET CLI kullanın.

    dotnet add package System.Device.Gpio --version 2.2.0-*
    
  3. Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:

    using System.Device.Gpio;
    using System.Threading.Tasks;
    
    const int Pin = 21;
    const string Alert = "ALERT 🚨";
    const string Ready = "READY ✅";
    
    using var controller = new GpioController();
    controller.OpenPin(Pin, PinMode.InputPullUp);
    
    Console.WriteLine(
        $"Initial status ({DateTime.Now}): {(controller.Read(Pin) == PinValue.High ? Alert : Ready)}");
    
    controller.RegisterCallbackForPinValueChangedEvent(
        Pin,
        PinEventTypes.Falling | PinEventTypes.Rising,
        OnPinEvent);
    
    await Task.Delay(Timeout.Infinite);
    
    static void OnPinEvent(object sender, PinValueChangedEventArgs args)
    {     
        Console.WriteLine(
            $"({DateTime.Now}) {(args.ChangeType is PinEventTypes.Rising ? Alert : Ready)}");
    }
    

    Yukarıdaki kodda:

    • Using bildirimi, örneğini GpioControlleroluşturur. Bildirimi, using nesnenin atılmasını ve donanım kaynaklarının düzgün bir şekilde serbest bırakılmasını sağlar.
      • GpioController , hangi donanım platformunda çalıştığını algılaması ve mantıksal pin numaralandırma düzenini kullanması gerektiğini belirten hiçbir parametre olmadan örneği oluşturulur.
    • GPIO pin 21 ile PinMode.InputPullUpaçılır.
      • Bu işlem raptiyeyi Çekme direnciyle açar. Bu modda, raptiye yere bağlandığında döndürür PinValue.Low. Raptiyenin yerden bağlantısı kesildiğinde ve bağlantı hattı açık olduğunda, pin döndürür PinValue.High.
    • İlk durum, üçüncül ifade kullanılarak bir konsola yazılır. Raptiyenin geçerli durumu ile Read()okunur. ise PinValue.High, dizeyi Alert konsola yazar. Aksi takdirde dizesini Ready yazar.
    • RegisterCallbackForPinValueChangedEvent() pin üzerindeki ve PinEventTypes.RisingPinEventTypes.Falling olayları için bir geri çağırma işlevi kaydeder. Bu olaylar sırasıyla ve PinValue.Lowsabitleme durumlarına PinValue.High karşılık gelir.
    • Geri çağırma işlevi adlı OnPinEvent()bir yöntemi gösterir. OnPinEvent() , karşılık gelen Alert veya Ready dizelerini de yazan başka bir üçüncül ifade kullanır.
    • Ana iş parçacığı, sabitleme olaylarını beklerken süresiz olarak uyku moduna girer.
  4. Uygulamayı oluşturun. .NET CLI kullanıyorsanız komutunu çalıştırın dotnet build. Visual Studio'da derlemek için Ctrl+ ShiftBtuşlarına+ basın.

  5. Uygulamayı SBC'ye bağımsız bir uygulama olarak dağıtın. Yönergeler için bkz. Raspberry Pi'ye .NET uygulamaları dağıtma. kullanarak chmod +xyürütülebilir yürütme izni verdiğinizden emin olun.

  6. Raspberry Pi'de uygulamayı çalıştırmak için dağıtım dizinine geçin ve yürütülebilir dosyayı çalıştırın.

    ./InputTutorial
    

    Konsol aşağıdakine benzer bir metin görüntüler:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Pin 21'i yerden çıkarın. Konsol aşağıdakine benzer bir metin görüntüler:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Pin 21'i ve zemini yeniden bağlayın. Konsol aşağıdakine benzer bir metin görüntüler:

    (05/10/2022 16:00:25) READY ✅
    
  9. Ctrl+C tuşlarına basarak programı sonlandırın.

Tebrikler! NuGet paketini kullanarak System.Device.Gpio girişi algılamak için GPIO kullandınız! Bu tür girişler için birçok kullanım vardır. Bu örnek, bir anahtarın bağlantı hattına bağlandığı veya devreyi kırdığı herhangi bir senaryoyla kullanılabilir. Burada, genellikle açık kapıları veya pencereleri algılamak için kullanılan manyetik reed anahtarıyla kullanılan bir örnek verilmiştir.

Manyetik reed anahtarının açılıp kapanmasını gösteren animasyonlu GIF. Anahtar bir mıknatısa maruz kalıyor ve uygulama HAZIR olarak görüntüleniyor. Mıknatıs kaldırılır ve uygulama UYARI görüntüler. Eylem daha sonra yinelenir.

Lazer tripwire

Önceki örnek kavramı biraz daha genişleterek bunun lazer tripwire oluşturmak için nasıl uygulanabileceğine göz atalım. Lazer tripwire oluşturmak için aşağıdaki ek bileşenler gerekir:

  • KY-008 lazer verici modülü
  • Lazer alıcı algılayıcı modülü (aşağıdaki nota bakın)
  • 2 10K Ω dirençler

Not

Lazer alıcı algılayıcı modülü , birçok internet perakendecisinde bulunan ortak bir modüle uygulanan genel addır. Cihaz ad veya üretici olarak değişebilir, ancak bu görüntüye benzemelidir.

Lazer Alıcı Algılayıcı Modülü görüntüsü

Lazer tripwire donanımlarını bağlama

Aşağıdaki diyagramda ayrıntılı olarak açıklandığı gibi bileşenleri bağlayın.

Lazer alıcı algılayıcı modülünden giriş alan devreyi gösteren diyagram.

10.000 Ω dirençlere çok dikkat edin. Bunlar bir voltaj bölücü uygular. Bunun nedeni lazer alıcı modülünün ışının kırıldığını göstermek için 5V çıkışını vermeleridir. Raspberry Pi, GPIO girişi için yalnızca 3,3V'ye kadar destekler. Pine tam 5V göndermek Raspberry Pi'ye zarar verebileceğinden, alıcı modülünden gelen akım, voltajı 2,5V'ye yarıya indirecek bir voltaj bölücüden geçirilir.

Kaynak kodu güncelleştirmelerini uygulama

Bir özel durum dışında , neredeyse öncekiyle aynı kodu kullanabilirsiniz. Diğer örneklerde, raptiyenin yerden bağlantısı kesildiğinde ve bağlantı hattı açık olduğunda pin döndürülmesi PinValue.Highiçin kullandıkPinMode.InputPullUp.

Ancak lazer alıcı modülü söz konusu olduğunda açık devre algılamuyoruz. Bunun yerine, pinin lazer alıcı modülünden gelen akım için bir havuz gibi davranmasını istiyoruz. Bu durumda raptiyeyi ile PinMode.InputPullDownaçacağız. Bu şekilde pin, hiç akım almadığında ve PinValue.High lazer alıcı modülünden akım aldığında geri dönerPinValue.Low.

controller.OpenPin(pin, PinMode.InputPullDown);

Önemli

Raspberry Pi'nizde dağıtılan kodun lazer tripwire'ını test etmeden önce bu değişikliği içerdiğinden emin olun. Program onsuz çalışır, ancak yanlış giriş modunu kullanmak Raspberry Pi'nize zarar verme riski taşır!

Lazer tripwire'ın gösterimini gösteren animasyonlu GIF. Lazer yayıcı lazer algılayıcı modülünü aydınlatıyor ve uygulama HAZIR olarak görüntülüyor. Lazer ışını bozuk ve uygulama UYARI'yı görüntülüyor. Eylem daha sonra yinelenir.

Kaynak kodunu alma

Bu öğreticinin kaynağı GitHub'da kullanılabilir.

Sonraki adımlar