Udostępnij za pośrednictwem


Użyj GPIO do wejścia binarnego

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:

Diagram pokazujący obwód, który łączy pin uziemienia z pinem 21.

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:

A diagram showing the pinout of the Raspberry Pi GPIO header. Image courtesy Raspberry Pi Foundation.
Obraz dzięki uprzejmości Raspberry Pi Foundation.

Tworzenie aplikacji

Wykonaj następujące kroki w preferowanym środowisku projektowym:

  1. 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
    
  2. 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-*
    
  3. 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. Deklaracja using gwarantuje, że obiekt zostanie usunięty, a zasoby sprzętowe zostaną prawidłowo zwolnione.
    • 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 zwraca PinValue.High.
    • 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 jest PinValue.High, wpisuje łańcuch Alert na konsolę. W przeciwnym razie zapisuje ciąg Ready.
    • RegisterCallbackForPinValueChangedEvent() rejestruje funkcję zwrotną dla obu zdarzeń PinEventTypes.Rising i PinEventTypes.Falling na pinie. Te zdarzenia odpowiadają stanom pinów PinValue.High i PinValue.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ągi Alert lub Ready.
    • Główny wątek śpi bez końca, czekając na zdarzenia przypięcia.
  4. 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.

  5. 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.

  6. 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 ✅
    
  7. Odłącz pin 21 od masy. Konsola wyświetla tekst podobny do następującego:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Ponownie podłącz pin 21 i uziemienie. Konsola wyświetla tekst podobny do poniższego:

    (05/10/2022 16:00:25) READY ✅
    
  9. 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.

Animowany GIF pokazujący otwieranie i zamykanie magnetycznego przełącznika kontaktronowego. Przełącznik jest wystawiony na działanie magnesu, a aplikacja wyświetla GOTOWE. Magnes zostaje usunięty, a aplikacja wyświetla ALARM. Następnie akcja jest powtarzana.

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.

Image of a Laser Receiver Sensor Module

Podłącz sprzęt laserowej pułapki

Połącz komponenty zgodnie ze szczegółami przedstawionymi na poniższym diagramie.

Diagram przedstawiający obwód, który otrzymuje dane z modułu czujnika odbiornika laserowego.

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!

Animated GIF showing a demonstration of the laser tripwire. The laser emitter lights the laser sensor module, and the app displays READY. The laser beam is broken, and the app displays ALERT. The action is then repeated.

Pobieranie kodu źródłowego

Źródło tego samouczka jest dostępne w witrynie GitHub.

Następne kroki