Teilen über


Verwenden von GPIO für binäre Eingaben

GPIO-Stifte (General Purpose I/O) können für die Annahme elektrischer Signale als Eingabe konfiguriert werden. Auf der einfachsten Ebene ist dies nützlich für Szenarien, in denen das Öffnen/Schließen eines Schaltkreises erkannt wird. Solche Schaltungen können Drucktasten, Umschalter, Reedschalter, Druckschalter und andere Geräte umfassen, die binäre Werte (ein/aus) darstellen, indem sie einen Schaltkreis schließen.

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

Voraussetzungen

  • ARM-basierter (ARMv7 oder höher) Single-Board-Computer (SBC)
  • Jumperdrähte
  • Breadboard (optional)
  • Raspberry Pi GPIO Breakout Board (optional)
  • .NET SDK 7 oder höher

Hinweis

Dieses Tutorial wurde unter der Annahme geschrieben, dass das Zielgerät 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. Für Raspberry Pi: Lesen Sie Einrichten eines SSH-Servers in der Dokumentation zu Raspberry Pi.

Vorbereiten der Hardware

Verwenden Sie die Hardwarekomponenten, um eine Schaltung wie im folgenden Diagramm 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.

Beachten Sie falls nötig das folgende Anschlussdiagramm:

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 sie InputTutorial.

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

    dotnet add package System.Device.Gpio --version 2.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)}");
    }
    

    Für den Code oben gilt:

    • Eine Using-Deklaration erzeugt 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, was angibt, dass die Hardwareplattform, auf der sie ausgeführt wird, erkannt werden und das logische Stiftnummerierungsschema verwendet werden soll.
    • Der GPIO-Stift 21 ist mit PinMode.InputPullUp geö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 Status des Stifts wird mit Read() gelesen. Wenn dies PinValue.High ist, gibt er die Alert-Zeichenfolge an der Konsole aus. Andernfalls wird die Ready-Zeichenfolge ausgegeben.
    • RegisterCallbackForPinValueChangedEvent() registriert eine Rückruffunktion für die beiden Ereignisse PinEventTypes.Rising und PinEventTypes.Falling am Stift. Diese Ereignisse entsprechen den Stiftzuständen PinValue.High bzw PinValue.Low.
    • Die Rückruffunktion verweist auf eine Methode namens OnPinEvent(). OnPinEvent() verwendet einen weiteren ternären Ausdruck, der auch die entsprechenden Zeichenfolgen Alert oder Ready 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 kompilieren.

  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 chmod +x die execute-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 einen Text an, der ungefähr dem folgenden entspricht:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Trennen Sie Stift 21 von der Erde. Die Konsole zeigt einen Text an, der ungefähr dem folgenden entspricht:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Verbinden Sie Stift 21 wieder mit der Erde. Die Konsole zeigt einen Text an, der ungefähr dem folgenden entspricht:

    (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 NuGet-Pakets System.Device.Gpio zu erkennen! Für diese Art von Eingabe gibt es viele Verwendungsmöglichkeiten. Dieses Beispiel kann mit jedem Szenario verwendet werden, in dem ein Schalter einen Schaltkreis schließt oder unterbricht. Hier sehen Sie ein Beispiel für die Verwendung mit einem magnetischen Reedschalter, der häufig verwendet wird, um geöffnete Türen oder Fenster zu erkennen.

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

Laser-Stolperdraht

Um das vorherige Beispielkonzept noch etwas zu erweitern, sehen wir uns an, wie es sich auf die Erstellung eines Laser-Stolperdrahts anwenden lässt. Für das Erstellen eines Laser-Stolperdrahts sind die folgenden zusätzlichen Komponenten erforderlich:

  • KY-008 Lasersendemodul
  • Laserempfangssensormodul (siehe Anmerkung unten)
  • 2 Widerstände zu 10 KΩ

Hinweis

Laserempfangssensormodul ist der allgemeine Name für ein gebräuchliches Modul, das von vielen Internethändlern angeboten wird. Das Gerät kann hinsichtlich Name oder Hersteller abweichen, sollte aber dieser Abbildung ähneln.

Abbildung eines Laserempfangssensormoduls

Verbinden der Laser-Stolperdrahthardware

Verbinden Sie die Komponenten wie im folgenden Diagramm dargestellt.

Ein Diagramm, das eine Schaltung zeigt, die Eingaben von einem Laserempfangssensormodul erhält.

Achten Sie besonders auf die 10 KΩ-Widerstände. Diese implementieren einen Spannungsteiler. Dies hat den Grund, dass das Laserempfangsmodul 5 V ausgibt, um eine Unterbrechung des Strahls anzuzeigen. Raspberry Pi unterstützt für GPIO-Eingaben nur bis zu 3,3 V. Da das Senden der vollen 5 V an den Stift den Raspberry Pi beschädigen könnte, wird der Strom aus dem Empfängermodul durch einen Spannungsteiler geleitet, um die Spannung auf 2,5 V zu halbieren.

Anwenden von Quellcodeupdates

Sie können mit einer Ausnahme fast den gleichen Code wie zuvor verwenden. 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 Laserempfangsmoduls erkennen wir jedoch keinen offenen Schaltkreis. Stattdessen soll der Stift als Senke für Strom aus dem Laserempfangsmodul fungieren. In diesem Fall öffnen wir den Stift mit PinMode.InputPullDown. Auf diese Weise gibt der Stift PinValue.Low zurück, wenn er keinen Strom erhält, und PinValue.High, wenn er Strom vom Laserempfangsmodul empfängt.

controller.OpenPin(pin, PinMode.InputPullDown);

Wichtig

Achten Sie darauf, dass der auf Ihrem Raspberry Pi bereitgestellte Code diese Änderung enthält, bevor Sie einen Laser-Stolperdraht testen. Das Programm funktioniert ohne die Änderung, aber durch die Verwendung des falschen Eingabemodus riskieren Sie Schäden an Ihrem Raspberry Pi!

Animiertes GIF mit einer Demonstration des Laser-Stolperdrahts. Der Lasersender beleuchtet das Lasersensormodul, und die App zeigt READY an. Der Laserstrahl wird unterbrochen, und die App zeigt ALERT an. Die Aktion wird dann wiederholt.

Herunterladen des Quellcodes

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

Nächste Schritte