İ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:
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:
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:
.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
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-*
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
GpioController
oluş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.InputPullUp
açı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ürPinValue.High
.
- Bu işlem raptiyeyi Çekme direnciyle açar. Bu modda, raptiye yere bağlandığında döndürür
- İlk durum, üçüncül ifade kullanılarak bir konsola yazılır. Raptiyenin geçerli durumu ile
Read()
okunur. isePinValue.High
, dizeyiAlert
konsola yazar. Aksi takdirde dizesiniReady
yazar. -
RegisterCallbackForPinValueChangedEvent()
pin üzerindeki vePinEventTypes.Rising
PinEventTypes.Falling
olayları için bir geri çağırma işlevi kaydeder. Bu olaylar sırasıyla vePinValue.Low
sabitleme durumlarınaPinValue.High
karşılık gelir. - Geri çağırma işlevi adlı
OnPinEvent()
bir yöntemi gösterir.OnPinEvent()
, karşılık gelenAlert
veyaReady
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.
-
Using bildirimi, örneğini
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.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 +x
yürütülebilir yürütme izni verdiğinizden emin olun.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 ✅
Pin 21'i yerden çıkarın. Konsol aşağıdakine benzer bir metin görüntüler:
(05/10/2022 15:59:59) ALERT 🚨
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 ✅
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.
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 tripwire donanımlarını bağlama
Aşağıdaki diyagramda ayrıntılı olarak açıklandığı gibi bileşenleri bağlayın.
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.High
iç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.InputPullDown
aç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!
Kaynak kodunu alma
Bu öğreticinin kaynağı GitHub'da kullanılabilir.