Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Allmänna I/O-stift (GPIO) 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 öppnande/stängning av en krets. Sådana kretsar kan innehålla tryckknappar, växlingsväxlar, 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 öppnandet och stängningen av en krets.
Förutsättningar
- ARM-baserad (ARMv7 eller senare) enkelkortsdator (SBC)
- Bygeltrådar
- Brödskiva (valfritt)
- Raspberry Pi GPIO breakout board (valfritt)
- .NET SDK 10 eller senare
Anmärkning
Den här handledningen är skriven med antagandet att målenheten är en Raspberry Pi. Den här handledningen kan användas för alla Linux-baserade SBC som stöder .NET, till exempel Orange Pi, ODROID och mer.
Kontrollera att SSH är aktiverat på enheten. För Raspberry Pi , se 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/Råd
Diagrammet visar ett kopplingsdäck och en GPIO-breakout för illustrativa ändamål, men anslut gärna bara ett jordstift och pinne 21 med en bygeltråd på Raspberry Pi.
Se följande pinout-diagram efter behov:
Bild med tillstånd Raspberry Pi Foundation.
Skapa appen
Slutför följande steg i den utvecklingsmiljö du föredrar:
Skapa en ny .NET-konsolapp med antingen .NET CLI eller Visual Studio. Ge den namnet InputTutorial.
dotnet new console -o InputTutorial cd InputTutorialLägg till paketet System.Device.Gpio i projektet. Använd antingen .NET CLI från projektkatalogen eller Visual Studio.
dotnet package add System.Device.Gpio --version 4.0.1Ersä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. Deklarationenusingsäkerställer att objektet tas bort och att maskinvaruresurser släpps korrekt.-
GpioControllerinstansieras 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 ett PullUp-motstånd aktiverat. När stiftet är anslutet till jord i det här läget returneras
PinValue.Low. När stiftet är frånkopplat från jorden och kretsen är öppen returnerar stiftetPinValue.High.
- Då öppnas stiftet med ett PullUp-motstånd aktiverat. När stiftet är anslutet till jord i det här läget returneras
- Den inledande statusen skrivs till en konsol med ett ternäruttryck. Pin-kodens aktuella tillstånd läse med
Read(). Om det ärPinValue.Highskriver den strängenAlerttill konsolen. Annars skriver den strängenReady. -
RegisterCallbackForPinValueChangedEvent()registrerar en återanropsfunktion för bådePinEventTypes.Rising- ochPinEventTypes.Falling-händelserna på pinnen. Dessa händelser motsvarar pin-tillstånd förPinValue.HighrespektivePinValue.Low. - Återanropsfunktionen pekar på en metod som heter
OnPinEvent().OnPinEvent()använder ett annat ternary-uttryck som också skriver motsvarandeAlertellerReadysträngar. - Huvudtråden sover tillsvidare i väntan på pinhändelser.
- En användningsdeklaration skapar en instans av
Skapa appen. Om du använder .NET CLI kör du
dotnet build. Om du vill skapa i Visual Studio trycker du på Ctrl+Shift+B.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 filen exekveringsbehörighet med hjälp av
chmod +x.Kör appen på Raspberry Pi genom att växla till mappen för distribution och köra den körbara filen.
./InputTutorialKonsolen 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 pinne 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 med valfritt scenario där en växel ansluter eller bryter en krets. Här är ett exempel som använder det med en magnetbrytare, som ofta används för att upptäcka öppna dörrar eller fönster.
Lasersnubbeltråd
Om vi utökar det tidigare exempelkonceptet lite längre kan vi ta en titt på hur detta kan användas för att skapa en laser tripwire. Att skapa en laser tripwire kräver följande ytterligare komponenter:
- KY-008 lasersändare modul
- Sensormodul för lasermottagare (se anmärkning nedan)
- 2 10 kΩ motstånd
Anmärkning
Laser mottagarsensormodul ä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änningsavdelare. 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, överförs 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 vi PinMode.InputPullUp så att när stiftet kopplas från jord och kretsen är öppen, returnerar stiftet PinValue.High.
Men när det gäller modulen lasermottagare identifierar vi inte en öppen krets. I stället vill vi att stiftet ska fungera som en mottagare för ström som kommer från lasermottagaremodulen. I det här fallet öppnar vi pin-koden 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 laseremottagarmodulen.
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 att använda fel indataläge riskerar att skada din Raspberry Pi!
Hämta källkoden
Källan för den här handledningen är tillgänglig på GitHub.