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:

Diagram przedstawiający obwód, który łączy wyprowadzenie naziemne z numerem PIN 21.

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:

Diagram przedstawiający wyprowadzenia nagłówka GPIO urządzenia Raspberry Pi. Obraz dzięki uprzejmości 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ą .NET przy użyciu interfejsu wiersza polecenia platformy .NET lub programu Visual Studio. Nadaj mu nazwę InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. 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-*
    
  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)}");
    }
    

    Powyższy kod ma następujące działanie:

    • Deklaracja using tworzy wystąpienie klasy GpioController. Deklaracja using zapewnia, że obiekt zostanie usunięty, a zasoby sprzętowe zostaną prawidłowo zwolnione.
    • Wyprowadzka GPIO 21 jest otwarta za pomocą PinMode.InputPullUppolecenia .
      • 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.
    • Początkowy stan jest zapisywany w konsoli przy użyciu wyrażeniaternary. Bieżący stan pinezki jest odczytywany za pomocą polecenia Read(). Jeśli jest PinValue.Highto , zapisuje Alert ciąg w konsoli. W przeciwnym razie zapisuje Ready ciąg.
    • RegisterCallbackForPinValueChangedEvent() rejestruje funkcję wywołania zwrotnego zarówno dla zdarzeń, jak PinEventTypes.Rising i PinEventTypes.Falling w numerze PIN. Te zdarzenia odpowiadają odpowiednio stanom PinValue.High pinezki i PinValue.Low.
    • Funkcja wywołania zwrotnego wskazuje metodę o nazwie OnPinEvent(). OnPinEvent() używa innego wyrażeniaternary, które również zapisuje odpowiadające im Alert ciągi lub Ready .
    • Główny wątek jest w trybie nieokreślony, czekając na przypinanie zdarzeń.
  4. 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.

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

  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 następującego:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Odłącz wyprowadzenie 21 od podstaw. Konsola wyświetla tekst podobny do następującego:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Połącz ponownie numer PIN 21 i uziemienie. Konsola wyświetla tekst podobny do następującego:

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

Animowany plik GIF demonstrujący ponowne otwarcie i zamknięcie przełącznika magnetycznego. Przełącznik jest narażony na magnes, a aplikacja wyświetla gotowy. Magnes jest usuwany, a aplikacja wyświetla alert. Akcja jest następnie powtarzana.

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.

Obraz modułu czujnika odbiornika laserowego

Podłączanie sprzętu laserowego tripwire

Połącz składniki zgodnie z opisem na poniższym diagramie.

Diagram przedstawiający obwód, który pobiera dane wejściowe z modułu czujnika laserowego.

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.InputPullDownpolecenia . 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!

Animowany GIF przedstawiający pokaz laserowego tripwire. Moduł emitujący laserowy włącza moduł czujnika laserowego, a aplikacja wyświetla komunikat READY (GOTOWE). Wiązka laserowa jest uszkodzona, a aplikacja wyświetla alert. Akcja jest następnie powtarzana.

Uzyskiwanie kodu źródłowego

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

Następne kroki