Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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:
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:
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 deze de naam InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
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-*
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
. Deusing
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 naarPinValue.High
.
- Hiermee opent u de pin met een PullUp-weerstand ingeschakeld. In deze modus wordt, wanneer de pin is verbonden met de aarde,
- 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 hetPinValue.High
is, schrijft hij deAlert
tekenreeks naar de console. Anders wordt deReady
tekenreeks geschreven. -
RegisterCallbackForPinValueChangedEvent()
registreert een callback-functie voor zowel dePinEventTypes.Rising
als dePinEventTypes.Falling
gebeurtenissen op de pin. Deze gebeurtenissen komen overeen met de pinstatus vanPinValue.High
enPinValue.Low
, respectievelijk. - De callback-functie verwijst naar een methode met de naam
OnPinEvent()
.OnPinEvent()
maakt gebruik van een andere ternaire expressie die ook de bijbehorendeAlert
ofReady
tekenreeksen schrijft. - De hoofdthread blijft voor onbepaalde tijd slapen terwijl het op pin-gebeurtenissen wacht.
- Een using-declaratie maakt een exemplaar van
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.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
.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 ✅
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 🚨
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 ✅
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.
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.
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. 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!
De broncode ophalen
De bron voor deze zelfstudie is beschikbaar op GitHub.