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