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 .NET ve Raspberry Pi'nizin GPIO pinlerini kullanarak bir bağlantı hattının açılmasını ve kapatılmasını algılayacaksı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 10 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 destekleyen tüm 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:

Toprak pinini pin 21'e bağlayan devreyi gösteren bir şema.

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ığı pin yerleşimini gösteren diyagram. Görüntü, Raspberry Pi Foundation'ın izniyle.
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 .NET CLI veya Visual Studio kullanın.

    dotnet package add System.Device.Gpio --version 4.0.1
    
  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 düzgün ş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 etkinleştirilmiş halde açar. Bu modda, pin yere bağlandığında PinValue.Low döndürülür. Pinin toprak bağlantısı kesildiğinde ve devre açık olduğunda, pin PinValue.High geri döner.
    • İlk durum, bir üçüncül ifade kullanılarak bir konsola yazılır. Pinin geçerli durumu Read() ile okunur. Eğer bu PinValue.High ise, Alert dizesini konsola yazar. Aksi takdirde Ready dizisini yazar.
    • RegisterCallbackForPinValueChangedEvent() pin üzerindeki 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 sabitleme durumlarına karşılık gelir.
    • Geri çağırma işlevi, OnPinEvent() adlı bir yöntemi işaret eder. 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 dotnet build çalıştırın. Visual Studio oluşturmak için Ctrl+Shift+B tuş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. chmod +x kullanarak yü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 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 GIF. Anahtar bir mıknatısa maruz kaldığında uygulama HAZIR olarak görüntülenir. Mıknatıs kaldırıldığında uygulama UYARI'yı görüntüler. Bu işlem daha sonra tekrarlanır.

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, pin topraktan ayrıldığında ve devre açık olduğunda, pinin PinMode.InputPullUp döndürmesi için PinValue.High şekilde 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 PinMode.InputPullDown ile pini açacağız. Bu şekilde, pin akım almadığında PinValue.Low 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 üzerinde mevcuttur.

Sonraki adımlar