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

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

36 thoughts on “První experimenty s GPIO – svítíme LED diodou a detekujeme pohyb

  1. Super článek, už se nemůžu dočkat dalšího pokračování, zatím teprve čekám na malinu, ale její možnosti mě nepřestávají udivovat :-) Díky za tyhle články!

  2. Ahoj, diky za clanek. Malina je tez objednana, ale rikam si, pac sem uplnej elktronepolibenej….proc zapojujes odpor a proc zrovna 680ohm. To nejde napojit naprimo a podle ceho urcim, co mezi dany soucastky zapojit? Doporucis nejakej tutorial jak to vubec v elektrobastleni funguje? Dik

    • Ahoj, pokusim se vysvetlit problematiku LED. Zkratka LED znamena „svetlo vyzarujici dioda“, tzn ze se jedna o polovodic. Napriklad zarovka polovodic neni a jiz sama o sobe ma elektricky odpor, ale LED nema a proto se tam musi dodat. Pri vypoctu je odporu se vyuzije ohmuv zakon U=R*I (U napeti, R odpor, I proud). Pokud chceme znat odpor, tak R=U/I. Napeti dosadime napajeci napeti (nebo uroven logicke 1) a za proud dosadime maximalni pripustny proud (bud maximalni proud LED, nebo maximalni proud pinu zarizeni – maliny). Led maji standardne 20mA, nebo nizkoodberove 2mA=0,002Amper. pokud by tam odpor nebyl tak by pri logicke 1 sel pin do zkratu a protekal by maximalni mozny proud a pokud neni osetreno, znicila by se bud LED nebo zarizeni. Tak a ted vypocet. od napajeciho napeti je potreba jeste odecist ubytek napeti na LED (zavisle dle LED napr obyc zelena ma 1,9V)

      Takze pri logicke urovni 3,3V a pouziti nizkoodberove LED, me vychazi odpor R=3,3-1,9/0,002=700ohm (v clanku autor zrejme pouzil jiny typ diody s vetsim ubytkem muze byt klidne i 2,5V). Presne tato hodnota se neprodava, takze se vybere nejblizsi vyssi. Jeste bych ale upozornil, ze autor rika, ze by mel byt stali proud jen 1mA, tzn., ze by bylo vhodne upravit vypocet R=3,3-1,9/0,001 pak by byl odpor 1400ohm (1K4) a LED by svitila na 50%. Pri spinani vetsich proudu by se pouzil bud optoclen (vetsi bezpecnost a galvanicke oddeleni), nebo tranzistor.

        • Hledal jsem takové schéma a našel jednodušší řešení.Jeden brouček ADUM1250arz pro galvanické oddělení I2C sběrnice a za ním 16bit I/O expandér.Máš jistých 16 vstupů nebo výstupů,a nemusíš se strachovat o PI. Za expander jsem pro posílení ještě dal driver ULN2803AP abych mohl pohánět krokové motorky.Takže mám tři brouky a dva odpory na výstupu adum1250 .

      • Dovolím si nesouhlasit s vým vyjádřením ohledně LED. LEDka neměla svůj odpor je absolutní nesmysl(jeho závislost je ale nelineární. Odpor předřazujeme proto, protože LED dioda pracuje s napětím nižším než 3,3V a proto musíme nastavit správný praconí bod vhodným předřadníkem.

        • U polovodicu je vhodne spise mluvit o vodivosti, ale dejme tomu. Takze je to tak , ze ve stavu kdy sviti, tak je odpor velmi maly, kdyz nesviti, tak je velky (lavinovy efekt atd). A opakuji odpor je tam proto aby omezil proud, ne (jen) proto aby snizil napeti !!! Pokud pripojite LED na silny zdroj 2V a led je na 2V a nedate tam predradny odpor, tak proud bude diky velmi malemu odporu LED velky a snadno prekona max proud LED (2 nebo standartne 20mA) a dojde ke ZNICENI LED !!! takze tvrzeni „LED nema el proud“ bylo mysleno, ze je velmi mali a pro vypocet zanedbatelny ( stejne tak muze znit otazka jaky odpor ma tranzistor v otevrenem stavu?). V praxi ale vetsina lidi pripojuje LED k TTL zarizeni primo a nic se nestane, ale to je z toho duvodu ze TTL zarizeni vice jak 20mA neumi dodat, ale toto reseni je spatne. Stejne tak jako se mezi 2 zarizeni TTL dava do serie odpor, je to proto aby se ochranil pin zarizeni a neteklo pres nej nikdy vic nez dovoleny proud.

          • Svatá prostoto…
            Jestliže připojíte 2V diodu na 2 V, tak jí bude procházet nominální proud, takže diodě se NIC NESTANE! Proč by proboha mělo?!
            V případě, že připojíme diodu na 5V TTL, tak obvody TTL mají tak velký vnitřní odpor, že dioda ani nedosáhne projektovaného pracovního bodu, protože v TTL dojde k takovému úbytku napětí, že na diodě místo 5 V bude třeba jen 1,5 V (úbytek v TTL 3,5 V; taky může TTL krásně shořet, žeáno).
            Takže pokles proudu diodou je opravdu dán snížením napětí na diodě způsobeného úbytkem napětí na předřadném rezistoru – napětí se dělí mezi rezistor a diodu. Pro vše stále platí otřepaná rovnice U=I*R, přičemž ale odpor diody je dynamický a tím závislost proudu na napětí diody nelineární, takže pracovní bod nejde jednoduše spočítat a obvykle se odečítá z grafu (http://fyzika.smoula.net/data/images/VA_char.bmp).

            • No.
              Rozhodně vhodnější držet se doporučení výrobců, kteří určují jmenovitý proud. Napětí na diodě je při daném proudu dané s odchylkami, danými výrobními odchylkami, a platí jen při definované teplotě přechodu.
              Proto LED napájíme proudovým zdrojem, že… Předřazený rezistor je takové hodně jednoduché, ale většinou dostatečně funkční řešení pro jakous stabilizaci proudu.
              Tudíž – připojit diodu na 2V přímo na zdroj napětí 2V je prostě špatně.

              To se pak někteří nešťastníci diví, že se jim za půl roku svícení diody vysvítí. Bodejť nek, když nejsou napájený proudovým, ale napěťovým zdrojem…
              Aspoň jsem se to tak teda učil ve škole…
              K.

  3. Ahoj všem,

    chtěl bych se zeptat jak se jmenuje ta plastová bílá věc (popř. k čemu slouží) na obrázku, do který to máš zapojený, Dík ;)

    PS:Máiě super web i návody :)

  4. Mohl bych poprosit o zveřejnění toho skriptu?
    V terminálu ručně dokážu už bez problému číst tlačítko a blikat s ledkou, ale když chci napsat skript, tak mi to hlásí chybu hned na prvním řádku v příkazu
    gpio-admin export 22
    (hlásí to : is not a valid GPIO pin number) Když ten samý příkaz zadám přímo do terminálu, tak je to v pořádku.

    Nikdy jsem skripty v linuxu nepsal, a tak by mi zveřejnění tohoto příkladu pomohlo.

    • Tak už jsm na to přišel sám. Hlavní problém byl ve špatných ukončních řádku.(CR/LF). Když jsem to upravil, tak se mi povedlo nějaké ty příklady rozběhnout.
      Skript pro podobný příklad jako je v článku jsem splácal takhle:

      =======
      #!/bin/bash

      gpio-admin export 22
      gpio-admin export 18
      echo out > /sys/devices/virtual/gpio/gpio18/direction

      minulystav=“1″

      while [ „1“ == „1“ ]
      do

      stav22=`cat /sys/devices/virtual/gpio/gpio22/value`

      if [ $minulystav != $stav22 ]; then

      if [ „$stav22“ -eq „0“ ]; then
      echo 1 > /sys/devices/virtual/gpio/gpio18/value
      echo „stisknute tlacitko – `date`“
      else
      echo 0 > /sys/devices/virtual/gpio/gpio18/value
      echo „uvolnene tlacitko – `date`“
      fi
      minulystav=$stav22
      fi

      sleep 1
      done

      ======
      Jsem fakt začátečník, a ještě nevím, jak udělat „nekonečnou smyčku“, tak jsem tam použil podmínku „dokud 1 = 1 ….“ Asi by to šlo napsat líp, ale tohle fungovalo.

      Je to nastavené pro GPIO porty 22(tlačítko) a 18(LED).

      Když jsem ten skript chtěl spustit podruhé, tak mi to hlásilo, nějaké problémy při otevírání a nastavování portů, tak jsem ty první tři řádky zakomentoval a šlapalo to taky.

      Jdu se dál učit …

      • Ahoj, tu chyby, co Ti to hlásilo při druhém spuštění se dají lehce vysvětlit. Příkaz „gpio-admin export XY“ totiž slouží k tomu, že Ti daný GPIO pin „otevře“ a vyhradí, tzn. že při pokusu o další „otevření“ stejného portu, tzn. zopakování tohoto příkazu, to vyhodí chybu, co jsi viděl, tedy že pin už někdo používá. Správně bys „otevření“ těch pinů měl ve svém skriptu nechat. Pokud už máš pin(y) „otevřené“, tak by fungoval, ale např. po restartu Raspberry Pi by nefungoval. Příkaz „gpio-admin export XY“ totiž také vytvoří příslušné soubory v /sys/devices/virtual/gpio/gpioXY, kterými pin následně ovládáš.

        Každopádně problém vyřeš tak, že nakonec skriptu přidej pro všechny „otevřené“ piny jejich zavření:

        „gpio-admin unexport XY“

        Je to jako práce se souborem – otevřeš / čteš nebo zapisuješ / zavřeš. Ty jsi prostě zapomněl na konci piny „zařít“, takže při dalším pokusu o jejich otevření to vyhodilo chybu, že již otevřené jsou.

        • Díky za rady.
          Na to uzavírání portů už jsem přišel sám.

          Protože ale ve výše uvedeném příkladu dochází k „tvrdému“ přerušení běhu skriptu pomocí kláves Ctrl+C (kvůli nekonečné smyčce), není možné použité porty uzavřít pomocí „gpio-admin unexport xx“.

          Proto je asi lepší, před nastavením portu testovat, jestli už náhodou není otevřený z dřívějška:

          ================

          #nastaveni portu s tlacitkem pro vstup
          if [ ! -d /sys/devices/virtual/gpio/gpio22 ]; then gpio-admin export 22 ; fi

          #nastaveni portu s LEDkou pro vystup
          if [ ! -d /sys/devices/virtual/gpio/gpio18 ]; then gpio-admin export 18 ; fi
          echo out > /sys/devices/virtual/gpio/gpio18/direction

          ================

          Je to vlastně testování přítomnosti souboru ve složce /sys/devices/virtual/gpio/

          Když je port otevřený z minulé doby, soubor existuje a už není žádoucí port znovu otvírat.
          Pokud se port uzavře pomocí „… unexport …“ dojde automaticky i ke smazání souboru.

          • Ano, to je také možnost. Já to vyřešil lehce odlišně, možná korektněji, ale záleží, co komu vyhovuje. Skript totiž neukončuji CTRL + C, ale mám v něm nekonečnou smyčku, která testuje stisk (libovolné) klávesy. Jakmile je stisknuta klávesa, skončí smyčka, unexportují se otevřené piny a skript končí. Korektněji myslím proto, protože skript po sobě „uklidí“.

        • Jasně že znám.

          Pointa byla jinde – proč kupovat něco, u čeho není zjevné, že je to s RPi kompatibilní (= bude nutno měři a případně aplikovat napěťový dělič), když se dá za zhruba stejnou cenu koupit něco, co má přímo 3V3 výstup?

          Nehledě na to, že já sice napěťový dělič znám, ale zná ho ten člověk, co se ptá? Má doma voltmetr, aby si ověřil, co z toho PIR čidla leze?

    • Jinak tedy s dealextreme.com mám obecně dobré zkušenosti, nakoupil jsem tam už hodněkrát (odhadem 20x). Pokud chceš, aby zásilka dorazila rychle a neukradla jí česká pošta, připlať si dolar za tracking number.

  5. jak bezpečné je používat gpio-admin? přece pokud OS chce práva root, tak samotný jakýkoli program jej neobejde – musí v tom být nějaká vychytávka, třeba využití sbitu apod. Máte někdo bližší informace? Pátral jsem, nic jsme nenašel. navíc, v oficiálních zdrojích k RP, gpio-admin není, ani v elinuxu… Díky.

  6. Ahoj,
    po několika peripetiích se mi podařilo rozchodit přístup na gpio, ale potřeboval bych to nějak rozchodit z pythonu. Našel jsem quick2wire-python-api , ale popravdě nevím, jak to rozchodit. Máte s tím někdo zkušenosti?
    Díky

  7. Našel by se zde někdo ochotný za úplatu naprogramovat script, který předá jinému programu (PHP) informaci o sepnutí vstupních pinů?

    Zmáčknu tlačítko, načte se jednička.
    Zmáčknu druhé tlačítko, načte se dvojka.

    hbo83@seznam.cz

  8. Jak se jmenuje ta deska s abecedou jak se do ni zasouvaji poly diod a rezistory adt…dekuji chtel bych to koupit ale nevim pod jakym nazvem to mam hledat dekuji za rady Honza.

Napsat komentář

Vaše emailová adresa nebude zveřejněna.