Dela via


Använda GPIO för binära indata

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)
  • Jumper wires
  • Brödskiva (valfritt)
  • Raspberry Pi GPIO breakout board (optional)
  • .NET SDK 8 eller senare

Anmärkning

Den här handledningen är skriven med antagandet att målenheten är en Raspberry Pi. Den här handledningen 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. 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:

Ett diagram som visar en krets som ansluter ett jordstift till stift 21.

Bilden ovan visar en direkt anslutning mellan en markstift och stift 21.

Tips/Råd

The diagram depicts a breadboard and GPIO breakout for illustrative purposes, but feel free to just connect a ground pin and pin 21 with a jumper wire on the Raspberry Pi.

Refer to the following pinout diagram as needed:

Ett diagram som visar pinout-koden för Raspberry Pi GPIO-huvudet. Bild med tillstånd Raspberry Pi Foundation.
Bild med tillstånd Raspberry Pi Foundation.

Skapa appen

Slutför följande steg i den utvecklingsmiljö du föredrar:

  1. 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
    
  2. 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 3.2.0-*
    
  3. 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. Deklarationen using säkerställer att objektet tas bort och att maskinvaruresurser släpps 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.
      • This opens the pin with a PullUp resistor engaged. In this mode, when the pin is connected to ground, it will return PinValue.Low. När stiftet är frånkopplat från jord och kretsen är öppen, returnerar stiftet PinValue.High.
    • Den inledande statusen skrivs till en konsol med ett ternäruttryck. The pin's current state is read with Read(). Om det är PinValue.Highskriver den strängen Alert till konsolen. Otherwise, it writes the Ready string.
    • RegisterCallbackForPinValueChangedEvent() registers a callback function for both the PinEventTypes.Rising and PinEventTypes.Falling events on the pin. Dessa händelser motsvarar pin-tillstånd för PinValue.High respektive PinValue.Low.
    • Återanropsfunktionen pekar på en metod som heter OnPinEvent(). OnPinEvent() använder ett annat ternary-uttryck som också skriver motsvarande Alert eller Ready strängar.
    • The main thread sleeps indefinitely while waiting for pin events.
  4. Skapa appen. Om du använder .NET CLI kör du dotnet build. Om du vill skapa i Visual Studio trycker du på Ctrl+Skift+B.

  5. Distribuera appen till SBC som en fristående app. Anvisningar finns i Distribuera .NET-appar till Raspberry Pi. Make sure to give the executable execute permission using chmod +x.

  6. Kör appen på Raspberry Pi genom att växla till mappen för distribution och köra den körbara filen.

    ./InputTutorial
    

    Konsolen visar text som liknar följande:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Koppla bort stift 21 från marken. Konsolen visar text som liknar följande:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Reconnect pin 21 and ground. Konsolen visar text som liknar följande:

    (05/10/2022 16:00:25) READY ✅
    
  9. 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.

Animerad GIF som visar en magnetisk vassbrytare som öppnar och stänger. Växeln exponeras för en magnet och appen visar READY. Magneten tas bort och appen visar AVISERING. Åtgärden upprepas sedan.

Laser tripwire

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.

Bild av en sensormodul för lasermottagare

Ansluta laser tripwire-maskinvara

Anslut komponenterna enligt beskrivningen i följande diagram.

Ett diagram som visar en krets som hämtar indata från en sensormodul för lasermottagare.

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. In the other examples, we used PinMode.InputPullUp so that when the pin is disconnected from ground and the circuit is open, the pin returns 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. This way, the pin returns PinValue.Low when it's getting no current, and PinValue.High when it receives current from the laser receiver module.

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!

Animerad GIF som visar en demonstration av laser tripwire. Lasersändaren lyser lasersensormodulen och appen visar READY. Laserstrålen är trasig och appen visar ALERT. Åtgärden upprepas sedan.

Hämta källkoden

The source for this tutorial is available on GitHub.

Nästa steg