Sunteți pe pagina 1din 47

MANUAL DE UTILIZARE

SET EDUCATIV RASPBERRY PI


Cod produs: 1225953

1. De la instalarea sistemului de operare pn la primul program Python


Aproape c nu exist un alt aparat electronic n acest segment de pre care s ofere la fel de multe ca i Raspberry Pi. Chiar dac
nu arat aa, Raspberry Pi este un computer complex n formatul unui card de credit i n plus oferit la un pre avantajos. Nu
numai hardware-ul este ieftin, ci i software-ul: sistemul de operare i toate aplicaiile necesare sunt oferite gratuit pentru
descrcare.

Fig. 1.1: Raspberry Pi un PC n format mini

Datorit sistemului de operare Linux optimizat i cu suprafa grafic, Raspberry Pi nlocuiete oricnd un PC, funcioneaz
silenios i are un consum foarte mic de curent. Interfaa GPIO programabil transform Raspberry Pi ntr-un obiect de studiu
foarte interesant pentru programatori sau productori de hardware.

1.1 De ce avei nevoie?


n ciuda dimensiunilor sale miniaturale Raspberry Pi este un computer de nalt calitate. Dar pentru a-l putea folosi avei nevoie
de cteva accesorii sistem de operare, alimentare, reea, monitor, tastatur i diverse cabluri de conexiune.
1.1.1 ncrctorul micro-USB pentru telefoane mobile
Raspberry Pi poate fi alimentat de la orice ncrctor de telefoane mobile. ncrctoarele care au fost concepute n perioada de
nceput a tehnicii de ncrcare USB nu sunt ns suficient de performante. Dac conectai aparate USB care consum mult
curent, precum hard diskuri externe fr alimentare proprie, vei avea nevoie de un ncrctor puternic. Blocul de alimentare
trebuie s livreze 5 V i minim 700 mA, ba chiar 1000 mA. Reglatorul de putere integrat mpiedic arderea aparatului dac
folosii ncrctoare prea puternice.
Caracteristicile unui ncrctor sub-performant
Dup ce Raspberry Pi a trecut de procesul de bootare, dar indicatorul mouse-ului nu poate fi micat sau sistemul nu
reacioneaz la comenzile de pe tastatur, nseamn c alimentarea este prea slab. De asemenea dac nu putei accesa stick-ul
USB sau hard diskul conectat nseamn c trebuie s folosii un bloc de alimentare mai puternic.

1.1.2 Card de memorie


n cazul lui Raspberry Pi cardul de memorie are rolul unui hard disk. Cardul de memorie are stocat sistemul de operare. De
asemenea pe acest card se stocheaz datele proprii i programele instalate. Cardul de memorie trebuie s aib minim 4 GB i s
suporte standardul clasa 4. Acest standard indic viteza cardului de memorie. Un card de memorie clasa 10 are performane
vizibil mai bune.

1.1.3 Tastatur
Putei folosi orice tastatur cu muf USB. Tastaturile fr cablu nu funcioneaz ntotdeauna, cci au nevoie de foarte mult
curent sau de drivere speciale. Dar dac nu dispunei de o alt tastatur atunci avei nevoie de un hub USB cu alimentare
separat pentru a putea folosi o tastatur wireless.

1|www.germanelectronics.ro
1.1.4 Maus
Avei nevoie de maus cu muf USB numai dac Raspberry Pi folosete un sistem de operare cu suprafa utilizator grafic.
Anumite tastaturi au mufe USB suplimentare pentru maus. Acestea pot fi folosite de ex. pentru un stick USB.

1.1.5 Cablu reea


Pentru conexiunea la un router din reeaua local avei nevoie de un cablu de reea. Acest cablu este necesar i pentru prima
configurare, iar mai trziu vei putea folosi WLAN. Multe dintre funciile lui Raspberry Pi nu pot fi folosite fr acces la internet.

1.1.6 Cablu HDMI


Raspberry Pi poate fi conectat la monitoare i televizoare folosind cablul HDMI. Pentru conectarea la monitoare PC cu muf DVI
exist cabluri HDMI speciale fr adaptor.

1.1.7 Cablu audio


Cablul audio cu jack de 3,5 mm permite conectarea de cti i boxe PC la Raspberry Pi. Semnalul audio este disponibil i dac se
folosete cablu HDMI. n cazul televizoarelor HDMI sau monitoarelor nu este nevoie de cablu audio. Dac conectai un monitor
PC folosind un cablu HDMI cu adaptor DVI, atunci semnalul audio se va pierde n acest loc i de aceea vei avea din nou nevoie
de ieirea audio analogic.

1.1.8 Cablu video galben FBAS


Dac nu avei la dispoziie un monitor HDMI, atunci putei lega Raspberry Pi la un televizor clasic folosind un cablu video FBAS
analogic cu tecr galben, dar n acest caz rezoluia ecranului va fi foarte mic. Pentru televizoarele fr intrare FBAS galben
exist adaptor FBAS pe SCART. La rezoluie TV analogic vei putea folosi suprafaa grafic, dar numai cu limitri.

1.2 Instalarea sistemului de operare Raspbian


Raspberry Pi este livrat fr sistem de operare. Spre deosebire de PC-uri, care folosesc aproape toate variantele Windows,
Raspberry Pi are nevoie de o variant Linux special ajustat. Pe acest hardware Windows nu poate funciona.
Raspbian este varianta Linux recomandat i suportat de productorul lui Raspberry Pi. Raspbian folosete Debian-Linux, una
dintre cele mai cunoscute variante Linux, care include printre altele popularele variante Linux Ubuntu i Knoppix. Ceea ce este
hard diskul pentru un PC este cardul de memorie la Raspberry Pi. Pe acest card sunt stocate sistemul de operare i datele;
totodat cardul de memorie servete pentru bootarea lui Raspberry Pi.
1.2.1 Pregtirea cardului de memorie n PC
Deoarece Raspberry Pi nu poate realiza singur bootarea, cardul de memorie trebuie pregtit n PC. n acest sens avei nevoie de
un cititor de carduri pe PC. Acesta poate s fie integrat fix sau conectat prin USB.
Folosii carduri de memorie noi, cci acestea sunt deja formatate optim de ctre productor. Putei folosi i un card de memorie
care a fost deja folosit ntr-o camer digital sau alt aparat, doar c acesta trebuie reformatat pentru a fi utilizat cu Raspberry Pi.
Teoretic putei folosi funciile de formatare din Windows. Mult mai bun este ns software-ul SDFormatter al SD Association.
n acest fel cardurile de memorie sunt formatate pentru performane optime. Software-ul poate fi descrcat gratuit la adresa
www.sdcard.org/downloads/formatter_4.
Dac cardul de memorie include partiii de la o instalare anterioar a sistemului de operare pentru Raspberry Pi, atunci
nseamn c SDFormatter nu a afiat dimensiunea corect. n acest caz folosii opiunea de formatare FULL (Erase) i activai
opiunea Format size adjustment. n acest fel ai repartiionat cardul de memorie.
Coninutul cardului de memorie este ters.
Pentru instalarea sistemului de operare cel mai bine este dac folosii un card de memorie gol. Dac exist date pe cardul de
memorie, atunci acestea vor fi terse n timpul instalrii sistemului de operare.

1.2.2 Installer software NOOBS


New Out Of Box Software (NOOBS) este un program de instalare pentru sistemele de operare Raspberry-Pi. Pentru a configura
un card de memorie nu avei nevoie de programe Image sau blocuri de bootare. NOOBS ofer mai multe sisteme de operare, iar
la primul start putei selecta sistemul de operare dorit direct pe Raspberry-Pi, pentru ca apoi s fie instalat pe cardul de
memorie. Descrcai arhiva NOOBS de cca. 1,2 GB de la adresa www.raspberrypi.org/downloads , despachetai-o pe PC i
instalai-o pe un card de memorie de minim 4 GB.
Pornii Raspberry Pi cu acest card de memorie. Introducei cardul n slotul lui Raspberry Pi i conectai tastatura, mausul,
monitorul i cablul de reea. Conexiunea alimentare USB este ultima conexiune care trebuie s fie realizat. Cu aceasta ai
activat Raspberry Pi. Aparatul nu dispune de un buton separat pentru pornire.
Dup cteva secunde apare meniul din care putei selecta sistemul de operare dorit. Noi folosim sistemul de operare
recomandat de fundaia Raspberry: Raspbian.
Alegei limba de instalare i marcai sistemul de operare Raspbian. Dup confirmarea mesajului de securitate cum c cardul de
memorie va fi suprascris se activeaz instalarea, proces care dureaz cteva minute. n timpul instalrii sunt afiate informaii
scurte despre Raspbian.
1.2.3 Ledurile de pe Raspberry Pi
ntr-un col al Raspberry Pi se afl cinci leduri care indic starea. Denumirea lor difer la modelele mai noi i mai vechi Raspberry
Pi, dar funciile sunt similare.
2|www.germanelectronics.ro
Plac electronic nou Plac electronic Culoare Semnificaie led
ACT OK Verde Accesarea cardului de memorie
PWR PWR Rou Conexiunea la alimentare
FDX FDX Verde LAN n modul full duplex
LNK LNK Verde Acces la LAN
100 10M Galben LAN cu 100 Mbps
Tab. 1.1: Ledurile de pe Raspberry Pi.

Fig. 1.2: Ledurile stare de pe Raspberry Pi.

1.2.4 Prima punere n funciune a Raspberry Pi


Dup ncheierea instalrii Raspberry Pi rebooteaz i pornete automat programul de configurare raspi-config. Din punctul
Enable boot to desktop selectai opiunea Desktop log in as user. Setrile de baz sunt selectate automat. Dup restart avei la
dispoziie desktopul grafic LXDE.

1.3 Rapid ca Windows suprafaa grafic LXDE


Toat lumea se sperie atunci cnd aude de Linux, cci se gndete la o serie infinit de comenzi, similar cu ce se ntmpla acum
30 de ani sub DOS. Dar nu este deloc aa! Linux este un sistem de operare deschis i de aceea suprafaa sa grafic poate fi
permanent dezvoltat.

Fig. 1.3: Desktop-ul LXDE de pe Raspberry Pi seamn foarte mult cu Windows XP.

Raspbian-Linux folosete suprafaa LXDE (Lightweight X11 Desktop Environment), care folosete foarte puine resurse i
seamn cu suprafaa Windows datorit meniului de start i file manager.

nregistrare Linux
nregistrarea utilizatorului se face automat. Dar dac avei totui nevoie de date, iat care sunt acestea: numele utilizator este
pi, iar parola raspberry.

3|www.germanelectronics.ro
Simbolul LXDE din stnga jos deschide meniul de start, simbolurile de lng file manager i browser-ul web. Ca i la Windows
meniul de start are o structur configurat pe mai multe nivele. Pentru programele folosite des putei realiza simboluri pe
desktop apsnd tasta dreapt a mausului. Aici se afl cteva programe instalate, browser-ul web Midori, programele Python i
Pi Store.
Oprire Raspberry Pi
Teoretic putei scoate tecrul i cu asta Raspberry Pi se oprete. Dar mai bine este s procedai la fel ca i la un PC atunci cnd
nchidei sistemul de operare. n acest sens dai dublu clic pe desktop pe simbolul Shutdown.

1.3.1 Stocarea datelor proprii pe Raspberry Pi


Sub Linux managementul datelor se realizeaz n mod diferit fa de Windows, fr a fi ns un proces dificil. Raspbian are
propriul management al datelor, care seamn foarte mult cu Windows Explorer. O diferen important fa de Windows:
toate datele se afl ntr-un file system comun.
Sub Linux toate datele proprii se afl n directorul Home. n acest caz este vorba despre /home/pi, numele de utilizator fiind pi.
Linux folosete linia nclinat pentru a separa diferitele niveluri ale directorului (/), iar nu backslash-ul (\) folosit de Windows. n
acest director putei depozita i programele Python. File manager, care poate fi activat din meniul start folosind combinaia de
taste [Win]+[E] la fel ca i sub Windows, afieaz n mod standard numai directorul Home. Anumite programe depoziteaz
automat sub-directoare n acest director.
Dac dorii s vedei i datele care sunt interesante pentru utilizatorul cu cunotine avansate mutai File manager de sus, stnga
din Places n Directory tree. Apoi n meniu selectai View, iar aici opiunea Detail view.

Fig. 1.4: Aa arat File manager pe Raspberry Pi.

Fig. 1.5:sau aa.

Ct spaiu liber exist pe cardul de memorie?


Spaiul de stocare al unui hard disk de PC se poate umple foarte repede cu att mai repede se ntmpl acest lucru n cazul
cardului de memorie al lui Raspberry Pi. De aceea este foarte important s se poat controla permanent spaiul liber de pe
cardul de memorie. Bara de stare a File manager din marginea de jos a ferestrei afieaz n dreapta spaiul liber i cel ocupat de
pe cardul de memorie.

4|www.germanelectronics.ro
1.4 Primul program cu Python
Limbajul de programare instalat pe Raspberry Pi se numete Python. Acest limbaj convinge datorit structurii sale clare, dar i
prin posibilitatea de a automatiza orice rapid. Programul nu dispune de declaraii variabile, tipuri, clase sau reguli complicate i
de aceea utilizarea lui este o adevrat plcere.
Python 2.7.3 sau 3.3.0?
Pe Raspberry Pi sunt gata instalate dou versiuni Python. Din pcate versiunea cea mai nou Python 3.x folosete parial o alt
sintax dect versiunea 2.x, i de aceea programele nu pot funciona de pe o versiune pe alta. Anumite biblioteci importante, ca
de ex. PyGame pentru programarea jocurilor i afiri grafice pe ecran, nu sunt nc disponibile pentru Python 3.x. De aceea, dar
i pentru c majoritatea programelor disponibil online a fost scris pentru Python 2.x, folosim n acest manual versiunea Python
2.7.3. Dac pe Raspberry Pi este instalat o versiune Python mai veche 2.x, atunci exemplele vor funciona n acelai mod.

Python 2.7.3 se pornete de pe desktop folosind simbolul IDLE. n imagine vedei fereastra folosit pentru introducerea
datelor.

Fig. 1.6: Fereastra pentru introducerea datelor n Python-Shell.

n aceast fereastr putei deschide programele Python existente, edita sau prelucra direct comenzile Python sau edita un
program propriu. De ex. putei introduce urmtoarele date:
>>> 1+2
Dup aceea apare imediat rspunsul corect:
3
n acest mod Python poate fi folosit drept calculator de buzunar, ceea ce nu are ns de-a face cu programarea. n mod normal
cursurile de programare ncep cu un program Hallo Welt, care scrie pe ecran propoziia Hallo Welt. Acesta este un Python
simplu, dar putei insera i un headline. n fereastra Python-Shell introducei urmtoarele:
>>> print Hallo Welt (Hello World)
Acest prim program scrie apoi Hallo Welt n urmtorul rnd ce apare pe ecran.

Fig. 1.7: Hallo Welt n Python (deasupra apare i calculul).

Python-Shell folosete automat diverse culori pentru texte. Comenzile Python sunt portocalii, string-urile verzi, iar rezultatele
albastre. Mai trziu vei descoperi i alte culori.
Flashcards Python
Python este limbajul ideal de programare pentru a ncepe s nvai s programai. Va trebui ns s v obinuii cu sintaxa i
regulile pentru layout. Elementele cele mai importante de sintax sunt scrise sub form de crib. Acestea se bazeaz pe Python-
Flashcard ale lui David Whale. Pentru detalii v. bit.ly/pythonflashcards. Aceste Flashcards descriu sintaxa pe baza unor exemple
foarte scurte.
1.4.1 Cifre cu Python
nainte de ne ocupa cu teoria programrii, algoritmi i tipuri de date vom realiza primul joc n Python: un numr ales aleatoriu de
computer va trebui s fie ghicit de juctor folosind civa pai.
1. n meniul Python-Shell selectai File/New Window. Se deschide o nou fereastr, n care introducei urmtorul cod program:

5|www.germanelectronics.ro
2. Salvai datele n File/Save As als spiel1.py. Sau descrcai programul de la adresa www.buch.cd i deschidei-l n Python-Shell
cu File/Open. Apare automat codul de culori n Quelltext; cutai erorile de introducere a datelor.
3. nainte de a porni jocul trebuie s inei cont de literele speciale din limba german. Python ruleaz pe diferite platforme PC
care codeaz diferit aceste litere. Pentru a putea afia corect aceste litere alegei n meniul Options/Configure IDLE i activai
pe tabul General opiunea Locale-defined n zona Default Source Encoding.

Fig. 1.8: Setarea corect pentru afiarea literelor speciale n Python.

4. Pornii jocul cu tasta [F5] sau punctul din meniu Run/Run Module.
5. De dragul simplitii jocul a renunat la orice interfa grafic, precum i la texte sau ntrebri afiate. Computerul genereaz
la ntmplare un numr ntre 0 i 1.000. Introducei un anumit numr pentru a afla dac numrul generat de computer este
mai mare sau mai mic. Introducnd alte numere v vei apropia de rezultat.

Fig. 1.9: Numere n Python.

1.4.2 Cum funcioneaz


Putei verifica foarte uor dac jocul chiar funcioneaz. Probabil ns c v ntrebai urmtoarele: Ce se ntmpl n fundal? Ce
nseamn rndurile individuale ale programului?
import random Pentru a genera un numr aleatoriu se import un modul Python extern denumit random, care include
diverse funcii pentru generatorul aleatoriu.
zahl = random.randrange(1000) Funcia randrange din modulul random genereaz un numr aleatoriu n domeniul
limitat de parametri i anume 0 999. Parametrul funciei random, randrange () determin numrul posibil pentru cifrele
aleatorii. Acelai lucru este valabil i pentru alunecare sau alte funcii n Python.
Acest numr aleatoriu este stocat n variabila zahl. n Python variabilele sunt poziii de stocare ce au un nume aleatoriu i care
pot stoca cifre, succesiuni de cifre, liste sau alte tipuri de date. Spre deosebire de alte limbaje de programare acestea nu trebuie
s fie anterior declarate.
6|www.germanelectronics.ro
Cum iau natere cifrele aleatorii?
n general se consider c ntr-un program nu ar trebui s se ntmple nimic aleatoriu. i atunci cum ar putea un program s
genereze numere aleatorii? Dac un numr prim este mprit la o valoare oarecare, atunci primele numere dup virgul nu pot
fi anticipate. Acestea se modific fr nicio regul dac divizorul crete n mod regulat. Iar rezultatul va fi unul aleatoriu. ns
folosind un program identic sau activnd de mai multe ori acelai program acest numr va putea fi oricnd reprodus. Dac lum
ns un numr compus din aceste cifre i l mprim la un alt numr, care rezult n actuala secund sau din coninutul unei
poziii de stocare aleatorii, vom obine un rezultat care nu se poate reproduce i de aceea va fi considerat un numr aleatoriu.
tipp = 0 Variabila tipp include mai ulterior numrul introdus de utilizator. La nceput ea este 0.
i = 0 Variabila i este un contor pentru secvenele buclelor (loops) de programare. Ea este folosit pentru a contoriza numrul
de tipps de care are nevoie utilizatorul pentru a descoperi cifra secret. i aceast variabil este la nceput 0.
whiletipp! = zahl: Cuvntul while introduce o bucl de programare, care n acest caz este repetat de attea ori ca i
tipp, numrul introdus de utilizator este diferit de numrul secret tipp. Python folosete combinaia de semne != pentru diferit.
Dup dou puncte urmeaz bucla propriu-zis a programului.
tipp = input("Dein Tipp:") Funcia input scrie textul Dein Tipp:, dup care ateapt o introducere de date, care sunt
stocate n variabila tipp.
Amprentele sunt importante n Python
Majoritatea limbajelor de programare are imprimate bucle de programare sau decizii care au rolul de a organiza codul de
programare. n Python aceste amprente nu numai c servesc claritii, ci sunt necesare i pentru logica programului. n acest
sens nu este nevoie de un semn special pentru a ncheia buclele sau deciziile.

if zahl < tipp: Dac numrul secret zahl este mai mic dect numrul introdus de utilizator tipp, atunci...
print "Die gesuchte Zahl ist kleiner als ",tipp
...apare acest text. La capt se afl variabila tipp, pentru ca numrul introdus s fie afiat n Text. Dac nu se ntmpl aa atunci
irul amprentat este pur i simplu ignorat.
if tipp < zahl: Dac numrul secret este mai mare dect numrul introdus de utilizator tipp, atunci...
print "Die gesuchte Zahl ist grer als ",tipp
...va aprea un alt text.
i += 1 n orice caz contorul i, care numr ncercrile, va crete cu 1. Acest rnd al programului care include operatorul += are
aceeai semnificaie ca i i=i + 1.
print "Du hast die Zahl beim ",i,". Tipp erraten"
Acest ir este amprentat mai mult, ceea ce nseamn c i bucla while este spre sfrit. Dac nu este aa, adic numrul introdus
de utilizator tipp nu mai este diferit (ci egal) cu numrul secret zahl, va aprea acest text, compus din dou pri i variabila i i
care indic numrul de ncercri de care a avut nevoie utilizatorul. Programele Python nu au nevoie de o instruciune proprie
pentru ncheiere. Ele se ncheie dup ultima comand, respectiv dup o bucl care nu mai este executat i dup care nu mai
urmeaz alte comenzi.

2. Pe Raspberry Pi se aprinde primul led


Regleta de conexiuni cu 23 pini din colul lui Raspberry Pi ofer posibilitatea de a conecta direct hardware, pentru ca de ex. s se
introduc date prin intermediul tastelor sau s se aprind leduri n funcie de programare. Aceast reglet poart denumirea
GPIO (General Purpose Input Output).
Din cei 26 de pini, 17 pot fi programai la alegere drept intrare sau ieire, pentru a fi astfel folosii pentru multe extindere cu
hardware. Restul, cele pentru alimentare i alte scopuri, sunt configurate fix.

Fig. 2.1: Alocarea interfeelor GPIO. Linia gri de sus din stnga marcheaz marginea plcii electronice. Pinul 2 GPIO este n colul extrem al lui
Raspberry Pi.

7|www.germanelectronics.ro
Atenionare
Nu interconectai sub nicio form pinii GPIO i respectai urmtoarele instruciuni:
Anumii pini GPIO sunt conectai direct la mufele procesorului, iar un scurtcircuit poate distruge complet Raspberry Pi. Dac
legai doi pini ntre ei printr-un comutator sau led, atunci trebuie s inserai o rezisten n serie.
Pentru semnalele logice folosii ntotdeauna pinul 1, care livreaz +3,3 V i poate suporta o sarcin de max. 50 mA. Pinul 6
reprezint legarea la mas pentru semnalele logice. Restul, pinii marcai cu Ground sau 3V3 denumii 9, 14, 17, 20, 25 sunt
folosii pentru extinderi ulterioare. Recomandm ns s nu facei acest lucru pentru a putea folosi proiectele proprii pe versiuni
viitoare ale Raspberry Pi.
Fiecare pin GPIO poate fi folosit drept ieire (de ex. pentru leduri) sau intrare (de ex. pentru taste). Ieirile GPIO livreaz n starea
logic 1 o tensiune de +3,3 V, iar n starea logic 0 tensiunea de 0 V. Intrrile GPIO livreaz semnalul logic 0 pentru o tensiune de
pn la +1,7 V i semnalul logic 1 pentru o tensiune ntre +1,7 V i +3,3 V.
Pinul 2 livreaz +5 V pentru alimentarea hardware-ului extern. Aici se poate obine o valoare pentru curent egal cu cea livrat
de blocul de alimentare USB lui Raspberry Pi. Acest pin nu are voie ns s fie legat la o intrare GPIO.

2.1 Componentele incluse n setul educativ


Setul educativ include numeroase componente electronice cu care se pot realiza experimentele descrise (precum i cele proprii).
Acum vom descrie componentele pe scurt. Experiena practic n manipularea lor o putei obine numai prin realizarea
experimentelor.
2x plci electronice
1x led rou
1x led galben
1x led verde
1x led albastru
4x taste
4x rezistene 10 kOhmi (maro negru- portocaliu)
4x rezistene 1 kOhm (maro negru- rou)
4x rezistene 220 Ohmi (rou rou - maro)
12x cabluri de conexiune (plac electronic Raspberry Pi)
Cca. 1 m fir de conexiune.
2.1.1 Plac electronic tip breadboard
Setul educativ include dou plci electronice breadboard care permit realizarea rapid a circuitelor electronice. Placa are orificii
aezate la distane standard ntre ele n care se introduc componentele, fr a fi necesar lipirea lor. Aceste plci electronice au
irurile exterioare lungi conectate ntre ele prin contacte (X i Y).

Fig. 2.2: Placa electronic din set cu conexiuni realizate drept model.
Aceste iruri de contacte sunt folosite deseori drept pol pozitiv sau negativ n alimentarea circuitelor. n celelalte iruri de
contacte exist cte cinci contacte (A E i F - J) legate ntre ele n plan transversal, iar n mijlocul plcii electronice se afl un
orificiu. De aceea aici se pot introduce componentele mai mari, ce pot fi legate spre exterior.
2.1.2 Cablul de conexiune
Cablurile de conexiune color au toate pe o parte un mic tecr cu fir, ce permite conectarea acestora la placa electronic. Pe
cealalt parte exist o muf care intr ntr-un pin GPIO de pe Raspberry Pi.
Setul include i un fir de conexiune. Cu acesta putei realiza jumpere de conexiune scurte, ce permit conectarea irurilor de
contacte de pe placa electronic. Tiai firul cu un mic clete pentru a obine lungimile menionate n experimente. Pentru a
putea introduce mai simplu aceste fire n placa electronic recomandm s tiai firul oblic, n aa fel nct s rezulte un fel de
pan de fixare. Dezizolai ambele capete pe o lungime de o jumtate de centimetru.

8|www.germanelectronics.ro
2.1.3 Rezistenele i codurile lor de culoare
n electronica digital rezistenele sunt folosite pentru limitarea curentului care trece prin porturile unui microcontroler, precum
i drept rezistene n serie pentru leduri. Unitatea de msur pentru rezisten este Ohm. 1000 de Ohmi sunt un kiloohm, adic
kOhm.
Valorile de rezisten sunt indicate de inele colorate. Cele mai multe rezistene au patru inele color. Primele dou inele
reprezint cifrele, cel de-al doilea este multiplicatorul, iar cel de-al patrulea tolerana. Acest inel toleran are de obicei culoarea
aurie sau argintie aceste culori nu se folosesc la primele inele i de aceea direcia de citire a inelelor este clar. n electronica
digital valoarea toleran nu joac un rol prea important.

Fig. 2.1: Tabelul indic semnificaia inelelor colorate de pe rezistene.

Setul educativ conine rezistene cu trei valori diferite:


Valoare Inelul 1 Inelul 2 Inelul 3 Inelul 4 Utilizare
(zecimal) (unitate) (multiplicator) (toleran)
220 Ohm rou rou Maro auriu Rezisten n serie pentru
leduri
1 kOhm maro negru rou auriu Rezisten de protecie
pentru intrrile GPIO
10 kOhm maro negru portocaliu auriu Rezisten pull-down pentru
intrrile GPIO
Fig. 2.2: Codurile de culori ale rezistenelor din setul educativ.

inei cont de culori n special la rezistenele de 1 kOhm i 10 kOhmi. Acestea sunt uor de confundat.

2.2 Conectarea ledului


La porturile GPIO se pot conecta leduri pentru a realiza semnale i efecte luminoase. n acest sens conectai ntre pinul GPIO
folosit i anodul ledului o rezisten n serie de 220 Ohmi (rou-rou-maro) pentru a limita fluxul de curent i a mpiedica arderea
vreunui led. n plus, rezistena n serie protejeaz i ieirea GPIO a lui Raspberry Pi, cci n direcia de curgere a curentului ledul
aproape c nu are rezisten i de aceea portul GPIO conectat la mas ar putea fi uor suprasolicitat. Catodul ledului se leag la
cablul mas pe pinul 6.
n ce direcie se conecteaz ledul?
Cele dou fire de conexiune ale unui led au lungimi diferite. Firul mai lung este polul plus, anodul, iar firul mai scurt este catodul.
Simplu de memorat: semnul plus are nc o linie fa de semnul minus i de aceea firul este ceva mai lung. Totodat aproape
toate ledurile au partea minus aplatizat i semnul minus. Uor de memorat: catod = scurt.

Conectai un led la conexiunea +3,3 V (pin 1) folosind o rezisten n serie de 220 Ohmi (rou-rou-maro) i legai polul negativ al
ledului la cablul mas (pin 6).

9|www.germanelectronics.ro
Fig. 2.3: Circuitul pe plac pentru conectarea unui led.

Componentele necesare:
1x plac electronic
1x led rou
1x rezisten 220 Ohmi
2x cablu de conexiune

Fig. 2.4: Primul led pe Raspberry Pi.

n acest prim experiment Raspberry Pi este folosit numai pentru alimentarea ledului. Ledul lumineaz permanent, nu este nevoie
de un software.
n urmtorul experiment instalai un buton n cablul de alimentare al ledului. Ledul se aprinde numai dac apsai tasta. Nici n
acest caz nu este nevoie de un software.

10 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 2.5: Circuit pentru un led controlat de la o tast.

Componentele necesare:
1x plac experimental
1x led rou
1x rezisten 220 Ohmi
1x tast
2x cablu de conexiune

Fig. 2.6: Led cu tast pe Raspberry Pi.

11 | w w w . g e r m a n e l e c t r o n i c s . r o
2.3 GPIO cu Python
Pentru a putea folosi porturile GPIO cu programele Python trebuie s instalai biblioteca Python-GPIO. Dac nu tii cu siguran
dac au fost instalate toate modulele necesare, atunci instalai versiunile actuale folosind urmtoarele comenzi:
sudo apt-get update
sudo apt-get install python-dev
sudo apt-get install python-rpi.gpio
Porturile GPIO sunt ncorporate, ca i datele, n structura directorului. Pentru a accesa aceste date avei nevoie de drepturi Root.
Pornii Python-Shell cu drepturi Root folosind un terminal LX: sudo idle.

2.4 Aprinderea i stingerea ledului


Conectai un led cu o rezisten n serie de 220 Ohmi (rou-rou-maro) la portul GPIO 25 (pin 22), iar nu direct la conexiunea
+3,3 V i conectai polul negativ al ledului la ina mpmntare a plcii electronice folosind cablul mas al lui Raspberry Pi (pin 6).
Componentele necesare:
1x plac electronic
1x led rou
1x rezisten 220 Ohmi
2x cablu de conexiune
Urmtorul program led.py aprinde ledul timp de 5 sec., iar apoi n stinge:
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT)
GPIO.output(25, 1)
time.sleep(5)
GPIO.output(25, 0)
GPIO.cleanup()

Fig.2.7: Un led la portul GPIO 25.

2.4.1 Cum funcioneaz


Exemplul indic funciile de baz ale bibliotecii RPi.GPIO.
Import RPi.GPIO as GPIO Biblioteca RPi.GPIO trebuie s fie importat n toate programele Python n care urmeaz s fie
folosit. Toate funciile bibliotecii pot fi activate folosind prefixul GPIO.
Import time Biblioteca Python time, des folosit, nu are nimic de-a face cu programarea GPIO. Ea include funcii privind
calculul timpului i datei, printre altele i funcia time.sleep, ce permite programarea unor timpi de ateptare ntr-un program.
GPIO.setmode(GPIO.BCM) La nceputul fiecrui program trebuie s definii denumirea porturilor GPIO. n mod normal se
folosete varianta standard BCM.

12 | w w w . g e r m a n e l e c t r o n i c s . r o
Numerotarea porturilor GPIO
Biblioteca RPi.GPIO suport dou metode diferite pentru denumirea porturilor. n modul BCM se folosesc numerele port GPIO,
ce sunt folosite i la nivelul comenzilor sau scripturilor Shell. n modul alternativ BOARD denumirea pinilor cu numere de la 1 la
26 corespunde cu cea de pe placa Raspberry-Pi.
GPIO.setup(25, GPIO.OUT) Funcia GPIO.setup iniializeaz un port GPIO drept ieire sau intrare. Primul parametru
denumete portul n funcie de modul indicat BCM sau BOARD folosind numrul GPIO sau numrul pin. Al doilea parametru
poate fi GPIO.OUT pentru o ieire sau GPIO.IN pentru o intrare.
GPIO.output(25, 1) Portului astfel iniializat i se aloc 1. Se aprinde ledul conectat aici. n loc de 1 pot fi folosite i valorile
predefinite True sau GPIO.HIGH.
time.sleep(5) Aceast funcie din biblioteca time determin un timp de ateptare de 5 secunde, nainte ca programul s
ruleze mai departe.
GPIO.output(25, 0) Pentru a stinge ledul se aloc valoarea 0, respectiv False sau GPIO.LOW portului GPIO.
GPIO.cleanup() La sfritul unui program trebuie s resetai toate porturile GPIO. Acest rnd din program realizeaz acest
lucru pentru toate porturile GPIO iniializate din program. Porturile iniializate de alte programe nu sunt afectate. n acest fel nu
este distorsionat desfurarea altui program care ruleaz n paralel.
Interceptarea atenionrilor GPIO
Dac trebuie s configurai un port GPIO ce nu a fost resetat corect i care este nc deschis de un alt program sau de un
program anulat, atunci vor aprea mesaje de atenionare, care nu opresc ns desfurarea programului. n timpul programrii
aceste atenionri pot fi utile n descoperirea erorilor. ntr-un program gata conceput ele pot induce n eroare utilizatori
neexperimentai. De aceea biblioteca GPIO ofer prin comanda GPIO.setwarnings(False) posibilitatea de a elimina aceste
atenionri.

2.5 Start Python cu suport GPIO, fr terminal


Dac folosii Python i GPIO n mod intens nu trebuie s activai de fiecare dat terminalLX pentru a porni IDLE. Se poate i mai
simplu. Realizai un simbol pe desktop care activeaz Python-IDE cu drepturi de superuser:
Realizai o copie a simbolului de pe desktop IDLE. Procedai astfel:

Clic cu tasta dreapt a mouse-ului pe simbolul IDLE de pe desktop i alegei din meniu Copiaz.

Fig. 2.8: Copierea simbolului IDLE de pe desktop.


Clic cu tasta dreapt a mouse-ului pe desktop i alegei din meniu Insereaz. Deoarece pe desktop exist un simbol cu acest
nume va aprea un mesaj care v va atrage atenia asupra acestui fapt.
Modificai numele copiei din idle.desktop n idle_gpio.desktop. Simbolul de pe desktop nu se modific. Numele afiat este IDLE.

Fig. 2.9: Mesaj la copierea unui simbol de pe desktop.

13 | w w w . g e r m a n e l e c t r o n i c s . r o
Clic cu tasta dreapt a mouse-ului pe copia simbolului i alegei din meniu Leafpad. Linkurile desktop sunt n Linux date text, ce
pot fi prelucrate cu un editor de text.

Fig. 2.10: Link desktop n editorul Leafpad.

Realizai ambele modificri prezentate n imagine:


Modificai cmpul Name cu IDLE. GPIO. Acesta este numele afiat pe ecran.
n cmpul Exec, n faa activrii comenzii, aezai cuvntul sudo.
nchidei editorul i salvai datele. Cu dublu clic pe noul simbol desktop vei porni Python-IDE IDLE cu drepturi de superuser.
Acum putei folosi funciile GPIO fr a fi nevoie s activai Python de pe un terminal LX.

3. Semaforul
Chiar dac nu pare a fi aa pentru a aprinde i a stinge un led nu avei nevoie practic de un computer. Putei foarte simplu
construi un semafor cu trei leduri folosind combinaia de culori rou-galben; n plus Python dispune de alte tehnici de
programare.
Construii pe placa electronic circuitul din imagine. Pentru controlul ledurilor se folosesc trei porturi GPIO i un cablu
mpmntare comun. Numerele porturilor GPIO n modul BCM apar n imagine.

Fig. 3.1: Circuitul pentru semafor.

Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
3x rezisten 220 Ohmi
4x cablu de conexiune

14 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 3.2: Un semafor simplu.

Programul ampel01.py controleaz semaforul:

3.1.1 Cum funcioneaz


Primele rnduri ale programului sunt deja cunoscute, ele import bibliotecile RPi.GPIO pentru controlul porturilor GPIO i time
pentru decalajul de timp. Dup aceea urmeaz numerotarea porturilor GPIO pe BCM, la fel ca i n experimentul anterior.
rot = 0; gelb = 1; gruen = 2 Aceste rnduri definesc cele trei variabile rou, galben i verde pentru cele trei leduri. Nu
este nevoie s memorai n program numerele sau porturile GPIO, cci ledurile pot fi controlate prin intermediul culorilor.
Ampel=[4,18,23] Pentru controlul celor trei leduri se realizeaz o list care include numerele GPIO n succesiunea n care
ledurile sunt montate pe plac. Deoarece porturile GPIO apar n program numai n acest loc vei putea reconfigura simplu
programul dac dorii s folosii alte porturi GPIO.
GPIO.setup(Ampel[rot], GPIO.OUT, initial=False)
GPIO.setup(Ampel[gelb], GPIO.OUT, initial=False)
GPIO.setup(Ampel[gruen], GPIO.OUT, initial=True)
Dup aceea se iniializeaz cele trei porturi GPIO drept ieiri. n acest sens nu se folosesc numerele porturilor GPIO, ci lista
definit anterior. n cadrul listei sunt indicate prin cifre (ncepnd de la 0) elementele individuale. Ampel[0] este primul element,
n acest caz 4. Variabilele rou, galben i verde includ cifrele 0, 1 i 2, care sunt folosite drept indicii pentru elementele listei. n
acest cod porturile GPIO pot fi etichetate prin culori:
Ampel[rot] corespunde portului GPIO 4 cu ledul rou.

15 | w w w . g e r m a n e l e c t r o n i c s . r o
Ampel[gelb] corespunde portului GPIO 18 cu ledul galben.
Ampel[gruen] corespunde portului GPIO 23 cu ledul verde.
Instrucia GPIO.setup poate include un parametru opional iniial, care aloc portului GPIO o stare logic ncepnd cu
iniializarea. n acest fel ledul verde este aprins de la bun nceput n acest program. Celelalte dou leduri ncep programul n
starea neactivat.
print("Strg+C beendet das Programm") Acum pe ecran apare o scurt instruciune. Programul ruleaz automat.
nchidei programul cu combinaia de taste Strg + C. Pentru a chestiona faptul c utilizatorul trebuie s ncheie programul cu Strg
+ C vom folosi ntrebarea try...except. n acest proces sub try: se execut nc o dat codul introdus pentru program. Dac n
timpul acestui proces apare o excepie o eroare sau combinaia de taste Strg + C programul este oprit, iar instruciunea
except este executat la sfritul programului.
except KeyboardInterrupt:
GPIO.cleanup()
Aceast combinaie de taste declaneaz KeyboardInterrupt i totodat se iese automat din loop. Ultimul rnd determin
porturile GPIO utilizate i oprete toate ledurile. Cu aceasta programul este ncheiat. Datorit nchiderii controlate a porturilor
GPIO nu apar niciun fel de atenionri n sistem sau mesaje de eroare, care ar putea induce n eroare utilizatorul. Ciclul de
funcionare al semaforului are loc ntr-un loop continuu:
while True: Un loop continuu are nevoie ntotdeauna de o condiie pentru anulare, cci altfel programul nu ar putea fi
niciodat ncheiat.
time.sleep(2): La nceputul programului i la orice nou nceput al loop-ului se aprinde ledul verde timp de 2 secunde.
GPIO.output(Ampel[gruen],False); GPIO.output(Ampel[gelb],True)
time.sleep(0.6)
Acum se stinge ledul verde i se aprinde ledul galben. Acesta lumineaz timp de 0,6 secunde.
GPIO.output(Ampel[gelb],False); GPIO.output(Ampel[rot],True)
time.sleep(2)
Acum se stinge ledul verde i se aprinde cel rou. Acesta lumineaz timp de 2 secunde. Faza ledului rou al unui semafor este de
obicei mult mai lung dect faza ledului galben.
GPIO.output(Ampel[gelb],True)
time.sleep(0.6)
La startul fazei rou-galben se aprinde suplimentar ledul galben, fr a se stinge un alt led. Aceast faz dureaz 0,6 secunde.
GPIO.output(Ampel[rot],False)
GPIO.output(Ampel[gelb],False)
GPIO.output(Ampel[gruen],True)
La sfritul loop-ului semaforul trece din nou pe verde. Ledurile rou i galben sunt stinse, iar cel verde este aprins. Loop-ul o ia
de la nceput din faza verde a semaforului, cu un timp de ateptare de 2 secunde. Evident, toi aceti timpi pot fi ajustai n
funcie de preferinele personale. n realitate fazele semaforului depind de dimensiunile interseciei i de traficul rutier. Fazele
galben i rou dureaz de obicei cte 2 secunde.

4. Semafor pietoni
n acest experiment vom extinde circuitul semafor pentru a realiza un semafor pentru pietoni, care n timpul fazei rou a
semaforului afieaz o lumin intermitent pentru pietoni (aa cum este cazul n anumite ri). Evident putem construi i un
semafor pentru pietoni tipic pentru Europa Central care include lumina roie i verde; setul educativ conine pe lng ledurile
necesare pentru semafor nc un led.
Pentru acest experiment montai nc un led cu rezisten n serie, ca n imagine. Acesta este legat la portul GPIO 24.

Fig. 4.1: Circuit semafor i lumin intermitent pietoni.

16 | w w w . g e r m a n e l e c t r o n i c s . r o
Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
1x led albastru
4x rezisten 220 Ohmi
5x cablu de conexiune

Fig. 4.2: Semafor cu lumin intermitent pentru pietoni.

Programul ampel02.py controleaz noul semafor. Fa de versiunea anterioar programul a fost minim extins.

4.1.1 Cum funcioneaz


Secvena de desfurare a programului este n mare parte cunoscut. n timpul fazei de lumin roie (ceva mai lung) trebuie s
clipeasc rapid semaforul albastru pentru pietoni.
Blau = 4 Ledul pentru semaforul pietoni din list este definit de o nou variabil.
Ampel=[4,18,23,24] Lista include acum 4 elemente, pentru a putea controla cele 4 leduri.

17 | w w w . g e r m a n e l e c t r o n i c s . r o
GPIO.setup(Ampel[blau], GPIO.OUT, initial=False) Noul led este iniializat i oprit la nceput. Aceasta este setarea
de baz din timpul fazei de lumin verde a semaforului.

La 0.6 secunde dup nceputul fazei de lumin roie se d startul loop-ului, care determin clipirea ledului albastru. n acest sens
folosim un loop for, care spre deosebire de loop-ul while folosit n experimentele anterioare, utilizeaz ntotdeauna un anumit
numr de secvene loop, ceea ce nseamn c nu ruleaz pn la mplinirea condiiei de ncetare a loop-ului.
for i in range(10) Fiecare loop for are nevoie de un contor loop, o variabil care preia o valoare nou la fiecare secven
loop. n toate limbajele de programare pentru contoarele loop simple s-a ncetenit numele de i pentru aceast variabil.
Evident ns pot fi folosite i alte denumiri. La fel ca i oricare alt variabil i aceast valoare poate fi afiat n cadrul unui loop,
ceea ce nu este necesar n cazul de fa. Parametrul range din loop indic numrul de secvene loop, adic valorile pe care le
poate prelua contorul loop. n exemplul nostru loop-ul ruleaz de zece ori. Contorul loop i primete valori de la 0 la 9. n cadrul
loop-ului se aprinde noul led albastru, ca s se sting apoi dup 0,05 secunde. Dup alte 0,05 secunde se ncheie o secven
loop, iar urmtoarea repornete cu aprinderea ledului. n acest mod ledul clipete de 10 ori, iar totul dureaz n total 1 secund.
time.sleep(0.6) Cu un decalaj de 0,6 secunde de la ultima secven loop se reia ciclul normal al semaforului, astfel nct
ledul galben se aprinde suplimentar fa de ledul rou deja aprins. Nimic nou pn acum. Semaforul pentru pietoni devine cu
adevrat interesant dac nu funcioneaz automat, ci este pornit numai dup apsarea unui buton, aa cum se ntmpl n
realitate la multe semafoare pentru pietoni. n experimentul urmtor vom simula butonul veritabil al unui semafor pentru
pietoni folosind o tast conectat la un port GPIO.

4.2 Buton la conexiunea GPIO


Porturile GPIO indic nu numai date, de ex. prin leduri, ci pot fi folosite i pentru introducerea datelor. n acest sens ele trebuie
s fie definite n program drept intrare. Pentru introducerea datelor vom folosi un buton, conectat direct la placa electronic.
Butonul are patru pini de conexiune, iar pinii aflai fa n fa (distana mai mare) sunt legai ntre ei. Atta vreme ct apsai
butonul sunt legate ntre ele toate cele patru conexiuni. Spre deosebire de un comutator, un buton nu se blocheaz n poziie.
De aceea conexiunea este imediat ntrerupt dup eliberarea butonului. Dac la un port GPIO definit drept intrare se aplic un
semnal +3,3 V, atunci acesta este evaluat logic drept true, respectiv 1. Teoretic putei conecta portul GPIO la conexiunea +3,3 V
a lui Raspberry Pi folosind un buton, dar nu ar trebui n niciun caz s ncercai aa ceva! n caz contrar portul GPIO va fi
suprancrcat. Legai ntotdeauna o rezisten de protecie 1 kOhm ntre intrarea GPIO i conexiunea +3,3 V pentru a mpiedica
trecerea unui curent prea mare prin portul GPIO i astfel prin procesor.

Fig. 4.3: Buton cu rezisten de protecie la o intrare GPIO.

n majoritatea cazurilor acest circuit va funciona, cci altfel cu butonul n poziia deschis portul GPIO nu ar avea nicio stare clar
definit. Atunci cnd un program chestioneaz acest port se poate ajunge la rezultate aleatorii. Pentru a mpiedica acest lucru
conectai o rezisten foarte mare de obicei de 10 kOhmi la mas. Aceast aa-numit rezisten pull-down readuce starea
portului GPIO la 0 V atunci cnd butonul este n poziia deschis. Deoarece rezistena este foarte mare nu exist pericolul de
scurtcircuit atta vreme ct butonul este apsat.

Fig. 4.4: Buton cu rezisten de protecie i rezisten pull-down la o intrare GPIO.

Conform imaginii de mai jos montai n circuit un buton cu ambele rezistene.

18 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 4.5: Circuitul pentru semaforul pietonal.

Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
1x led albastru
4x rezisten 220 Ohmi
1x buton
1x rezisten 1 kOhm
1x rezisten 10 kOhmi
7x cablu de conexiune
1x jumper scurt
Terminalul de conexiuni inferior al butonului este legat la cablul +3,3 V al lui Raspberry Pi (pin 1) prin intermediul inei pozitive a
plcii electronice. Pentru a lega butonul la ina pozitiv se folosete un jumper scurt. Alternativ, unul din contactele inferioare
ale butonului poate fi legat direct la pinul 1 al lui Raspberry Pi prin intermediul unui cablu de conexiune.
Terminalul de conexiuni superior al butonului este legat la portul GPIO 25 prin intermediul unei rezistene de protecie de 1
kOhm (maro-negru-rou) i la cablul de mpmntare prin intermediul unei rezistene pull-down de 10 kOhmi (maro-negru-
portocaliu).

Fig. 4.6: Lumina intermitent a semaforului cu buton.

19 | w w w . g e r m a n e l e c t r o n i c s . r o
Programul ampel03.py controleaz noul semafor cu buton i lumin clipitoare pentru pietoni.

4.2.1 Cum funcioneaz


Fa de versiunea anterioar programul a fost puin extins.
# -*- coding: utf-8 -*- Pentru ca literele speciale din alfabetul german s poat fi afiate corect n programul
semaforului pentru pietoni indiferent de felul n care este setat suprafaa IDLE de ctre utilizator nainte de orice trebuie
definit un cod pentru afiarea semnelor speciale. Acest rnd trebuie s fie inclus n toate programele care afieaz texte ce
conin semne speciale.
ASCII, ANSI i Unicode
Un alfabet standard are 26 de litere, plus cteva semne speciale, toate scrise cu liter mare i mic, la care se adaug 10 cifre i
cteva semne de punctuaie; adic n total cca. 100 de simboluri. Cu un byte se pot afia 256 de semne diferite. Ceea ce ar trebui
s fie suficient sau cel puin aa se credea la nceputul istoriei computerelor cnd au fost definite principiile de baz ale tehnicii
actuale.
ns foarte repede s-a descoperit c dezvoltatorii setului de simboluri ASCII (American Standard Code for Information
Interchange) bazat de 256 de semne s-au nelat. Era vorba despre americani care nu au fost preocupai s conceptualizeze un
asemenea set dincolo de nevoile limbii engleze. n toate limbile importante ale lumii, cu excepia limbilor arabice i asiatice care
folosesc un stil propriu de litere, exist mai multe sute de litere care trebuie s fie reprezentate. Iar acestea nu aveau cum s
ncap ntr-o list cu numai 256 de semne.
Dup ce mai trziu a fost introdus n paralel cu ASCII i setul de simboluri ANSI, folosit de versiunile mai vechi Windows, s-a fcut
din nou aceeai greeal. Iar pentru ca nebunia s fie complet, literele speciale ale limbii germane i alte litere cu accente au
fost alocate n alte poziii ale setului de simboluri dect n standardul ASCII.
Pentru a rezolva aceast problem s-a introdus n anii 90 Unicode, ce poate reprezenta toate limbile, inclusiv hieroglifele,
scrierea cuneiform sau sanscrita vedic. Forma cea mai rspndit de codificare a semnelor Unicode n date text este UTF-8, un
sistem de codificare care folosete mai multe platforme i include primele 128 de semne ASCII i de aceea este compatibil cu
aproape toate sistemele de afiare a textului. Codificarea este indicat ntr-un rnd comentarii. Toate rndurile care ncep cu
semnul # nu sunt evaluate de interpretul Python. Codificarea, care trebuie s stea ntotdeauna la nceputul unui program, indic
felul n care sunt reprezentate semnele, fr s fie ns o instruciune real de programare. n acest fel n codul programului
putei introduce comentarii proprii.
Comentarii n programe
Atunci cnd se scrie un program se ntmpl des s nu mai tie la ce anume fac referire unele instruciuni ale programului.
Programarea este una dintre activitile cele mai creative, cci se creeaz ceva fr material i scule, ci numai pornind de la idei.
n cazul programelor care trebuie s fie nelese sau prelucrate i de alte persoane, comentariile sunt foarte importante.
Programele prezentate ca exemple nu includ comentarii pentru c scopul nostru a fost s meninem codul de program ct mai
clar. Toate instruciunile programului sunt descrise n mod detaliat.
n cazul programelor realizate n regie proprie apare deseori ntrebarea: comentarii n german sau englez? Dac comentariile
sunt n german se plng francezii, iar dac sunt n englez se plng britanicii de faptul c limba lor este ciuntit.

20 | w w w . g e r m a n e l e c t r o n i c s . r o
taster = 4
Ampel=[4,18,23,24,25]
De dragul simplitii am introdus n list pentru buton un element suplimentar cu numrul 4 i portul GPIO 25. n acest fel se
poate alege pentru buton i un alt port GPIO, cci numrul acestuia i porturile GPIO ale ledurilor sunt introduse numai n
aceast poziie a programului.
GPIO.setup(Ampel[taster], GPIO.IN) Portul GPIO al butonului este definit drept intrare. Aceast definiie se face tot prin
GPIO.setup, dar de data aceasta cu parametrul GPIO.IN.
print ("Taster drcken, um Fugngerblinklicht einzuschalten, Strg+C beendet das Programm")
Dup start programul afieaz un mesaj extins care informeaz utilizatorul c trebuie s apese butonul.
while True:
if GPI O.input(Ampel[taster])==True:

n interiorul loop-ului continuu este acum integrat o ntrebare. Instruciunile urmtoare sunt executate abia dup ce portul
GPIO 25 preia valoarea true, adic utilizatorul apas butonul. Pn la acest moment semaforul rmne n faza de lumin verde.
Cealalt secven a loop-ului corespunde n linii mari cu cea a ultimului program. Semaforul trece de la galben la rou, iar lumina
clipete de 10 ori. Dup aceea semaforul trece de la rou, la galben i verde.
time.sleep(2) n acest program exist o mic diferen. Faza de lumin verde de 2 secunde este acum la captul loop-ului,
iar nu la nceputul acestuia. Ea este aplicat o dat pro secven loop, cu diferena c ciclul semaforului ncepe imediat, fr
decalaj, dac butonul este apsat. Acest decalaj este integrat la captul loop-ului pentru a mpiedica stingerea rapid a fazei de
lumin verde atunci cnd butonul este apsat imediat dup faza de lumin galben.

5. Modele pentru ledurile multicolor i lumina curgtoare


Luminile curgtoare sunt ntotdeauna atractive, cci sunt folosite tocmai pentru a atrage atenie, fie n aplicaii gen party, fie n
cele profesionale. Un asemenea efect de lumin se poate realiza cu Raspberry Pi i cteva leduri.
Pentru urmtorul experiment montai pe placa electronic patru leduri cu rezistenele n serie. Acest circuit corespunde
semaforului pentru pietoni din experimentul anterior, dar fr buton.

Fig. 5.1: Circuitul pentru model i lumin curgtoare.

Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
1x led albastru
4x rezisten 220 Ohmi
5x cablu de conexiune

21 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 5.2: Patru leduri cu rezistene n serie.
Pe baza a diferite variante de clipire a ledurilor vom explica alte loop-uri i metode de programare n Python. Urmtorul program
demonstreaz diferitele variante de clipire led, ce pot fi selectate de ctre utilizator prin introducerea datelor pe tastatur.
Programul ledmuster.py permite clipirea ledurilor n diferite variante.

22 | w w w . g e r m a n e l e c t r o n i c s . r o
5.1.1 Cum funcioneaz
Primele rnduri ale programului cu definiia codificrii UTF-8 i importul bibliotecilor necesare sunt deja cunoscute din
experimentele anterioare. Suplimentar aici se import biblioteca random pentru a genera o variant de clipire aleatorie.
n dezvoltarea acestui program s-a avut n vedere ca acesta s fie ct mai flexibil n utilizare, adic s poat fi extins fr
probleme cu mai mult de patru leduri. Un stil bun de programare presupune o flexibilitate de acest gen. Pe Raspberry Pi aceste
programe pot fi extinse nu numai cu noi porturi GPIO, ci pot fi i rescrise pentru alte porturi GPIO, dac acest lucru este necesar
din punct de vedere al hardware-ului.
LED = [4,18,23,24] Pentru leduri se definete din nou o list cu numerele porturilor GPIO, astfel nct aceste porturi s
trebuiasc s fie integrate n program numai ntr-un singur loc.
for i in LED:
GPIO.setup (i, GPIO.OUT, initial=0)
Spre deosebire de iniializarea individual a ledurilor, aa cum se fcea la programele anterioare ale porturilor GPIO, acum prin
lista LED ruleaz un loop for. Contorul loop i preia una dup alta valorile din list, adic numrul porturilor GPIO ale ledurilor, i
nu realizeaz contorizarea simpl ca i la loop-urile for folosite pn acum. n acest fel se pot realiza liste orict de lungi. n
dezvoltarea programului lungimea listei nu trebuie s fie cunoscut.
z = len(LED); w = 5; t = 0.2 Cele patru porturi GPIO pentru leduri sunt definite drept ieiri i setate la 0 pentru a
decupla ledurile aprinse din experimentele anterioare.
Pentru a menine programul n varianta universal i ct mai uor de modificat sunt definite nc trei variabile:
z Numrul ledurilor Numrul ledurilor sunt preluate automat din lista LED cu ajutorul funciei len().
w Repetrile Fiecare model este repetat n mod standard de cinci ori, pentru a putea fi identificat mai bine.
Acest numr poate fi modificat dup bunul plac, fiind apoi valabil pentru toate modelele.
t Timp Aceast variabil indic durata n care un led rmne aprins n clipire. Pauza dureaz la fel de
mult. Numele t se folosete pentru toate variabilele care salveaz intervale de timp n
programe.
Valorile definite drept variabile sunt introduse n program numai n aceast poziie i de aceea pot fi uor modificate. Dup
aceste definiii se d startul programului propriu-zis.

Aceste rnduri informeaz utilizatorul referitor la tasta cifre folosit pentru reprezentarea unui anumit model.

Fig. 5.3: Programul afiat pe ecran.

Dup afiarea seleciei se d startul loop-ului principal al programului. n acest sens folosim un loop continuu while True:,
integrat ntr-o instruciune try...except.
e = raw_input ("Bitte Muster auswhlen: ") Chiar la nceputul loop-ului programul ateapt introducerea unor date de
ctre utilizator, care sunt salvate n variabila e. Funcia raw_input() preia sub form de text datele introduse, fr a le evalua. n
schimb operaiile matematice sau numele de variabile introduse cu input() sunt evaluate direct. De cele mai multe ori
raw_input() este alegerea mai bun, pentru c nu mai trebuie s v preocupai de mai multe eventualiti privind datele
posibile.

23 | w w w . g e r m a n e l e c t r o n i c s . r o
Programul ateapt pn ce utilizatorul introduce o liter i apas tasta [Enter]. n funcie de numrul introdus de utilizator
acum ar trebui s fie afiat a anumit variant cu leduri. Pentru a o chestiona folosim construcia if...elif...else.
Varianta 1
Dac data introdus a fost 1 va fi executat partea din program ncrestat n spatele acestui rnd.
if e == "1" Nu uitai c aceste ncrestri nu joac numai un rol optic n Python. La fel ca la loop, ntrebrile vor fi
introduse cu o ncresttur.
Acelai nu este ntotdeauna la fel
Python folosete dou tipuri de semne de egalitate. Cel mai simplu = are rolul de a aloca unei variabile o anumit valoare.
Semnul egal dublat == este folosit n ntrebri pentru a verifica dac dou valori sunt cu adevrat egale.
Dac utilizatorul a introdus 1 folosind tastatura se pornete un loop care genereaz o lumin curgtoare ciclic. Aceste loops au
n principiu aceeai structur pentru toate variantele led.
for i in range(w) Loop-ul exterior repet varianta de attea ori de cte ori este indicat n variabila w definit la nceput. n
acest loop se afl un alt loop care genereaz aceeai variant. Acestea sunt diferite la fiecare variant.

n cazul luminii curgtoare ciclice simple acest loop ruleaz o dat pentru fiecare led din list. Numrul de leduri a fost salvat la
nceputul programului n variabila z. Se aprinde ledul cu numrul strii actuale a contorului loop. Dup aceea programul ateapt
timpul salvat n variabila t, iar apoi stinge din nou ledul. n final ncepe noua secven loop cu urmtorul led. Loop-ul exterior
repet de cinci ori loop-ul interior.
Varianta 2
Dac utilizatorul a introdus 2 se d startul unui loop similar. n acest caz ledurile nu sunt numrate numai ntr-o direcie, ci la
captul luminii curgtoare ele sunt numrate din nou n succesiune invers. Lumina curge alternativ n fa i n spate.
elife == "2" Dup primele ntrebri restul folosesc interogarea elif , ceea ce nseamn c ele nu sunt executate dect atunci
cnd ntrebarea anterioar a avut drept rspuns False.

i n acest caz se folosesc loop-uri interconectate. Dup primul loop interior, care corespunde prii din program scris anterior,
adic dup ce ledul cu numrul 3 se aprinde, ncepe un alt loop pentru lumin curgtoare, care se desfoar n direcia invers.
Elementele de pe list sunt ntotdeauna numerotate ncepnd cu 0. De aceea cel de-al patrulea led are numrul 3.
Pentru a permite rularea unui loop n spate folosim sintaxa extins for...range(). n loc de a introduce numai o singur valoare
final se pot introduce i trei parametri: valoarea de start, pas i valoarea de final. n exemplul nostru acestea sunt:
Valoarea de start z-1 Variabila z include numrul de leduri. Deoarece numerotarea elementelor de pe list ncepe cu
0 ultimul led are numrul z-1.
Pasul -1 La un pas de -1 la fiecare executare a unui loop se numr napoi cu -1.
Valoarea final -1 ntr-un loop valoarea final este ntotdeauna prima valoare, care nu este atins. n primele
loops contorizate nainte contorul loops ncepe de la 0 i atinge valorile 0,1,2,3 pentru a adresa
ledurile. Valoarea 4 nu este atins la patru secvene loop. Loop-ul contorizat napoi trebuie se
ncheie cu 0 i astfel s nu ajung prima dat la valoarea -1.
Loop-ul al doilea descris determin clipirea celor patru leduri n direcie invers. Dup aceea loop-ul exterior d startul pentru
renceperea ciclului, care dureaz de dou ori mai mult dect n prima parte a programului, cci fiecare led clipete de dou ori.
Varianta 3
Dac utilizatorul a introdus 3 se d startul unui loop similar. n acest caz ledurile sunt contorizate n ambele direcii, dar nu sunt
stinse imediat dup ce sunt aprinse.

Primul loop interior aprinde ledurile unul dup altul, cu un mic decalaj. La captul loop-ului, ce poate fi recunoscut prin
decalarea rndului time.sleep(2*t), se ateapt timpul de decalaj dublu. Acesta este timpul n care sunt aprinse toate ledurile.
Dup aceea ncepe un alt loop care numr napoi i stinge ledurile unul dup altul. Dup ce toate ledurile sunt stinse, se
ateapt la captul loop-ului timpul de decalaj dublu, nainte ca loop-ul exterior s porneasc din nou ntreg ciclul.
24 | w w w . g e r m a n e l e c t r o n i c s . r o
Varianta 4
Dac utilizatorul a introdus 4, atunci se d startul unei alte variante de clipire, n care toate ledurile clipesc simultan i nu pot fi
activate unul dup altul.

Deoarece nu pot fi activate sau dezactivate simultan mai multe porturi GPIO folosind o singur instruciune, vom folosi i n
acest caz loops, dar fr timpi de decalare n interiorul unui loop. Cele patru leduri sunt aprinse unul dup altul. Ochiul uman
percepe ns aprinderea simultan a ledurilor. La captul primului loop interior programul ateapt timpul dublu de decalare
nainte de a stinge din nou toate ledurile.
Pentru a se obine efecte diferite n clipire vom aplica timpi diferii de aprindere i stingere. Clipirea este perceput dac durata
luminii este mai mare dect durata de ntuneric. Timpi foarte mici cu ledurile aprinse i timpi comparativ mai lungi cu ledurile
stinse genereaz efectul de clipire.
Varianta 5
Dac utilizatorul a introdus 5, atunci ledurile clipesc complet aleatoriu.

Deoarece n acest caz nu se folosesc loops interconectate vom permite parcurgerea de mai multe ori a loop-ului. Prin
multiplicarea variabilelor w i z fiecare led clipete la fel de des ca i n prima variant.
Funcia random.randint() scrie un numr aleatoriu n variabila j. Acest numr aleatoriu este mai mare sau egal cu primul
parametru i mai mic sau egal cu al doilea parametru; n cazul nostru el poate prelua valorile 0,1,2,3.
Ledul selecionat aleatoriu este aprins i apoi stins dup scurgerea timpului de decalaj. Dup aceea loop-ul repornete i se alege
aleatoriu un nou led.
Date invalid introduse
Toate programele care folosesc date introduse de utilizator trebuie s intercepteze datele introduse eronat. Dac utilizatorul nu
introduce datele corecte, atunci programul trebuie s reacioneze.

Dac utilizatorul a introdus altceva va fi executat instruciunea indicat prin else. Aceast seciune a unei interogri este
valabil ntotdeauna atunci cnd niciuna dintre interogri nu a livrat un rezultat adevrat. n cazul nostru programul afieaz pe
ecran un mesaj.
La fel ca i la experimentele anterioare programul este ncheiat cu KeyboardInterrupt; utilizatorul apas combinaia de taste
[Strg]+[C]. Ultimul rnd al programului nchide porturile GPIO utilizate i astfel stinge toate ledurile.

6. Diminuarea ledurilor prin modulaie de frecven a impulsurilor


Ledurile sunt componente folosite n mod normal pentru redarea semnalelor n electronica digital. Ele pot avea dou stri
diferite, on i off, 0 i 1 sau True i False. Acelai lucru este valabil i pentru porturile GPIO definite drept ieiri digitale. Conform
celor afirmate, teoretic dimarea unui led ar fi o operaie imposibil.
Dac se folosete un truc este totui posibil reglarea luminozitii unui led la un port digital GPIO. Dac un led clipete suficient
de rapid atunci ochiul uman nu mai poate percepe fenomenul de clipire. Tehnica denumit modulaie n durat a impulsurilor
genereaz un semnal pulsatoriu care se activeaz i dezactiveaz la intervale foarte scurte de timp. Tensiunea semnalului
rmne permanent aceeai, se modific doar raportul dintre nivelul False (0 V) i nivelul True (+3,3 V). Ciclul de funcionare
indic raportul dintre durata strii activate i durata total a unui ciclu.

Fig. 6.1: Stnga: ciclu de funcionare 50% - dreapta: ciclu de funcionare 20%

Cu ct ciclul de funcionare este mai mic, cu att mai mic este durata de iluminare a ledului n cadrul unui ciclu. De aceea un led
pare a fi mai nchis dect un led permanent activat.
n experimentul urmtor vom lega un led la portul GPIO 18 folosind o rezisten n serie.

25 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 6.2: Circuit cu un led.

Componentele necesare:
1x plac electronic
1x led galben
1x rezisten 220 Ohmi
2x cablu de conexiune

Fig. 6.3: Un led la portul GPIO 18.

Programul leddimmen01.py regleaz ciclic luminozitatea ledului folosind n acest sens funcionalitatea proprie PWM a bibliotecii
GPIO. Semnalul PWM este generat drept thread propriu. n acest fel putei folosi ntr-un program un led dimat (rapid) la fel ca i
unul cu luminozitate normal.

26 | w w w . g e r m a n e l e c t r o n i c s . r o
6.1.1 Cum funcioneaz
O parte a acestui program v este deja familiar, dar unele elemente vor fi complet necunoscute. Vom ncepe cu importul
bibliotecilor. De data aceasta vom stabili numai o singur variabil, LED, pentru portul GPIO 18, iar acesta va fi iniializat drept
ieire.
print ("Strg+C beendet das Programm") Deoarece i acest program funcioneaz cu o construcie try...except i
trebuie s fie respectat de ctre utilizator; va fi afiat o anumit informaie pentru utilizator.
p = GPIO.PWM(LED, 50) Funcia GPIO.PWM() din biblioteca GPIO este decisiv pentru redarea semnalelor PWM. Aceast
funcie are nevoie de doi parametri, portul GPIO i frecvena semnalului PWM. n cazul nostru portul GPIO este determinat
folosind variabila LED, frecvena fiind 50 Hz (oscilaii pe secund).
De ce 50 Hz este frecvena ideal pentru PWM
Ochiul uman nu mai poate percepe oscilaii ale luminii mai rapide de 20 Hz. Deoarece reeaua public de curent din Europa are
frecvena de 50 Hz foarte multe dintre corpurile de iluminat clipesc la aceast frecven, frecven ce nu poate fi perceput de
ochiul uman. Dac un led ar clipi la mai mult de 20 Hz, dar mai puin de 50 Hz, atunci ar putea s apar interferene cu alte surse
de lumin, motiv pentru care efectul de dimare nu ar mai fi uniform.
GPIO.PWM() genereaz un aa-numit obiect care este salvat n variabila p. Obiectele de acest gen sunt mult mai mult dect
simple variabile. Obiectele pot avea diferite caracteristici i pot fi influenate de aa-numitele metode. Metodele sunt separate
printr-un punct i sunt indicate n spatele numelui obiectului.
p.start(0) Metoda start() d startul generrii semnalului PWM. n acest sens trebuie specificat i ciclul de funcionare. n
cazul nostru ciclul de funcionare este 0, adic ledul este permanent stins. Acum se d startul loop-ului continuu, n care sunt
integrate unul dup altul dou loop-uri, care cresc sau diminueaz alternativ luminozitatea ledului.
for c in range(0, 101, 2): Loop-ul contorizeaz n pai de la 2 la 100. Drept final al unui loop for este indicat o
valoare, care nu este atins momentan, n cazul nostru 101.
p.ChangeDutyCycle(c) n fiecare secven loop metoda ChangeDutyCycle() seteaz ciclul de funcionare al obiectului PWM
la valoarea contorului loop, adic cu 2% mai mult de fiecare dat, pn cnd la ultima secven se ajunge la 100%, iar ledul are
luminozitatea maxim.
time.sleep(0.1) n fiecare secven loop se ateapt 0,1 secunde pn cnd urmtoarea secven crete din nou ciclul de
funcionare cu 2%.

Dup ce ledul ajunge la luminozitatea maxim, aceasta este diminuat de un al doilea loop folosind aceeai schem. Acest loop
numr n jos ncepnd cu 100 i folosind pai de -2. Acest ciclu se repet pn cnd un utilizator apas combinaia de taste
[Strg]+[C].

KeyboardInterrupt declaneaz suplimentar metoda stop() a obiectului PWM. Aceast metod ncheie generarea unui
semnal PWM. Dup aceea porturile GPIO sunt resetate.

6.1.2 Dimarea independent a dou leduri


Deoarece pentru programarea semnalului PWM nu este nevoie de un timp de programare, n scriptul Python exist posibilitatea
de dimare independent a mai multor leduri, aa dup cum o arat experimentul urmtor. n acest sens conectai un alt led la
portul GPIO 25 folosind o rezisten n serie.

27 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 6.4: Circuit pentru dimarea a dou leduri.

Componentele necesare:
1x plac electronic
1x led galben
1x led rou
2x rezisten 220 Ohmi
3x cablu de conexiune

Fig. 6.5: Un al doilea led la portul GPIO 25.

Programul leddimmen02.py dimeaz ciclic un led, n timp ce cellalt led crete n intensitatea luminoas mpreun cu primul led,
dar n ciclul urmtor nu pierde din luminozitate, ci devine mai luminos pornind de la 0 i de aceea plpie puternic.

28 | w w w . g e r m a n e l e c t r o n i c s . r o
6.1.3 Cum funcioneaz
Structura de baz a programului corespunde cu cea a experimentului anterior cu cteva mici modificri.

n locul unei variabile pentru portul GPIO acum se definete o list cu dou variabile i astfel se iniializeaz dou porturi GPIO,
18 i 25, drept ieiri pentru leduri.

n final se aplic cele dou obiecte p i q, care genereaz semnalele PWM pentru cele dou leduri, fiecare la 50 Hz.
n primul loop ciclul de funcionare al celor dou obiecte PWM crete simultan pas cu pas. n aceast faz cele dou leduri se
comport la fel.

q.ChangeFrequency(10) La captul acestui loop, cnd cele dou leduri au ajuns la luminozitatea maxim, se diminueaz
frecvena semnalului PWM al celui de-al doilea led la 10 Hz folosind metoda ChangeFrequency(). Aceast frecven este
perceput drept clipire de ctre ochiul uman.

Acum se d startul pentru al doilea loop, dar de data aceasta numrtoare este n sens ascendent. Pentru primul led din obiectul
PWM p, care trebuie s fie dimat pas cu pas n acest ciclu, se calculeaz n fiecare secven valorile corespunztoare pentru ciclul
de funcionare. Pentru al doilea led din obiectul PWM q ciclul de funcionare este pur i simplu majorat. Efectul de clipire apare
din cauza modificrii frecvenei.
q.ChangeFrequency(10) La captul celui de-al doilea loop frecvena acestui led este resetat la 50 Hz, astfel nct n
urmtorul ciclu ledul s devin treptat mai luminos la fel ca i primul led.

7. Afiarea spaiului de stocare de pe cardul de memorie folosind leduri


Cardurile de memorie, la fel ca i hard disk-urile, au ntotdeauna probleme cu spaiul liber de stocare. De aceea un indicator led
care s indice dintr-o privire spaiul liber de stocare ar fi util pentru muli utilizatori. Acest indicator poate fi uor realizat cu trei
leduri pe Raspberry Pi. n acest sens se folosesc funciile sistemului de operare care sunt accesate folosind Python.

Fig. 7.1: Spaiul liber de stocare poate fi afiat i direct n File manager, pe Raspberry Pi.

Pentru afiarea spaiului liber de stocare folosim trei leduri din circuitul semafor, care se aprind folosind diferite combinaii de
culori.

29 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 7.2: Circuitul pentru indicatorul de afiare al spaiului liber de stocare.

Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
3x rezisten 220 Ohmi
4x cablu de conexiune

Fig. 7.3: Cele trei leduri afieaz spaiul liber de stocare de pe cardul de memorie.

Programul speicheranzeige.py genereaz indicatoare led diferite, n funcie de spaiul liber de stocare de pe cardul de memorie.
Spaiu liber de stocare Indicator led
< 1 MB rou
1 MB la 10 MB rou-galben
10 MB la 100 MB galben
100 MB bis 500 MB galben-verde
> 500 MB verde
Tabel 7.1: Acesta este modul n care este indicat spaiul liber de stocare de pe cardul de memorie.

30 | w w w . g e r m a n e l e c t r o n i c s . r o
Dac programul este pus n funciune, atunci ledurile afieaz permanent spaiul liber de stocare de pe cardul de memorie.
Verificai acest lucru copiind cantiti mari de date din reea pe cardul de memorie, pe care apoi le tergei. Afiarea se
actualizeaz automat.

7.1.1 Cum funcioneaz


Pentru a calcula spaiul liber de stocare programul folosete modulul Python os, care pune la dispoziie funciile de baz ale
sistemului de operare.
Import os La fel ca i alte module, modulul os trebuie s fie importat la nceputul programului.
g1 = 1; g2 = 10; g3 = 100; g4 = 500 Aceste rnduri ale programului definesc limitele domeniului pentru spaiul liber
de stocare, ncepnd de la care afiarea trebuie s se schimbe. De dragul simplificrii programul folosete MB iar nu byte, cci
aceste cifre sunt mai uor de imaginat. Aceste valori limit pot fi oricnd modificate, iar cele patru valori pot fi aranjate numai n
sens cresctor.

O list definete numerele porturilor GPIO ale celor trei leduri. Dup aceea un loop iniializeaz cele trei porturi GPIO drept ieiri
i stinge ledurile.
n acest experiment folosim de asemenea o construcie try...except i un loop continuu, pentru a permite funcionarea automat
a programului, pn ce este anulat de ctre utilizator apsnd [Strg]+[C]. Dup aceea urmeaz funciile cu adevrat interesante,
care acceseaz sistemul de operare i verific spaiul liber de stocare.
S = os.statvfs('/') Modulul statistic os.statvfs() din biblioteca os livreaz diverse informaii statistice referitoare la File
system, care sunt scrise din nou drept obiect n variabila s la fiecare secven loop.
f = s.f_bsize * s.f_bavail / 1048576 Metoda s.f_bsize ofer mrimea n bytes pentru un bloc de stocare. s.f_bavail
indic numrul de blocuri libere. nmulind cele dou valori se obine numrul de bytes liberi, care n acest caz este mprit la
1.048.576, pentru a se obine astfel numrul de MB liberi. Rezultatul este stocat n variabila f.

Dac spaiul de stocare este mai mic dect prima valoare limit (1 MB), atunci secvena de caractere x (care indic modelul
pentru aprinderea ledurilor) este setat la 100. Trebuie s se aprind primul led, cel rou. Modelul este o succesiune de
caractere compus din cifrele 0 i 1.

31 | w w w . g e r m a n e l e c t r o n i c s . r o
Cu ajutorul ntrebrilor elif se chestioneaz i restul valorilor limit, iar modelul led este astfel setat n mod corespunztor,
atunci cnd prima ntrebare nu este valabil, ceea ce nseamn c exist un spaiu liber de stocare mai mare de 1 MB.

Dac niciun dintre ntrebri nu este valabil, ceea ce nseamn c exist un spaiu liber de stocare mai mare dect cea mai mare
valoare limit, atunci modelul led este setat la 001. Se aprinde ultimul led, cel verde.

Un loop determin valorile de ieire GPIO pentru cele trei leduri. Unul dup altul toate ledurile primesc o valoare din
succesiunea de valori 0 sau 1. Pentru a activa sau dezactiva ieirile GPIO valorile 0 i 1 pot fi folosite la fel ca i False i True.
Funcia int() calculeaz valoarea pornind de la un semn. Semnul este selectat dintr-o anumit poziie a lanului de modele
folosind contorul loop i.
time.sleep(1.0) Programul ateapt 1 secund pn la urmtoarea secven loop. Pentru a crete performana putei folosi
un timp de ateptare mai mare, dup scurgerea cruia urmeaz calculul spaiului liber de stocare.
Acum loop-ul while...True o ia de la nceput. Dac utilizatorul apas tastele [Strg]+[C] se declaneaz un KeyboardInterrupt i se
iese din loop. Dup aceea porturile GPIO sunt nchise, iar ledurile stinse.

8. Zar grafic
Pentru ca un joc s fie cool are nevoie de grafic, nu numai de text, aa cum se ntmpla n vremurile primelor computere DOS.
Biblioteca PyGame ofer funcii pre-definite i obiecte pentru reprezentarea grafic i programarea jocului. Drept urmare exist
un punct de pornire n programarea unui joc.
Multe jocuri folosesc zaruri, dar de multe ori se ntmpl s nu avei unul la dispoziie. Programul urmtor demonstreaz ct
este de uor s folosii Raspberry Pi drept zar cu ajutorul lui Python i PyGame:

Fig. 8.1: Raspberry Pi ca zar.

Zarul trebuie s fie uor de manevrat, cu o singur tast, iar rezultatul aruncrii zarului trebuie s fie afiat grafic sub forma
unui zar real. Programul wuerfel.py simuleaz pe ecran acest tip de zar.

32 | w w w . g e r m a n e l e c t r o n i c s . r o
Funcioneaz fr sudo
Deoarece acest program nu are nevoie de vreun port GPIO, el poate funciona i fr drepturi de superuser. Python-IDE poate fi
pornit simplu folosind simbolul de pe desktop IDLE.

8.1.1 Cum funcioneaz


Acest program include numeroase funcii noi, n special n ceea ce privete afiarea grafic cu biblioteca PyGame, care poate fi
folosit att pentru jocuri, ct i pentru orice afiare grafic pe ecran.

Aceste trei rnduri din programare se afl la nceputul aproape oricrui program care folosete PyGame. Pe lng modulul
random folosit pentru generarea cifrelor aleatorii, se ncarc i modulele pygame i sys, cci conin funcii importante ale
PyGame, ca de ex. deschiderea i nchiderea unei ferestre. Toate funciile din biblioteca PyGame sunt importate, iar astfel este
iniializat modulul PyGame propriu-zis.

Aceast funcie important n orice program, care folosete o afiare grafic, definete suprafaa unui caracter, aa-numita
surface, care are n exemplul nostru valoarea de 320 x 320 pixeli i numele FELD. Respectai modalitatea de scriere cu paranteze
duble, care este folosit n principiu pentru coordonatele grafice afiate pe ecran. O asemenea surface este reprezentat ntr-o
fereastr nou de pe ecran.

Acest rnd al programului servete la introducerea numelui ferestrei.

Aceste rnduri definesc culorile folosite, albastru i alb. Valoarea pentru culoare poate fi oricnd introdus direct n program,
ceea ce ns complic puin lucrurile.
Reprezentarea culorilor pe ecran
La fel ca i la majoritatea limbajelor de programare, culorile sunt definite n Python de trei cifre din intervalul 0 255, care
determin cele trei culori: rou, verde i albastru. Ecranele folosesc un amestec de culori, iar albul se obine din cele trei culori la
saturaie maxim.

Aceste rnduri din programare determin punctele centrale ale zarului. Pe un cmp cu dimensiunea de 320 x 320 pixeli se afl
cele trei axe ale zarului, fiecare cu coordonatele 60, 160 i 260.
Sistemul de coordonate pentru grafica PC
Fiecare punct dintr-o fereastr, respectiv de pe un obiect surface este definit cu ajutorul unei coordonate x i a unei coordonate
y. Punctul zero al sistemului de coordonate nu este jos n stnga, ci sus n stnga. Tot aa cum un text se citete din stnga sus
spre dreapta jos, axa x se ntinde de la stnga la dreapta, iar axa y de sus n jos.

Cele apte puncte P1 P7 determin punctele centrale ale zarului, redate grafic. Fiecare fa a zarului are o raz de 40 de pixeli.
La o distan fa de ax de 80 pixeli rmn 20 de pixeli ntre faa zarului i 20 de pixeli pn la marginile ferestrei.

33 | w w w . g e r m a n e l e c t r o n i c s . r o
Fig. 8.2: Feele zarului i coordonatele.

Acum se seteaz pe True o nou variabil denumit mainloop, care mai trziu va fi folosit pentru loop-ul principal al jocului.
Mainloop = True Cu aceasta s-au creat condiiile de baz, iar jocul propriu-zis poate s nceap.

Acest rnd explic utilizatorului ce anume s fac. La fiecare apsare a unei taste a tastaturii se arunc din nou zarul. print se
scrie ntotdeauna n fereastra Python-Shell, iar nu n noua fereastr grafic.
While mainloop: Acum ncepe loop-ul principal al jocului. Multe jocuri folosesc un loop continuu, care se repet permanent
i care chestioneaz tot timpul activitile utilizatorului. Undeva n loop trebuie s fie definit o condiie pentru ntrerupere, care
are rolul de a opri jocul.
n acest sens se folosete variabila mainloop, care preia ambele valori True i False. La nceput preia True, iar dup fiecare
secven loop starea este chestionat din nou. Dac n timpul loop-ului s-a preluat valoarea False, atunci loop-ul va fi ncheiat la
urmtoarea secven.
for event in pygame.event.get(): Acest rnd citete ultima activitate a utilizatorului i o salveaz drept event. Jocul
are numai dou tipuri de activiti relevante: utilizatorul apas o tast i astfel arunc zarul sau utilizatorul dorete s ncheie
jocul.

Exist dou posibiliti de a ncheia jocul. Clic pe simbolul x din colul din dreapta sus al ferestrei sau apsarea tastei Esc. Dac se
d clic pe simbolul x se livreaz event.type==QUIT. Dac se apas o tast i apoi aceasta este eliberat este vorba despre
event.type==KEYUP. Suplimentar n acest caz tasta apsat este salvat n event.key.
ntrebarea if verific dac utilizatorul vrea s nchid fereastra sau (or) a apsat i eliberat o tast i (and) aceast tast are
denumirea intern K_ESCAPE. Dac este aa atunci variabila mainloop primete valoarea False, ceea ce ncheie loop-ul principal
al jocului nainte de urmtoarea secven.
if event.type == KEYDOWN: Al doilea tip de activitate utilizator, care apare de mai multe ori n timpul jocului, este faptul
c utilizatorul apas o tast. n acest sens nu are nicio importan ce fel de tast, cu excepia tastei Esc. Dup ce a fost apsat o
tast (KEYDOWN), ncepe s ruleze o parte important a programului care genereaz i afieaz rezultatul aruncrii zarului.
FELD.fill(BLAU) Obiectul Surface denumit drept FELD, adic fereastra programului, este umplut cu culoarea definit prin
BLUE pentru a putea terge rezultatul anterior al aruncrii zarului.

Funcia aleatorie random genereaz un numr aleatoriu ntre 1 i 6 i l stocheaz n variabila ZAHL.

34 | w w w . g e r m a n e l e c t r o n i c s . r o
print ZAHL Acest rnd al programrii este scris n fereastra Python-Shell pentru controlul rezultatului aruncrii zarului. Putei
omite acest rnd dac dorii s renunai la afiarea textului.

Acum urmeaz ase ntrebri, toate urmnd aceeai schem. Atunci cnd numrul obinut prin aruncarea zarului are o anumit
valoare sunt desenate una pn la ase fee ale zarului. Funcia folosit n acest sens pygame.draw.circle() are nevoie de
patru sau cinci parametri:
Surface indic suprafaa caracterului pe care se deseneaz, n exemplu FELD.
Farbe indic culoarea cercului, n exemplu culoarea definit anterior WEISS.
Punctul central indic centrul cercului.
Radius indic raza cercului.
Dicke indic grosimea liniei cercului. Dac se renun la acest parametru sau se preia valoarea 0 cercul este umplut.
Dac este ndeplinit una dintre condiiile if, atunci feele zarului sunt salvate numai pe o suprafa semne virtual.
pygame.display.update() Acest rnd de la captul loop-ului actualizeaz grafica de pe ecran. Acum se pot vedea feele
zarului.

Fig. 8.3: Cele ase rezultate posibile ale aruncrii zarului.

Loop-ul reia totul de la nceput i ateapt din nou ca utilizatorul s apese o tast. Dac n timpul loop-ului mainloop acesta este
setat pe False, deoarece utilizatorul vrea s ncheie jocul, atunci loop-ul nu va mai rula nc o dat, ci va fi executat urmtorul
rnd din program:
pygame.quit() Acest rnd ncheie modulul PyGame, ceea ce nchide i fereastra grafic, iar apoi ntreg programul.

9. Ceas analogic afiat pe ecran


Afiarea digital a orei, aa cum ne-am obinuit de la computere, a intrat n mod abia n anii 70. Pn atunci ora a fost afiat
secole de-a rndul n mod analog, folosind ace indicatoare pe un cadran. Boom-ul ceasurilor digitale a pierdut din intensitate n
ultimii ani, cci s-a remarcat faptul c ora afiat analogic este mai uor de citit, n special n condiii meteorologice proaste sau

35 | w w w . g e r m a n e l e c t r o n i c s . r o
de la distane mari, aa cum se ntmpl n cazul ceasurilor din gri. Ochiul uman percepe mai rapid un simbol grafic, dect cifre
sau litere. Imaginea unui ceas analogic se imprim n memoria de scurt durat, astfel nct ceasul poate fi citit chiar dac
imaginea este neclar sau incomplet. Dac ns imaginea unui ceas digital este imprecis, nu se poate obine o evaluare corect
a orei exacte.

Fig. 9.1: Ceas analogic programat cu PyGame.

Acest program nu are numai rolul de a arta cum se programeaz un ceas, ci i de a indica principiile de baz folosite n
reprezentarea analogic, ce sunt folosite nu doar la ceasuri, ci i n afiarea diferitelor valori msurate sau date statistice.
Cele trei ace indicatoare se mic n jurul punctului central al cadranului ceasului: indicatorul care afieaz ora, minutarul i
secundarul. Sus n titlul ferestrei se afl i un ceas digital.
Programul uhr01.py afieaz ceasul analogic pe ecran:

9.1.1 Cum funcioneaz


Acest program include alte funcii ale bibliotecilor PyGame i time, precum i funciile trigonometrice folosite pentru
reprezentarea afirii analogice.

La nceput se iniializeaz biblioteca PyGame. n plus, se import biblioteca time pentru msurarea timpului, precum i trei
funcii din complexa bibliotec math.

36 | w w w . g e r m a n e l e c t r o n i c s . r o
Cele trei culori folosite pentru grafic sunt stocate n trei variabile.

Se deschide o fereastr de 400 x 400 pixeli, care este umplut complet cu alb.

Coordonatele punctului central sunt determinate de trei variabile, pe care se bazeaz toate celelalte elemente grafice, precum i
orientarea cadranului i a indicatoarelor. Variabilele MX i MY includ coordonatele x i y ale punctului central, variabila MP
punctul central drept punct, aa cum se folosete n cazul funciilor grafice.
Dup aceea urmeaz definirea unei funcii importante, care pe baza distanei dintre punctul central i un unghi calculeaz
punctele n sistemul de coordonate. Aceast funcie este folosit de mai multe ori n program, att pentru reprezentarea
cadranului ceasului, ct i a indicatoarelor.

Funcia folosete doi parametri: A este distana de la punctul dorit la punctul central, W este unghiul raportat la punctul central.
Pentru a simplifica afiarea orei, unghiul este calculat n direcia acelor de ceasornic raportat la direcia vertical ora 12. Unghiul
este distribuit funciei, dar nu n grade, ci n minute, 1/60 dintr-un cerc. n acest fel se elimin multe calcule intermediare.
La fel ca i majoritatea limbajelor de programare, Python calculeaz unitatea de msur pentru unghiuri n arc, iar nu n grade.
Funcia radian() din biblioteca math convertete gradele n arc. Datele introduse n program n minute sunt nmulite cu 6 pentru
a se obine grade, iar apoi se scad 90 de grade astfel nct direcia 0 s indice vertical n sus. Acest unghi calculat n arcuri este
stocat n variabila w1 pentru a fi folosit la alte calcule din interiorul funciei.
Afiarea unui ceas analogic se bazeaz pe funciile trigonometrice sinus i cosinus. Acestea calculeaz coordonatele punctului
central (wl) n sistemul de coordonate rectangulare (x1 i y1) pornind de la unghiul unui punct exprimat n arcuri. Coordonatele
punctului central sunt preluate de la variabilele MX i MY, care au fost definite n afara funciei i au validitate global. Distana
dintre punct i punctul central este transferat funciei prin intermediul parametrului A. Pe baza rezultatului funcia int()
calculeaz ntregul (numr ntreg), deoarece coordonatele pixeli nu pot fi indicate dect ca i numere ntregi.
Valoarea return a funciei este un punct geometric cu coordonatele x1 i y1, care ca i toate punctele apare ntre paranteze
duble.
Dup definirea acestei funcii este desenat cadranul cifrelor.

Un loop deseneaz unul dup altul pe un cerc cele 60 de puncte ale minutelor. Toate punctele sunt calculate cu funcia punkt().
Ele se afl la aceeai distan fa de punctul central, care este la o distan de exact 10 pixeli fa de marginea ferestrei (innd
cont de cei 190 de pixeli n cele patru cadrane). Punctele au o raz de 2 pixeli.

Un al doilea loop deseneaz 12 cercuri mai mari, care marcheaz orele pe cadranul ceasului. Acestea au o raz de 4 pixeli i sunt
desenate deasupra cercurilor existente pe care le acoper complet. Simbolurile or urmeaz unul dup altul la o distan de 5
minute.
Mainloop = True; s1 = 0 nainte ca loop-ul principal s dea startul programului, trebuie definite nc dou variabile
Help, de care vom avea nevoie n secvena urmtoare. La fel ca i la programul anterior mainloop-ul indic dac loop-ul trebuie
s funcioneze n continuare sau dac utilizatorul dorete s ncheie programul. s1 stocheaz ultima secund afiat.

Acum se d startul loop-ului principal al programului, care scrie n obiectul zeit timpul actual pentru fiecare secven, indiferent
de durata acesteia. n acest sens se folosete funcia time.localtime() din biblioteca time. Rezultatul este o structur de date,
compus din diferite valori individuale.

Cele trei valori relevante pentru acele indicatoare, secundele, minutele i orele, sunt scrise n trei variabile s, m i h.

Ceasurile analogice afieaz numai 12 ore. Funcia time.localtime() afieaz ora n formatul 24h. La afiarea orei dup-masa se
scad 12 ore.

Reprezentarea timpului la ceasurile analogice


n funcie de mecanismele folosite ceasurile analogice au dou afiri diferite. Minutarul realizeaz o micare uniform n jurul
cercului pe un ceas analogic, n timp ce la un ceas digital el sare de la un minut la altul. Ultima variant are avantajul c ceasul
poate fi citit mai uor, la precizie de un minut. n viaa de zi cu zi nu au importan fraciunile unui minut. Programul nostru
folosete i el aceast variant. Acul indicator al orei trebuie s execute o micare n cerc uniform, cci nu ar avea niciun sens
dac indicatorul ar sri de la o or la alta.

37 | w w w . g e r m a n e l e c t r o n i c s . r o
hm = (h + m / 60.0) * 5 Variabila hm stocheaz n minute unghiul acului indicator al orei. n acest sens se adaug la ora
actual 1/60 din valoarea minutului. Acul indicator al orei se mic n fiecare minut cu 1/60 dintr-o or. Valoarea calculat este
nmulit cu 5, cci acul indicator al orei avanseaz pe cadran ntr-o or cinci minute.
if s1 <> s: Durata unei curse n program nu este cunoscut. Pentru un ceas analogic acest lucru nseamn c grafica nu
trebuie s fie actualizat la fiecare curs, ci numai atunci cnd secunda actual este diferit de ultima desenat. n acest sens
secunda desenat este stocat mai trziu n program n variabila s1, iar secunda actual este ntotdeauna n variabila s.
Dac secunda s-a modificat fa de ultima secund desenat, atunci va fi actualizat grafica ceasului. Dac secunda nu s-a
modificat, atunci nu este nevoie de actualizarea graficului, iar loop-ul o ia de la capt chestionnd nc o dat ora actual a
sistemului.
pygame.draw.circle(FELD, WEISS, MP, 182)
Prima dat se deseneaz o suprafa de cerc alb, acoperit complet de acul indicator al orei. Raza de 182 de pixeli este ceva
mai mare dect cel mai lung ac indicator. Este mult mai simplu s desenezi un cerc pe tot ecranul, dect s suprascrii la precizie
de pixeli ultimul ac indicator desenat.
pygame.draw.line(FELD, SCHWARZ, MP, punkt(120, hm), 6)
Acest rnd al programului deseneaz acul indicator al orei drept o linie cu o lime de 6 pixeli i un unghi de 120 pixeli fa de
punctul central; acul indicator este introdus n variabila hm. Funcia pygame.draw.line() nu a fost folosit pn acum. Ea are
nevoie de cinci parametri:
Surface indic suprafaa pe care se deseneaz, n exemplul nostru FELD.
Farbe indic culoarea cercului, n exemplul nostru culoarea definit anterior SCHWARZ (negru).
Anfangspunkt indic punctul de nceput al liniei, n exemplul nostru punctul central al ceasului.
Endpunkt indic punctul de final al liniei, n exemplul nostru acesta este calculate cu funcia punkt() pornind de la unghiul
acului indicator al orei.
Dicke indic grosimea liniei.
Aceeai funcie deseneaz i celelalte dou ace indicatoare ale ceasului.
pygame.draw.line(FELD, SCHWARZ, MP, punkt(170, m), 4)
Acest rnd al programului deseneaz acul indicator al minutelor drept o linie cu o grosime de 4 pixeli i un unghi de 170 de pixeli
pornind de la punctul central i care este indicat n minute.
pygame.draw.line(FELD, ROT, MP, punkt(180, s), 2)
Acest rnd la programului deseneaz secundarul drept o linie roie cu o lime de 2 pixeli i un unghi de 180 pixeli pornind de la
punctul central i care este indicat n secunde.
s1 = s Acum secunda actualmente afiat este salvat n variabila s1, pentru a compara aceast valoare cu secunda actual n
urmtoarea curs.
pygame.display.set_caption("Aktuelle Zeit: " +
time.asctime())
Acest rnd al programului scrie ora actual n format digital n titlul ferestrei. n acest sens se folosete funcia time.asctime() din
biblioteca time, care livreaz datele de timp sub form de stringuri gata formatate.
pygame.display.update() Pn acum elementele grafice au fost desenate numai virtual. Acest rnd ns rennoiete
afiarea grafic. Actualizarea are loc simultan. De aceea nu exist trepidaii la desenarea acelor indicatoare individuale.
for event in pygame.event.get():
if event.type == QUIT or (event.type ==
KEYUP and event.key == K_ESCAPE):
mainloop = False
n cadrul ntrebrii if, adic numai o dat pe secund, apare o alt ntrebare prin care se stabilete dac utilizatorul dorete s
nchid fereastra ceas n cadrul ultimei secunde sau dac a apsat tasta Esc. Dac se ntmpl aa atunci variabila mainloop este
setat pe False, iar loop-ul nu mai este repornit.
pygame.quit() Ultimul rnd al programului nchide modulul PyGame, ceea ce nchide i fereastra grafic, iar apoi ntreg
programul.

10. Cmpurile grafice de dialog pentru controlul programului


Niciun program modern care presupune o interaciune cu utilizatorul nu funcioneaz numai n modul text. Toate programele au
suprafee grafice ce includ butoane care pot fi activate prin clic i deci nu folosesc introducerea datelor prin tastatur.
Python nu dispune de suprafee grafice pentru programe, dar exist mai multe module externe, similare cu PyGame, care au
rolul de a realiza suprafeele grafice. Unul dintre cele mai cunoscute module de acest gen este Tkinter, care face compatibil cu
Python suprafaa grafic Tk (ce poate fi folosit i cu alte limbaje de programare).
Structurile suprafeei grafice Toolkit Tk sunt diferite de cele ale lui Python, ba chiar par a fi neobinuite. De aceea vom ncepe cu
un exemplu simplu: un led trebuie aprins i stins ntr-o fereastr dialog folosind butoane.

38 | w w w . g e r m a n e l e c t r o n i c s . r o
Componentele necesare:
1x plac electronic
1x led rou
1x rezisten 220 Ohmi
2x cablu de conexiune

Fig. 10.1: Un singur led la portul GPIO 4.

Conectai un led la portul GPIO 4 folosind o rezisten n serie. Programul ledtk01.py va aprinde acest led.

Fig. 10.2: Aa arat fereastra de dialog.

10.1.1 Cum funcioneaz


Acest program include funciile de baz ale bibliotecii Tkinter folosite pentru a construi cmpuri grafice de dialog. Spre deosebire
de biblioteca PyGame, care construiete grafice la precizie de pixeli, mrimea cmpurilor de dialog i ale elementelor de control
n Tkinter se calculeaz automat pornind de la mrimile necesare; la nevoie aceasta poate fi influenat semnificativ i manual.
import RPi.GPIO as GPIO
from Tkinter import *
Dup importul bibliotecii GPIO se import i elementele bibliotecii Tkinter.

39 | w w w . g e r m a n e l e c t r o n i c s . r o
LED = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
Aceste rnduri nu includ nimic nou. Portul GPIO 4 este definit drept port de ieire pentru un led i este identificat cu variabila
LED.
def LedEin():
GPIO.output(LED,True)
Acum se definete funcia LedEin(), care aprinde ledul.
def LedAus():
GPIO.output(LED,False)
O funcie similar, LedAus(), stinge din nou ledul. Aceste dou funcii sunt activate mai trziu n cmpul de dialog folosind cele
dou butoane.
Pn acum nu am vorbit dect despre Python, dar mergem mai departe cu Tk i caracteristicile sale.
root = Tk() Tkinter funcioneaz cu aa-numitele widgets. Este vorba despre elemente de sine stttoare afiate pe ecran, n
majoritatea cazurilor n jurul cmpurilor de dialog, care la rndul lor includ diverse elemente. Fiecare program are nevoie de un
widget root, de la care se pot activa toate celelalte obiecte. Acest widget root se numete ntotdeauna Tk(), genereaz automat
o fereastr i iniializeaz i biblioteca Tkinter.
root.title("LED") n Tkinter obiectele pun la dispoziie diverse metode pentru diferite scopuri. Metoda title() ntr-un
widget configureaz titlul ferestrei, adic scrie n acest caz cuvntul LED n titlul noii ferestre.
Fiecare widget poate include mai multe obiecte, ce sunt definite individual. Tkinter folosete diferite tipuri de obiecte, care
permit orice parametru ce descrie caracteristicile obiectului. Parametrii sunt separai prin virgul i indicai ntr-o parantez n
spatele tipului obiectului. Deoarece aceast list poate deveni foarte lung vom scrie fiecare parametru ntr-un rnd propriu,
astfel nct toi parametrii s fie orientai ntre ei. Spre deosebire de interconectrile din cazul loop-urilor i a ntrebrilor din
Python, interconectrile obiectelor Tkinter nu sunt obligatorii.
Label(root, text="Bitte Button klicken, um die LED ein- und auszuschalten").pack()
Obiectele de tipul Label sunt texte ntr-un widget. Acestea pot fi modificate de program, dar nu ofer interaciune cu
utilizatorul. n orice obiect Tkinter primul parametru este numele widget-ului superior, de cele mai multe ori al ferestrei n care
se afl obiectul respectiv. n cazul nostru acesta este singura fereastr din program, widget-ul root.
Parametrul text include textul ce trebuie s fie afiat pe label. La captul definiiei obiectului este anexat aa-numitul Packer
drept metod .pack(). Acest Packer ncorporeaz obiectul n fereastra de dialog i genereaz geometria widget-ului.
Button(root, text="Ein",
command=LedEin).pack(side=LEFT)
Obiectele de tip buton sunt suprafee de control pe care se d clic pentru a declana o anumit aciune. i n acest caz
parametrul text include textul care trebuie s fie afiat pe buton.
Parametrul command include o funcie care activeaz butonul prin clic. Nu pot fi configurai parametri, iar numele funciei
trebuie s fie indicat fr paranteze. Acest buton activeaz funcia LedEin(), care aprinde ledul.
Metoda .pack() poate conine parametric care determin felul n care trebuie ordonat un obiect n interiorul cmpului de
dialog. side=LEFT nseamn c butonul trebuie s fie ordonat spre stnga, iar nu n poziie central.
Button(root, text= "Aus", command=LedAus).pack(side=LEFT)
Folosind aceeai schem se ordoneaz nc un buton, care stinge ledul folosind funcia LedAus().
Acum sunt definite toate funciile i obiectele, iar programul propriu-zis poate ncepe s funcioneze.
root.mainloop() Programul principal este compus dintr-un singur rnd. El pornete loop-ul principal mainloop(), o metod a
widget-ului root. Acest loop ateapt ca utilizatorul s acioneze un widget i astfel s declaneze o aciune.
Simbolul x din dreapta sus folosit pentru nchiderea ferestrei nu trebuie s fie definit n Tkinter. Dac utilizatorul nchide
fereastra principal root se nchide automat i mainloop().
GPIO.cleanup() Programul ruleaz mai departe pn la ultimul rnd i nchide porturile GPIO deschise.
Dup ce s-a dat startul programului pe ecran apare un cmp de dialog. Clic pe butonul On pentru a aprinde ledul, iar apoi pe Off
pentru a-l stinge.

10.2 Controlul luminii curgtoare cu suprafa grafic


Biblioteca Tkinter ofer mai multe elemente de control pe lng butoane. Butoanele radio permit construirea de meniuri de
selecie, n care utilizatorul poate selecta una dintre multele opiuni oferite.
Ce sunt butoanele radio?
Numele butoane radio provine de la vechile radiouri pe care existau butoane pentru staiile radio. Dac se apas un asemenea
buton atunci ultimul buton apsat srea automat afar. Butoanele radio se comport n acelai fel. Dac utilizatorul alege o
opiune, atunci restul sunt automat dezactivate.
40 | w w w . g e r m a n e l e c t r o n i c s . r o
Urmtorul experiment afieaz diverse modele de clipire leduri, care seamn cu cele folosite n experimentul Modele de leduri
colorate i lumin curgtoare. Dar n acest caz utilizatorul nu trebuie s introduc numere pe ecran, ci doar s aleag dintr-o
list modelul dorit.

Fig. 10.3: Cmpul de dialog ofer trei modele led la alegere.


Circuitul este asemntor cu cel din experimentul Modele de leduri colorate i lumin curgtoare.

Fig. 10.4: Circuitul pentru experimentul 10.2.

Componentele necesare:
1x plac electronic
1x led rou
1x led galben
1x led verde
1x led albastru
4x rezisten 220 Ohmi
5x cablu de conexiune

Fig. 10.5: Cele trei leduri clipesc urmnd modele diferite.

41 | w w w . g e r m a n e l e c t r o n i c s . r o
Programul ledtk02.py se bazeaz pe programul anterior, dar a fost extins cu butoanele radio i funciile pentru lumina
curgtoare led i modelele de clipire.

10.3 Setarea vitezei de clipire


n pasul al treilea se extinde nc o dat cmpul de dialog. Utilizatorul poate seta viteza de clipire de la un comutator culisant.

Fig. 10.6: Trei modele led pentru selecie i viteza de clipire setabil.
Utilizarea comutatorului culisant
Comutatorul culisant folosete o metod intuitiv pentru introducerea numerelor n cadrul unui anumit domeniu. n acest fel nu
mai este nevoie de ntrebarea privind plauzibilitatea, care verific dac utilizatorul a introdus o valoare pe care programul o
poate implementa, cci nu sunt posibile alte valori dect cele care se nscriu n domeniul comutatorului. Orientai comutatorul n
aa fel nct valorile s poat fi imaginate de ctre utilizator. Nu are niciun rost s setai valori la milimetru. Utilizatorul are la
dispoziie o scal de la 1 la 10 sau 100, iar valoarea este convertit n program. Valorile trebuie s creasc de la stnga la
dreapta, cci este metoda familiar pentru orice utilizator. Introducei ntotdeauna o valoare precis care este preluat atunci
cnd utilizatorul nu modific comutatorul.
Programul ledtk03.py corespunde exemplului anterior, fiind completat numai reglarea vitezei.

42 | w w w . g e r m a n e l e c t r o n i c s . r o
10.3.1 Cum funcioneaz
Iniializarea bibliotecilor i a porturilor GPIO, precum i definirea listei pentru cele trei modele de clipire corespund programului
anterior. Nu mai trebuie stabilit variabila t pentru timpul de clipire, cci acesta va fi citit mai trziu de pe comutatorul culisant.
g = IntVar(); g.set(5) Pe lng variabila Tk V n care a fost stocat modelul de clipire ales, este nevoie de o alt variabil
pentru vitez. Aceasta conine o valoare de start de 5, care corespunde valorii medii a comutatorului culisant.
def LedEin():
e = v.get(); t = 1.0/g.get()
Funcia care determin clipirea ledurilor corespunde de asemenea exemplului anterior, dar cu o diferen. Variabila t pentru
durata clipirii se calculeaz pe baza valorii comutatorului culisant g.
Deoarece n general clipirea rapid este asociat cu viteza mare, comutatorul culisant va livra valorile mai mari spre dreapta.
Pentru o vitez mai mare este nevoie de un timp de ateptare mai scurt, adic o valoare mai mic. Aceasta se obine din calculul
unei valori inverse, care se determin pornind de la valorile 1 pn la 10 ale comutatorului culisant pentru a obine valorile 1.0
pn la 0.1 pentru variabila t. n formul trebuie introdus 1.0 iar nu 1, astfel nct rezultatul s fie un numr flotant, iar nu un
numr ntreg.
Convertirea numerelor ntregi n numere flotante
Rezultatul unui calcul este stocat automat drept numr flotant, dac cel puin una dintre valori apare drept numr flotant. Dac
toate valorile sunt numere ntregi atunci rezultatul apare tot ca numr ntreg.
Definiia pentru label i butoanele radio din cmpul de dialog este preluat din exemplul anterior.
Label(root,
Text = "Geschwindigkeit").pack()
Pentru explicarea comutatorului culisant se scrie un alt label n cmpul de dialog. Deoarece acesta nu include niciun parametru
n metoda pack(), va fi ncorporat central n plan orizontal, sub butoanele radio.
Scale(root, orient=HORIZONTAL, from_ = 1, to = 10, variable = g).pack()
Comutatorul culisant este un obiect de tip Scale, care la fel ca toate obiectele din acest cmp de dialog include root drept primul
parametru. Parametrul orient=HORIZONTAL indic faptul c comutatorul culisant este orizontal. Fr acest parametru ar sta n
poziie vertical. Parametri from_ i to indic valorile de nceput i de sfrit ale comutatorului culisant. Parametrul variable
determin o variabil Tk declarat anterior, n care se introduce valoarea setat anterior pentru comutatorul culisant. Valoarea
de nceput a fost preluat de la valoarea stabilit pentru declaraia variabilei, n acest caz 5.

43 | w w w . g e r m a n e l e c t r o n i c s . r o
Comutatorul culisant este ncorporat n cmpul de dialog ntr-o poziie central, orizontal folosind metoda pack().
Celelalte pri ale programului butonul Start, mainloop i sfritul programului sunt preluate n variant nemodificat din
exemplul anterior.
Pornii programul, alegei un model de clipire i stabilii viteza. Valorile mai mari nseamn vitez mai mare de clipire. Clic pe
butonul Start, funcia LedEin() citete modelul de clipire selectat din butoanele radio, precum i viteza din poziia comutatorului
culisant.

11. PiDance cu leduri


Spre sfritul anilor 70, nainte de apariia veritabilelor PC games, a existat un joc electronic cu patru lmpi colorate, care a fost
desemnat n anul 1979 drept cel mai popular joc. Jocul a fost comercializat n Germania sub denumirea de Senso. Atari a scos pe
pia o alt variant sub denumirea Touch Me, jocul avnd dimesiunile unui calculator de buzunar. O alt variant a primit
numele Einstein, iar n rile vorbitoare de limb englez Senso a fost comercializat sub denumirea Simon.
Python livreaz o versiune grafic a acestui joc, care poart numele de Simulate i se gsete n Games Raspbian.

Fig. 11.1: Jocul Simulate din Python Game.


PiDance se bazeaz pe acelai principiu de joc: ledurile clipesc ntr-o succesiune aleatorie. Utilizatorul trebuie s apese pe
butoanele pentru a copia aceeai succesiune. La fiecare rund a jocului se aprinde nc un led, astfel nct devine tot mai greu
pentru utilizator s rein succesiunea. Jocul se ncheie la prima greeal.
Jocul este construit pe dou plci electronice, astfel nct butoanele s fie amplasate la margine i s poat fi uor de manevrat,
fr a trage din greeal cablu din plci. Pentru o stabilitate ct mai bun plcile electronice pot fi conectate ntre ele pe
lungime.
Suplimentar, pe lng cablurile de conexiune deja cunoscute, vom avea nevoie i de patru jumpere scurte. Tiai din firul de
conexiune buci de 2,5 cm folosind un clete sau o foarfec i dezizolai capetele acestor buci pe o lungime de 7 mm folosind
un cuit ascuit. ndoii firele n forma literei U. Cu acestea vei putea apoi conecta ntre ele cte dou rnduri de pe o plac
electronic.

Fig. 11.2: Circuitul pt experimentul 11.

44 | w w w . g e r m a n e l e c t r o n i c s . r o
Componentele necesare:
2x plac electronic 1x led albastru 4x butoane
1x led rou 4x rezisten 220 Ohmi 10x cablu de conexiune
1x led galben 4x rezisten 1 kOhm 4x jumper scurt
1x led verde 4x rezisten 10 kOhmi

Fig. 11.3: PiDance cu leduri i butoane pe dou plci.


Butoanele sunt montate vizavi fa de ledurile corespunztoare. Cele dou rnduri din mijloc ale plcilor electronice de pe
ambele pri ale locurilor de conexiune servesc drept cablurile 0 V i +3,3 V ale circuitului.
Programul pidance01.py include jocul integral.

45 | w w w . g e r m a n e l e c t r o n i c s . r o
11.1.1 Cum funcioneaz
Programul ofer multe nouti, dar principiile de baz ale sistemului de control GPIO sunt aceleai.
Rzahl = 10 Dup importul modulelor time, random i RPi.GPIO se programeaz variabila rzahl, care determin numrul de
runde de joc. Evident, putei juca mai mult de 10 runde dar cu ct este mai mare numrul de runde, cu att mai dificil va fi s
memorai succesiunea de clipire a ledurilor.
farbe = []
for i in range(rzahl):
farbe.append(random.randrange(4))
Lista farbe este completat cu tot attea numere aleatorii ntre 0 i 3, cte runde trebuie s fie jucate, iar n acest sens se
folosete un loop i metoda append(), pe care o avei la dispoziie n orice list. Metoda introduce n list elementul livrat drept
parametru.
LED = [23,24,25,8]
for i in LED:
GPIO.setup(i, GPIO.OUT, initial=False)
Porturile GPIO pentru leduri sunt configurate drept ieiri ntr-o list LED i sunt toate oprite.
TAST = [4,17,21,22]
for i in TAST:
GPIO.setup(i, GPIO.IN)
Folosind aceeai schem, porturile GPIO pentru cele patru butoane sunt configurate drept intrri ntr-o list LED.
Cu aceasta au fost create condiiile de baz i nu mai urmeaz dect s definim nc dou funcii, de care programul va avea
nevoie de mai multe ori.
def LEDein(n, z):
GPIO.output(LED[n], True); time.sleep(z)
GPIO.output(LED[n], False); time.sleep(0.15)
Funcia LEDein() aprinde un led i l las aprins o anumit perioad de timp. Funcia folosete doi parametri. Primul parametru,
n, indic numrul ledului, ntre 0 i 3, al doilea parametru, z, timpul n care ledul este aprins. Dup ce ledul este din nou stins,
funcia ateapt nc 0,15 secunde nainte de a se dezactiva; n acest fel pot fi percepute scurtele pauze ntre aprinderea
ledurilor. Acest lucru este foarte important atunci cnd un led este aprins consecutiv de mai multe ori. n caz contrar fenomenul
nu ar putea fi perceput.
def Druecken():
while True:
if(GPIO.input(TAST[0])):
return 0
if(GPIO.input(TAST[1])):
return 1
if(GPIO.input(TAST[2])):
return 2
if(GPIO.input(TAST[3])):
return 3
Funcia Druecken() este compus dintr-un loop continuu, care ateapt ca utilizatorul s apese un buton. Dup aceea numrul
butonului este restituit programului.
ok = True Dup definirea funciilor se d startul programului principal, iar variabila ok este setat pe True. Dac juctorul face
o greeal, variabila ok este setat pe False. Dac variabila este setat n continuare pe True dei numrul de runde de joc
programate s-au epuizat, atunci nseamn c juctorul a ctigat.
for runde in range(1, rzahl +1):
Jocul se desfoar conform numrului de runde indicate n variabila rzahl. Contorul runde este mutat la 1, pentru ca jocul s
nceap cu runda 1, iar nu cu runda 0.
print "Runde", runde
Runda actual este afiat n fereastra Python-Shell.
for i in range(runde):
LEDein(farbe[i], 1)
Acum programul execut succesiunea pe care trebuie s o memoreze juctorul. n funcie de runda actual de joc se aprind
ledurile unul dup altul conform listei farbe stabilit la nceputul programului, n care culorile sunt selectate aleatoriu. Deoarece
contorul runde ncepe cu 1, n prima rund se aprinde un led. Pentru a aprinde ledul se folosete funcia LEDein(), al crui prim
parametru este culoarea din poziia corespunztoare de pe list, iar al doilea parametru determin ca fiecare led s lumineze
timp de o secund.
for i in range(runde): Dup ce s-a realizat succesiunea de culori, se d startul celui de-al doilea loop, n care juctorul
trebuie s apese pe butoane pentru a realiza aceeai succesiune din memorie.

46 | w w w . g e r m a n e l e c t r o n i c s . r o
taste = Druecken() n acest sens se activeaz funcia Druecken(), pn ce juctorul apas un buton. Numrul de butoane
apsate este salvat n variabila taste.
LEDein(taste, 0.2) Dup apsarea unui buton se aprinde scurt ledul corespunztor timp de 0,2 secunde.
if(taste != farbe[i]): Dac ultimul buton apsat nu corespunde cu culoarea din poziia corespunztoare de pe list,
nseamn c juctorul a pierdut. Operatorul != indic inegalitatea. Aici se poate folosi i <>.
print "Verloren!"
print "Du hast es bis Runde", runde 1, "geschafft"
Programul afieaz pe un ecran faptul c juctorul a pierdut, precum i numrul de runde reuite de acesta. Numrul rundelor
reuite este cu unul mai mic dect ceea ce s-a contorizat.
for j in range(4):
GPIO.output(LED[j], True)
Toate ledurile sunt aprinse.
for j in range(4):
time.sleep(0.5); GPIO.output(LED[j], False)
iar apoi sunt stinse unul dup altul la o distan de 0,5 secunde. n acest fel se obine efectul de involuie.
ok = False Variabila ok, care indic dac juctorul este nc n joc, este setat pe False
break... iar loop-ul este oprit. Juctorul nu mai poate apsa niciun buton. La prima greeal jocul s-a ncheiat.
if(ok == False):
break
Dac ok este setat pe False, se oprete i loop-ul exterior i nu mai urmeaz alte runde.
time.sleep(0.5) Dac introducerea succesiunii a fost corect, atunci programul ateapt 0,5 secunde pn la startul noii
runde.
if(ok == True): Programul ajunge n acest loc fie atunci cnd loop-ul a fost executat pn la capt, ceea ce nseamn c
juctorul a indicat corect toate succesiunile, fie atunci cnd loop-ul anterior a fost ntrerupt de o greeal a juctorului. Dac ok
este setat pe True urmeaz premierea ctigtorului. Altfel se sare peste acest bloc, iar jocul ruleaz ultimul rnd al programului.

n cazul unei victorii n fereastra Python-Shell apare un mesaj. Dup aceea clipesc scurt, de 5x toate ledurile, unul dup altul.
GPIO.cleanup() Este executat ultimul rnd al programului. Se nchid porturile GPIO utilizate.

Toate denumirile folosite pentru hardware i software, precum i denumirile i logo-urile firmelor incluse n acest manual
reprezint mrci nregistrate. Toate drepturile rezervate.
Toate circuitele i programele incluse n acest manual au fost concepute, examinate i testate cu foarte mult grij. Cu toate
acestea nu pot fi excluse erori n manual i n software. Dreptul la despgubiri n caz de nendeplinire a clauzelor contractuale
este limitat la daunele previzibile, atta timp ct nu este vorba despre vreo responsabilitate obligatorie conform legii privind
calitatea produselor.
Acest produs respect directivele CE n vigoare, dar numai dac este utilizat n conformitate cu acest manual. Manualul
de utilizare nsoete produsul. nmnai acest manual i altor persoane, crora le punei la dispoziie produsul.
Atenie! Protecia ochilor i ledurile
Nu privii direct spre un led de la distan mic, cci riscai daune oculare! Observaia este valabil n special pentru ledurile
luminoase ncorporate n carcase transparente, dar mai ales pentru ledurile power. n cazul ledurilor albe, albastre, violete i
ultra-violete luminozitatea aparent nu pare a fi un pericol pentru ochi. Mare atenie n manipularea lentilelor convergente.
Folosii ledurile dup cum este descris n acest manual. Nu aplicai valori mari de curent.

Aceste instruciuni de utilizare sunt o publicaie a German Electronics SRL (str. Cuza Vod nr.61/A, Oradea, Romnia) i Conrad Electronic SE (Klaus-Conrad 1, D-
92240 Hirschau, Germania).
Toate drepturile, inclusiv cele aferente traducerii, sunt rezervate. Reproducerea (inclusiv traducerea) prin orice mijloace, de ex. prin fotocopiere, microfilmare sau prin introducerea n
sisteme electronice de procesare a datelor, necesit n prealabil aprobarea scris a editorului. Retiprirea, chiar i parial, este interzis.
Aceste instruciuni de utilizare reflect specificaiile tehnice ale produsului la data tipririi. Productorul i rezerv dreptul de a opera modificri de natur tehnic sau de design fr o
ntiinare prealabil.
2015 Conrad Electronic SE & German Electronics SRL (ed. lb. romn)
Toate drepturile rezervate

47 | w w w . g e r m a n e l e c t r o n i c s . r o

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