Sdílet prostřednictvím


Použití GPIO pro binární vstup

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:

Diagram znázorňující obvod, který spojuje uzemněný kolík ke kolíku 21

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.

Diagram znázorňující zapojení 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í .NET CLI nebo Visual Studio. Pojmenujte ji InputTutorial.

    dotnet new console -o InputTutorial
    cd InputTutorial
    
  2. Př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-*
    
  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, že objekt je ukončen a hardwarové prostředky jsou uvolněny správně.
    • 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.
    • Počáteční stav se zapíše do konzoly pomocí ternárního výrazu. Aktuální stav pinu se čte pomocí Read(). Pokud PinValue.High, zapíše řetězec Alert do konzoly. V opačném případě zapíše řetězec Ready.
    • RegisterCallbackForPinValueChangedEvent() zaregistruje funkci zpětného volání pro události PinEventTypes.Rising a PinEventTypes.Falling na pinu. Tyto události odpovídají stavům pinů PinValue.High a PinValue.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ězce Alert nebo Ready.
    • Hlavní vlákno po neomezenou dobu spí při čekání na události připnutí.
  4. 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.

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

  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ý následujícímu:

    Initial status (05/10/2022 15:59:25): READY ✅
    
  7. Odpojte kolík 21 od země. Konzola zobrazí text podobný následujícímu:

    (05/10/2022 15:59:59) ALERT 🚨
    
  8. Znovu připojte kolík 21 a uzemnění. Konzola zobrazí text podobný následujícímu:

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

Animovaný GIF demonstrující magnetický reed spínač při otevření a uzavření. Spínač je vystaven magnetu a aplikace zobrazí PŘIPRAVENO. Magnet je odstraněn a aplikace zobrazí VÝSTRAHU. Akce se poté opakuje.

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.

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

Připojte laserový tripwire hardware

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 senzoru laserového přijímače

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!

Animovaný GIF znázorňující ukázku laserové pasti. Laserový emitor aktivuje modul laserového senzoru a aplikace zobrazí PŘIPRAVENO. Laserový paprsek je přerušen a aplikace zobrazí ALARM. Akce se pak opakuje.

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

Zdroj pro tento kurz je k dispozici na GitHubu.

Další kroky