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 .NET i pinów GPIO urządzenia Raspberry Pi do monitorowania otwierania i zamykania obwodu.

Wymagania wstępne

  • Komputer z jedną płytą (ARMv7 lub nowszy) oparty na architekturze ARM (SBC)
  • Przewody skoczkowe
  • Płytka stykowa (opcjonalnie)
  • Moduł rozszerzający GPIO dla Raspberry Pi (opcjonalnie)
  • .NET SDK 10 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 .NET, takich jak Orange Pi, ODROID i nie tylko.

Upewnij się, że SSH jest włączone na Twoim urządzeniu. Dla Raspberry Pi, zobacz Konfigurowanie 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 przedstawiają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.

W razie potrzeby zapoznaj się z następującym diagramem przypinania:

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ę konsoli .NET przy użyciu interfejsu wiersza polecenia .NET lub Visual Studio. Nadaj mu nazwę InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Dodaj pakiet System.Device.Gpio do projektu. Użyj .NET CLI z katalogu projektu lub Visual Studio.

    dotnet package add System.Device.Gpio --version 4.0.1
    
  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 using tworzy wystąpienie GpioController. Deklaracja using gwarantuje, że obiekt zostanie usunięty, a zasoby sprzętowe zostaną prawidłowo zwolnione.
      • GpioController jest instancjonowane bez parametrów, co wskazuje, że powinno wykryć, na której platformie sprzętowej jest uruchomione, i używać schematu logicznego numerowania pinów.
    • Pin GPIO 21 jest otwarty za pomocą PinMode.InputPullUp polecenia.
      • Powoduje to otworzenie pinu z aktywnym rezystorem PullUp. W tym trybie, gdy wyprowadzenie jest podłączone do 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 status jest zapisany do konsoli przy użyciu wyrażenia trójkowego. Bieżący stan pinu jest czytany przy użyciu Read(). Jeśli jest PinValue.High, zapisuje ciąg Alert na konsolę. W przeciwnym razie zapisuje Ready ciąg.
    • RegisterCallbackForPinValueChangedEvent() rejestruje funkcję wywołania zwrotnego dla zdarzeń PinEventTypes.Rising i PinEventTypes.Falling na pinie. Te zdarzenia odpowiadają odpowiednio stanom PinValue.High i PinValue.Low pinów.
    • Funkcja wywołania zwrotnego wskazuje metodę o nazwie OnPinEvent(). OnPinEvent() używa innego wyrażenia ternarnego, które 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 korzystasz z .NET CLI, wykonaj dotnet build. Aby skompilować Visual Studio, naciśnij Ctrl+Shift+B.

  5. Wdróż aplikację w SBC jako samodzielną aplikację. Aby uzyskać instrukcje, zobacz Deploy .NET aplikacje do urządzenia Raspberry Pi. Upewnij się, że nadajesz plikowi wykonywalnemu uprawnienia do wykonywania przy użyciu 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 poniższego.

    (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 klawisze Ctrl+C.

Gratulacje! Użyto GPIO do wykrywania sygnałów wejściowych System.Device.Gpio przy użyciu pakietu NuGet! 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 plik GIF demonstrujący przełącznik kontaktronowy otwierający i zamykający się. Przełącznik jest wystawiony na działanie magnesu, a aplikacja wyświetla GOTOWY. Magnes zostaje usunięty, a aplikacja wyświetla ALERT. Operacja jest następnie 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
  • 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ć nazwą lub producentem, ale powinno przypominać ten obraz.

Obraz modułu czujnika odbiornika laserowego

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 pobiera dane wejściowe z modułu czujnika odbiornika laserowego.

Zwróć szczególną uwagę na rezystory 10K Ω. Implementują one rozdzielacz 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 metody PinMode.InputPullUp , aby po odłączeniu wyprowadzenia od ziemi i otwarciu obwodu wyprowadzenie zwraca wartość PinValue.High.

Jednakże w przypadku modułu odbiornika laserowego, nie wykrywamy obwodu otwartego. Zamiast tego chcemy, aby pin działał jako ujście prądu pochodzącego z modułu odbiornika laserowego. W takim przypadku otworzymy pin za pomocą PinMode.InputPullDown. W ten sposób wyprowadzenie zwraca wartość PinValue.Low , gdy nie otrzymuje prądu, a PinValue.High gdy odbiera prąd z modułu odbiornika laserowego.

controller.OpenPin(pin, PinMode.InputPullDown);

Ważne

Przed rozpoczęciem testowania laserowego 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 wejściowego grozi uszkodzeniem urządzenia Raspberry Pi!

Animowany GIF przedstawiający demonstrację laserowego tripwire. Moduł emitujący laser oświetla czujnik laserowy, a aplikacja wyświetla GOTOWE. Wiązka laserowa zostaje przerwana, a aplikacja wyświetla ALERT. Następnie akcja jest powtarzana.

Pobieranie kodu źródłowego

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

Następne kroki