4. maja, 2014

Raspberry Pi in Python za začetnike (2) – zunanje prekinitve, tipke, razvojna plošča

Revija 219 219 45 - Raspberry Pi in Python za začetnike (2) –  zunanje prekinitve, tipke, razvojna ploščaRevija logo se - Raspberry Pi in Python za začetnike (2) –  zunanje prekinitve, tipke, razvojna plošča

V prvem članku smo pisali o začetnem zagonu Raspberry Pi-ja in kako začeti s programskim jezikom Python. Spisali smo tudi prvi program za nastavljanje izhoda (utripanje LEDice) in primitivno zaznavanje vhoda (tipke). Sedaj nas čaka še podroben, oziroma pravilen opis detekcije tipke in tudi pravilno delo s čiščenjem GPIO priključkov, ko jih ne potrebujemo več – da popravimo skrivanje napak iz prejšnjega programa. Malo se bomo tudi mudili ob lovljenju izjem, ki jih – ne bodi jih treba – sproži napačno izvajanje programa. Osnove poznamo, preden pa se lotimo nadaljnjega dela, bi vam radi predstavili razvojno ploščo, ki smo jo razvili v uredništvu in na kateri bomo pisali programe.

Revija 219 219 45%20%281%29 - Raspberry Pi in Python za začetnike (2) –  zunanje prekinitve, tipke, razvojna ploščaRazvojna plošča za Raspberry Pi

V uredništvu smo naredili odlično razvojno ploščo, ki jo preko letve na vezju enostavno priključite na GPIO priključke vašega Raspberry Pi-a. Na njej so tri LED diode in tri tipke, dajalnik impulzov (ang. enkoder) s tipko – zelo uporabno za navigacijo po menijih, alfa-numerični LCD zaslon z osvetlitvijo dimenzij 2×8 znakov, HM-TRP 868 MHz oddajnik-sprejemnik (ang. transiver) za brezžično komunikacijo ter I2C senzor temperature in vlage. Da pa med priklopom vaših naprav, ne bi prišlo do neželenih poškodb RPi-ja, pa smo dodali še dvo-kanalni optični ločilnik (ang. opto coupler). Kakšna je naša razvojna plošča, si lahko ogledate na slikah 1 in 2, podrobno vezalno shemo, pa si lahko snamete iz naše spletne strani v paketu s programi. Ko ploščico namestite na vaš RPi, iz naše spletne strani prenesete programe in že lahko testirate priključene elemente.

Sedaj pa se vrnimo tja, kamor smo bili namenjeni – Raspberry Pi in Python.

Detekcija roba signala

Revija 219 219 45%20%282%29 - Raspberry Pi in Python za začetnike (2) –  zunanje prekinitve, tipke, razvojna ploščaRabi bi vam pokazali še malo dela z vhodi. Na primer detekcijo roba signala na vhodu. Želimo napisati program, ki bo ob pritisku tipke stalno obračal stanje izhoda ‘0’ > ‘1’ ali obratno ‘1’ > ‚’0′. LED dioda in tipka sta vezani enako, kot v prvem članku, k definiciji izhoda smo dodali še atribut „initial“, s katerim povemo, v kakšnem stanju naj bo izhod na začetku programa, v našem primeru ugasnjena:

GPIO.setup(7, GPIO.OUT, initial=False)
Glavni del programa „tipkaInventiraStanjeDiode1.0“ pa smo si zamislili tako:
a = True
GPIO.output(7, a)
while True:
       if not GPIO.input(13):
               a = not a
               GPIO.output(7, a)

Program deluje zelo slabo. Ko tipko pritisnemo, dioda utripa, včasih se vrednost obrne, včasih ne… Poizkusimo v program „tipkaInventiraStanjeDiode1.1“ dodati časovno zakasnitev:

       if not GPIO.input(13):
               time.sleep(0.2)
               a = not a
               GPIO.output(7, a)

Program deluje občutno bolje. Težava je še vedno, če gumb držimo predolgo, dioda utripa. Včasih se gumba niti dobro ne dotaknemo in do spremembe pride dvakrat. To se zgodi zaradi iznihavanja pri prehodu napetosti signala iz enega v drug nivo(ang. bounce) (Slika 3).

Tega si ne želimo. Dodajmo v program „tipkaInventiraStanjeDiode1.2“ dvojno preverjanje pritiska in zanko, ki se vrti, dokler tipka ne bo zopet spuščena:

while True:
       if not GPIO.input(13):
               time.sleep(0.02)
               #stanje tipke preverimo drugic
               if not GPIO.input(13):
                       a = not a
                       GPIO.output(7, a)
                     #prazna zanka
                       while not GPIO.input(13):
                               pass

Tako. Program deluje odlično! Pa res? Poglejmo si obremenitev, ki jo prikazuje diagram v spodnjem desnem kotu zaslona. Je res potrebna skoraj 100 odstotna obremenitev procesorja, ki le čaka pritisk tipke? Mora obstaja boljša možnost… In tudi je! Napako smo naredili, ko smo konstantno preverjali, ali je tipka pritisnjena (ang. pooling). To težavo lahko odpravimo z metodo wait_for_edge(), ki čaka na pozitiven rob in je že integrirana v GPIO modulu. Uporabimo jo takole:

GPIO.wait_for_edge(pin, detekcija)

Pin je številka našega priključka, detekcija pa pove, kateri prehod želimo čakati. Možnosti prehoda so tri: za pozitivnega „GPIO.RISING“, negativnega „GPIO.FALLING“ ali pa za oba „GPIO.BOTH“. Dodajmo to odlično funkcijo v naš program „tipkaInventiraStanjeDiode2.0“:

while True:
       GPIO.wait_for_edge(13, GPIO.FALLING)
       a = not a
       GPIO.output(7, a)

S programom smo sedaj zadovoljni, ravno tako tudi procesor. Tovrstni problem je rešen. Vendar funkcija ni uporabna za prekinitev utripanja v našem programu iz prejšnjega članka, ker funkcija ustavi izvajanje in čaka na pritisk tipke. Mi seveda želimo, da med čakanjem dioda utripa. Kot kaže, težavam še vedno ni videti konca.

Program

Celotni članek

Raspberry Pi in Python za začetnike (2) – zunanje prekinitve, try-except, main

AX elektronika d.o.o.

2014_SE219_45