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:
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:
Afbeelding met dank aan Raspberry Pi Foundation.
De app maken
Voer de volgende stappen uit in de ontwikkelomgeving van uw voorkeur:
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
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-*
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
GpioController
gemaakt. Deusing
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.Low
deze . Wanneer de pin is losgekoppeld van de grond en het circuit open is, retourneertPinValue.High
de pin .
- Hiermee opent u de speld met een PullUp-weerstand ingeschakeld. In deze modus, wanneer de pin is verbonden met de grond, retourneert
- 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 isPinValue.High
, wordt deAlert
tekenreeks naar de console geschreven. Anders wordt deReady
tekenreeks geschreven. -
RegisterCallbackForPinValueChangedEvent()
registreert een callback-functie voor dePinEventTypes.Rising
gebeurtenissen enPinEventTypes.Falling
op de pincode. Deze gebeurtenissen komen overeen met de vastgemaakte statussen vanPinValue.High
respectievelijk enPinValue.Low
. - De callback-functie verwijst naar een methode met de naam
OnPinEvent()
.OnPinEvent()
gebruikt een andere ternaire expressie waarmee ook de bijbehorendeAlert
tekenreeksen ofReady
worden geschreven. - De hoofdthread slaapt voor onbepaalde tijd terwijl wordt gewacht op vastgemaakte gebeurtenissen.
- Met een using-declaratie wordt een exemplaar van
de app bouwen. Als u de .NET CLI gebruikt, voert u uit
dotnet build
. Druk op Ctrl+Shift+B om Visual Studio te bouwen.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
.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 ✅
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 🚨
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 ✅
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.
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.
Laser tripwire-hardware aansluiten
Verbind de onderdelen zoals beschreven in het volgende diagram.
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!
De broncode ophalen
De bron voor deze zelfstudie is beschikbaar op GitHub.