Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Kolíky GPIO pro obecné účely 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ření/zavření okruhu. Takové obvody mohou zahrnovat tlačítka, kolébkové spínače, jazýčkové spínače, tlakové spínače a další zařízení, která představují binární (zapnuté/vypnuté) hodnoty uzavřením obvodu.
V tomto kurzu použijete .NET a piny GPIO Raspberry Pi ke zjištění otevření a uzavření okruhu.
Požadavky
- Počítač s jednou deskou (SBC) založený na ARM (ARMv7 nebo novější)
- Propojovací vodiče
- Popis cesty (volitelné)
- Rozšiřující deska GPIO pro Raspberry Pi (volitelná)
- .NET SDK 8 nebo novější
Poznámka:
Tento kurz je napsán za předpokladu, že cílové zařízení je Raspberry Pi. Tento kurz však lze použít pro jakýkoli linuxový SBC, který podporuje .NET, jako je Orange Pi, ODROID a další.
Ujistěte se, že je na vašem zařízení povolený protokol SSH. V případě Raspberry Pi si přečtěte téma 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 uzemňujícím kolíkem a špendlíkem 21.
Návod
Diagram znázorňuje protoboard a GPIO breakout pro ilustrativní účely, ale neváhejte jen připojit uzemněný kolík a kolík 21 propojovacím drátem na Raspberry Pi.
Podle potřeby si projděte následující vývodové schéma.
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í .NET CLI nebo Visual Studio. Pojmenujte ji InputTutorial.
dotnet new console -o InputTutorial cd InputTutorialPřidejte do projektu balíček System.Device.Gpio . Použijte .NET CLI z adresáře projektu nebo sady Visual Studio.
dotnet add package System.Device.Gpio --version 3.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. Deklaraceusingzajišťuje, že objekt je ukončen a hardwarové prostředky jsou uvolněny správně.-
GpioControllerje vytvořen bez parametrů, aby detekoval hardwarovou platformu, na které běží, a použil schéma číslování logických pinů.
-
- GPIO pin 21 je otevřen pomocí
PinMode.InputPullUp.- Tím se otevře pin se zapojeným rezistorem PullUp. V tomto režimu, když je kolík připojen k zemi, vrátí
PinValue.Low. Když je kolík odpojen od země a okruh je otevřený, kolík vrátíPinValue.High.
- Tím se otevře pin se zapojeným rezistorem PullUp. V tomto režimu, když je kolík připojen k zemi, vrátí
- Počáteční stav se zapíše do konzoly pomocí ternárního výrazu. Aktuální stav pinu se čte pomocí
Read(). PokudPinValue.High, zapíše řetězecAlertdo konzoly. V opačném případě zapíše řetězecReady. -
RegisterCallbackForPinValueChangedEvent()zaregistruje funkci zpětného volání pro událostiPinEventTypes.RisingaPinEventTypes.Fallingna pinu. Tyto události odpovídají stavům pinůPinValue.HighaPinValue.Low, v uvedeném pořadí. - Funkce zpětného volání odkazuje na metodu volanou
OnPinEvent().OnPinEvent()používá jiný ternární výraz, který zapisuje odpovídající řetězceAlertneboReady. - Hlavní vlákno po neomezenou dobu spí při čekání na události připnutí.
- Deklarace using vytvoří instanci
Sestavení aplikace Pokud používáte .NET CLI, spusťte
dotnet build. Pokud chcete sestavovat v sadě Visual Studio, stiskněte kombinaci kláves 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 spustitelnému souboru udělíte oprávnění execute pomocí
chmod +x.Spusťte aplikaci na Raspberry Pi přepnutím do adresáře nasazení a spuštěním spustitelného souboru.
./InputTutorialKonzola zobrazí text podobný následujícímu:
Initial status (05/10/2022 15:59:25): READY ✅Odpojte kolík 21 od země. Konzola zobrazí text podobný následujícímu:
(05/10/2022 15:59:59) ALERT 🚨Znovu připojte kolík 21 a uzemnění. Konzola zobrazí text podobný následujícímu:
(05/10/2022 16:00:25) READY ✅Ukončete program stisknutím kláves Ctrl+C.
Gratulujeme! Pomocí balíčku NuGet jste použili GPIO k detekci vstupu System.Device.Gpio. Pro tento typ vstupu existuje mnoho použití. Tento příklad lze použít s jakýmkoli scénářem, kdy se přepínač připojí nebo přeruší okruh. Zde je příklad použití s magnetickým jazýčkovým spínačem, který se často používá k detekci otevřených dveří nebo oken.
Laser tripwire
Trochu rozšíříme předchozí příklad a podíváme se na to, jak to lze použít pro vytváření laserového spouštěcí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 senzoru laserového přijímače (viz poznámka níže)
- 2× 10kΩ rezistory
Poznámka:
Modul senzoru laserového přijímače je obecný název použitý u běžného modulu nalezeného u mnoha internetových prodejců. Zařízení se může lišit podle názvu nebo výrobce, ale mělo by vypadat podobně jako na tomto obrázku.
Připojte laserový tripwire hardware
Připojte komponenty, jak je podrobně popsáno v následujícím diagramu.
Věnujte velkou 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 poškozený. Raspberry Pi podporuje pouze 3,3V pro vstup GPIO. Vzhledem k tomu, že dodávání plného napětí 5V na pin by mohlo poškodit Raspberry Pi, je proud z modulu přijímače veden přes rozdělovač napětí, který sníží napětí na 2,5V.
Použití aktualizací zdrojového kódu
Téměř můžete použít stejný kód jako dříve, s jednou výjimkou. V dalších příkladech jsme použili PinMode.InputPullUp, aby se při odpojení pinu od země a otevření okruhu pin vrátil PinValue.High.
V případě modulu laserového přijímače ale nerozpoznáme otevřený obvod. Místo toho chceme, aby špendlí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 kolík s použitím PinMode.InputPullDown. Tímto způsobem vývod vrátí PinValue.Low, když nedostává žá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 testováním laserového tripwire se ujistěte, že kód nasazený na Raspberry Pi tuto změnu zahrnuje. 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.