První experimenty s GPIO – svítíme LED diodou a detekujeme pohyb

Prvotně publikováno na raspi.cz 29.6.2012.

Takže máme Raspberry Pi… co s ním? Přece ho nebudeme používat jako běžný počítač. Je to hračka pro bastlíře, pojďme k němu něco připojit.

Trocha teorie na úvod

Vedle držáku pro SD kartu je vyveden „expanzní konektor“ – 2x 13 pinů ve standardní rozteči desetiny palce. Konektor je dobře popsán na wiki projektu.

Dsc_20451

Na konektoru jsou vyvedeny sériové sběrnice SPI a I2C, těm se budeme věnovat příště. Dále je zde vyvedeno napájení 5V a 3.3V (obojí ovšem s poměrně malým povoleným odběrem) a pak je tu to nejdůležitější: 8 „general purpose“ portů, které mohou sloužit jako vstupní nebo výstupní.

POZOR! Všechny porty na expanzním konektoru (tj. nejen GPIO, ale i I2C a SPI sběrnice) jsou provozovány na napětí 3.3 V a nejsou tolerantní ke „standardním“ 5 V, které se vyskytují v bastlířské elektronice nejčastěji. Pokud na některý pin přivedete více než 3.3 V, můžete svému RPi udělat bebí, které se mu nezahojí.

Stejné varování se týká i povoleného maximálního odběru z jednotlivých pinů. Taháte přímo za nožičky procesoru – nečekejte, že tím budete přímo řídit velkou LED diodu či relátko. Určitě to krátkodobě něco vydrží, ale více než 1 mA z každého pinu  bych raději dlouhodobě neodebíral.

Všechny GPIO piny jsou dostupné jako speciální soubory v /sys filesystému. Ale pro používání těchto souborů musíte mít superuživatelská (root) práva, a to je špatně. Kdo s linuxem již někdy dělal, ví proč; kdo přichází ze světa Windows – prosím, berte to jako axiom. Lépe je psát aplikace, které nemusí běžet jako root.

Tady je řešení problému – aplikace, která GPIO zpřístupňuje normálním uživatelům. Nainstalujte podle návodu. Pak už je to snadné. Na začátku je potřeba GPIO port otevřít – říct, že ho budeme používat:

gpio-admin export 22

Port je následně dostupný jako soubor – třeba /sys/devices/virtual/gpio/gpio22/value . Tedy zobrazit jeho stav můžeme přímo v shellu:

cat /sys/devices/virtual/gpio/gpio22/value

(vypíše nulu nebo jedničku). Stejně tak do něj můžeme zapisovat. Nejprve mu otočíme směr na výstupní a pak můžeme začít řídit, zda z portu teče logická jednička (3.3 V) nebo nula:

echo out > /sys/devices/virtual/gpio/gpio22/direction
echo 1 > /sys/devices/virtual/gpio/gpio22/value

Jak se k portu fyzicky připojit?

Nejjednodušší mi přijde varianta koupit si kousek plochého kabelu (FBK26H v GM Electronics) a nacvakávací konektor (PFL26 v GM Electronics). Kabel (bez odizolovávání!) vložíme do konektoru na zoubky, které tam na něj čekají, a kleštěmi nebo svěrákem přimáčkneme horní část, dokud nezacvaknou zámky. Tím získáme kabel, který bezpečně (bez možnosti omylu, přepojení na špatné piny atd) nasadíme na Raspberry Pi a na druhém konci máme naše zařízení.

Svítíme si LED diodou

Abych RPi zbytečně nezatěžoval, koupil jsem LED diodu, které stačí proud 2 mA. Přes odpor 680 ohm jsem jí připojil mezi GPIO port 24 a zem. A pak stačilo:

gpio-admin export 24
echo out > /sys/devices/virtual/gpio/gpio24/direction
echo 1 > /sys/devices/virtual/gpio/gpio24/value

a LED se rozsvítila.

Detekce pohybu pomocí PIR čidla

Pro některé své projekty (např. krmítko pro ptáky s fotopastí) potřebuji detekovat, zda se v cílovém prostoru někdo pohybuje. To jde samozřejmě dělat přes webkameru a detekci změn v obraze, ale to je jednak náročné na výkon, a druhak to vůbec není elegantní. Navíc to nefunguje v noci.

Ale tenhle problém vyřešili výrobci zabezpečovací techniky už před lety. Řešení se jmenuje pohybové pasivní infračervené (PIR) čidlo. Takže jsem ze svého oblíbeného čínského e-shopu koupil hotový modul PIR čidla, akceptující 5V napájení a kompatibilní s 3.3V signalizací. Za méně než 6 dolarů, dodávka do evropy je zdarma. Cesta z číny mu trvala necelých deset dní – spousta českých e-shopů této rychlosti nedosahuje.

Zapojení je triviální – napájení na 5V port konektoru, zem na zem, a výstup na GPIO 21.

Pak jsem si sednul a napsal krátký program v shellu (jo, to se mi na linuxu líbí):

– otevři port 21 pro vstup a 24 pro výstup

– čekej na 0 na portu 21 (na začátku počkáme na stav „klid“)

– donekonečna opakuj:

    • čekej na 1 na portu 21 (PIR čidlo někoho vidí)
    • vypiš informaci na terminál
    • rozsviť LED diodu (1 na port 24)
    • čekej na 0 na portu 21 (už je zase klid)
    • vypiš informaci na terminál
    • zhasni LED diodu (0 na port 24)

Spustil jsem to … a fungovalo to.


Příště: kterak zařídit, aby RPi vědělo i bez internetu, kolik je hodin

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s