Sunteți pe pagina 1din 5

L2 Utilizarea GPIO folosind limbajul Python

Partea teoretică
În această lucrare se dorește implementarea funcțiilor de intrare și ieșire (GPIO - General Purpose Input
Output) pentru Raspberry Pi. Prin folosirea mediului Python, se vor realiza aplicații care rulează repetitiv, de
un număr finit de ori sau în buclă infinită.
Sistemul Raspberry Pi conține un conector cu 40 de pini (din care 26 de pini GPIO), numit P1 (Fig. 1), a cărui
structură este prezentată în Tabel 1. Așa cum se va vedea în această lucrare dar și în cele următoare,
semnificația pinilor depinde de numerotarea folosită pentru pini.

Fig. 1 Amplasarea conectorului P1


.
Tabel 1. Semnificația pinilor din conectorul P1 al sistemului Raspberry Pi
Numerotare Numerotare BCM Numerotare Numerotare BCM Numerotare
WiringPi fizică WiringPi
3,3 V 1 2 5V
8 GPIO2/I2C1 SDA 3 4 5V
9 GPIO3/I2C1 SCL 5 6 GND
7 GPIO4 7 8 GPIO14/UART TXD 15
GND 9 10 GPIO15/UART RXD 16
0 GPIO17 11 12 GPIO18 1
2 GPIO27 13 14 GND
3 GPIO22 15 16 GPIO23 4
3,3 V 17 18 GPIO24 5
12 GPIO10/MOSI SPI 19 20 GND
13 GPIO9/MISO SPI 21 22 GPIO25 6
14 GPIO11/SCLK SPI 23 24 GPIO8 10
GND 25 26 GPIO7 11
GPIO0 27 28 GPIO1
GPIO5 29 30 GND
GPIO6 31 32 GPIO12
GPIO13 33 34 GND
GPIO19 35 36 GPIO16
GPIO26 37 38 GPIO20
GND 39 40 GPIO21
 
Majoritatea pinilor au funcția GPIO (General Purpose Input Output). Pe lângă aceștia mai există câte 2 pini
care furnizează tensiunile de alimentare 5 V și respectiv 3,3 V, precum și mai mulți pini cu funcția de masă
(GND). De asemenea mai există pini care deservesc interfețe seriale (UART, I2C și SPI) care sunt în afara
scopului acestei lucrări.
Funcția Output (ieșire) reprezintă generarea unei tensiuni cu două niveluri posibile (0 logic și 1 logic) la
pinul respectiv. În cel mai simplu caz, tensiunea respectivă poate să aprindă sau să stingă o diodă LED. Pentru
sistemul Raspberry Pi, nivelul 1 logic este reprezentat de tensiunea de 3,3 V, iar nivelul logic prin 0 V.
Funcția Input (intrare) reprezintă citirea tensiunii aplicată din exterior la pinul respectiv, sub forma unui bit,
0 logic sau 1 logic. Tensiunea respectivă poate fi aplicată prin intermediul unui comutator cu două poziții:
poziția 1, 3,3V sau nivelul 1 logic; poziția 2, 0V (GND) sau nivelul 0 logic.


 
1.Python-probleme generale
Python este un limbaj de programare de tip scriptic sau interpretor, prin aceea că nu necesită compilare
înaintea execuției. În acest scop există un interpretor, care citește și execută fiecare linie din fișierul program.
Limbajul Python are multe elemente similare cu limbajul C:
-instrucțiunile de control for, while, if, else
-posibilitatea de afișare folosind funcția printf
Câteva diferențe în raport cu limbajul C
-corpul unei funcții sau al unei instrucțiuni ca de exemplu while este reprezentat de liniile care au aceeași
indentare (același număr de spații) față de coloana în care este definită instrucțiunea, adică nu se folosesc
simbolurile {};
-variabilele nu trebuie declarate la începutul programului, pot fi definite oriunde în program;
-nu este necesară definirea funcției main(), aceasta începe după liniile din cadrul fișierului program în care
se importă anumite module (a se vedea exemplele de mai jos) sau unde se declară funcții (programele
prezentate nu conțin funcții).

Accesarea Python sub un sistem de operare de tip Linux se face prin


$ python având ca efect
>>>
După prompterul >>> se pot introduce comenzi care se execută imediat, de exemplu:
>>> 8+4
12
>>>
Pentru părăsirea acestei aplicații și revenirea la linia de comandă Linux, se execută >>> quit()

2.Utilizarea limbajului Python pentru accesarea pinilor GPIO


Pentru a permite implementarea funcțiilor de intrare și ieșire în Python, trebuie făcute următoarele:
-importarea modulului GPIO
-stabilirea variantei de numerotare a pinilor, folosind funcția GPIO.setmode() (cu argumentul BCM, care
corespunde coloanei funcție BCM din tabelul 1, sau BOARD, care corespunde numerotării naturale (1,2,3,...)
a pinilor;
-stabilirea funcțiilor pinilor, intrare sau ieșire, folosind funcția GPIO.setup() (similar cu utilizarea
registrului direction în linia de comandă Linux);
-stabilirea nivelului logic al unui pin de ieșire – folosind funcția GPIO.output(), sau citirea nivelului
logic al unui pin de intrare – folosind funcția GPIO.input(), (similar cu utilizarea registrului value în
linia de comandă Linux);
-dezactivarea funcțiilor pinilor stabilite anterior folosind functia GPIO.cleanup()
În plus, pentru inserarea unor întârzieri în program, se importă modulul time, care permite apoi utilizarea
funcției time.sleep(), în care argumentul, în format float, este întârzierea în secunde.

Toate aceste operații pot fi identificate în cele două programe prezentate în continuare.

P1. În presupunerea că la pinii GPIO24 și GPIO25 sunt conectate două led-uri, programul prezentat realizează
comanda alternativă a acestor pini cu nivelurile 1 și 0, respectiv 0 și 1, fiecare comandă fiind urmată de o
pauză, care permite ca ochiul uman să sesizeze cele două stări (stins, aprins) ale led-urilor. Programul rulează
în buclă infinită. Apăsarea tastelor Ctrl-C permite oprirea rulării programului.
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) #se selecteaza numerotarea BCM
GPIO.setup(24,GPIO.OUT) #pinul 24 este iesire
GPIO.setup(25,GPIO.OUT) #pinul 25 este iesire


 
try:
while True: #bucla infinita
GPIO.output(24,1) #pinul 24 este pe 1 logic; se poat folosi si True
GPIO.output(25,0) #pinul 25 este pe 0 logic; se poate folosi si False
time.sleep(0.15)
GPIO.output(24,0)
GPIO.output(25,1)
time.sleep(0.85)

except KeyboardInterrupt: #la intreruperea executiei programului


GPIO.cleanup() #prin combinatia CTRL-C, se anuleaza programarea
#facuta initial pentru pinii GPIO

Instrucțiunea try este în strânsă legătură cu instrucțiunea except (excepție sau eveniment care va întrerupe
cursul normal al programului). Dacă nu se apasa combinația de taste Ctrl-C, se execută instrucțiunile dintre
try și except. Dacă se apasă combinația de taste Ctrl-C, se execută acțiunea corespunzătoare lui except
(adică, GPIO.cleanup()), după care programul se oprește din execuție.

Pentru editarea programului se poate folosi comanda (fișierul respectiv va fi salvat în directorul curent)

$ sudo nano nume_program.py

Rularea în Python se poate face cu comanda (în presupunerea că fișierul nume_program se află în directorul
curent)

$ sudo python nume_program.py

P2. În continuare, se dorește introducerea unei facilități suplimentare în programul anterior: utilizarea funcției
de intrare pentru citirea nivelului logic aplicat pinului 23, și afișarea unui mesaj corespunzător pe monitor. În
acest scop, la pinul 23 se conectează un buton cu revenire care poate aplica nivelul 1 sau 0 (a se vedea lucrarea
precedentă). Programul este prezentat în continuare.

import RPi.GPIO as GPIO


import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(23,GPIO.IN) #pinul 23 este intrare
GPIO.setup(24,GPIO.OUT) #pinul 24 este iesire

while True:

if GPIO.input(23): #se testeaza nivelul logic de la pinul 23


GPIO.output(24,1)
print("butonul este apasat")
else:
GPIO.output(24,0)
print("butonul nu este apasat")
time.sleep(0.5)

3. Simulator python pentru Raspberry Pi


Simulatorul se găsește la adresa https://create.withcode.uk/ (Fig. 2), unde la prima accesare a paginii web în
tab-ul mycode.py se afișează un program foarte simplu din două linii. Acesta se șterge și în locul lui se va
scrie programul utilzatorului. În partea din dreaptă jos se găsește butonul Run (săgeata verde) pentru lansarea
în execuție a programului.

 
Fig. 2 Interfața grafică cu utilizatorul a simulatorului python pentru Raspberry Pi.

După rularea unui program pe ecran este afișat conectorul simulat din Fig. 3 (corespunzător conectorului real
de pe placă, din Fig.1), dacă programul respectiv conține următoarea linie: import RPi.GPIO as GPIO
. Pe acest conector simulat se poate observa starea fiecărui pin folosit în program prin colorarea diferită a
acestora în funcție de nivelul logic primit prin program.

Fig. 3 Conectorul P1 simulat.

3.1 Simulare buton


Pentru simularea apăsării unui buton se bifează/debifează cu mouse-ul pinul din conectorul P1 la care este
conectat butonul. Un exemplu este prezentat în Fig. 4, unde este bifat pinul 5, operație echivalentă cu apăsarea
butonului conectat la pinul 5.

Fig. 4 Bifarea pinului 5.

Desfășurarea lucrării
1. Se studiază programul P1.
2. Se consideră că LED-urile sunt conectate la pinii GPIO24 și GPIO25, conform numerotării BCM (vezi
Tabel 1). Care sunt pinii din conectorul GPIO al plăcii Raspberry Pi utilizați în program, conform numerotării
fizice?
3. Se studiază subcapitolul despre simulatorul python pentru Raspberry Pi.
4. Folosind simulatorul python pentru Raspberry Pi se scrie și se rulează programul P1.
5. Se fac următoarele modificări în program:
a) ambele LED-uri să fie aprinse, respectiv stinse, această succesiune repetându-se periodic;
b) se modifică timpii cât cele două LED-uri sunt aprinse, respectiv stinse; în acest fel se poate modifica atât
perioada (frecvența) aprinderii cât și raportul dintre intervalul în care LED-urile sunt aprinse în raport cu
perioada;
6. Se dorește ca programul să fie executat de un număr finit de ori. Pentru aceasta:
a) linia while True: se înlocuiește cu for i in range(1,10):
b) liniile Try: și except KeyboardInterrupt: se șterg; ca o consecință, linia for i in
range(1,10): trebuie aliniată la stânga cu primele linii de program;
c) linia GPIO.cleanup()trebuie aliniată și ea la stânga cu liniile de program precedente;
d) de câte ori se execută programul?
7. Se studiază programul P2.


 
8. Se consideră un LED conectat la pinul GPIO24 și un buton conectat la pinul GPIO23, conform numerotării
BCM (vezi Tabel 1). Care sunt pinii din conectorul GPIO al plăcii Raspberry Pi utilizați în program, conform
numerotării fizice?
9. Se rulează programul P2. Pentru a simula apăsarea butonului se bifează cu mouse-ul pinul corespunzător
acestuia. Ce se observă?

Observație: - la fișierele încărcate pe Campus Virtual pentru cerințele 4, 5, 9 se inserează câte un printscreen
al conectorului P1 simulat din timpul rulării programului respectiv, din care să se vadă starea pinilor; pentru ca
imaginea să fie cât mai mică se decupează din printscreen doar conectorul (se poate face în Paint) și imaginea
se salvează în format jpg;


 

S-ar putea să vă placă și