A GPIO használata bináris bemenethez
Az általános célú I/O (GPIO) tűk konfigurálhatók úgy, hogy bemenetként fogadják az elektromos jeleket. Ez a legalapvetőbb szinten olyan forgatókönyvek esetében hasznos, amelyek észlelik egy kapcsolatcsoport megnyitását/bezárását. Az ilyen áramkörök lehetnek nyomógombok, váltókapcsolók, reed kapcsolók, nyomáskapcsolók és egyéb eszközök, amelyek bináris (be- és kikapcsolt) értékeket képviselnek egy kapcsolatcsoport befejezésével.
Ebben az oktatóanyagban a .NET-et és a Raspberry Pi GPIO-tűit fogja használni egy kapcsolatcsoport megnyitásának és bezárásának észleléséhez.
Előfeltételek
- ARM-alapú (ARMv7 vagy újabb) egytáblás számítógép (SBC)
- Jumper drótok
- Rajztábla (nem kötelező)
- Raspberry Pi GPIO melléktábla (nem kötelező)
- .NET SDK 7 vagy újabb
Megjegyzés
Ez az oktatóanyag azt feltételezve íródott, hogy a céleszköz Raspberry Pi. Ez az oktatóanyag azonban minden olyan Linux-alapú SBC-hez használható, amely támogatja a .NET-et, például az Orange Pi-t, az ODROID-ot és egyebeket.
Győződjön meg arról, hogy az SSH engedélyezve van az eszközön. Raspberry Pi esetén tekintse meg az SSH-kiszolgáló beállítását a Raspberry Pi dokumentációjában.
A hardver előkészítése
A kapcsolatcsoportot a hardverösszetevők használatával hozhatja létre az alábbi ábrán látható módon:
A fenti kép egy közvetlen kapcsolatot ábrázol egy földelt tű és a 21-edik tű között.
Tipp
A diagram egy rajztáblát és EGY GPIO-törést ábrázol szemléltető célokra, de nyugodtan csatlakoztassa a 21-es csapot egy ugróhuzallal a Raspberry Pi-n.
Szükség szerint tekintse meg a következő kitűződiagramot:
Kép jóvoltból Raspberry Pi Foundation.
Az alkalmazás létrehozása
Hajtsa végre a következő lépéseket az előnyben részesített fejlesztési környezetben:
Hozzon létre egy új .NET-konzolalkalmazást a .NET CLI vagy a Visual Studio használatával. Adja neki az InputTutorial nevet.
dotnet new console -o InputTutorial cd InputTutorial
Adja hozzá a System.Device.Gpio csomagot a projekthez. Használja a .NET CLI-t a projektkönyvtárból vagy a Visual Studióból.
dotnet add package System.Device.Gpio --version 2.2.0-*
Cserélje le a Program.cs fájl tartalmát a következő kódra:
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)}"); }
A fenti kód a következőket végzi el:
- A using deklaráció létrehozza a példányát.
GpioController
Ausing
deklaráció biztosítja az objektum megsemmisítését és a hardvererőforrások megfelelő kiadását.-
GpioController
paraméter nélkül példányosítva van, ami azt jelzi, hogy észlelnie kell, hogy melyik hardverplatformon fut, és a logikai pin-számozási sémát kell használnia.
-
- A GPIO pin 21 a-vel
PinMode.InputPullUp
van megnyitva.- Ezzel megnyitja a gombostűt egy PullUp-ellenállással . Ebben a módban, ha a tű földhöz csatlakozik, a visszaadja
PinValue.Low
a következőt: . Ha a csap le van választva a földről, és a kapcsolatcsoport nyitva van, a tű a következőt adjaPinValue.High
vissza: .
- Ezzel megnyitja a gombostűt egy PullUp-ellenállással . Ebben a módban, ha a tű földhöz csatlakozik, a visszaadja
- A kezdeti állapotot a rendszer egy konzolra írja egy ternáris kifejezéssel. A gombostű aktuális állapotát a következővel olvassa be:
Read()
. Ha azPinValue.High
, akkor a sztringetAlert
a konzolra írja. Ellenkező esetben a sztringetReady
írja. -
RegisterCallbackForPinValueChangedEvent()
egy visszahívási függvényt regisztrál a ésPinEventTypes.Falling
azPinEventTypes.Rising
eseményhez a pin-kódon. Ezek az események a ésPinValue.Low
a pin-állapotánakPinValue.High
felelnek meg. - A visszahívási függvény egy nevű
OnPinEvent()
metódusra mutat.OnPinEvent()
egy másik ternáris kifejezést használ, amely a megfelelőAlert
vagyReady
sztringeket is megírja. - A fő szál határozatlan ideig alszik, miközben a pin-eseményekre vár.
- A using deklaráció létrehozza a példányát.
Az alkalmazás létrehozása. Ha a .NET CLI-t használja, futtassa a parancsot
dotnet build
. A Visual Studióban való buildeléshez nyomja le a CtrlShift+Bbillentyűkombinációt+.Helyezze üzembe az alkalmazást az SBC-ben önálló alkalmazásként. Útmutatásért lásd: .NET-alkalmazások üzembe helyezése a Raspberry Pi-ben. Győződjön meg arról, hogy a végrehajtható végrehajtási engedélyt a használatával
chmod +x
adja meg.Futtassa az alkalmazást a Raspberry Pi-n az üzembehelyezési könyvtárra való váltással és a végrehajtható fájl futtatásával.
./InputTutorial
A konzol a következőhöz hasonló szöveget jelenít meg:
Initial status (05/10/2022 15:59:25): READY ✅
Bontsa le a 21-et a földről. A konzol a következőhöz hasonló szöveget jelenít meg:
(05/10/2022 15:59:59) ALERT 🚨
Csatlakoztassa újra a 21-et és a talajt. A konzol a következőhöz hasonló szöveget jelenít meg:
(05/10/2022 16:00:25) READY ✅
Állítsa le a programot a CtrlC billentyű lenyomásával+.
Gratulálunk! A GPIO használatával észlelte a bemenetet a System.Device.Gpio
NuGet-csomag használatával! Az ilyen típusú bemenetek sokféleképpen használhatók. Ez a példa bármely olyan forgatókönyvhöz használható, amikor egy kapcsoló csatlakozik vagy megszakít egy kapcsolatcsoportot. Íme egy példa, amely mágneses reval használja, amelyet gyakran használnak nyitott ajtók vagy ablakok észlelésére.
Lézeres tripwire
Az előző példakoncepciót egy kicsit tovább bővítve vizsgáljuk meg, hogyan lehetne ezt alkalmazni egy lézeres tripwire létrehozásához. A lézeres tripwire létrehozásához a következő további összetevők szükségesek:
- KY-008 lézeres adómodul
- Lézerérzékelő modul (lásd az alábbi megjegyzést)
- 2 10 000 Ω ellenállás
Megjegyzés
A lézerérzékelős modul egy általános név, amelyet számos internetes kereskedő közös moduljára alkalmaztak. Az eszköz neve vagy gyártója eltérő lehet, de ennek a képnek kell hasonlítania.
Lézeres tripwire hardver csatlakoztatása
Csatlakoztassa az összetevőket az alábbi ábrán leírtak szerint.
Ügyeljen a 10K Ω ellenállásra. Ezek feszültségelosztót alkalmaznak. Ennek az az oka, hogy a lézerérzékelő modul 5V-os kimenetet ad ki, jelezve, hogy a nyaláb megszakadt. A Raspberry Pi csak 3,3V-os GPIO-bemenetet támogat. Mivel a teljes 5V-os tűre való küldése károsíthatja a Raspberry Pi-t, a vevőmodul árama egy feszültségelosztón keresztül halad át, hogy a feszültséget 2,5V-ra felezze.
Forráskódfrissítések alkalmazása
Egy kivétellel szinte ugyanazt a kódot használhatja, mint korábban. A többi példában úgy használtuk PinMode.InputPullUp
, hogy amikor a tű le van választva a földről, és a kapcsolatcsoport nyitva van, a tű a következőt adja PinValue.High
vissza: .
A lézerérzékelő modul esetében azonban nem észlelünk nyitott áramkört. Ehelyett azt szeretnénk, hogy a tű fogadóként működjön a lézerérzékelő modulból érkező áramhoz. Ebben az esetben a gombostűt a következővel PinMode.InputPullDown
nyitjuk meg: . Ily módon a tű akkor ad vissza PinValue.Low
, ha nincs áram, és PinValue.High
amikor áramot fogad a lézerérzékelő modulból.
controller.OpenPin(pin, PinMode.InputPullDown);
Fontos
A lézeres tripwire tesztelése előtt győződjön meg arról, hogy a Raspberry Pi-on üzembe helyezett kód tartalmazza ezt a módosítást. A program nem működik nélküle, de ha nem a megfelelő bemeneti módot használja, az károsíthatja a Raspberry Pi-t!
A forráskód lekérése
Az oktatóanyag forrása a GitHubon érhető el.