Använda GPIO för binära indata
GPIO-stift (General-purpose I/O) kan konfigureras för att ta emot elektriska signaler som indata. På den mest grundläggande nivån är detta användbart för scenarier som identifierar öppning/stängning av en krets. Sådana kretsar kan innehålla tryckknappar, växlingsknappar, vassbrytare, tryckbrytare och andra enheter som representerar binära (på/av)-värden genom att slutföra en krets.
I den här självstudien använder du .NET och Raspberry Pi:s GPIO-stift för att identifiera öppning och stängning av en krets.
Krav
- ARM-baserad (ARMv7 eller senare) enkelkortsdator (SBC)
- Bygeltrådar
- Brödbräda (valfritt)
- Raspberry Pi GPIO breakout board (valfritt)
- .NET SDK 7 eller senare
Anteckning
Den här självstudien skrivs förutsatt att målenheten är Raspberry Pi. Den här självstudien kan dock användas för alla Linux-baserade SBC som stöder .NET, till exempel Orange Pi, ODROID med mera.
Kontrollera att SSH är aktiverat på enheten. Raspberry Pi finns i Konfigurera en SSH-server i Raspberry Pi-dokumentationen.
Förbereda maskinvaran
Använd maskinvarukomponenterna för att skapa kretsen enligt följande diagram:
Bilden ovan visar en direkt anslutning mellan en markstift och stift 21.
Tips
Diagrammet visar en brödbräda och GPIO breakout för illustrativa ändamål, men känn dig fri att bara ansluta en markstift och stift 21 med en bygel tråd på Raspberry Pi.
Se följande pinout-diagram efter behov:
Bild med tillstånd Raspberry Pi Foundation.
Skapa appen
Utför följande steg i önskad utvecklingsmiljö:
Skapa en ny .NET-konsolapp med hjälp av .NET CLI eller Visual Studio. Ge den namnet InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Lägg till paketet System.Device.Gpio i projektet. Använd antingen .NET CLI från projektkatalogen eller Visual Studio.
dotnet add package System.Device.Gpio --version 2.2.0-*
Ersätt innehållet i Program.cs med följande kod:
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)}"); }
I koden ovan:
- En användningsdeklaration skapar en instans av
GpioController
.using
Deklarationen säkerställer att objektet tas bort och att maskinvaruresurser frigörs korrekt.-
GpioController
instansieras utan parametrar, vilket indikerar att den ska identifiera vilken maskinvaruplattform den körs på och använda det logiska pin-numreringsschemat.
-
- GPIO stift 21 öppnas med
PinMode.InputPullUp
.- Då öppnas stiftet med en PullUp-resistor aktiverad. När stiftet är anslutet till marken i det här läget returneras
PinValue.Low
. När stiftet kopplas från marken och kretsen är öppen returnerarPinValue.High
stiftet .
- Då öppnas stiftet med en PullUp-resistor aktiverad. När stiftet är anslutet till marken i det här läget returneras
- Den inledande statusen skrivs till en konsol med ett ternary-uttryck. Pin-kodens aktuella tillstånd läse med
Read()
. Om den ärPinValue.High
skriver den strängenAlert
till konsolen. Annars skrivs strängenReady
. -
RegisterCallbackForPinValueChangedEvent()
registrerar en återanropsfunktion för bådePinEventTypes.Rising
händelserna ochPinEventTypes.Falling
på pin-koden. Dessa händelser motsvarar pin-tillstånd förPinValue.High
respektivePinValue.Low
. - Återanropsfunktionen pekar på en metod med namnet
OnPinEvent()
.OnPinEvent()
använder ett annat ternary-uttryck som också skriver motsvarandeAlert
ellerReady
strängar. - Huvudtråden är i viloläge på obestämd tid i väntan på pin-händelser.
- En användningsdeklaration skapar en instans av
Skapa appen. Om du använder .NET CLI kör du
dotnet build
. Tryck på Ctrl+Skift+B för att skapa i Visual Studio.Distribuera appen till SBC som en fristående app. Anvisningar finns i Distribuera .NET-appar till Raspberry Pi. Se till att ge den körbara körningsbehörigheten med hjälp av
chmod +x
.Kör appen på Raspberry Pi genom att växla till distributionskatalogen och köra den körbara filen.
./InputTutorial
Konsolen visar text som liknar följande:
Initial status (05/10/2022 15:59:25): READY ✅
Koppla bort stift 21 från marken. Konsolen visar text som liknar följande:
(05/10/2022 15:59:59) ALERT 🚨
Återanslut stift 21 och jord. Konsolen visar text som liknar följande:
(05/10/2022 16:00:25) READY ✅
Avsluta programmet genom att trycka på Ctrl+C.
Grattis! Du har använt GPIO för att identifiera indata med hjälp av System.Device.Gpio
NuGet-paketet! Det finns många användningsområden för den här typen av indata. Det här exemplet kan användas i alla scenarier där en växel ansluter eller bryter en krets. Här är ett exempel som använder den med en magnetisk vassbrytare, som ofta används för att identifiera öppna dörrar eller fönster.
Laser tripwire
Om vi utökar det tidigare exempelkonceptet lite längre ska vi ta en titt på hur detta kan tillämpas på att skapa en laser tripwire. Att skapa en laser tripwire kräver följande ytterligare komponenter:
- KY-008 lasersändare modul
- Lasermottagarens sensormodul (se anmärkningen nedan)
- 2 10 000 Ω motstånd
Anteckning
Laser receiver sensor modul är det generiska namnet som tillämpas på en gemensam modul som finns hos många Internet återförsäljare. Enheten kan variera i namn eller tillverkare, men bör likna den här bilden.
Ansluta laser tripwire-maskinvara
Anslut komponenterna enligt beskrivningen i följande diagram.
Var uppmärksam på 10K Ω motstånd. Dessa implementerar en spänningsdelare. Detta beror på att lasermottagaremodulen matar ut 5V för att indikera att strålen är trasig. Raspberry Pi stöder endast upp till 3,3 V för GPIO-indata. Eftersom sändning av hela 5V till stiftet kan skada Raspberry Pi, skickas strömmen från mottagarmodulen genom en spänningsavdelare för att halvera spänningen till 2,5V.
Tillämpa källkodsuppdateringar
Du kan nästan använda samma kod som tidigare, med ett undantag. I de andra exemplen använde PinMode.InputPullUp
vi så att stiftet returnerar PinValue.High
när stiftet kopplas från marken och kretsen är öppen.
Men när det gäller modulen för lasermottagare identifierar vi inte en öppen krets. I stället vill vi att stiftet ska fungera som mottagare för ström som kommer från lasermottagaremodulen. I det här fallet öppnar vi stiftet med PinMode.InputPullDown
. På så sätt returnerar PinValue.Low
stiftet när det inte får någon ström och PinValue.High
när det tar emot ström från lasermottagaremodulen.
controller.OpenPin(pin, PinMode.InputPullDown);
Viktigt
Kontrollera att koden som distribueras på Raspberry Pi innehåller den här ändringen innan du testar en laser tripwire. Programmet fungerar utan det, men med fel indataläge riskerar skada på din Raspberry Pi!
Hämta källkoden
Källan för den här självstudien är tillgänglig på GitHub.