Aracılığıyla paylaş


İkili giriş için GPIO kullanma

Genel amaçlı G/Ç (GPIO) pinleri giriş olarak elektrik sinyallerini 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 kullanışlıdır. Bu tür devreler, bir bağlantı hattını tamamlayarak ikili (açık/kapalı) değerleri temsil eden basma düğmeleri, geçiş anahtarları, reed anahtarları, basınç anahtarları ve diğer cihazları içerebilir.

Bu öğreticide bir bağlantı hattının açılmasını ve 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
  • Devre tahtası (isteğe bağlı)
  • Raspberry Pi GPIO tartışma panosu (isteğe bağlı)
  • .NET SDK 8 veya üzeri

Uyarı

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:

Topraklama pinini pin 21'e bağlayan devreyi gösteren bir diyagram.

Yukarıdaki görüntüde toprak pini ile 21 numaralı pin arasındaki doğrudan bağlantı gösterilmektedir.

Tavsiye

Diyagramda, açıklayıcı amaçlarla bir breadboard ve GPIO çıkışı gösterilmiştir, ancak Raspberry Pi'de bir toprak pini ve pin 21'i jumper kablosuyla bağlamaktan çekinmeyin.

Gerektiğinde aşağıdaki bağlantı noktası diyagramına bakın.

Raspberry Pi GPIO başlığının pin yapısını gösteren bir diyagram. Görüntü, Raspberry Pi Foundation'un izniyle sağlanmıştır.
Görüntü, Raspberry Pi Foundation'ın izniyle.

Uygulamayı 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. Bunu InputTutorial olarak adlandır.

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

    dotnet add package System.Device.Gpio --version 3.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)}");
    }
    

    Önceki kodda:

    • Using bildirimi bir GpioController örneği oluşturur. using bildirimi, nesnenin atılmasını ve donanım kaynaklarının doğru şekilde serbest bırakılmasını sağlar.
      • GpioController , üzerinde çalıştığı donanım platformunu 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 PinMode.InputPullUp ile açılır.
      • Bu, pini PullUp direnci devrede iken açar. Bu modda, pin yere bağlandığında PinValue.Low geri döner. Raptiye toprak bağlantısından çıkarıldığında ve devre açık olduğunda, pin geri döner PinValue.High.
    • İlk durum, bir üçüncül ifade kullanılarak bir konsola yazılır. Pinin geçerli durumu Read() ile okunur. Eğer PinValue.High ise, Alert dizgesini konsola yazar. Aksi takdirde Ready dizesini yazar.
    • RegisterCallbackForPinValueChangedEvent() pini üzerinde PinEventTypes.Rising ve PinEventTypes.Falling olayları için bir geri çağırma işlevi kaydeder. Bu olaylar sırasıyla PinValue.High ve PinValue.Low pin durumlarına karşılık gelir.
    • Geri çağırma fonksiyonu OnPinEvent() adlı bir yöntemi gösterir. OnPinEvent() , karşılık gelen Alert veya Ready dizeleri de yazan başka bir üçüncül ifade kullanır.
    • Sabit olayları beklerken ana iş parçacığı süresiz olarak uyku moduna alır.
  4. Uygulamayı oluşturun. .NET CLI kullanıyorsanız komutunu çalıştırın dotnet build. Visual Studio'da derlemek için Ctrl+ ShiftB+ 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 yürütülebilir dosyaya chmod +x 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 toprak hattını 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 bir GIF. Anahtar bir mıknatısla karşılaştırıldığında uygulama HAZIR'ı gösterir. Mıknatıs kaldırılınca uygulama UYARI'yı gösterir. Bu işlem daha sonra tekrar edilir.

Lazer tuzak teli

Ö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

Uyarı

Lazer alıcı algılayıcı modülü , birçok internet perakendecisinde bulunan yaygın bir modüle uygulanan genel addır. Cihaz ad veya üretici olarak farklılık gösterebilir, 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 ayırıcı uygular. Bunun nedeni lazer alıcı modülünün ışının bozuk olduğunu belirtmek için 5V çıkışını veriyor olmasıdır. Raspberry Pi, GPIO girişi için yalnızca 3,3V'ye kadar destekler. Pine tam 5V gönderilmesi 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, pinin toprakla bağlantısı kesildiğinde ve devre açık olduğunda pinin PinValue.High döndürmesi için PinMode.InputPullUp kullandık.

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 pini PinMode.InputPullDown ile açacağız. Bu şekilde pin, hiç akım almadığında PinValue.Low geri döner ve lazer alıcı modülünden akım aldığında PinValue.High geri döner.

controller.OpenPin(pin, PinMode.InputPullDown);

Önemli

Raspberry Pi'nizde dağıtılan kodun lazer tripwire 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üler. Eylem daha sonra tekrarlanır.

Kaynak kodu alma

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

Sonraki adımlar