Używanie funkcji GPIO na potrzeby danych wejściowych binarnych
Wyprowadzenia we/wy ogólnego przeznaczenia (GPIO) można skonfigurować do odbierania sygnałów elektrycznych jako danych wejściowych. Na najbardziej podstawowym poziomie jest to przydatne w scenariuszach, w których wykryto otwarcie/zamknięcie obwodu. Takie obwody mogą obejmować przyciski push, przełączniki, przełączniki, przełączniki reed, przełączniki ciśnienia i inne urządzenia reprezentujące wartości binarne (włączone/wyłączone) przez ukończenie obwodu.
W tym samouczku użyjesz platformy .NET i wyprowadzeń GPIO urządzenia Raspberry Pi do wykrywania otwierania i zamykania obwodu.
Wymagania wstępne
- Komputer z jedną płytą (SBC) oparty na architekturze ARM (ARMv7 lub nowszym)
- Przewody skoczkowe
- Tablica do stron nadrzędnych (opcjonalnie)
- Tablica breakout urządzenia Raspberry Pi GPIO (opcjonalnie)
- Zestaw .NET SDK 7 lub nowszy
Uwaga
Ten samouczek został napisany przy założeniu, że docelowe urządzenie to Raspberry Pi. Jednak ten samouczek może być używany dla dowolnego SBC opartego na systemie Linux, który obsługuje platformę .NET, taką jak Orange Pi, ODROID i nie tylko.
Upewnij się, że protokół SSH jest włączony na urządzeniu. W przypadku urządzenia Raspberry Pi zapoznaj się z artykułem Konfigurowanie serwera SSH w dokumentacji urządzenia Raspberry Pi.
Przygotowywanie sprzętu
Użyj składników sprzętowych do skompilowania obwodu, jak pokazano na poniższym diagramie:
Powyższy obraz przedstawia bezpośrednie połączenie między numerem pin uziemienia i wyprowadzenia 21.
Porada
Diagram przedstawia tablicę do stron nadrzędnych i breakout GPIO w celach ilustracyjnych, ale możesz po prostu podłączyć wyprowadzenie naziemne i pin 21 z przewodem skoczka na urządzeniu Raspberry Pi.
W razie potrzeby zapoznaj się z następującym diagramem wyprowadzania:
Obraz dzięki uprzejmości Raspberry Pi Foundation.
Tworzenie aplikacji
Wykonaj następujące kroki w preferowanym środowisku projektowym:
Utwórz nową aplikację konsolową .NET przy użyciu interfejsu wiersza polecenia platformy .NET lub programu Visual Studio. Nadaj mu nazwę InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Dodaj pakiet System.Device.Gpio do projektu. Użyj interfejsu wiersza polecenia platformy .NET z katalogu projektu lub programu Visual Studio.
dotnet add package System.Device.Gpio --version 2.2.0-*
Zastąp zawartość pliku Program.cs następującym kodem:
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)}"); }
Powyższy kod ma następujące działanie:
- Deklaracja using tworzy wystąpienie klasy
GpioController
. Deklaracjausing
zapewnia, że obiekt zostanie usunięty, a zasoby sprzętowe zostaną prawidłowo zwolnione.-
GpioController
Wystąpienie jest tworzone bez parametrów, co wskazuje, że powinna wykryć, na której platformie sprzętowej jest uruchomiona, i używać schematu numeracji numeru PIN logicznego.
-
- Wyprowadzka GPIO 21 jest otwarta za pomocą
PinMode.InputPullUp
polecenia .- Spowoduje to otwarcie pinezki z włączonym rezystorem PullUp . W tym trybie, gdy wyprowadzenie jest połączone z ziemią, zwróci wartość
PinValue.Low
. Gdy wyprowadzenie jest odłączone od podstawy i obwód jest otwarty, wyprowadzenie zwraca wartośćPinValue.High
.
- Spowoduje to otwarcie pinezki z włączonym rezystorem PullUp . W tym trybie, gdy wyprowadzenie jest połączone z ziemią, zwróci wartość
- Początkowy stan jest zapisywany w konsoli przy użyciu wyrażeniaternary. Bieżący stan pinezki jest odczytywany za pomocą polecenia
Read()
. Jeśli jestPinValue.High
to , zapisujeAlert
ciąg w konsoli. W przeciwnym razie zapisujeReady
ciąg. -
RegisterCallbackForPinValueChangedEvent()
rejestruje funkcję wywołania zwrotnego zarówno dla zdarzeń, jakPinEventTypes.Rising
iPinEventTypes.Falling
w numerze PIN. Te zdarzenia odpowiadają odpowiednio stanomPinValue.High
pinezki iPinValue.Low
. - Funkcja wywołania zwrotnego wskazuje metodę o nazwie
OnPinEvent()
.OnPinEvent()
używa innego wyrażeniaternary, które również zapisuje odpowiadające imAlert
ciągi lubReady
. - Główny wątek jest w trybie nieokreślony, czekając na przypinanie zdarzeń.
- Deklaracja using tworzy wystąpienie klasy
Kompilowanie aplikacji. Jeśli używasz interfejsu wiersza polecenia platformy .NET, uruchom polecenie
dotnet build
. Aby skompilować w programie Visual Studio, naciśnij klawisze Ctrl+Shift+B.Wdróż aplikację w SBC jako samodzielną aplikację. Aby uzyskać instrukcje, zobacz Wdrażanie aplikacji .NET na urządzeniach Raspberry Pi. Upewnij się, że nadaj plikowi wykonywalne uprawnienie do wykonywania przy użyciu polecenia
chmod +x
.Uruchom aplikację na urządzeniu Raspberry Pi, przełączając się do katalogu wdrożenia i uruchamiając plik wykonywalny.
./InputTutorial
Konsola wyświetla tekst podobny do następującego:
Initial status (05/10/2022 15:59:25): READY ✅
Odłącz wyprowadzenie 21 od podstaw. Konsola wyświetla tekst podobny do następującego:
(05/10/2022 15:59:59) ALERT 🚨
Połącz ponownie numer PIN 21 i uziemienie. Konsola wyświetla tekst podobny do następującego:
(05/10/2022 16:00:25) READY ✅
Zakończ program, naciskając klawisze Ctrl+C.
Gratulacje! Użyto interfejsu GPIO do wykrywania danych wejściowych System.Device.Gpio
przy użyciu pakietu NuGet. Istnieje wiele zastosowań dla tego typu danych wejściowych. W tym przykładzie można użyć dowolnego scenariusza, w którym przełącznik łączy się lub przerywa obwód. Oto przykład użycia go z przełącznikiem magnetycznym, który jest często używany do wykrywania otwartych drzwi lub okien.
Laser tripwire
Rozszerzenie poprzedniej koncepcji przykładowej nieco dalej, przyjrzyjmy się temu, jak można to zastosować do tworzenia lasera tripwire. Zbudowanie lasera tripwire wymaga następujących dodatkowych składników:
- Moduł nadajnika laserowego KY-008
- Moduł czujnika odbiornika laserowego (patrz uwaga poniżej)
- 2 10K Ω rezystory
Uwaga
Moduł czujnika odbiornika laserowego to ogólna nazwa stosowana do wspólnego modułu znalezionego w wielu sklepach internetowych. Urządzenie może się różnić w nazwie lub producencie, ale powinno przypominać ten obraz.
Podłączanie sprzętu laserowego tripwire
Połącz składniki zgodnie z opisem na poniższym diagramie.
Zwróć szczególną uwagę na rezystory 10K Ω. Implementują one rozdzielacz napięcia. Wynika to z tego, że moduł odbiornika laserowego wyprowadza 5V, aby wskazać, że belka jest uszkodzona. Urządzenie Raspberry Pi obsługuje tylko do 3,3V dla wejścia GPIO. Ponieważ wysłanie pełnego 5V do wyprowadzenia może uszkodzić urządzenie Raspberry Pi, prąd z modułu odbiornika jest przekazywany przez rozdzielacz napięcia, aby zmniejszyć napięcie do 2,5V.
Stosowanie aktualizacji kodu źródłowego
Możesz prawie użyć tego samego kodu co wcześniej, z jednym wyjątkiem. W innych przykładach użyliśmy PinMode.InputPullUp
metody , aby po odłączeniu wyprowadzenia od podstawy i otwarciu obwodu wyprowadzenie zwraca wartość PinValue.High
.
Jednak w przypadku modułu odbiornika laserowego nie wykrywamy otwartego obwodu. Zamiast tego chcemy, aby pin działał jako ujście prądu pochodzącego z modułu odbiornika laserowego. W takim przypadku otworzymy pinezkę za pomocą PinMode.InputPullDown
polecenia . W ten sposób wyprowadzenie zwraca PinValue.Low
wartość, gdy nie otrzymuje prądu, a PinValue.High
kiedy odbiera prąd z modułu odbiornika laserowego.
controller.OpenPin(pin, PinMode.InputPullDown);
Ważne
Przed rozpoczęciem testowania lasera tripwire upewnij się, że kod wdrożony na urządzeniu Raspberry Pi zawiera tę zmianę. Program działa bez niego, ale korzystanie z niewłaściwego trybu wprowadzania może spowodować uszkodzenie urządzenia Raspberry Pi!
Uzyskiwanie kodu źródłowego
Źródło tego samouczka jest dostępne w usłudze GitHub.