Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Piny wejścia/wyjścia ogólnego przeznaczenia (GPIO) mogą być skonfigurowane do odbierania sygnałów elektrycznych jako wejście. Na najbardziej podstawowym poziomie jest to przydatne do scenariuszy wykrywających otwieranie/zamykanie obwodu. Takie obwody mogą zawierać przyciski, przełączniki dźwigniowe, przełączniki kontaktronowe, wyłączniki ciśnieniowe i inne urządzenia, które reprezentują wartości binarne (włącz/wyłącz) poprzez zamknięcie obwodu.
W tym samouczku użyjesz platformy .NET oraz pinów GPIO na Raspberry Pi, aby wykrywać otwieranie i zamykanie obwodu.
Wymagania wstępne
- Komputer z jedną płytą (ARMv7 lub nowszy) oparty na architekturze ARM (SBC)
- Przewody skoczkowe
- Breadboard (optional)
- Raspberry Pi GPIO breakout board (optional)
- .NET SDK 8 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 systemu Linux opartego na protokole SBC, który obsługuje platformę .NET, taką jak Orange Pi, ODROID i nie tylko.
Upewnij się, że SSH jest włączone na Twoim urządzeniu. Dla Raspberry Pi, zobacz Konfigurację serwera SSH w dokumentacji Raspberry Pi.
Przygotowywanie sprzętu
Użyj składników sprzętowych do skompilowania obwodu, jak pokazano na poniższym diagramie:
Obrazek powyżej przedstawia bezpośrednie połączenie między pinem uziemienia a pinem 21.
Tip
Schemat przedstawia płytkę stykową i wyprowadzenie GPIO w celach ilustracyjnych, ale nie krępuj się po prostu podłączyć przewodem zworkowym na Raspberry Pi pin uziemienia i pin 21.
Refer to the following pinout diagram as needed:
Obraz dzięki uprzejmości Raspberry Pi Foundation.
Tworzenie aplikacji
Wykonaj następujące kroki w preferowanym środowisku projektowym:
Utwórz nową aplikację konsolową platformy .NET przy użyciu interfejsu wiersza polecenia platformy .NET lub programu Visual Studio. Name it InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Dodaj pakiet System.Device.Gpio do projektu. Użyj .NET CLI z katalogu projektu lub programu Visual Studio.
dotnet add package System.Device.Gpio --version 3.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)}"); }
W poprzednim kodzie:
- Deklaracja użycia tworzy instancję
GpioController
. Deklaracjausing
gwarantuje, że obiekt zostanie usunięty, a zasoby sprzętowe zostaną prawidłowo zwolnione.-
GpioController
jest inicjalizowany bez parametrów, co oznacza, że powinien wykryć, na jakiej platformie sprzętowej działa, i używać logicznego schematu numeracji pinów.
-
- Pin GPIO 21 jest otwierany za pomocą
PinMode.InputPullUp
.- To otwiera pin z włączonym rezystorem PullUp. W tym trybie, gdy pin jest podłączony do masy, zwróci
PinValue.Low
. Kiedy pin jest odłączony od masy i obwód jest otwarty, pin zwracaPinValue.High
.
- To otwiera pin z włączonym rezystorem PullUp. W tym trybie, gdy pin jest podłączony do masy, zwróci
- Początkowy status jest zapisany do konsoli przy użyciu wyrażenia trójkowego. Aktualny stan pinu jest odczytywany za pomocą
Read()
. Jeśli to jestPinValue.High
, wpisuje łańcuchAlert
na konsolę. W przeciwnym razie zapisuje ciągReady
. -
RegisterCallbackForPinValueChangedEvent()
rejestruje funkcję zwrotną dla obu zdarzeńPinEventTypes.Rising
iPinEventTypes.Falling
na pinie. Te zdarzenia odpowiadają stanom pinówPinValue.High
iPinValue.Low
, odpowiednio. - Funkcja zwrotna wskazuje na metodę o nazwie
OnPinEvent()
.OnPinEvent()
używa innego wyrażenia trójkowego, które również zapisuje odpowiednie ciągiAlert
lubReady
. - Główny wątek śpi bez końca, czekając na zdarzenia przypięcia.
- Deklaracja użycia tworzy instancję
Kompilowanie aplikacji. Jeśli używasz interfejsu wiersza polecenia platformy .NET, uruchom polecenie
dotnet build
. Aby skompilować w programie Visual Studio, naciśnij 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 nadajesz plikowi wykonywalnemu uprawnienia do wykonywania używając
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 poniższego.
Initial status (05/10/2022 15:59:25): READY ✅
Odłącz pin 21 od masy. Konsola wyświetla tekst podobny do następującego:
(05/10/2022 15:59:59) ALERT 🚨
Ponownie podłącz pin 21 i uziemienie. Konsola wyświetla tekst podobny do poniższego:
(05/10/2022 16:00:25) READY ✅
Zakończ program, naciskając Ctrl+C.
Gratulacje! Użyłeś GPIO do wykrywania wejścia przy użyciu pakietu NuGet System.Device.Gpio
! Istnieje wiele zastosowań dla tego rodzaju danych wejściowych. Ten przykład można użyć w dowolnym scenariuszu, w którym przełącznik łączy lub przerywa obwód. Oto przykład użycia go z kontaktronem magnetycznym, który często jest używany do wykrywania otwartych drzwi lub okien.
Laserowy przełącznik
Rozszerzając nieco koncepcję z poprzedniego przykładu, przyjrzyjmy się, jak można ją zastosować do stworzenia laserowej zapory. Aby zbudować laserowy czujnik ruchu, potrzebne są następujące dodatkowe komponenty:
- Moduł nadajnika laserowego KY-008
- Laser receiver sensor module (see note below)
- 2 10K Ω resistors
Uwaga
Moduł czujnika odbiornika laserowego to ogólna nazwa stosowana do powszechnie dostępnego modułu, który można znaleźć u wielu sprzedawców internetowych. Urządzenie może się różnić nazwą lub producentem, ale powinno przypominać ten obraz.
Podłącz sprzęt laserowej pułapki
Połącz komponenty zgodnie ze szczegółami przedstawionymi na poniższym diagramie.
Zwróć szczególną uwagę na rezystory 10K Ω. Te elementy implementują dzielnik napięcia. Wynika to z faktu, że moduł odbiornika laserowego wypuszcza 5V, aby wskazać, że wiązka została przerwana. Raspberry Pi obsługuje maksymalnie 3.3V dla wejściowego portu GPIO. Ponieważ przesłanie pełnych 5V do pinu mogłoby uszkodzić Raspberry Pi, prąd z modułu odbiorczego jest przepuszczany przez dzielnik napięcia, aby zmniejszyć napięcie do 2,5V.
Zastosuj aktualizacje 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
, aby gdy pin jest odłączony od masy i obwód jest otwarty, pin powraca PinValue.High
.
Jednakże w przypadku modułu odbiornika laserowego, nie wykrywamy obwodu otwartego. Instead, we want the pin to act as a sink for current coming from the laser receiver module. W tym przypadku otworzymy pin za pomocą PinMode.InputPullDown
. This way, the pin returns PinValue.Low
when it's getting no current, and PinValue.High
when it receives current from the laser receiver module.
controller.OpenPin(pin, PinMode.InputPullDown);
Ważne
Make sure the code deployed on your Raspberry Pi includes this change before testing a laser tripwire. Program rzeczywiście działa bez tego, ale używanie niewłaściwego trybu wejściowego grozi uszkodzeniem Raspberry Pi!
Pobieranie kodu źródłowego
Źródło tego samouczka jest dostępne w witrynie GitHub.