Použití GPIO pro binární vstup
Kolíky GPIO (General-Purpose I/O) lze nakonfigurovat tak, aby přijímaly elektrické signály jako vstup. Na nejzásadnější úrovni je to užitečné ve scénářích, které detekují otevírání a zavírání okruhu. Tyto obvody mohou zahrnovat tlačítka, přepínače, perové spínače, tlakové spínače a další zařízení, která představují binární (zapnuto/vypnuto) hodnoty dokončením okruhu.
V tomto kurzu použijete .NET a piny GPIO raspberry Pi k detekci otevření a zavření okruhu.
Požadavky
- Počítač s jednou deskou (SBC) s procesorem ARM (ARMv7 nebo vyšším)
- Dráty propojek
- Breadboard (volitelné)
- Breakout board Raspberry Pi GPIO (volitelné)
- .NET SDK 7 nebo novější
Poznámka
Tento kurz je napsán za předpokladu, že cílové zařízení je Raspberry Pi. Tento kurz se ale dá použít pro jakýkoli linuxový SBC, který podporuje .NET, například Orange Pi, ODROID a další.
Ujistěte se, že je na vašem zařízení povolený protokol SSH. Informace o Raspberry Pi najdete v tématu Nastavení serveru SSH v dokumentaci k Raspberry Pi.
Příprava hardwaru
Pomocí hardwarových komponent sestavte okruh, jak je znázorněno v následujícím diagramu:
Obrázek výše znázorňuje přímé spojení mezi uzemněnou kolíkem a kolíkem 21.
Tip
Diagram znázorňuje breadboard a GPIO breakout pro ilustrativní účely, ale nebojte se připojit uzemněný kolík a připnout 21 pomocí propojkového drátu na Raspberry Pi.
Podle potřeby si projděte následující diagram pinout:
Obrázek se svolením Raspberry Pi Foundation.
Vytvoření aplikace
V upřednostňovaném vývojovém prostředí proveďte následující kroky:
Vytvořte novou konzolovou aplikaci .NET pomocí rozhraní příkazového řádku .NET nebo sady Visual Studio. Pojmenujte ji InputTutorial.
dotnet new console -o InputTutorial cd InputTutorial
Přidejte do projektu balíček System.Device.Gpio . Použijte rozhraní příkazového řádku .NET z adresáře projektu nebo sadu Visual Studio.
dotnet add package System.Device.Gpio --version 2.2.0-*
Obsah souboru Program.cs nahraďte tímto kódem:
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)}"); }
V předchozím kódu:
-
Deklarace using vytvoří instanci .
GpioController
Deklaraceusing
zajišťuje odstranění objektu a správné uvolnění hardwarových prostředků.-
GpioController
Instance se vytvoří bez parametrů, což znamená, že by měl zjistit, na které hardwarové platformě běží, a použít schéma logického číslování PIN.
-
- Pin GPIO 21 se otevírá pomocí
PinMode.InputPullUp
.- Tím se otevře kolík se zasunutým rezistorem PullUp . V tomto režimu, když je kolík připojený k uzemnění, vrátí
PinValue.Low
. Když je kolík odpojený od země a okruh je otevřený, vrátíPinValue.High
kolík .
- Tím se otevře kolík se zasunutým rezistorem PullUp . V tomto režimu, když je kolík připojený k uzemnění, vrátí
- Počáteční stav se zapíše do konzoly pomocí ternárního výrazu. Aktuální stav špendlíku se přečte pomocí
Read()
. Pokud jePinValue.High
, zapíše řetězec do konzolyAlert
. V opačném případě zapíšeReady
řetězec . -
RegisterCallbackForPinValueChangedEvent()
registruje funkci zpětného volání pro události aPinEventTypes.Rising
PinEventTypes.Falling
na pinu. Tyto události odpovídají stavůmPinValue.High
připnutí aPinValue.Low
. - Funkce zpětného volání odkazuje na metodu s názvem
OnPinEvent()
.OnPinEvent()
používá jiný ternární výraz, který také zapisuje odpovídajícíAlert
řetězce neboReady
. - Hlavní vlákno po neomezenou dobu přepne do režimu spánku a čeká na události připnutí.
-
Deklarace using vytvoří instanci .
Sestavení aplikace Pokud používáte .NET CLI, spusťte
dotnet build
příkaz . K sestavení v sadě Visual Studio stiskněte klávesu Ctrl+Shift+B.Nasaďte aplikaci do SBC jako samostatnou aplikaci. Pokyny najdete v tématu Nasazení aplikací .NET do Raspberry Pi. Ujistěte se, že jste spustitelnému souboru dali oprávnění ke spuštění pomocí příkazu
chmod +x
.Spusťte aplikaci na Raspberry Pi přepnutím do adresáře nasazení a spuštěním spustitelného souboru.
./InputTutorial
Konzola zobrazí text podobný tomuto:
Initial status (05/10/2022 15:59:25): READY ✅
Odpojte kolík 21 od země. Konzola zobrazí text podobný tomuto:
(05/10/2022 15:59:59) ALERT 🚨
Znovu připojte kolík 21 a uzemte. Konzola zobrazí text podobný tomuto:
(05/10/2022 16:00:25) READY ✅
Ukončete program stisknutím klávesy Ctrl+C.
Gratulujeme! Pomocí GPIO jste detekovali vstup pomocí System.Device.Gpio
balíčku NuGet. Tento typ vstupu má mnoho použití. Tento příklad lze použít v jakémkoli scénáři, kdy přepínač připojí nebo přeruší okruh. Tady je příklad použití s magnetickým jažbovým přepínačem, který se často používá k detekci otevřených dveří nebo oken.
Laser tripwire
Když rozšíříme koncept předchozího příkladu o trochu dál, podíváme se na to, jak by se to dalo použít při vytváření laserového trojdrátového drátu. Vytvoření laserového tripwire vyžaduje následující další součásti:
- Modul laserového vysílače KY-008
- Modul snímače laserového přijímače (viz poznámka níže)
- 2 rezistory Ω 10K
Poznámka
Modul snímače laserového přijímače je obecný název, který se používá u běžného modulu, který se nachází u mnoha internetových prodejců. Název nebo výrobce zařízení se může lišit, ale mělo by se podobat tomuto obrázku.
Připojení hardwaru laserového tripwire
Připojte komponenty, jak je podrobně popsáno v následujícím diagramu.
Věnujte zvýšenou pozornost 10K Ω rezistorům. Ty implementují rozdělovač napětí. Je to proto, že modul laserového přijímače výstupem 5V označuje, že paprsek je rozbitý. Raspberry Pi podporuje pouze 3,3V pro vstup GPIO. Vzhledem k tomu, že odeslání plného 5V do kolíku by mohlo poškodit Raspberry Pi, proud z modulu přijímače prochází přes rozdělovač napětí na polovinu napětí na 2,5V.
Použití aktualizací zdrojového kódu
Můžete použít téměř stejný kód jako dříve, s jednou výjimkou. V ostatních příkladech jsme použili PinMode.InputPullUp
tak, že když je kolík odpojený od země a okruh je otevřený, vrátí PinValue.High
kolík .
V případě modulu laserového přijímače ale nedetekujeme otevřený okruh. Místo toho chceme, aby kolík fungoval jako jímka pro proud přicházející z modulu laserového přijímače. V tomto případě otevřeme špendlík pomocí PinMode.InputPullDown
. Tímto způsobem se kolík vrátí PinValue.Low
, když nepřibírá žádný proud a PinValue.High
když přijímá proud z modulu laserového přijímače.
controller.OpenPin(pin, PinMode.InputPullDown);
Důležité
Před otestování laserového tripwire se ujistěte, že kód nasazený na Raspberry Pi obsahuje tuto změnu. Program funguje bez něj, ale použití nesprávného vstupního režimu riskuje poškození vašeho Raspberry Pi!
Získání zdrojového kódu
Zdroj pro tento kurz je k dispozici na GitHubu.