Dela via


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:

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

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:

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

Utför följande steg i önskad utvecklingsmiljö:

  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 2.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. 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 returnerar PinValue.Highstiftet .
    • Den inledande statusen skrivs till en konsol med ett ternary-uttryck. Pin-kodens aktuella tillstånd läse med Read(). Om den är PinValue.Highskriver den strängen Alert till konsolen. Annars skrivs strängen Ready .
    • RegisterCallbackForPinValueChangedEvent() registrerar en återanropsfunktion för både PinEventTypes.Rising händelserna och PinEventTypes.Falling på pin-koden. Dessa händelser motsvarar pin-tillstånd för PinValue.High respektive PinValue.Low.
    • Återanropsfunktionen pekar på en metod med namnet OnPinEvent(). OnPinEvent() använder ett annat ternary-uttryck som också skriver motsvarande Alert eller Ready strängar.
    • Huvudtråden är i viloläge på obestämd tid i väntan på pin-händelser.
  4. 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.

  5. 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.

  6. 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 ✅
    
  7. Koppla bort stift 21 från marken. Konsolen visar text som liknar följande:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Återanslut stift 21 och jord. 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 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.

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

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.

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ä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.Highnä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!

Animerad GIF som visar en demonstration av laser tripwire. Laseravsändaren tänder lasersensormodulen och appen visar KLAR. Laserstrålen är trasig och appen visar ALERT. Åtgärden upprepas sedan.

Hämta källkoden

Källan för den här självstudien är tillgänglig på GitHub.

Nästa steg