
IoT prakticky - programovanie Raspberry Pi v Pythone 4: softvérová obsluha vstupov
Mini seriál je zameraný na obsluhu hardvéru pripojeného na dosku Raspberry PI. V tejto časti na praktických príkladoch ukážeme možnosti softvérovej obsluhy digitálnych vstupov.
Upozorňujeme, že nie každý pin portu sa dá použiť kedykoľvek a na čokoľvek. Napríklad porty GPIO2 a GPIO3 môžete na všeobecné účely použiť iba v prípade aj nie je aktivovaná komunikácia na I2C zbernici. Prečo sme ich teda použili v cvičnom príklade? Aby sme vás upozornili na túto vlastnosť. Na obrázku sú zeleným vyznačené porty, ktoré môžete využiť kedykoľvek a žltým porty, ktoré sa dajú využiť len za určitých okolností. Pri implicitnom nastavení je komunikácia cez I2C zakázaná.
Ak nemáte vstupný pin pripojený k nejakej napäťovej úrovni, bude ľudovo povedané „plávať“. Inými slovami, načítaná hodnota nie je definovaná, pretože nie je pripojená k ničomu, kým nestlačíte tlačidlo alebo prepínač. Pri rozopnutom tlačidle je hodnota nedefinovaná a ovplyvňuje ju rôzne rušenie.
Preto sme v článku https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone---2-cast--vstupy-a-vystupykde sme sa venovali aj načítaniu stavu vstupov pripojili port, pomocou ktorého sme zisťovali, či je tlačidlo zatlačené nielen na tlačidlo, ale cez rezistor s odporom 10 kOhm na napájacie napätie. Tým sme zaistili, že keď tlačidlo, ktoré pripája tento port k zemi (GND), bude na porte logická 1. Po zatlačení tlačidla sa zmení na logickú 0. Čip Broadcom v Raspberry Pi umožňuje tieto rezistory medzi vstupným pinom a 3,3 V (pull-up) alebo 0V (pull-down) pripojiť softvérovo, vo vnútri čipu. Vľavo je zapojenie s vonkajším pull-up rezistorom, ak sa aktivuje rezistor na čipe, zapojenie (vpravo) sa zjednoduší.
![]() |
![]() |
Takýto spôsob načítania a vyhodnotenia hodnoty na vstupe je však triviálny. Môže sa napríklad stať, že v okamihu zatlačenia tlačidla program robí niečo iné a udalosť nezachytí. Preto je možné na tento účel využiť prerušenie a detekciu nábežnej, prípadne zostupnej hrany signálu na vstupnom porte. Často nás viac zaujíma zmena stavu signálu, než jeho aktuálna hodnota. Hrana je zmena stavu elektrického signálu z LOW na HIGH (nábežná hrana) alebo z HIGH na LOW (zostupná hrana).
Ak nechcete zmeškať hranu, v našom príklade spôsobenú stlačením, prípadne uvoľnením tlačidla v čase keď je váš program zaneprázdnený inými aktivitami môžete využiť dve funkcionality:
Čakanie na hranu - funkcia wait_for_edge ()
Obsluha udalosti - funkcia event_detected () aktivuje thread funkciu spätného volania, ktorá sa spustí, keď sa zistí hrana
Tieto funkcie môžete naviazať na nábežnú hranu GPIO.RISING, zostupnú hranu GPIO.FALLING, alebo akúkoľvek zmenu signálu GPIO.BOTH
Funkcia wait_for_edge () funguje tak, že zastaví vykonávanie vášho programu, kým sa nezistí hrana, alebo neuplynie nastavený časový limit. V príklade program čaká na stlačenie tlačidla pripojeného na GPIO2 5 sekúnd (5 000 ms):
Málokedy vám vyhovuje, aby sa váš program zastavil a čakal. Funkcia event_detected () zachytí zmenu stavu vstupu, aj v prípade, ak procesor vykonáva inú vetvu programu.
Pri pohľade na kód predchádzajúceho príkladu si poviete, že program v hlavnej sľučke mohol testovať rovno stav na vstupnom pine. Mohol, pretože je to cvičný príklad, ktorý nerobí nič iné. Ak je v hlavnej sľučke zamestnaný niečím dôležitým, čo budeme v ďalšom príklade simulovať nekonečným cyklom bude sa udalosť zmeny stavu signálu na sledovanom porte spracovávať v obsluhe prerušenia, čiže v callback funkcii.
Aj tu vás asi napadne, že na obsluhu dvoch tlačidiel pripojených na porty GPIO2 a GPIO3 by stačila jedna callback funkcia. Stačila, ale musíte jej odovzdať parameter – číslo portu v nasledujúcom príkaze cez lambda výraz. Parameter bouncetime = 200 (v milisekundách) ošetruje zákmity tlačidla
V pokračovaní ukážeme komunikáciu cez zbernicu I2C, konkrétne obsluhu expanderu - obvodu MCP23008 určeného na rozšírenie počtu portov
Doterajšie časti seriálu:
Programovanie Raspberry Pi v Pythone 1: Konfigurácia https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone---1-cast--konfiguracia
Programovanie Raspberry Pi v Pythone 2: Vstupy a výstupyhttps://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone---2-cast--vstupy-a-vystupy
Programovanie Raspberry Pi v Pythone 3: PWM výstup a ovládanie servomotorov https://www.pcrevue.sk/a/IoT-prakticky---programovanie-Raspberry-Pi-v-Pythone-3--PWM-vystup-a-ovladanie-servomotorov
Zobrazit Galériu