Delen via


GPIO gebruiken voor binaire invoer

Algemene I/O-pinnen (GPIO) kunnen worden geconfigureerd om elektrische signalen als invoer te ontvangen. Op het meest eenvoudige niveau is dit handig voor scenario's waarin het openen/sluiten van een circuit wordt gedetecteerd. Dergelijke circuits kunnen bestaan uit drukknoppen, wisselschakelaars, reedschakelaars, drukschakelaars en andere apparaten die binaire (aan/uit) waarden vertegenwoordigen door een circuit te voltooien.

In deze zelfstudie gebruikt u .NET en de GPIO-pinnen van uw Raspberry Pi om het openen en sluiten van een circuit te detecteren.

Vereisten

  • Op ARM gebaseerde computer met één bord (ARMv7 of hoger) (SBC)
  • Jumperdraden
  • Breadboard (optioneel)
  • Raspberry Pi GPIO breakout board (optioneel)
  • .NET SDK 7 of hoger

Notitie

Deze zelfstudie is geschreven ervan uitgaande dat het doelapparaat Raspberry Pi is. Deze zelfstudie kan echter worden gebruikt voor elke Linux-SBC die .NET ondersteunt, zoals Orange Pi, ODROID en meer.

Zorg ervoor dat SSH is ingeschakeld op uw apparaat. Voor Raspberry Pi raadpleegt u Een SSH-server instellen in de documentatie van Raspberry Pi.

De hardware voorbereiden

Gebruik de hardwareonderdelen om het circuit te bouwen, zoals wordt weergegeven in het volgende diagram:

Een diagram van een circuit dat een aardpin verbindt met pin 21.

In de bovenstaande afbeelding ziet u een directe verbinding tussen een grondspeld en pin 21.

Tip

Het diagram toont een breadboard en GPIO breakout voor illustratieve doeleinden, maar voel je vrij om gewoon een ground pin en pin 21 te verbinden met een jumper draad op de Raspberry Pi.

Raadpleeg indien nodig het volgende pin-outdiagram:

Een diagram met de pinout van de Raspberry Pi GPIO-header. Afbeelding met dank aan Raspberry Pi Foundation.
Afbeelding met dank aan Raspberry Pi Foundation.

De app maken

Voer de volgende stappen uit in de ontwikkelomgeving van uw voorkeur:

  1. Maak een nieuwe .NET Console-app met behulp van de .NET CLI of Visual Studio. Geef het de naam InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Voeg het pakket System.Device.Gpio toe aan het project. Gebruik .NET CLI vanuit de projectmap of Visual Studio.

    dotnet add package System.Device.Gpio --version 2.2.0-*
    
  3. Vervang de inhoud van Program.cs door de volgende 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)}");
    }
    

    In de voorgaande code:

    • Met een using-declaratie wordt een exemplaar van GpioControllergemaakt. De using declaratie zorgt ervoor dat het object wordt verwijderd en hardwareresources correct worden vrijgegeven.
      • GpioController wordt geïnstantieerd zonder parameters, wat aangeeft dat het moet detecteren op welk hardwareplatform het wordt uitgevoerd en het logische pincodeschema moet gebruiken.
    • GPIO-pin 21 wordt geopend met PinMode.InputPullUp.
      • Hiermee opent u de speld met een PullUp-weerstand ingeschakeld. In deze modus, wanneer de pin is verbonden met de grond, retourneert PinValue.Lowdeze . Wanneer de pin is losgekoppeld van de grond en het circuit open is, retourneert PinValue.Highde pin .
    • De initiële status wordt naar een console geschreven met behulp van een ternaire expressie. De huidige status van de pincode wordt gelezen met Read(). Als dit is PinValue.High, wordt de Alert tekenreeks naar de console geschreven. Anders wordt de Ready tekenreeks geschreven.
    • RegisterCallbackForPinValueChangedEvent() registreert een callback-functie voor de PinEventTypes.Rising gebeurtenissen en PinEventTypes.Falling op de pincode. Deze gebeurtenissen komen overeen met de vastgemaakte statussen van PinValue.High respectievelijk en PinValue.Low.
    • De callback-functie verwijst naar een methode met de naam OnPinEvent(). OnPinEvent() gebruikt een andere ternaire expressie waarmee ook de bijbehorende Alert tekenreeksen of Ready worden geschreven.
    • De hoofdthread slaapt voor onbepaalde tijd terwijl wordt gewacht op vastgemaakte gebeurtenissen.
  4. de app bouwen. Als u de .NET CLI gebruikt, voert u uit dotnet build. Druk op Ctrl+Shift+B om Visual Studio te bouwen.

  5. Implementeer de app in de SBC als een zelfstandige app. Zie .NET-apps implementeren in Raspberry Pi voor instructies. Zorg ervoor dat u de uitvoerbare uitvoerbare uitvoermachtiging geeft met behulp van chmod +x.

  6. Voer de app uit op de Raspberry Pi door over te schakelen naar de implementatiemap en het uitvoerbare bestand uit te voeren.

    ./InputTutorial
    

    In de console wordt tekst weergegeven die er ongeveer als volgt uitziet:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Koppel pin 21 los van de grond. In de console wordt tekst weergegeven die er ongeveer als volgt uitziet:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Sluit pin 21 opnieuw aan en de grond. In de console wordt tekst weergegeven die er ongeveer als volgt uitziet:

    (05/10/2022 16:00:25) READY ✅
    
  9. Beëindig het programma door op Ctrl+C te drukken.

Gefeliciteerd U hebt GPIO gebruikt om invoer te detecteren met behulp van het System.Device.Gpio NuGet-pakket. Er zijn veel toepassingen voor dit type invoer. Dit voorbeeld kan worden gebruikt voor elk scenario waarin een switch een circuit verbindt of onderbreekt. Hier volgt een voorbeeld van een magnetische rietschakelaar, die vaak wordt gebruikt om open deuren of vensters te detecteren.

GIF-animatie die een magnetische rietschakelaar openen en sluiten demonstreert. De schakelaar wordt blootgesteld aan een magneet en de app wordt READY weergegeven. De magneet wordt verwijderd en de app geeft ALERT weer. De actie wordt vervolgens herhaald.

Laser tripwire

Laten we het vorige voorbeeldconcept wat verder uitbreiden. Laten we eens kijken hoe dit kan worden toegepast bij het maken van een laser tripwire. Voor het bouwen van een laser-tripwire zijn de volgende extra onderdelen vereist:

  • KY-008 laserzendermodule
  • Sensormodule van de laserontvanger (zie opmerking hieronder)
  • 2 10K Ω weerstanden

Notitie

De sensormodule van de laserontvanger is de algemene naam die wordt toegepast op een algemene module die bij veel internetwinkels wordt gevonden. De naam of fabrikant van het apparaat kan verschillen, maar moet lijken op deze afbeelding.

Afbeelding van een sensormodule van de laserontvanger

Laser tripwire-hardware aansluiten

Verbind de onderdelen zoals beschreven in het volgende diagram.

Een diagram met een circuit dat invoer krijgt van een sensormodule voor een laserontvanger.

Let goed op de 10K Ω weerstanden. Deze implementeren een spanningsverdeler. Dit komt doordat de laserontvangermodule 5V uitvoert om aan te geven dat de straal is verbroken. Raspberry Pi ondersteunt alleen maximaal 3.3V voor GPIO-invoer. Aangezien het verzenden van de volledige 5V naar de pin de Raspberry Pi kan beschadigen, wordt de stroom van de ontvangermodule doorgegeven door een spanningsverdeler om de spanning te halveren tot 2,5V.

Broncode-updates toepassen

U kunt bijna dezelfde code gebruiken als eerder, met één uitzondering. In de andere voorbeelden hebben we zo gebruikt PinMode.InputPullUp dat wanneer de pin is losgekoppeld van de grond en het circuit open is, de pin retourneert PinValue.High.

In het geval van de laserontvangermodule detecteren we echter geen open circuit. In plaats daarvan willen we dat de pin fungeert als een gootsteen voor stroom die afkomstig is van de module van de laserontvanger. In dit geval openen we de pincode met PinMode.InputPullDown. Op deze manier retourneert PinValue.Low de pin wanneer deze geen stroom krijgt en PinValue.High wanneer deze stroom ontvangt van de laserontvangermodule.

controller.OpenPin(pin, PinMode.InputPullDown);

Belangrijk

Zorg ervoor dat de code die op uw Raspberry Pi is geïmplementeerd, deze wijziging bevat voordat u een laser tripwire test. Het programma werkt wel zonder, maar het gebruik van de verkeerde invoermodus riskeert schade aan je Raspberry Pi!

Gif-animatie met een demonstratie van de laser tripwire. De laserzender verlicht de lasersensormodule en de app geeft READY weer. De laserstraal is verbroken en de app geeft ALERT weer. De actie wordt vervolgens herhaald.

De broncode ophalen

De bron voor deze zelfstudie is beschikbaar op GitHub.

Volgende stappen