ACER_JUN23 ACER_JUN23 ACER_JUN23

IoT prakticky - programovanie Raspberry Pi v Pythone 4: softvérová obsluha vstupov

Mikrokontroléry
0

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

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN)
 
GPIO.setup(2, GPIO.IN, GPIO.PUD_UP)
 
while True:
    vstup = GPIO.input(2)
    if vstup == False:
       print("STLACENE")
       while vstup == False:
           vstup = GPIO.input(2)

 

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):

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(2, GPIO.IN, GPIO.PUD_UP)
 
aktivita = GPIO.wait_for_edge(2, GPIO.RISING, timeout=5000)
 
if aktivita is None:
   print('Udalost nenastala')
else:
   print('Hrana na pine', aktivita)

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. 

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
tlacidla = (2,3)
GPIO.setup(tlacidla, GPIO.IN, GPIO.PUD_UP)
 
GPIO.add_event_detect(2, GPIO.RISING)
GPIO.add_event_detect(3, GPIO.RISING)
 
while True:
    if GPIO.event_detected(2):
       print('Hrana GPIO2')
       
    if GPIO.event_detected(3):
       print('Hrana GPIO3')

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.

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
tlacidla = (2,3)
GPIO.setup(tlacidla, GPIO.IN, GPIO.PUD_UP)
 
def callback2(port):
   print('Hrana GPIO', port)
 
def callback3(port):
   print('Hrana GPIO', port)
 
GPIO.add_event_detect(2, GPIO.RISING)
GPIO.add_event_callback(2, callback2)
 
GPIO.add_event_detect(3, GPIO.RISING)
GPIO.add_event_callback(3, callback3)
 
while True:
    a=1

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

import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
tlacidla = (2,3)
GPIO.setup(tlacidla, GPIO.IN, GPIO.PUD_UP)
 
def callback1(port):
   print('Hrana GPIO', port)
 
GPIO.add_event_detect(2, GPIO.RISING, callback = lambda x: callback1(2), bouncetime = 200)
GPIO.add_event_detect(3, GPIO.RISING, callback = lambda x: callback1(3), bouncetime = 200)
 
while True:
    a=1

 

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

Luboslav Lacko

Všetky autorove články
Raspberry Pi Python programovanie GPIO

Pridať komentár