Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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:
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.
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:
.NET CLI veya Visual Studio kullanarak yeni bir .NET Konsol Uygulaması oluşturun. Bunu InputTutorial olarak adlandır.
dotnet new console -o InputTutorial cd InputTutorialSystem.Device.Gpio paketini projeye ekleyin. Proje dizininden .NET CLI veya Visual Studio kullanın.
dotnet package add System.Device.Gpio --version 4.0.1Program.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.usingbildirimi, 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.InputPullUpile açılır.- Bu, pini PullUp direnci etkinleştirilmiş halde açar. Bu modda, pin yere bağlandığında
PinValue.Lowdöndürülür. Pinin toprak bağlantısı kesildiğinde ve devre açık olduğunda, pinPinValue.Highgeri döner.
- Bu, pini PullUp direnci etkinleştirilmiş halde açar. Bu modda, pin yere bağlandığında
- İlk durum, bir üçüncül ifade kullanılarak bir konsola yazılır. Pinin geçerli durumu
Read()ile okunur. Eğer buPinValue.Highise,Alertdizesini konsola yazar. Aksi takdirdeReadydizisini yazar. -
RegisterCallbackForPinValueChangedEvent()pin üzerindekiPinEventTypes.RisingvePinEventTypes.Fallingolayları için bir geri çağırma işlevi kaydeder. Bu olaylar sırasıylaPinValue.HighvePinValue.Lowsabitleme durumlarına karşılık gelir. - Geri çağırma işlevi,
OnPinEvent()adlı bir yöntemi işaret eder.OnPinEvent(), karşılık gelenAlertveyaReadydizeleri de yazan başka bir üçüncül ifade kullanır. - Sabit olayları beklerken ana iş parçacığı süresiz olarak uyku moduna alır.
-
Using bildirimi bir
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.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 +xkullanarak 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.
./InputTutorialKonsol 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 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 ✅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 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 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 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!
Kaynak kodu alma
Bu öğreticinin kaynağı GitHub üzerinde mevcuttur.