Delen via


GPIO gebruiken voor binaire invoer

GPIO-pinnen (General-Purpose I/O) kunnen worden geconfigureerd voor het ontvangen van elektrische signalen als invoer. Op het meest eenvoudige niveau is dit handig voor scenario's die het openen/sluiten van een circuit detecteren. Dergelijke circuits kunnen drukknoppen omvatten, 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.

Vereiste voorwaarden

  • OP ARM gebaseerde (ARMv7 of hoger) single-board computer (SBC)
  • Jumperkabels
  • Breadboard (optioneel)
  • Raspberry Pi GPIO breakout board (optioneel)
  • .NET SDK 8 of hoger

Opmerking

Deze handleiding is geschreven, ervan uitgaande dat het doelapparaat een 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. Raadpleeg voor Raspberry Pi het instellen van een SSH-server in de Raspberry Pi-documentatie.

De hardware voorbereiden

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

Een diagram met een circuit dat een aarding verbindt naar pin 21.

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

Hint

Het diagram toont een breadboard en GPIO-break-out voor illustratieve doeleinden, maar je kunt gewoon een aardingspin en pin 21 verbinden met een jumperdraad op de Raspberry Pi.

Raadpleeg indien nodig het volgende pinnendiagram:

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 deze de naam InputTutorial.

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

    dotnet add package System.Device.Gpio --version 3.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:

    • Een using-declaratie maakt een exemplaar van GpioController. De using declaratie zorgt ervoor dat het object wordt verwijderd en hardwarebronnen correct worden vrijgegeven.
      • GpioController wordt geïnstantieerd zonder parameters, waarmee wordt aangegeven dat het moet vaststellen op welk hardwareplatform het draait en het logische pinnummeringsschema moet gebruiken.
    • GPIO pin 21 wordt geopend met PinMode.InputPullUp.
      • Hiermee opent u de pin met een PullUp-weerstand ingeschakeld. In deze modus wordt, wanneer de pin is verbonden met de aarde, PinValue.Low geretourneerd. Wanneer de pin is losgekoppeld van de massa en het circuit open is, keert de pin terug naar PinValue.High.
    • De initiële status wordt naar een console geschreven met behulp van een ternaire expressie. De huidige status van de pin wordt gelezen met Read(). Als het PinValue.High is, schrijft hij de Alert tekenreeks naar de console. Anders wordt de Ready tekenreeks geschreven.
    • RegisterCallbackForPinValueChangedEvent() registreert een callback-functie voor zowel de PinEventTypes.Rising als de PinEventTypes.Falling gebeurtenissen op de pin. Deze gebeurtenissen komen overeen met de pinstatus van PinValue.High en PinValue.Low, respectievelijk.
    • De callback-functie verwijst naar een methode met de naam OnPinEvent(). OnPinEvent() maakt gebruik van een andere ternaire expressie die ook de bijbehorende Alert of Ready tekenreeksen schrijft.
    • De hoofdthread blijft voor onbepaalde tijd slapen terwijl het op pin-gebeurtenissen wacht.
  4. Bouw de app. Als u de .NET CLI gebruikt, voert u het volgende uit dotnet build. Druk op Ctrl+Shift+B om te bouwen in Visual Studio.

  5. Implementeer de app als een zelfstandige app in de SBC. Zie .NET-apps implementeren in Raspberry Pi voor instructies. Zorg ervoor dat u de uitvoerbare uitvoerbaar bestand uitvoeringsrechten 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 vergelijkbaar is met de volgende:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Koppel pin 21 los van de aarde. In de console wordt tekst weergegeven die vergelijkbaar is met de volgende:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Sluit pin 21 en grond opnieuw aan. In de console wordt tekst weergegeven die vergelijkbaar is met de volgende:

    (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 in elk scenario waarin een switch een circuit verbindt of onderbreekt. Hier volgt een voorbeeld van het gebruik van een magnetische reedschakelaar, die vaak wordt gebruikt om open deuren of ramen te detecteren.

GIF-animatie die een magnetische reedschakelaar opent en sluit demonstreert. De schakelaar wordt blootgesteld aan een magneet en de app geeft READY weer. De magneet wordt verwijderd en de app geeft ALERT weer. De actie wordt vervolgens herhaald.

Laser tripwire

Laten we, door voort te bouwen op het eerdere voorbeeldconcept, eens kijken hoe dit kan worden toegepast op het maken van een lasertripwire. Voor het bouwen van een laser tripwire zijn de volgende extra onderdelen vereist:

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

Opmerking

De sensormodule van de laserontvanger is de algemene naam die wordt toegepast op een algemene module die in veel internetwinkels is gevonden. Het apparaat kan variëren in naam of fabrikant, maar moet er ongeveer als volgt uitzien.

Afbeelding van een laserontvangersensormodule

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

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. Omdat het verzenden van de volledige 5V naar de pin de Raspberry Pi kan beschadigen, wordt de stroom van de ontvangermodule door een spanningsverdeler doorgegeven om de spanning te halveren naar 2,5V.

Broncode-updates aanbrengen

U kunt bijna dezelfde code gebruiken als eerder, met één uitzondering. In de andere voorbeelden hebben we gebruikt PinMode.InputPullUp , zodat wanneer de pin wordt losgekoppeld van de grond en het circuit is geopend, de pin wordt geretourneerd 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 sink voor stroom die afkomstig is van de laserontvangermodule. In dit geval openen we de speld met PinMode.InputPullDown. Op deze manier geeft de pin PinValue.Low aan wanneer er geen stroom is, en PinValue.High wanneer hij 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 zonder het, maar het gebruik van de verkeerde invoermodus riskeert schade aan uw Raspberry Pi!

Gif-animatie met een demonstratie van de laser tripwire. De laserzender licht de lasersensormodule aan 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