Freigeben über


Verwenden von GPIO für binäre Eingaben

Allgemeine I/O-Pins (GPIO) können so konfiguriert werden, dass elektrische Signale als Eingang empfangen werden. Dies ist auf der einfachsten Ebene nützlich für Szenarien, die das Öffnen/Schließen eines Schaltkreises erkennen. Solche Schaltkreise können Drucktasten, Kippschalter, Reedschalter, Druckschalter und andere Geräte enthalten, die binäre Werte (Ein/Aus) darstellen, indem sie einen Stromkreis schließen.

In diesem Lernprogramm verwenden Sie .NET und die GPIO-Pins Ihres Raspberry Pi, um das Öffnen und Schließen eines Schaltkreises zu erkennen.

Voraussetzungen

  • ARM-basierter (ARMv7 oder höher) Single-Board-Computer (SBC)
  • Jumper-Kabel
  • Breadboard (optional)
  • Raspberry Pi GPIO Breakout Board (optional)
  • .NET SDK 8 oder höher

Hinweis

Dieses Tutorial wurde unter der Annahme geschrieben, dass das Zielgerät ein Raspberry Pi ist. Dieses Tutorial kann jedoch für jeden Linux-basierten SBC verwendet werden, der .NET unterstützt, z. B. Orange Pi, ODROID und mehr.

Stellen Sie sicher, dass SSH auf Ihrem Gerät aktiviert ist. Zur Einrichtung eines SSH-Servers auf dem Raspberry Pi lesen Sie bitte den Abschnitt "Einen SSH-Server einrichten" in der Raspberry-Pi-Dokumentation.

Vorbereiten der Hardware

Verwenden Sie die Hardwarekomponenten, um den Schaltkreis wie im folgenden Diagramm dargestellt zu erstellen:

Diagramm, das eine Schaltung zeigt, die einen Erdungsstift mit Stift 21 verbindet.

Das Bild oben zeigt eine direkte Verbindung zwischen einem Erdungsstift und Stift 21.

Tipp

Im Diagramm sind zu Veranschaulichungszwecken eine Steckplatine und eine GPIO-Kabelpeitsche dargestellt, aber Sie können einfach auf dem Raspberry Pi einen Erdungsstift und Stift 21 mit einer Drahtbrücke verbinden.

Sehen Sie sich bei Bedarf das folgende Pinout-Diagramm an:

Anschlussdiagramm: Raspberry Pi GPIO-Header. Bild mit freundlicher Genehmigung der Raspberry Pi Foundation.
Bild mit freundlicher Genehmigung der Raspberry Pi Foundation.

Erstellen der App

Führen Sie in Ihrer bevorzugten Entwicklungsumgebung die folgenden Schritte aus:

  1. Erstellen Sie eine neue .NET-Konsolen-App, indem Sie entweder die .NET-CLI oder Visual Studio verwenden. Nennen Sie es InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Fügen Sie das System.Device.Gpio-Paket zum Projekt hinzu. Verwenden Sie entweder .NET CLI aus dem Projektverzeichnis oder Visual Studio.

    dotnet add package System.Device.Gpio --version 3.2.0-*
    
  3. Ersetzen Sie den Inhalt von Program.cs durch den folgenden Code:

    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)}");
    }
    

    Im vorhergehenden Code:

    • Eine using-Deklaration erstellt eine Instanz von GpioController. Mit der using-Deklaration wird sichergestellt, dass das Objekt verworfen wird und die Hardwareressourcen richtig freigegeben werden.
      • GpioController wird ohne Parameter instanziiert und gibt an, dass sie erkennen soll, auf welcher Hardwareplattform sie ausgeführt wird, und das logische Pinnummerierungsschema verwenden.
    • GPIO-Pin 21 wird mit PinMode.InputPullUpgeöffnet.
      • Dadurch wird der Stift mit aktiviertem PullUp-Widerstand geöffnet. Wenn der Stift in diesem Modus mit der Erde verbunden ist, wird PinValue.Low zurückgegeben. Wenn der Stift von der Erde getrennt und der Schaltkreis geöffnet ist, gibt der Stift PinValue.High zurück.
    • Der Anfangsstatus wird mithilfe eines ternären Ausdrucks in eine Konsole geschrieben. Der aktuelle Zustand des Pins wird mit Read() abgelesen. Wenn es PinValue.High ist, schreibt es die Alert Zeichenfolge in die Konsole. Andernfalls schreibt sie die Ready Zeichenfolge.
    • RegisterCallbackForPinValueChangedEvent() registriert eine Rückruffunktion sowohl für die Ereignisse PinEventTypes.Rising als auch PinEventTypes.Falling auf dem Pin. Diese Ereignisse entsprechen den Pin-Zuständen von PinValue.High bzw. von PinValue.Low.
    • Die Rückruffunktion verweist auf eine Methode namens OnPinEvent(). OnPinEvent() verwendet einen weiteren ternären Ausdruck, der auch die entsprechenden Alert oder Ready Zeichenfolgen schreibt.
    • Der Hauptthread verbleibt unbegrenzt im Ruhezustand, während auf Stiftereignisse gewartet wird.
  4. Erstellen Sie die App. Führen Sie dotnet build aus, wenn Sie die .NET-CLI verwenden. Drücken Sie STRG+UMSCHALT+B, um die App in Visual Studio zu erstellen.

  5. Stellen Sie die App auf dem SBC als eigenständige App bereit. Anweisungen hierzu finden Sie unter Bereitstellen von .NET-Apps auf einem Raspberry Pi-Gerät. Erteilen Sie dabei mithilfe von die chmod +x-Berechtigung für ausführbare Dateien.

  6. Führen Sie die App auf dem Raspberry Pi aus, indem Sie zum Bereitstellungsverzeichnis wechseln und die ausführbare Datei ausführen.

    ./InputTutorial
    

    Die Konsole zeigt Text ähnlich wie folgt an:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Trennen Sie den Pin 21 vom Boden. Die Konsole zeigt Text ähnlich wie folgt an:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Verbinden Sie Stift 21 wieder mit der Erde. Die Konsole zeigt Text ähnlich wie folgt an:

    (05/10/2022 16:00:25) READY ✅
    
  9. Beenden Sie das Programm, indem Sie STRG+C drücken.

Glückwunsch! Sie haben GPIO verwendet, um Eingaben mithilfe des System.Device.Gpio NuGet-Pakets zu erkennen! Für diese Art von Eingabe gibt es viele Verwendungsmöglichkeiten. Dieses Beispiel kann für jedes Szenario verwendet werden, in dem ein Schalter eine Verbindung herstellt oder einen Schaltkreis umbricht. Hier ist ein Beispiel für die Verwendung mit einem magnetischen Reedschalter, der häufig verwendet wird, um offene Türen oder Fenster zu erkennen.

Animierte GIF-Datei, die einen magnetischen Umschalter zeigt, der geöffnet und geschlossen wird. Der Schalter wird einem Magnet ausgesetzt, und die App zeigt READY an. Der Magnet wird entfernt, und die App zeigt WARNUNG an. Die Aktion wird dann wiederholt.

Laser-Stolperdraht

Wenn Sie das vorherige Beispielkonzept noch etwas weiter erweitern, sehen wir uns an, wie dies auf die Erstellung eines Lasertripwires angewendet werden könnte. Für die Erstellung eines Lasertripwires sind die folgenden zusätzlichen Komponenten erforderlich:

  • KY-008 Lasersendermodul
  • Laserempfängersensormodul (siehe Hinweis unten)
  • 2 Widerstände zu 10 KΩ

Hinweis

Laserempfängersensormodul ist der generische Name, der auf ein gängiges Modul angewendet wird, das in vielen Internethändlern zu finden ist. Das Gerät kann in Name oder Hersteller variieren, sollte aber diesem Bild ähneln.

Abbildung eines Laserempfängersensormoduls

Verbinden von Lasertripwire-Hardware

Verbinden Sie die Komponenten wie im folgenden Diagramm beschrieben.

Ein Diagramm mit einem Schaltkreis, der Eingaben von einem Laserempfängersensormodul erhält.

Achten Sie auf die 10K Ω Widerstände. Diese implementieren einen Spannungsteiler. Dies liegt daran, dass das Laserempfängermodul 5V ausgibt, um anzugeben, dass der Strahl unterbrochen ist. Raspberry Pi unterstützt nur bis zu 3,3V für GPIO-Eingaben. Da das Senden der vollen 5V an den Pin den Raspberry Pi beschädigen könnte, wird der Strom aus dem Empfängermodul durch eine Spannungstrennlinie übergeben, um die Spannung auf 2,5V zu halbieren.

Anwenden von Quellcodeupdates

Sie können fast den gleichen Code wie früher verwenden, mit einer Ausnahme. In den anderen Beispielen haben wir PinMode.InputPullUp verwendet, damit der Stift PinValue.High zurückgibt, wenn er von der Erde getrennt und der Schaltkreis offen ist.

Im Fall des Laserempfängermoduls erkennen wir jedoch keine offene Schaltung. Stattdessen soll der Pin als Spüle für Strom aus dem Laserempfängermodul fungieren. In diesem Fall öffnen wir den Pin mit PinMode.InputPullDown. Auf diese Weise gibt der Pin zurück PinValue.Low , wenn er keinen Strom erhält und PinValue.High wann er strom vom Laserempfängermodul empfängt.

controller.OpenPin(pin, PinMode.InputPullDown);

Wichtig

Stellen Sie sicher, dass der auf Ihrem Raspberry Pi bereitgestellte Code diese Änderung enthält, bevor Sie eine Lasertripwire testen. Das Programm funktioniert ohne das Programm, aber die Verwendung des falschen Eingabemodus birgt Schäden an Ihrem Raspberry Pi!

Animierte GIF mit einer Demonstration des Lasertripwires. Der Laserstrahler leuchtet das Lasersensormodul und die App zeigt READY an. Der Laserstrahl ist unterbrochen, und die App zeigt WARNUNG an. Die Aktion wird dann wiederholt.

Herunterladen des Quellcodes

Der Quellcode für dieses Tutorial ist auf GitHub verfügbar.

Nächste Schritte