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:
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:
Bild mit freundlicher Genehmigung der Raspberry Pi Foundation.
Erstellen der App
Führen Sie in Ihrer bevorzugten Entwicklungsumgebung die folgenden Schritte aus:
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
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-*
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 derusing
-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 StiftPinValue.High
zurück.
- Dadurch wird der Stift mit aktiviertem PullUp-Widerstand geöffnet. Wenn der Stift in diesem Modus mit der Erde verbunden ist, wird
- Der Anfangsstatus wird mithilfe eines ternären Ausdrucks in eine Konsole geschrieben. Der aktuelle Status des Stifts wird mit
Read()
gelesen. Wenn diesPinValue.High
ist, gibt er dieAlert
-Zeichenfolge an der Konsole aus. Andernfalls wird dieReady
-Zeichenfolge ausgegeben. -
RegisterCallbackForPinValueChangedEvent()
registriert eine Rückruffunktion für die beiden EreignissePinEventTypes.Rising
undPinEventTypes.Falling
am Stift. Diese Ereignisse entsprechen den StiftzuständenPinValue.High
bzwPinValue.Low
. - Die Rückruffunktion verweist auf eine Methode namens
OnPinEvent()
.OnPinEvent()
verwendet einen weiteren ternären Ausdruck, der auch die entsprechenden ZeichenfolgenAlert
oderReady
schreibt. - Der Hauptthread verbleibt unbegrenzt im Ruhezustand, während auf Stiftereignisse gewartet wird.
- Eine Using-Deklaration erzeugt eine Instanz von
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.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.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 ✅
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 🚨
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 ✅
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.
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.
Verbinden der Laser-Stolperdrahthardware
Verbinden Sie die Komponenten wie im folgenden Diagramm dargestellt.
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!
Herunterladen des Quellcodes
Der Quellcode für dieses Tutorial ist auf GitHub verfügbar.