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 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:
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 InputTutorial
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-*
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önerPinValue.High
.
- Bu, pini PullUp direnci devrede iken 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ğerPinValue.High
ise,Alert
dizgesini konsola yazar. Aksi takdirdeReady
dizesini yazar. -
RegisterCallbackForPinValueChangedEvent()
pini üzerindePinEventTypes.Rising
vePinEventTypes.Falling
olayları için bir geri çağırma işlevi kaydeder. Bu olaylar sırasıylaPinValue.High
vePinValue.Low
pin durumlarına karşılık gelir. - Geri çağırma fonksiyonu
OnPinEvent()
adlı bir yöntemi gösterir.OnPinEvent()
, karşılık gelenAlert
veyaReady
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.
-
Using bildirimi bir
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.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.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 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, 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!
Kaynak kodu alma
Bu öğreticinin kaynağı GitHub'da kullanılabilir.