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 10 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, 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 rozhraní příkazového řádku .NET z adresáře projektu nebo Visual Studio.
dotnet package add System.Device.Gpio --version 4.0.1Obsah 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 správně zlikvidován a hardwarové prostředky jsou uvolněny.-
GpioControllerje vytvořena instance bez parametrů, což znamená, že detekuje hardwarovou platformu, na které běží, a použije logické číslování kolíků.
-
- Pin GPIO 21 je otevřen s
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 zemi, vrátí
PinValue.Low. Když je pin odpojen od země a okruh je otevřený, pin vrátíPinValue.High.
- Tím se otevře kolík se zasunutý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(). Pokud je toPinValue.High, zapíše řetězecAlertdo konzoli. V opačném případě zapíše řetězecReady. -
RegisterCallbackForPinValueChangedEvent()nastaví funkci zpětného volání pro událostiPinEventTypes.RisingaPinEventTypes.Fallingna pinu. Tyto události odpovídají stavůmPinValue.HighaPinValue.Lowpinů, respektive. - Funkce zpětného volání odkazuje na metodu volanou
OnPinEvent().OnPinEvent()používá jiný ternární výraz, který také zapisuje odpovídající řetězecAlertneboReady. - 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 rozhraní příkazového řádku .NET, spusťte
dotnet build. Pokud chcete sestavit projekt ve Visual Studiu, stiskněte Ctrl+Shift+B.Nasaďte aplikaci do SBC jako samostatnou aplikaci. Pokyny najdete v tématu Deploy .NET aplikací na Raspberry Pi. Ujistěte se, že dáte spustitelnému souboru oprávnění k provádění 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! Použili jste GPIO k detekci vstupu pomocí balíčku NuGet 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 do stavu 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 pin pomocí PinMode.InputPullDown. Tímto způsobem pin vrátí hodnotu PinValue.Low, když nedostává žádný proud, a PinValue.High, když přijímá proud z 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 tohoto kurzu je k dispozici na GitHub.