Číst v angličtině

Sdílet prostřednictvím


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:

Diagram znázorňující obvod, který spojuje uzemněný kolík se špendlíkem 21

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:

Diagram znázorňující pinout hlavičky Raspberry Pi GPIO Obrázek se svolením Raspberry Pi Foundation.
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:

  1. 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
    
  2. 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-*
    
  3. 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 Deklarace using 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.Highkolík .
    • 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 je PinValue.High, zapíše řetězec do konzoly Alert . V opačném případě zapíše Ready řetězec .
    • RegisterCallbackForPinValueChangedEvent() registruje funkci zpětného volání pro události a PinEventTypes.RisingPinEventTypes.Falling na pinu. Tyto události odpovídají stavům PinValue.High připnutí a PinValue.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 nebo Ready .
    • Hlavní vlákno po neomezenou dobu přepne do režimu spánku a čeká na události připnutí.
  4. Sestavení aplikace Pokud používáte .NET CLI, spusťte dotnet buildpříkaz . K sestavení v sadě Visual Studio stiskněte klávesu Ctrl+Shift+B.

  5. 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.

  6. 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 ✅
    
  7. Odpojte kolík 21 od země. Konzola zobrazí text podobný tomuto:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Znovu připojte kolík 21 a uzemte. Konzola zobrazí text podobný tomuto:

    (05/10/2022 16:00:25) READY ✅
    
  9. 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.

Animovaný obrázek GIF znázorňující otevírání a zavírání magnetického racínového přepínače Přepínač je vystaven magnetu a aplikace zobrazí připraveno. Magnet se odebere a aplikace zobrazí UPOZORNĚNÍ. Akce se pak zopakuje.

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.

Obrázek modulu snímače laserového přijímače

Připojení hardwaru laserového tripwire

Připojte komponenty, jak je podrobně popsáno v následujícím diagramu.

Diagram znázorňující obvod, který získává vstup z modulu snímače laserového přijímače

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.Highkolí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!

Animovaný obrázek GIF znázorňující ukázku laserového trojdrátku Laserový emitor rozsvítí modul laserového senzoru a aplikace zobrazí ready. Laserový paprsek je rozbitý a aplikace zobrazí UPOZORNĚNÍ. Akce se pak zopakuje.

Získání zdrojového kódu

Zdroj pro tento kurz je k dispozici na GitHubu.

Další kroky