Sunteți pe pagina 1din 116

ALEXANDRU CARANICA

REŢELE DE SENZORI
Lucrări practice de laborator

Editura
NAUTICA
ALEXANDRU CARANICA

REŢELE DE SENZORI
Lucrări practice de laborator

Editura
NAUTICA
Copyright © 2014, Editura NAUTICA

Toate drepturile asupra acestei ediţii sunt rezervate Editurii

Tehnoredactare şi grafică: Alexandru CARANICA

Editura NAUTICA
Editură recunoscută de CNCSIS
Str. Mircea cel Bătrân nr.104
900663 Constanţa, România
tel.: +40-241-66.47.40
fax: +40-241-61.72.60
e-mail: info@imc.ro
www.edituranautica.org.ro

ISBN:
ISBN 978-606-8105-05-5
978-606-681-028-9
Cuprins

Aspecte teoretice introductive; DIGI® Gateway Development Kit .............................. 5

Securizarea comunicațiilor: IPSec peste TCP/IP ....................................................... 33

Atmel AVR Atmega328: Exemplificare Arduino UNO................................................ 51

Digi XBee Radio: Broadcast Radio 802.15.4 ............................................................. 73

Achiziționare de date în timp real: Matlab și Arduino ............................................... 87

Linux în sistemele embedded: Exemplificare Raspberry PI ....................................... 97


Rețele de senzori

Aspecte teoretice introductive; DIGI® Gateway


Development Kit

Laboratorul 1

5
Scopul lucrării
Laboratorul de față, introductiv, oferă definiții și o privire de ansamblu asupra achizițiilor de
date prin rețele de senzori (atât mediul de transmisie wireless cât și cablat).

Se vor defini o parte din termenii folosiți pe parcursul acestui laborator, urmând o scurtă
introducere a plăcilor de dezvoltare educaționalece vor fi utilizate.

Introducere
Dezvoltarea reţelelor informatice a făcut posibilă interconectarea la distanţă a diverselor
componente ale unui sistem de măsurare, apărând conceptul de sistem distribuit de măsurare. În
cadrul acestor sisteme distribuite, componentele sistemului posedă inteligenţă proprie, fiind
capabile de acţiuni şi prelucrări independente, subordonate sau lucrând în cooperare cu un master.

Se poate vorbi deci de inteligenţă distribuită asociată cu conducerea la distanţă a proceselor,


de BUS-uri inteligente şi de sisteme inteligente având traductorul asociat cu sistemul de prelucrare a
datelor şi cu elementul de execuţie, sub numele de traductoare inteligente.

În domeniul echipamentelor, încorporarea prin construcţie a unei reţele de senzori şi a unei


inteligenţe proprii conferă acestora posibilitatea de a se monitoriza şi autoevalua, putând lua decizii
în sensul optimizării funcţionării sau al protecţiei la avarii, apărând noţiunea de echipamente
inteligente. Mai mult, s-a trecut la încorporarea unei reţele de senzori în construcţia unor structuri
capabile să se autoevalueze cu ajutorul unui sistem inteligent şi să semnaleze pericole de defectare
înainte ca ele să se producă sau să protejeze structura prin limitarea solicitărilor la care este supusă,
devenind astfel structură inteligentă.

În ciuda simplităţii echipamentelor, sistemele cablate sunt scumpe şi dificil de instalat,


presupunând proiectarea riguroasă, costuri de implementare ridicate, flexibilitate redusă, depanare
greoaie şi necesită întreţinere. De aceea, au apărut tehnologii wireless alternative, cum ar fi ZigBee,
bazată pe Standarul IEEE 802.15.4, care nu prezintă aceste dezavantaje (figura 1).

Fig. 1: Aplicații ale tehnologiei wireless de monitorizare

6
Desigur, utilizarea tehnologiei fără fir aduce cu sine o serie de probleme, cum ar fi
sensibilitatea la perturbaţii, rată de erori mai ridicată, întârzieri ale semnalului şi posibilitatea
interceptării, însă aceste dezavantaje pot fi în cele mai multe cazuri evitate. Echipamentele utilizate
sunt de tipul Platform-in-Package (PIP), care conţin toate părţile componente pe o placă, ce poate fi
extinsă prin adăugarea de componente suplimentare.

Datorită complexităţii reduse, fiabilităţii ridicate, flexibilităţii, razei mari de acoperire,


instalării facile şi consumului redus de energie, se poate afirma sistemele wireless de monitorizare
şi control, ce vor fi prezentat pe parcursul laboratoarelor, poate fi cu succes implementate într-o
rețea industrială, pentru a obţine producţie maximă, cu consumuri de resurse minime.

Introducere în achiziţiile de date

Achiziţia de date reprezintă procesul de obţinere a datelor de la o altă sursă, de obicei una
exterioară sistemului. Ea se poate realiza prin detectare electronică - cum ar fi în reglarea proceselor
sau în comunicatii, sau prin introducerea datelor de la terminale cum ar fi prelucrarea “batch” a
bazelor de date. În lucrarea de faţă, achiziţia de date se referă mai ales la domeniul tehnic:
măsurarea unor mărimi şi prelucrarea rezultatelor acestor măsurători.

Un sistem de achiziţie de date trebuie să poată executa trei funcţii fundamentale:

 convertirea fenomenului fizic într-un semnal care poate fi măsurat;


 măsurarea semnalelor generate de senzori sau traductori în scopul extragerii informaţiei;
 analizarea datelor şi prezentarea lor într-o formă utilizabilă;

Cele mai multe dintre sistemele moderne de achiziţie de date utilizează un procesor dedicat
pentru achiziţionare, eşantionare şi prelucare (DSP). Ţinând cont de cele enunţate mai sus, structura
tipică a unui sistem de achiziţie de date ce are la bază un sistem embedded sau DSP este următoarea
(figura 2):

 senzorii au traductori care convertesc fenomenul fizic într-un semnal electric ce poate fi
măsurat;
 circuite de adaptare a semnalului pentru izolarea, convertirea şi / sau amplificarea
semnalului provenit de la traductor;
 un subsistem de achiziţie de date (care poate include multiplexoare şi convertoare analog -
digitale);
 un sistem de calcul;
 soft sau firmware (la cele integrate) pentru achiziţia de date.

7
Fig. 2: Structura unui sistem de achiziţii de date

Pentru a putea detecta şi măsura mărimile fizice variabile (cum ar fi temperatura, presiunea,
etc), se folosesc traductoare care convertesc mărimea fizică într-un semnal electric pe care îl
transmit fie unui circuit de adaptare, fie direct plăcii de achiziţie de date. O funcţie foarte importantă
a circuitelor de adaptare este filtrarea. Scopul unui filtru este acela de a îndrepta semnalele nedorite
(zgomotul) din semnalul pe care dorim să-l măsuram.

Un alt parametru important îl reprezintă numărul de citiri analogice pe care placa de


achiziţie o poate realiza, şi viteza cu care eşantionează semnalele analogice în vederea prelucrării
digitale. Pentru a realiza creşterea numărului de intrări pe care le poate măsura o interfaţă analog
numerică, se poate folosi un multiplexor. Circuitele sample & hold (de eşantionare) permit interfeţei
A/D să citească mai multe canale de intrare în acelasi moment de timp (figura 3).

Fig. 3: Configuraţia clasică de intrare cu multiplexor şi circuit de eşantionare şi reţinere

8
Reţele şi tehnologii wireless pentru achiziţiile de date

În cazul reţelelor wireless, absenţa standardelor industriale a încetinit procesul de integrare a


senzorilor şi a îngreunat implementarea la scară largă. Totuşi, datorită evoluţiei comunicaţiilor
wireless şi a electronicii din ultimii ani, dezvoltarea şi implementarea reţelelor de senzori
multifuncţionali cu costuri mici şi cu consum energetic redus a devenit posibilă.

Deşi aptitudinile unui singur dispozitiv sunt limitate, împreunarea a sute de astfel de
dispozitive conferă posibilităţi tehnologice majore. În acest sens, este descrisă o reţea wireless mai
specială, diferită de reţelele ad-hoc sau de calculatoare, o reţea cu senzori, cunoscută ca WPAN, ale
cărei caracteristici o recomandă pentru dezvoltarea de sisteme de achiziţie wireless.

Reţelele de senzori bazate pe comunicaţii wireless pot fi clasificate în mai multe moduri, fie
în funcţie de caracteristicile de bază, fie în funcţie de dimensiunea reţelei (figura 4). Caracteristicile
de bază ale reţelelor de senzori wireless sunt:

 posibilitatea de re-organizare;
 comunicaţii broadcast pe distanţe mici şi rutare multi-hop;
 densitatea mare şi efortul colaborat ale nodurilor de senzori;
 schimbarea frecventă a topologiei datorită efectelor de propagare şi a căderii nodurilor;
 limitări ale energiei, puterii de transmisie, dimensiunii memoriei, puterii de calcul.

Fig. 4: Exemplu reţea wireless de senzori coordonată prin noduri de rutare

Aceste caracteristici, în special ultimele trei, diferenţiază reţelele de senzori de alte reţele ad-
hoc sau de tip plasă (mesh). Atuul de bază a acestor reţele wireless cu senzori constă în abilitatea de

9
a distribui un număr mare de noduri mici şi foarte mici care să se auto-organizeze şi să se auto-
configureze în reţea. În funcţie de distanţa de transmisie, există 4 clase de bază: BAN (reţele de
proximitate, 1 – 2 m), PAN (reţele personale, 10 – 20 m), LAN (reţele locale, până în 100 de m) şi
WAN (reţele vaste, peste 500 de m). Reţelele ad-hoc vaste sunt reţele wireless mobile multi-hop
care ridică multe provocări ce urmează a fi rezolvate în viitor. Reţele ad-hoc multi-hop mai mici,
adică LAN, PAN şi BAN prezintă interes şi pot extinde raza de acţiune a tehnologiilor de reţea ad-
hoc de-a lungul a câtorva hop-uri radio. Tehnologiile wireless destinate mediului LAN cunosc o
ascensiune rapidă (de exemplu, Wi-Fi), care conferă conexiuni mobile şi nelimitate la serviciile de
date ale Internet-ului (figura 5). Totuşi, echipamentele destinate mediilor WLAN consumă multă
putere şi pot avea o rază de acţiune mai mult decât necesară. Aşadar a apărut conceptul de PAN,
care poate permite dispozitivelor vecine să comunice informaţii între ele în mod dinamic şi cu
consum minim de putere (o astfel de tehnologie este ZigBee).

O comparaţie a sistemelor de comunicaţie actuale şi viitoare în termeni de mobilitate şi de


rată de transmisie a datelor este ilustrată în figura 5.

Fig. 5: Comparaţie între mobilitatea şi rata de transmisie a sistemelor actuale

Echipamentele şi dispozitivele conectate între ele fără fir, ce comunică prin intermediul
canalului aerian, formează o reţea wireless. În funcţie de aria de acoperire, reţelele wireless se
împart în mai multe clase, dar interes pentru comunicaţiile industrial prezintă doar primele două:

 WPAN (Wireless Personal Area Network) – reţea personală fără fir;


 WLAN (Wireless Local Area Network) – reţea locală fără fir;
 WMAN (Wireless Metropolitan Area Network) – reţea metropolitană fără fir;
 WWAN (Wireless Wide Area Network) – reţea extinsă fără fir.

10
Figura 6: Împărţirea familiei de standarde wireless IEEE 802

Standardul IEEE 802.15.4 – ZigBee

ZigBee reprezintă denumirea unei specificaţii tehnice utilizate în


protocoalele de comunicaţii radio digitale, de mică putere, bazate pe
standardul IEEE 802.15.4 pentru reţele wireless personale (Wireless
Personal Area Networks). Versiunea ZigBee 1.0 a fost ratificată la 14
decembrie 2004. Operând în benzile radio de 868 MHz (Europa), 915
MHz (SUA) şi 2,4 GHz în majoritatea ţărilor, un circuit radio ZigBee
produs în serie foarte mare costa în 2005 circa 1,10 dolari SUA, iar
preţul unui microcontroler dedicat este în prezent mai mic de 3 dolari.

Utilizând o tehnologie mult mai simplă şi mai ieftină decât alte reţele wireless, cu
dimensiuni ale software-ului între 2 % şi 10 % din cele pentru un nod Bluetooth tipic, reţelele
ZigBee sunt destinate aplicaţiilor cu consumuri foarte mici de putere (schimbarea bateriilor se poate
face în unele cazuri doar o dată la doi ani) şi care nu necesită rate mari de tranfer al datelor.

O reţea ZigBee poate fi utilizată într-o gamă largă de domenii, de la controlul industrial, reţelele cu
senzori integraţi, achiziţia de date medicale şi sistemele antiincendiu şi antiefracţie până la
automatizările din clădiri şi casele inteligente. Rata maximă de date este de 250 kbps. Ca un
rezumat, dispozitivele ZigBee sunt operţionale pentru caţiva ani inainte ca bateria să fie inlocuită.

Standardul ZigBee a fost dezvoltat pentru prima dată de ZigBee Alliance, organizaţie ce are
sute de companii membre. Această organizaţie a fost fondată in anul 2002, ca o organizaţie non-
profit, deschisă oricărui doritor să se alăture. Conceptul de a folosi comunicaţii wireless pentru a
aduna informaţii, ori pentru a efectua controale in înteriorul unei case sau a unei fabrici nu este nou.

11
Există cateva standarde pentru reţele wireless de rază scurtă, precum IEEE 802.11, Wirelles Local
Area Network (WLAN) şi Bluetooth. Fiecare dintre aceste standarde are avantajul său in anumite
tipuri de aplicaţii.

Topologia reţelei ZigBee

Într-o reţea wireless IEEE 802.15.4 exista două tipuri de dispozitive:

 dispozitive cu funcţii depline (FFD - full function devices)


 dispozitive cu funcţii reduse (RFD - reduced function devices)

Un dispozitiv cu funcţii depline (FFD) este capabil să îndeplinească toate funcţiile descrise
în standardul IEEE 802.15.4 şi poate să deţină orice rol in reţea. Un dispozitiv cu funcţii reduse
(RFD) are capacităţi limitate (RFD poate comunica doar cu un dispozitiv FFD).

Într-o reţea IEEE 802.15.4, un dispozitiv FFD poate avea trei roluri diferite:

 coordinator
 coordonator PAN (router)
 dispozitiv

Topologia unei reţele ZigBee este dată de straturile reţelei. Reţeaua trebuie să fie una dintre
cele trei tipuri de reţea specificate în standardul IEEE 802.15.4:

 stea (star)
 peer-to-peer sau mesh (punct la punct).
 tree (arborescentă)

În topologia stea, figura 7, fiecare dispozitiv din reţea poate comunica numai cu
coordonatorul PAN.

Fig. 7: Reţea de tip stea

12
Fiecare FFD dintr-o reţea peer-to-peer (figura 8) poate fi un coordonator PAN. O cale de a
decide care dispozitiv va fi coordonator PAN este de a alege primul dispozitiv FFD care începe să
comunice ca şi un coordonator PAN.

Fig. 8: Reţea de tip peer to peer sau MESH

Dacă nu există nicio restricţie, reţeaua peer-to-peer este cunoscută ca o reţea cu topologia de
tip mesh. O altă formă de reţea peer-to-peer pe care ZigBee o suportă este aceea de topologie de tip
tree (arborescentă). În acest caz, coordonatorul ZigBee construieşte reţeaua iniţială. Figura 9 arată
un exemplu despre cum redirecţionarea unui mesaj poate ajuta la extinderea reţelei şi cum acesta
poate să ocolească o barieră.

Fig. 9: Reţea arborescentă (tree)

13
Desfășurarea lucrării (ZigBee - DIGI® Gateway Development Kit)

Pentru a construi o reţea de senzori pentru monitorizarea unor


locații, echipamente, se folosește un kit de dezvoltare ZigBee, produs de
către firma Digi International Inc. (http://www.digi.com).

DIGI® Gateway Development Kit este o aplicaţie directă a


reţelelor 802.15.4, în 2.4GHz, ce vor fi tratate mai pe larg în
laboratoarele următoare. Kitul este construit cu scopul de a scrie rapid aplicaţii în limbajul de
programare Python, pe care sistemul Digi le interpretează prin compilatorul integrat în sistemul său
de operare (firmware Linux-based).

Pentru simplificarea construirii aplicaţiilor, SDKul conţine un mediu de programare bazat pe


Eclipse, denumit „Digi ESP for Python 2.0”. Permite de asemenea construirea aplicaţiilor în mediul
Cloud, pe https://developer.idigi.com.

Kitul conţine:

 ConnectPort® X4 ZigBee to Ethernet gateway (coordonator) – figura 10


 XBee® Wall Router (network router) – figura 11
 Battery-powered XBee temperature/light sensor (end device) – figura 12
 Digi ESP Integrated Development Environment (IDE – mediu programare)
 Cabluri, baterii şi sursă de alimentare 12V, 1.66A

Fig. 10: Coordonator reţea ZigBee ConnectPort® X4

14
Fig. 11: XBee Wall Router (router, permite extinderea rețelei)

Fig. 12: Senzor XBee temperatură / umiditate / luminozitate (end device)

15
Fig. 13: Specificațiile tehnice ale senzorului Xbee

DIGI® Gateway Development Kit este construit


cu scopul de a scrie rapid aplicaţii folosind SDKul
integrat, bazat pe un mediu de programare Eclipse,
denumit „Digi ESP for Python 2.0”. Figura 14 prezintă
folosirea wizardului pentru generarea interfeţei web,
precum şi a setării parametrilor reţelei ZigBee: MAC
echipamente, PAN reţea, putere emisie, intervalul de
transmisie a datelor, rata de eşantionare (sample rate).

Iniţializare senzor, sample time, MAC

Fig. 14: Mediul de programare Digi ESP

16
Pentru a configura iDigi Kit, trebuie să porniți coordonatoul de rețea, ConnectPort X4, care
va constitui nodul rețelei XBee. Pentru a realiza acest lucru, se parcurg etapele următoare:

1. Atașați antena XBee în portul specific din ConnectPort X4


2. Folosind un switch, sau un router (în acest caz, de preferință cu DHCP activat), conectați
coordonatorul ConnectPortX4 în rețeaua ethernet:

3. Alimentați coodonatorul ConnectPortX4. Schema de mai jos exemplifică accesoriile ce pot


fi conectate la acest router ZigBee:

4. Puneți în priza routerul ce permite extindere rețelei, XBee Wall Router. LED-ul verde
clipește în momentul în care se asociază cu coordonatorul (în mod implicit, acest router
caută cel mai apropiat coordonator de rețea, la care se conectează automat). Dacă niciun Led
nu este aprins, verificați bateriile.

17
5. Procedați la fel cu senzorul de rețea XBee.

Al doilea pas important îl reprezintă configurarea coordonatorului, Connect X4. Dacă ați
folosit un router cu serverul DHCP pornit, puteți lansa aplicația Digi Device Discovery pentru a
detecta automat dispozitivul (se anunță prin broadcast în rețea). Aplicația, dacă nu se află în PC, se
poate instala din kitul discovery40002265_G.exe:

Se reține IP-ul dispozitivului (vom avea nevoie de el la configurarea SDK-ului).

18
Mediul de programare (IDE) Digi ESP™ for Python este bazat pe Eclipse, și simplifică
crearea de aplicații în limbajul Python pentru dispozitivele iDigi. De asemenea, conține multe
exemple de proiecte, ce pot fi integrate în aplicațiile pe care le dezvoltăm ulterior.

Se lansează aplicația Digi ESP for Python, pentru a fi se integra cu Connect X4. Dacă
aceasta nu este instalată, kitul se numește digi_esp_for_python_40002839_A.exe. Se configurează
spațiul de lucru:

1. La pornire IDE-ul te va întreba ce spațiu de lucru dorești să folosești (workspace).


Alegeți un director unde doriți să salvați proiectul.
2. În acest director Digi ESP for Python salveaza proiectele și setările aplicației. În mod
implicit, această cale se află în C:/Documents and Settings/[username]/workspace.

3. Spațiu de lucru se încarcă. Welcome screen este afișat, împreună cu câteva exemple.
Dacă se ascunde Welcome tab, se poate reafișa din Help > Welcome:

19
iDigi DIA (Device Integration Application), este un pachet de clase scrise în Python, ce
simplifică lucrul cu senzoruu atașați la coordonator (senzorii XBee). De asemenea, permite scrierea
de aplicații de tip „cloud”, conectate prin iDigi Web Services API la serverele
http://developer.idigi.com.

Următorii pași exemplifică modul de compilare, încarcare pe dispozitiv și rulare a unei


aplicații iDigi DIA. Aplicația iDigi DIA rezultată va conține drivere pentru senzorul XBee și pentru
router-ul XBee Wall Router. De asemenea, aplicația va fi configurată să raporteze informații prin
modulul RCI, pentru a fi accesat de serviciile iDigi Web Services (este nevoie de conexiune la
internet pentru asa ceva).

Pentru a crea un proiect DIA:

1. Se deschide iDigi Dia Project Wizard din meniul File > New > iDigi Dia Project:

2. Pagina principală a „wizard-ului” conține o căsuță de tip text unde se va introduce numele
proiectului vostru. Restul setărilor se lasă pe default.

20
3. Urmează selecția dispozitivului coordonator. Dacă ați notat IP-ul anterior, alegeți butonul
New..., pentru a adauga dispozitivul:

4. La apăsarea butonului New…, fereastra Device Manager Wizard apare:

21
5. Inițial nu este afișat niciun dispozitiv, pentru a-l adauga, apăsați butonul Device
Discovery pentru a-l cauta iar automat (se poate introduce și manual).
6. Aveți grijă să cautați dispozitivul în rețeaua Local Area Network:

7. Alegeți dispozitivul din listă, și apăsați butonul Create Configuration.

22
8. Noua configurație va primi un nume generic, "ConnectPort X4" în acest caz. Lasați restul
setărilor la valorile implicite.
9. Apăsați Set Current pentru a seta configurația curentă ca și activă. Platforma Digi ESP for
Python va folosi această configurație pentru a seta mediul de lucru:

10. Urmați ferestrele următoare până la crearea proiectului, lăsând la valori implicite setările din
ferestrele respective:

23
11. La final, proiectul iDigi Dia va fi afișat:

24
12. Proiectul creat este afișat în zona Pydev Package Explorer:

13. Fișierul principal al proiectului, dia.yml, se va deschide și afișa în Smart Project Editor.
Fișierul conține elementele iDigi Dia (dispozitive, servicii, etc), ce vor fi folosite în proiectul
nostru:

14. Senzorul XBee și XBee Wall Router trebuie adaugate în proiect, pentru a putea fi
inițializate. Apăsați Add... pentru a începe să adaugați dispozitive.
Pentru senzorul Xbee, selectați „XBee Sensor” din lista de dispozitive, apoi apăsați butonul
Add.
Repetați procesul și pentru Xbee Wall Router.
În final, cele două dispozitive vor fi adăugate în sistem:

25
15. Se observă lipsa adreselor MAC pentru cele două dispozitive. Fără adresele MAC,
coordonatorul X4 nu poate comunica la nivelul 2 OSI cu cei doi senzori.
Pentru a adăuga MAC-ul senzorului XBee, selectați-l, după care apăsați butonul Select din
dreptul zonei adresei MAC.
XBee Device Discover se va deschide, și va căuta toți senzorii disponibili în zonă. Selectați
senzorul, câmpul se va autocompleta cu adresa dorită.

26
16. Repetați procesul și pentru Wall Router.
17. Configurarea este aproape gata, pentru o vizualizare mai rapidă a valorilor captate de la
senzori, este recomandat să schimbăm rata de eșantionare, de la 60000ms la 5000ms.
Acest lucru ne va permite să observăm mai ușor variația temperaturii citite de către senzor.
Acest lucru prezintă și un dezavantaj, bateria senzorilor se va consuma mai rapid. Trebuie
ținut cont de acest aspect, în proiectarea unei rețele de senzori.

27
Partea de configurare este gata, puteți salva proiectul.

Urmează partea de compilare și rulare a aplicației de demo pe echipament. Aplicația citește


senzorii, la un interval de 5 secunde, cu afișarea stării bateriei. Totul este gestionat de către
coordonator, care rulează aplicația demo configurată mai sus, în Python.

Interfața programului ce rulează pe coordonator va putea fi accesată din browser, de la


adresa echipamentului, sub forma: http:\\ip_coordonator\idigi_dia.html

Pentru compilarea aplicației și rularea ei, se urmează următorii pași:

1. Se apasă butonul Run, , din toolbar, se selectează optiunea Remote iDigi Dia, apoi
OK.

2. În timpul compilării, în partea de jos a IDE-ului pot fi urmărite mesajele de stare rezultate în
urma compilării. IDE-ul construiește aplicația, o copiază în coordonator, apoi îl repornește și
rulează aplicația:

28
Mediul de lucru acum afișează un tab adițional, Dia Web Presentation, cu aplicația noastră
rulând:

Aplicația poate fi accesată și dintr-un browser WEB, accesând IP-ul dispozitivului


coordonator ConnectPort X4, adăugând în continuarea URL-ului pagina "/idigi_dia.html"
(exemplu: http://10.21.6.178/idigi_dia.html)

Exercitii:

1. În ce bandă de frecvențe lucrează Digi Gateway Development KIT?


2. Care este rata de transfer maximă ce poate fi atinsă în standardul 802.15.4?
3. Observând funcționarea kitului Digi, ce tip de topologie de rețea s-a implementat?
4. Ce tip de topologie de rețea este recomandată pentru ocolirea de obstacole? Poate fi
implementată cu acest kit?
5. Lucrând în aceeași banda de frecvențe ca și WiFi 802.11a/b/g, credeți că acest lucru poate
duce la apariția interferențelor?

29
30
Bibliografie

1. Ing. Mihai MACHEDON-PISU, „Optimizări energetice şi funcţionale ale sistemelor de


achiziţie pentru comunicaţii wireless în banda ISM”, Teză de doctorat, Braşov, 2010,
preluare paragrafe pentru partea teoretică
2. Ciontu Marian, „Achiziţia datelor în cadrul sistemelor de monitorizare”, Departamentul de
Inginerie Electrica, Energetica si Aerospatiala, preluare paragrafe pentru partea teoretică,
http://retele.elth.ucv.ro/Ciontu%20Marian/Sisteme%20de%20monitorizare%20(Master)/
3. Ing. Cristea George, „Sistem wireless de monitorizare şi control cu aplicaţie pentru sere
industriale”, Lucrare dizertație, Constanța, 2012, preluare paragrafe pentru partea teoretică
4. Ing. Caranica Alexandru, „Monitorizarea sistemelor de disponibilitate ridicată”, Lucrare
dizertație, Constanța, 2012
5. Tom SAVU, „Reţele Wireless de tip ZigBee pentru măsurări şi automatizări”, Dolsat,
http://www.freewebs.com/justaxel/ZigBee.pdf
6. Platforme laborator, Ing. Alexandru Rusu, master CSIC UPB
7. Wikipedia
8. „Achizitia de date”, preluare paragrafe pentru partea teoretică,
http://www.micromedia.home.ro/articole/periferice/cap1.pdf
9. http://www.digi.com/
10. http://developer.digi.com
11. Wireless Sensor Networks for Industrial Process Monitoring and Control: A Survey, Gang
Zhao, Digital Technology Laboratory

31
32
Rețele de senzori

Securizarea comunicațiilor: IPSec peste TCP/IP

Laboratorul 2

33
Scopul lucrării

Lucrarea de faţă urmăreşte familiarizarea studentului cu noţiuni despre modul în care se


poate realiza criptarea datelor peste stiva TCP/IP, între două site-uri ce pot conține diverse
echipamente de monitorizare și control. În mod evident, acest trafic trebuie securizat.

IPSec este la ora actuală una dintre cele mai folosite metode de securizare a transmisiei pe
Internet, alături de SSL (Secure Sockets Layer) și TLS (Transport Layer Security). Avantajul major,
al protocolului IPSec, faţă de SSL şi TLS, se regăseşte în criptarea la nivelul 3 al stivei TCP/IP și la
nivelul 3 al stivei OSI, ceea ce face posibilă securizarea tuturor aplicațiilor care traversează o reţea
TCP/IP.

Se presupune că studenții au deja cunoștințe de rețelistică de bază (setare ip-uri, rute statice)
atât în sisteme Linux, cât și pe dispozitive de rețea dedicate (rutere și „switch”-uri). Aceste noţiuni
sunt necesare în configurarea iniţială a echipamentelor Mikrotik, folosite ulterior pentru stabilirea
tunelului IPSec.

Introducere

O reţea privată virtuală (VPN) reprezintă o conexiune criptată de date, ce foloseşte un tunel
sigur între capete, prin Internet. În anii `90, o companie care dorea securizarea comunicaţiei între
două sau mai multe locaţii, avea la dispoziţie tehnologii ca liniile închiriate telefonice, conexiuni de
tip Frame Relay, adesea costisitoare, oferind şi o lăţime de bandă limitată.

Răspândirea conexiunilor broadband, prin Internet, adoptarea rapidă a protocolului TCP/IP


peste care rulează o multitudine de aplicaţii şi hardware curent, au dus la dezvoltarea unor noi
metode de securizare a transmiterii datelor pe WEB, prin „ridicarea tunelurilor criptate” între LAN-
urile din topologia cerută.

IPSec-ul prezintă numeroase avantaje, printre care:

1. costul redus de implementare, deoarece se foloseşte o conexiune Internet existentă


2. complexitate hardware mai redusă, fiind nevoie doar de echipamente (routere) capabile să
comunice protocolul de transport ales (IPSec, LPSec, GRE, L2F, PPTP, L2TP)
3. criptarea tuturor aplicaţiilor, deoarece, în cazul IPSec, fiind un protocol de nivel 3 (în stiva
OSI), tot traficul ce trece prin tunel este criptat:

Fig. 1: Protcolul de securitate Internet (IP).

34
Noțiuni teoretice (arhitectura IPSec)

IPSec foloseşte următoarele seturi de protocoale pentru a realiza criptarea şi transportul datelor:

1. Authentication Headers (AH) - permite controlul integrităţii şi securitate anti-reply, dar nu


şi confidenţialitate (nu criptează datele).
2. Encapsulating Security Payloads (ESP) - criptează conţinutul pachetelor în două moduri:
transport (protejează doar conţinutul pachetului, nu şi header-ul) sau tunel (întreg pachetul
este criptat).
3. Security Associations (SA) - asocierea de securitate este un ansamblu de date de tip nume
de algoritm - cheie, care reprezintă capabilitățile criptografice comune entităților
participante la asocierea IPSec: ISAKMP (Internet Security Association and Key
Managment Protocol) se ocupă cu stabilirea cheilor, urmând ca IKE (Internet Key
Exchange) să se ocupe de schimbul de chei (pre-shared key).

Moduri de transport în IPSec:

IPSec poate fi configurat pentru două moduri distincte: modul tunel şi modul transport.

În modul tunel, IPSec încapsulează pachetele IPv4 în cadre IP securizate, pentru transferul
informaţiei între două sisteme firewall, de exemplu.

În modul transport, informaţia este încapsulată într-un altfel de mod, încât ea poate fi securizată
între punctele terminale ale conexiunii, deci „ambalajul” nu ascunde informaţia de rutare cap-la-
cap. Modul tunel este cea mai sigură metodă de securizare, însă creşte gradul de încărcare a sesiunii
de comunicaţie, prin mărirea dimensiunilor pachetelor.

Authentication Headers (AH)

Permite controlul integrităţii şi securitate anti-reply (retransmiterea unor date, cum ar fi chei
pre-shared, din sesiune anterioare, cu scopul de a obţine acces în mod ilegal), dar nu şi
confidenţialitate (nu criptează datele). Folosirea AH în modul tunel este ilustrată mai jos:

Fig. 2: Antetul de autentificare IPsec în modul transport pentru IPv4

În IPv4, AH este interpus între antetul IP ( incluzând orice opţiuni) şi antetul TCP.

35
Să examinăm acum antetul AH:

Câmpul Antetul următor este folosit pentru a păstra valoarea anterioară pe care a avut-o
câmpul Protocol IP, şi indică ce protocol de nivel înalt a fost protejat anterior. Valoarea acestuia
este luată din lista standard de protocoale (ex: 51 pentru AH, 6 pentru TCP, 17 UDP).

Lungimea încărcării utile o reprezintă numărul de cuvinte de 32 de biţi din antetul AH


minus 2.

Indexul parametrilor de securitate reprezintă identificatorul de conexiune. Acesta este


inserat de către emiţător pentru a indica o anumită înregistrare în baza de date a receptorului.
Această înregistrare conţine cheia partajată folosită în această sesiune şi alte informaţii despre
conexiunea curentă.

Câmpul Număr de secvenţă este folosit pentru a număra toate pachetele trimise pe un SA.
Fiecare pachet primeşte câte un identificator unic, chiar şi retransmisiile, cu alte cuvinte copia unui
pachet primeşte un număr diferit de cel original (chiar dacă numărul său de secvenţă TCP este
acelaşi). Scopul acestui câmp este de a detecta atacurile prin reply (retransmitere).

Date de autentificare este un câmp de lungime variabilă care conţine semnătura digitală.
Când este stabilit un SA, cele două părţi negociază algoritmul de semnare pe care îl vor folosi. În
mod normal, nu este folosită criptografia cu chei publice pentru că pachetele trebuie procesate
rapid, iar toţi algoritmii cu chei publice sunt prea lenţi. Deoarece IPsec este bazat pe criptografia cu
chei simetrice iar emiţătorul şi receptorul negociază o cheie partajată înaintea stabilirii unui SA,
cheia partajată este folosită în procesul de semnare. O modalitate simplă este de a calcula rezumatul
pentru un pachet şi cu cheia partajată. Desigur, cheia partajată nu este transmisă. O schemă ca
aceasta este denumită HMAC (Hashed Message Authentication Code).

Antetul AH nu permite criptarea datelor, deci este cel mai folosit atunci când este necesară
verificarea integrităţii dar nu este necesară confidenţialitatea. O proprietate demnă de notat a
antetului AH este aceea că verificarea integrităţii foloseşte o parte din câmpurile antetului IP, şi
anume, acelea care nu se schimbă când pachetul trece de la un ruter la altul. De exemplu, câmpul
Durata de viaţă se schimbă la fiecare ruter şi nu poate fi inclus în verificarea integrităţii. În orice caz
adresa sursă IP este inclusă în această verificare, un intrus neputând să falsifice originea pachetului.

Encapsulating Security Payloads (ESP)

O altă variantă de antet IPsec este ESP (figura 3). Criptează conţinutul pachetelor în două
moduri: transport (protejează doar conţinutul pachetului, nu şi header-ul) sau tunel (întreg pachetul
este criptat). Învelişul de securitate (ESP) - care furnizează confidenţialitate şi, în funcţie de
algoritmii şi de modurile folosite, poate furniza, de asemenea, integritate şi autentificare.

Antetul ESP conţine două cuvinte de 32 de biţi. Acestea sunt câmpurile Indexul
Parametrilor de Securitate şi, respectiv, Numărul de Secvenţă pe care le-am întâlnit la AH. Un al
treilea cuvânt care, în general, le urmează (dar care din punct de vedere tehnic nu este parte a
antetului) este câmpul Vector de Iniţializare, folosit pentru criptarea datelor; dacă nu se foloseşte
criptarea acest câmp este omis.

36
Fig. 3: (a) ESP în mod transport (b) ESP în mod tunel

Pe lângă autentificarea sursei, AH asigură numai integritatea datelor, în timp ce ESP, care
asigura până acum doar criptarea, acum asigură atât criptarea, cât şi integritatea datelor. Diferenţa
dintre integritatea datelor prin AH şi cea dată de ESP stă în scopul datelor care sunt autentificate.
AH autetifică întregul pachet, în timp ce ESP nu autentifică antetul IP exterior. În autentificarea
ESP, sumarul de mesaj se află în finalul pachetului, în timp ce în AH, sumarul se găseşte înăuntrul
antetului de autentificare.

Cele două antete, respectiv mecanisme de securitate, pot fi folosite independent unul de
celălalt, combinate sau într-un mod imbricat. Ele sunt definite în mod independent de algoritm
astfel încât algoritmii criptografici pot fi înlocuiţi fără ca alte părţi din implementare să fie afectate.
În mod implicit sunt specificaţi algoritmi standard, pentru asigurarea interoperabilităţii.

Security Associations (SA)

Asocierea de securitate este un ansamblu de date de tip nume de algoritm - cheie, care
reprezintă capabilitățile criptografice comune entităților participante la asocierea IPSec. Ansamblul
acestor seturi de asocieri de securitate pe un anumit calculator sau gateway este numit SAD -
Security Association Database, baza de date cu informații criptografice, de pe fiecare entitate IPSec,
în legătură cu celelalte entități conexe.

Pe fiecare entitate IPSec se mai găsește o a doua bază de date, numită SPD - Security Policy
Database, cu informații despre traficul care trebuie securizat, numit trafic interesant. Conținutul
bazei de date SAD este populat fie manual, de către administratorul acelui sistem, fie dinamic, prin
negocierea de IKE între entități, însă tot pe baza unui set predefinit de capabilități ale fiecărui
sistem.

Pentru ca în momentul securizării traficului fiecare entitate să cunoască parametrii de


securizare pentru fiecare tip de trafic este folosit identificatorul SPI - Security Parameter Index, un
index pe baza de date SAD. Folosind acest index și valoarea adresei IP din destinația pachetului ce
urmează a fi supus procesului de criptare sau autentificare, fiecare entitate IPSec știe exact ce
transformare trebuie realizată pe fiecare pachet IP pentru ca acesta să poată fi decriptat la receptor și
corect interpretat. Procesul de decriptare este asemănător în momentul recepției unui pachet astfel

37
securizat. În cazul în care sunt mai mult de doi participanți la asocierea de securitate, în cazul
traficului de tip multicast, asocierea de securitate este furnizată pentru întregul grup și este prezentă
pe fiecare sistem participant. Pot exista, deasemenea, mai multe asocieri de securitate pentru un
același grup de entități, fiecare cu diverse nivele de securitate în interiorul grupului.

În funcție de modalitatea de stabilire a parametrilor asocierii de securitate, suita IPSec poate


fi stabilită prin ISAKMP - negociere prin mesaje IKE sau manual - static, preconfigurate de
administrator pe fiecare sistem.

Negocierea IKE este alcătuită din două etape sau faze, numite sugestiv Phase1 și Phase2.
Prima fază are rolul de a autentifica entitățile de IPSec, de a stabili o asociere de securitate și de a
deriva cheile Diffie-Hellman din care vor fi derivate ulterior cheile efective de criptate și/sau
autentificare pentru traficul de date. Prima fază are la rândul ei două variante sau moduri: modul
principal - main mode și modul agresiv - aggressive mode. Faza a doua este numită modul rapid -
quick mode.

ISAKMP (Internet Security Association and Key Management Protocol), este un protocol
de gestiune a cheilor pentru internet, la nivel de aplicaţie, independent de protocoalele de securitate
de la nivelele inferioare. ISAKMP are la bază tehnici derivate din mecanismul Diffie-Hellman
pentru schimbarea cheilor. O standardizare în structura de pachete şi în mecanismul de administrare
a cheilor duce la completa interoperabilitate a diferitelor soluţii VPN.

Schimbul de chei este un serviciu strâns legat de administrare a asocierilor de securitate, AS.
Când este necesară crearea unei AS, trebuie să se schimbe chei. Prin urmare ISAKMP le
împachetează împreună şi le trimite ca pachet integrat (figura 4).

Fig. 4: Mecanismul de criptarea a datelor IPSec utilizând chei publice şi chei private.

IPSec nu suportă alte protocoale de reţea în afară de TCP/IP şi nu specifică o metodologie


de control al accesului în afară de filtrarea pachetelor.

38
Desfășurarea lucrării

Figura 5: Topologia laboratorului

Se va lucra în echipe de câte 3 studenţi. Fiecare student va configura un router Mikrotik şi


va lucra cu maşina virtuala Linux pusă la dispoziţie în Oracle VirtualBox.

Se va realiza topologia descrisă în figura 5, unde RHQ va fi routerul central (Headquarter),


sau nodul central, unde se vor termina cele două tunele IPSec. RO1 şi RO2 (Remote Office)
reprezintă site-urile „la distanţă”, scopul final fiind de a putea accesa din aceste locaţii resursele din
reţeaua LAN HQ, în mod securizat.

Din spatele reţelei RHQ se vor putea accesa toate locaţiile (site-urile) remote.

Fiecare router va primi o identitate (RHQ, RO1, RO2), pentru a fi mai uşor de identificat în
cadrul topologiei.

Configurarea iniţială a echipamentelor (valabilă pentru toate staţiile)

1. Se va conecta portul 1 (PoE) al routerului Mikrotik in Switch (toate grupele vor fi conectate
în Switch).

39
2. Individual, se va conecta cablul staţiei PC în unul din porturile libere din router.
3. Se rulează aplicaţia winbox.exe din directorul /home/student/Downloads (aplicaţia rulează în
subsistemul Wine de emulare Windows). Se selecteză router-ul din listă (click pe adresa
MAC):

4. Se resetează routerul, intrând în terminalul Winbox (New Terminal), unde se tastează


„/system reset-configuration”. Conexiunea cu routerul se pierde. Pentru a o restabili, tastati
în LXterminal al staţiei de lucru comanda: „sudo /etc/init.d/networking restart”, după
repornirea routerului. Vă puteţi reconecta folosind Winbox sau interfaţa web.
5. Schimbaţi identitatea echipamentului, din System → Identity, cu cea corespunzătoare grupei
(RO1, etc)
6. Redenumiţi interfaţa ether1-gateway în WAN, respectiv ether2-master-local în LAN, din
meniul Interfaces. Vă asiguraţi ca ARP este enabled:

7. Din meniul IP → DHCP Client, dezactivaţi WAN Interface:

40
8. Pentru a schimba subnetul fiecărei reţele, adresele IP cu cele ale grupei din care faceţi parte,
trebuie accesate o serie de meniuri, după cum urmează:

IP →Addresses, modificaţi adresa WAN şi LAN, cu cele din topologie:

IP →Pool setaţi plaja de ip-uri oferite prin DHCP:

IP →DHCP Server, tabul Networks, modificăm setările trimise prin serverul DHCP, după
care ne asigurăm (tabul DHCP) că avem bifată opţiunea Add ARP for Leases:

41
IP → Routes, adăugăm o rută statică către gateway (trebuie să fie acelaşi GW pe toate
routerele, de exemplu, 10.10.10.100):

Testaţi conectivitatea între routere, din meniul Tools → Ping (trebuie să puteţi da ping către
toate ipurile WAN, 10.10.10.1 / 10.10.10.2 / 10.10.10.3):

9. În acest moment, pe staţia Linux, restartaţi serviciul networking, cu „sudo


/etc/init.d/networking restart”. Staţia dumneavoastră trebuie să primească un IP din clasa
corespunzătoare topologiei, 192.168.22.x pentru RO1, 192.168.21.x pentru RHQ,
192.168.23.x pentru RO2.

Recapitulare:

După această configurare iniţială, fiecare grupă va avea următoare configuraţie: 3 routere,
unul central, RHQ, cu ip-ul WAN 10.10.10.1, ce va ţine două tunele IPSec, către locaţiile remote,
RO1 (10.10.10.2) şi RO2 (10.10.10.3).

În spatele fiecarui router, se vor afla reţelele interne, private, din clasa 192.168.2x.x.

Exerciţiu: încercaţi, din spatele routerului RO1 sau RO2, să accesaţi reţeaua privată din
spatele RHQ (ping către 192.168.21.1). Veţi constata că acest lucru este imposibil, routerul
mascând reţelele interne.

42
Următoarea etapă constă în stabilirea tunelelor IPSec, care vor lega cele doua „birouri” RO1
/ RO2 de RHQ.

Configurare Site to Site IpSec Tunnel

1. Înainte de a trece la configurare, trebuie să ne asigurăm că firewall-ul permite traficul IPSec.


În IP → Firewal, tabul Filter Rules, adăugăm următoarele reguli (cele subliniate):

Unde:
VPN IKE = Permite traficul pentru Internet Key Exchange (IKE), în stabilirea SA (Security
Association)
VPN NAT-T = Network address translation tunneling sau „NAT traversal in the IKE”,
permite trecerea pachetelor IPSec protected prin network address translation.
VPN IPSec ESP = Permite Encapsulating Security Protocol (ESP)
VPN IPSec AH = Permite Authentication Header (AH)

2. IP → Firewall, tabul NAT: RouterOS, sistemul de operare ce rulează pe Mikrotik, realizează


NAT în modul default pentru toate pachetele ce ies din echipament. Dezavantajul constă în
schimbarea adreselor sursă ale pachetelor după ce acestea sunt criptate. Routerul destinaţie
primeşte aceste pachete, dar nu le poate decripta, deoarece adresa specificată în regulile
IPSec nu se potriveşte cu cea primită după realizarea NAT.

Pentru a rezolva această problemă, se foloseşte o tehnică denumită NAT bypass. Adăugăm
următoarele reguli în tabela NAT, pentru toate cele 3 routere, deasupra regulii masquerade
default:

43
Pentru RO1:

Pentru RO2:

Pentru RHQ:

Prin plasarea acestei reguli în topul tabelei NAT, când un pachet este direcţionat din LAN-ul
curent într-un subnet destinaţie peste VPN, regula „accept” va opri tabela NAT din
procesare, intrarea „masquerade” nemaifiind executată.

3. IP → IPSec: adăugam politica IPSec, pentru fiecare dintre routere. Mikrotikul central, cel în
rolul „headquarter”, va conţine două politici, pentru cele două tunele ridicate (RO1 şi RO2).

44
Politica RO1, conţine Src. Address, subnetul local trimis prin tunel, şi Dst Address,
destinaţia privată din spatele echipamentui central. În tabul Action, se bifează modul de
transport Tunnel. SA Src Address conţine ip-ul extern al RO1 (10.10.10.2) şi destinaţia
RHQ (10.10.10.1):

Politica RO2: paşii sunt identici cu RO1, veţi înlocui subnetul local cu 192.168.23.0/24 şi
IP-ul extern sursă (SA Src Address) cu 10.10.10.3

45
Politicile RHQ: routerul central va conţine două politici, deoarece se vor conecta două
echipamente, de aici şi necesitatea a două tunele.

Tabul General, pentru ambele politici:

Tabul Action:

4. „Peer add”: următorul pas constă în adăugarea informaţiilor necesare despre SA, despre
„peer” sau legătura acceptată, cheia pre-shared, grupurile Diffie-Hellman, algoritmii criptare
Phase 1.

În tabul Proposals, se verifică parametrii, să coincidă pe toate cele 3 Mikrotik-uri:

46
Tabul Peers pentru RO1: se adaugă un peer nou, ce va conţine la adresă ip-ul destinaţie, al
RHQ, şi parola pre-shared pentru phase1. Se bifează si NAT Traversal:

Pentru RO2, tabul Peers va conţine aceleaşi setări, deoarece acceptăm tunelul din acelaşi
punct, de la „sediul central” RHQ.

Pentru RHQ, se vor introduce două reguli pentru peers, deoarece acceptăm conexiuni de la
„ambele sedii remote”:

47
5. Pentru a testa configurarea tunelului, incercaţi din Lxterminal, din spatele RO1, să accesaţi
LAN-ul RHQ. Conexiunea e bidirecţională, din subnetul RHQ puteţi accesa şi RO1 şi RO2:

Verificare şi depanare tunel

Verificarea ridicării celor două tunele se poate uşor vedea în tabul Installed SA. E
recomandat să se verifice pe routerul RHQ, unde vor apărea ambele tunele (vor apărea 4 intrări, câte
două per tunel):

Tunelul se „ridică” în momenul în care se identifică „interesting traffic”, atunci când politica IPSec
indetifică pachete cu destinaţia unui subnet extern.

48
Pentru depanare, se poate activa IPSec logging:

System → Logging: se adaugă o regulă nouă, unde se alege traficul de tip IPSec pentru
inspecţie:

Din tabul Actions, se poate mări numărul de linii reţinute de bufferul memoriei logging:

În LOG, se poate acum observa traficul IPSec:

49
Bibliografie

1. Ing. Simona Livia CONSTANTIN, „Protocoale de tunelare folosite în reţele virtuale


private”, Buletin TELECOMUNICAŢII Anul LII, nr. 2/2009, preluare paragrafe pentru
partea teoretică
2. Autor necunoscut, „Implementarea securității la nivel rețea: VPN si IPSec”, preluare
paragrafe pentru partea teoretică, http://www.scribd.com/doc/199629536/Curs-11-SSeA
3. Lect. Dr. M. Apetrii, „Introducere în securitatea rețelelor”, Facultatea de Matematică,
Universitatea „Alexandru Ioan Cuza” din Iaşi, preluare paragrafe pentru partea teoretică
http://www.math.uaic.ro/~cefair/files/intr_in_securitatea_retelelor.pdf
4. http://stst.elia.pub.ro/RIC/Teme_RIC_2008_9/CristianAndrei/Securitatea_informatiei_Cristi
an-Andreiv1.ppt

50
Rețele de senzori

Atmel AVR Atmega328: Exemplificare Arduino UNO

Laboratorul 3

51
Scopul lucrării
Laboratorul de față își propune să familiarizeze studentul cu microcontrollerul Atmega328,
de la Atmel, pe arhitectura AVR (arhitectură RISC - Alf and Vegard RISC).

Scopul final este de a folosi acest microcontroller pentru a controla radiourile XBee de la
Digi, pentru a prelucra datele de la senzori înainte de a fi transmise radio prin 802.15.4.

Laboratorul curent trece rapid prin arhitectura acestui microcontroller, exemplificând


implementarea AVR pe platforma open-hardware Arduino.

Pentru mai multe detalii despre arhitectura unui microcontroller, consultati cursul
„Arhitectura Microprocesoarelor”.

Introducere
Famila AVR de la Atmel este formată din microcontrollere cu arhitectura Harvard pe 8 biţi
şi set redus de instructiuni (RISC). Diferenţa dintre CISC şi RISC nu constă nicidecum doar în
numărul de instrucţiuni executabile ci se manifestă mai ales în structura internă şi în modul de
funcţionare.

Ele au fost introduse pe piaţă în 1996, fiind printre primele controllere care foloseau
memoria Flash pentru program, în locul memoriilor OTPROM sau EPROM, folosite de competiţie.

AVR-urile sunt clasificate în patru mari categorii:

1. tinyAVR
 1-8 kB memorie de program
 capsula de 8 pana la 32 pini
 set limitat de periferice

2. megaAVR
 4-256 kB memorie de program
 capsula de 28 pana la 100 de pini
 set extins de instructiuni (instructiuni pentru inmultire si adresare indirecta)
 set extins de periferice

3. XMEGA
 16-256 kB memorie de program
 capsula de 44 pana la 100 de pini
 interfete performante extinse, ca DMA, "Event System", si support pentru
criptografie
 set extins se periferice

4. Application specific AVR


 megaAVR cu functii speciale, care nu sunt prezente la familia AVR, cum ar fi
controller de LCD , controller USB , CAN etc.
 FPSLIC (Field Programmable System Level Integrated Circuit), un core AVR
integrat cu un FPGA.

52
Memoriile Flash, EEPROM, şi SRAM sunt integrate în acelaşi chip, înlăturând nevoia de
memorie externă.

Programul este format din instrucţiuni de 16 biţi lungime care sunt stocate în memoria Flash
nevolatilă.

Mărimea memoriei de program este indicată de numele componentei respective. De


exemplu, Atmega328 are 32kB de memorie Flash. Spaţiul de adresă constă din registrele generale,
registrele de I/O şi memoria SRAM. Sunt în total 32 de registre generale de câte 8 biţi.

AVR conţine o unitate de execuţie în banda de asamblare cu trei nivele, acest lucru
permiţând ca urmatoarea instrucţiune să fie adusă din memorie (fetch) în timp ce instrucţiunea
curentă este în execuţie. Majoritatea instrucţiunilor se execută într-un singur ciclu de instrucţiune,
acest lucru permiţând atingerea unei puteri de procesare de 1MIPS pe MHz. Un avantaj faţă de
celelalte familii concurente de µC în constituie faptul ca arhitectura AVR este optimizată pentru
execuţia de cod C compilat.

Arhitectura AVR

Bazată pe o arhitectură Harvard modificată, ce conţine:

PM - Memoria de programe. Aici sunt stocate instrucţiunile ce urmează a fi executate de către


microcontroller.

PC - Contorul de program, bazat pe un registru numărător, destinat selecţiei instrucţiunilor din


memoria de programe.

CDC - decodificatorul de comenzi.

ALU - Unitatea aritmetico logică. Executa instrucţiunile aritmetice şi logice.

53
GPR - regiştrii de uz general, regiştrii de lucru ai microcontrollerului. Prelucrarea datelor pentru
arhitectura AVR este restricţionată la utilizarea cel puţin a unui registru de uz general.

RAM - memoria cu acces aleator de program.

SREG - Registru de stare a microcontrollerului.

Arduino UNO
Arduino UNO este o platformă de procesare open-source, bazată pe
arhitectura AVR, pe microcontrolerul ATmega328. E o platformă de mici
dimensiuni (6.8 cm / 5.3 cm), construită special pentru entuziaşi şi mediul
academic, fiind capabilă de a prelua date din mediul înconjurător datorită
multitudinii de porturi de intrare disponibile, atât digitale cât şi analogice. Procesorul este capabil să
ruleze cod scris într-un limbaj de programare care este foarte similar cu limbajul C++.

Scopul acestei platforme hardware open source este de a crea rapid prototipuri de aplicaţii,
atât hardware cât şi software, fără a trece prin chinurile iniţializării unui microcontroller, sau de a
crea platforma hardware.

Este ideal pentru laboratorul de Reţele de senzori, scopul nostru fiind de a evidenţia
funcţionarea practică a radiourilor XBee de la DIGI.

54
Microcontrollerul fiind produs de Atmel, acesta se programează în mod uzual în Atmel
Studio 6:

Atmel Studio este un IDE mai neprietenos, din acest motiv, platforma Arduino vine cu
propriul mediu de programare, Arduino IDE, bazat pe limbajul Processing, dezvoltat începând din
2001 la MIT Media Lab.

Platforma curentă va folosi IDE-ul Arduino. Pentru detalii legate de folosirea Atmel Studio
6 cu Arduino, puteţi consulta ghidul următor:http://www.engblaze.com/tutorial-using-atmel-studio-
6-with-arduino-projects/.

Orice placă Arduino conţine deja un BOOTLOADER pe fiecare microcontroller, pentru


interfaţarea şi rularea aplicaţiilor scrise în mediul Arduino:

55
Modalităţi de comunicare între microcontroler şi componente
Interfeţe seriale:

 Utilizate, în general, pentru a conecta circuite periferice la microcontroller


 Aceste interfeţe permit conectarea de dispozitive diverse, cum ar fi:
o ceas de timp real (RTC - real-time clock)
o memorii nevolatile pentru stocarea unor parametrii
o interfeţe cu senzori
 Sunt interfeţe de preţ redus şi uşor de implementat

SPI - Serial Peripheral Interface

 Poate fi utilizată pentru interfaţarea diverselor dispozitive, cum ar fi:


o memorie (stocare date)
o convertoare analog-digitale
o convertoare digital-analoge
o RTC şi calendare RTC
o LCD drivers
o Sensori
 SPI este o interfaţă serială sincronă – toate transmisiile sunt sincronizate cu un semnal de
ceas comun furnizat de master (microcontroller)
 Perifericul receptor (“slave”) utilizează semnalul de ceas la achiziţia fluxului de biţi seriali
 SPI utilizează patru semnale:
o Master Out Slave In (MOSI)
o Master In Slave Out (MISO)
o Serial CLock (SCLK sau SCK)
o Chip Select (/CS) for the peripheral
 Unele procesoare au un semnal de chip select dedicat pentru SPI, numit Slave Select (/SS)

I2C - Inter-Integrated Circuit numit şi IIC

 I2C (Inter-Integrated Circuit numit şi IIC) este o magistrală ieftină şi eficientă


 I2C este o magistrală sinconă, bidirectională, de viteză mică
 Conectarea / deconectarea unor dispozitive la I2C nu afectează alte dispozitive
 I2C este o magistrală multi-master
 Viteza datelor în mod standard este de 100 kbps, iar în mod extins de 400 kbps
 Fiecare dispozitiv conectat la I2C are o adresă unică şi poate lucra ca transmiţător sau
receptor
 I2C mai este numită TWI (Two-Wire serial Interface)

Senzorii şi emiţătoarele folosite pe parcursul laboratoarelor folosesc protocoalele de comunicare


enumerate mai sus.

56
Desfășurarea lucrării
Verificare / Instalare driver FTDI USB

Vă asigurați că placa Arduino UNO este conectată la calculator, prin portul USB.

Se descarcă IDE-ul Arduino (arduino-1.0.3-windows.zip) de pe server-ul din laborator. Se


dezarhivează mediul Arduino într-un director.

Arduino folosește un convertor paralel-serial, de tip UART, pentru asigurarea comunicării


seriale prin USB. Pentru aceasta, trebuie să instalăm drivere-le FTDI USB Drivers din directorul
Drivers, al IDE-ului Arduino.

Verificați instalarea driverelor în PC, dacă acestea lipsesc, portul serial apare ca Unknown
device în Device Manager:

Instalați driver-ul UART din directorul drivers:

57
Dacă driverul s-a instalat cu succes, în device manager apare ca și port COM dispozitivul
Arduino. Rețineti portul (COM8 în exemplul de mai jos). Veți folosi acest port pentru conectarea la
microcontroler:

Exercitiu: Ce inseamna UART - Universal Asynchronous Receiver/Transmitter? Ce tip de


transmisiune serială este recomandată, sincronă sau asincronă?

Configurare IDE

Porniți IDE-ul Arduino, arduino.exe, din directorul arduino-1.0.3:

58
Din Fișier (File) → Preferințe (Preferences) verificați următoarele setări:

1. Limba editorului: english (reporniți aplicația)


2. Alegeți directorul unde doriți să se salveze aplicațiile (sketchbook location)
3. Bifați Show verbose output during: compilation și upload
4. Bifați Verify code after compilation.

Din meniul Tools → Board, alegeți modelul Arduino UNO.

Tools → Serial Port, alegeți portul de comunicare, pe care a fost instalat driver-ul (COM8 în
exemplu).

Tools →Programmer, alegeți AVRISP mkII.

Mediul de programare este setat. Se poate observa ușurința cu care se realizează acest lucru
cu Arduino, spre deosebire de alte medii de programare cu microcontroler. La final IDE-ul, în
partea de jos, trebuie să se evidențieze placa pe care lucrăm + portul de comunicație:

59
Mediul de lucru

Mediul de lucru hardware conține, pe lângă microcontrolerul Arduino UNO, și un


breadboard, pe care-l veți folosi pentru a lega ușor senzori, LED-uri, etc, fără a lipi componente:

Breadboard-urile moderne sunt constituite dintr-o rețea de găuri cu contacte (cleme) de


nichel-argint. Se poate observa o linie care împarte toate coloanele în două părți. Cele cinci puncte
(pozitionate simetric față de linia mediană), care formează coloana, sunt conectate între ele. Astfel
A1=B1=C1=D1=E1, dar sunt diferite de F1=G1=H1=I1=J1. Punctele de pe liniile de tensiune (+ și
-) sunt conectate toate conform liniilor albastre și roșii.

Dacă am face un circuit imprimat similar breadboard-ului, acesta ar avea desenul cablajului
ca în figura din dreapta:

60
I. Anatomia unui program Arduino

Orice program Arduino are două secțiuni. Secțiunea "setup", care este rulată doar o singură
dată, atunci când placa este alimentată (sau este apăsat butonul "Reset"), și sectiunea "loop", care
este rulată în ciclu, atâta timp cât este alimentată placa. Secțiunea setup reprezintă în fapt
inițializarea microcontrollerului. Să luam un exemplu:
void setup() {
// codul scris aici rulează o singura dată
}
void loop() {
// codul scris aici ruleaza tot timpul, în buclă
}

Astfel, în rutina "setup" vom pune de obicei cod de inițializare, iar în rutina "loop" vom scrie
partea principală a programului nostru.

Rulați programul de mai sus în IDE-ul Arduino, apoi scrieti-l pe placă folosind butonul
UPLOAD din bara principală! Codul de mai sus este echivalent cu ștergerea informației din
microcontroller, acesta nemaiexecutând nimic.

Pentru cel de-al doilea exemplu Arduino, vom folosi un led montat din fabricație pe placa de
bază. Placa Arduino are din construcție un led conectat la pinul digital 13. Acest led se aprinde
atunci cand pinul 13 digital este pus în starea HIGH, și se stinge atunci cand pinul 13 este pus în
starea LOW.

Ex. Scrieți programul de mai jos pe microcontroller:


void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);
}

Ce se observă? LEDul de pe placa de bază clipește la intervale de o secundă.

În secțiunea "setup" avem o singura instrucțiune, care declară că pinul 13 digital va fi folosit
în continuare pentru a controla un dispozitiv, o ieșire (OUTPUT).

Dacă am fi vrut să citim o informație din mediul exterior, o citire de port de exemplu – am fi
declarat pinul ca unul de intrare (INPUT) - "pinMode(13, INPUT)"). Această instrucțiune se
execută o singură dată.

Urmează secțiunea "loop", care aprinde led-ul conectat la pinul 13 ("digitalWrite(13,


HIGH)"), așteaptă o secundă, îl stinge, iar așteaptă o secundă. Cum a mai fost menționat,
instrucțiunile din secțiunea "loop" se execută ciclic, astfel că imediat după ce s-a terminat un ciclu,
led-ul iarăși se aprinde, apoi iarăși se stinge, tot asa până când tăiem alimentarea plăcii.

61
II. Exemplu LED

În următorul exemplu vom folosi breadboardul pentru a crea un circuit simplu, încercând să
aprindem un led conectat pe breadboard.

Avem nevoie de următoarele: un led, o rezistență (220Ω), conectori pentru breadboard.

Opriți alimentarea la USB de fiecare dată când legați conectori la porturile de intrare ale
Arduino!!!

Aplicația Resistor_color_code.exe vă poate ajuta în alegerea unei rezistențe:

Realizați următorul circuit simplu:

Pinul 13 al microcontrollerului va fi legat la anodul LED-ului, led aflat în serie cu o


rezistență de sarcină.

Atenție la polarizarea LED-ului!


Tot timpul pinul mai lung este (+) sau ANOD iar cel mai scurt este CATOD sau
(-). De asemenea în interiorul LED-ului catodul este mai proeminent faţă de
ANOD.

Circuitul se închide prin legarea CATODULUI led-ului la masă (GND).

Rulați aplicația deja existentă pe microcontroller. Ce observați?

62
Modificați pinul led-ului în aplicație, modificați circuitul, scrieți programul apoi rulați-l pe
microcontroler. Ce observați?

Modificați aplicația astfel încât să aprindeți pe rând ambele LED-uri.

III. Exemplu joc LED-uri multiple

Realizați următorul circuit:

Atenție la polarizarea LED-urilor. Este recomandat să folosiți fire de legătură de culori


diferite, de obicei negru pentru legătura la masă, roșu pentru alimentare (ieșirea din pin-ul în starea
HIGH din microcontroller).

Circuitul de mai sus are următoarea schemă echivalentă:

63
Schema rulează următorul cod:

int LED[] = {6,7,8,9,10,11,12,13};//se definesc pinii pe care sunt conectate


LED-urile

void setup()
{

/*Se seteaza pinii mai sus definiti ca si IESIRI

for(int i = 0; i < 8; i++){


pinMode(LED[i],OUTPUT);
}

void loop()
{
animatie();
}

void animatie(){
int intarziere = 100; //se defineste 100ms interval intre aprinderea si
stingerea unui led
for(int i = 0; i <8; i++){
int stopLED = i - 1; //calculeaza care a fost ultimul led aprins
if(i == 0) { //in cazul in care procesul se reia se stinge ultimul LED
stopLED = 7;
}
digitalWrite(LED[i], HIGH); //se aprinde un nou LED
digitalWrite(LED[stopLED], LOW); //se stinge ultimul LED
delay(intarziere);
}
}

Modificați programul, astfel încât să ruleze cu un număr mai mic de LED-uri.

Observație: În loc de LED-uri puteți folosi un LED Bar Graph, ca cel de mai jos:

64
IV. Citire analogică

În exemplul următor vom citi valoarea unui potențiometru variabil, pentru a aprinde o serie
de LED-uri, în funcție de valoarea tensiunii raportată la intrarea portului microcontrolerului.
Valoarea tensiunii este direct proporțională cu valoarea rezistenței potențiometrului.

Pentru ușurință, este recomandat să folosim un LED Bard Graph, componentă echivalentă
cu 10 LEDuri.

Se va realiza următorul circuit (în loc de LEDuri, recomand Bar Graphul):

Schema echivalentă a circuitului:

65
Schema rulează următorul cod:

//This example code is in the public domain.


//http://www.arduino.cc/en/Tutorial/BarGraph

// these constants won't change:


const int analogPin = A0; // the pin that the potentiometer is attached to
const int ledCount = 10; // the number of LEDs in the bar graph

int ledPins[] = {
2, 3, 4, 5, 6, 7,8,9,10,11 }; // an array of pin numbers to which LEDs are
attached

void setup() {
// loop over the pin array and set them all to output:
for (int thisLed = 0; thisLed < ledCount; thisLed++) {
pinMode(ledPins[thisLed], OUTPUT);
}
}

void loop() {
// read the potentiometer:
int sensorReading = analogRead(analogPin);
// map the result to a range from 0 to the number of LEDs:
int ledLevel = map(sensorReading, 0, 1023, 0, ledCount);

// loop over the LED array:


for (int thisLed = 0; thisLed < ledCount; thisLed++) {
// if the array element's index is less than ledLevel,
// turn the pin for this element on:
if (thisLed < ledLevel) {
digitalWrite(ledPins[thisLed], HIGH);
}
// turn off all pins higher than the ledLevel:
else {
digitalWrite(ledPins[thisLed], LOW);
}
}
}

Încercați să rotiți potențiometrul, observați cum se aprinde gradual bare de LED-uri.

66
V. Display 16x2 paralel, compatibil Hitachi HD44780

În următorul exemplu veți încerca să controlați un display compatibil cu driver-ul Hitachi


HD44780.

Sunt foarte multe display-uri cu 16 segmente disponibile pe piață, majoritatea fiind


compatibile între ele, prezentând o metodă standard de interfațare pe 16 pini.

LCD-ul prezintă o interfață paralelă, ceea ce înseamnă că microcontrollerul trebuie să


manipuleze mai mulți pini în paralel, în același timp, pentru a controla display-ul.

Pinii de control ai displayului sunt următorii:

 register select (RS) pin, controlează locația de memorie din LCD unde scriem datele.
 Read/Write (R/W) pin, selectează modul scriere sau citire din LCD.
 Enable pin, permite scrierea în registrii LCD-ului
 8 pini de date (D0 -D7). Starea acestor pini (high sau low), reprezintă biții de date pe care-i
trimitem sau citim de la display.
 pin (Vo), pentru contrast (reglabil prin potențiometru)
 Pini de alimentare și împământare (+5V și Gnd)
 Pinul 15, pentru backlight

Realizați următoarea schemă:

Observație: dacă nu se aprinde lumina de fundal a LCD-ului, legați la 5V pinul 15, cu o rezistență
de sarcină în serie (pentru LCD-ul cu backlight, legați pinul 15 la 5V, pinul 16 la GND).
Cu ajutorul potențiometrului reglați contrastul display-ului.

67
Codul pentru microcontroller este următorul (îl puteți încărca din File → Examples →
LiquidCrystal → HelloWord):

/*
LiquidCrystal Library - Hello World

Demonstrates the use a 16x2 LCD display. The LiquidCrystal


library works with all LCD displays that are compatible with the
Hitachi HD44780 driver. There are many of them out there, and you
can usually tell them by the 16-pin interface.

This example code is in the public domain.

http://www.arduino.cc/en/Tutorial/LiquidCrystal
*/

// include the library code:


#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("hello, world!");
}

void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
// print the number of seconds since reset:
lcd.print(millis()/1000);
}

Rulați aplicația.

VI. Senzor temperatură I2C - TMP102

Senzorul TMP102 de la Texas Instruments este un dispozitiv I2C, ceea ce înseamnă că


raportează direct valoarea citită, fără a fi nevoie de algoritmi de corecție, sau formule de calcul
pentru a interpreta semnalele citite.

68
Cum am menționat în introducerea teoretică, I2C este un protocol de comunicare serială de 2
fire, SDA (Data) și SCL (Clock) fiind pinii necesari. Pe Arduino UNO, SDA e pinul analog 4, SCL
fiind pinul 5. Pe alte microcontrolere din gama Arduino (Mega de exemplu), SDA se află pe pinul
digital 20, SCL pe 21.

Pe Arduino, se folosește librăria „Wire” de comunicare I2C.

Senzorul are un pin de adresă (ADD0), ce este folosit pentru a schimba adresa senzorului.
Acestă adresă este folosită în cazul în care se dorește a se interoga independent mai multi senzori,
pe aceeași magistrală. Prin împământarea acestui pin, senzorul primește automat adresa 72 (0x48 în
hex). Alimentând senzorul, prin conectare la V+ (3.3V), adresa primită devine 73 (0x49 în hex). În
schema prezentată mai jos, legăm senzorul la masă, de aceea această adresă trebuie inițializată de
noi, prin codul: int tmp102Address = 0×48;

Schema circuitului:

Exemplu cod citire temperatură (a se observa afișarea acestor informații folosind comunicarea
serială cu PC-ul):
#include <Wire.h>
int tmp102Address = 0x48;

void setup(){
Serial.begin(9600);
Wire.begin();
}

void loop(){

float celsius = getTemperature();


Serial.print("Celsius: ");
Serial.println(celsius);

69
float fahrenheit = (1.8 * celsius) + 32;
Serial.print("Fahrenheit: ");
Serial.println(fahrenheit);

delay(200); // întârzie afișarea pe serială


}

float getTemperature(){
Wire.requestFrom(tmp102Address,2);

byte MSB = Wire.read();


byte LSB = Wire.read();

//se folosește adresare în complement față de 2.


int TemperatureSum = ((MSB << 8) | LSB) >> 4;

float celsius = TemperatureSum*0.0625;


return celsius;
}

În încheiere, vă recomand pornirea aplicației Fritzing (fritzing.2013.01.02.pc.zip), pentru a


vă familiariza cu un mediu de realizare a plăcilor integrate (Prototyping). Nu este la fel de puternic
ca și EAGLE, dar e un punct de pornire pentru realizarea cel puțin a unor scheme simple.

Încercați să implementați un circuit din cele simple prezentate în laborator.

Devine foarte util în momentul integrării unei librării cu componente de bază.

Exemplu: http://www.adafruit.com/blog/2012/08/27/how-to-install-and-use-the-adafruit-fritzing-
library/

70
Bibliografie

1. Clubul Ingineresc Micro LAB: Introducere in Arhitectura Microcontrolelor


2. http://cs.curs.pub.ro/wiki/pm/lab/lab0
3. http://andrei.clubcisco.ro/cursuri/3pm/lab1.pdf
4. http://www.adafruit.com/blog/2012/08/27/how-to-install-and-use-the-adafruit-fritzing-
library/
5. http://bildr.org/2011/01/tmp102-arduino/
6. http://arduino.cc/en/Tutorial/HomePage
7. http://www.roroid.ro/wiki/
8. http://en.wikipedia.org/wiki/Atmel
9. http://www.atmel.com/products/microcontrollers/avr/default.aspx

71
72
Rețele de senzori

Digi XBee Radio: Broadcast Radio 802.15.4

Laboratorul 4

73
Scopul lucrării
Laboratorul de față își propune să familiarizeze studentul cu radiourile de la Digi
International, XBee Series 2, cu scopul de a-și crea o rețea MESH, formată dintr-un coordonator și
mai multe routere sau end-point devices.

Se are în vedere și testarea acoperirii radio, prin măsurarea parametrului RSSI, și raza
maximă pe care o acoperă aceste emițătoare ZigBee.

Introducere
Hardware-ul XBee Series 2 folosește un chip de la Ember Networks, ce permite crearea mai
multor topologii de rețea standardizate Mesh. Topologia Mesh stă la baza construirii unor rețele
robuste, rezistente la factori perturbatori, cu posibilitatea de a colecta și transporta o colecție imensă
de date de la senzori.

Echipamente folosite în lucrare:

Xbee Series 2:

74
FTDI convertor (pentru programarea prin Virtual COM Port):

Digi evaluation board (placă dezvoltare aplicații – CodeWarrior IDE):

Desfășurarea lucrării
Verificare / Instalare driver FTDI USB

Pentru programarea XBee, vom folosi un convertor denumit adapter board, de la Sparkfun
Electronics.

75
Este un convertor paralel-serial, de tip UART, pentru asigurarea comunicării seriale prin
USB. Pentru aceasta, trebuie să instalăm drivere-le FTDI USB Drivers.

Verificați instalarea driverelor în PC, dacă acestea lipsesc, portul serial apare ca Unknown
device în Device Manager:

Instalați driver-ul UART din directorul CDM20828_Setup_ftdi.

În acest adaptor se introduce radio-ul XBee, respectând poziția corectă a pinilor:

76
Configurarea echipamentelor:
Se va implementa următoarea topologie:

X-CTU

X-CTU este aplicația oficială de configurare


pentru XBee. Rulează doar pe sistemul de operare
Windows.

Folosind X-CTU putem să configurăm


echipamentele, să schimbăm firmware-ul lor, testa
acoperirea radio, etc.

Pentru a folosi X-CTU, după instalarea


driverelor FTDI, conectăm XBee-ul in adaptor, care la
rândul său se conectează prin USB la PC. FTDI-ul ne
va aloca un port COM în device manager, pe care îl
vom folosi pentru a programara aparatele.

77
Configurarea routerului (Mod AT):

Se alege portul COM al radioului pe care-l configurăm ca și router. Dacă folosim același PC
pentru configurarea mai multor radiouri, trebuie să fim atenți la selecția corectă a portului COM.

Se testează conectivitatea selectând funcția Test / Query (observâm ledurile de pe placa


adaptoare, pentru a identifica radioul ce trebuie programat):

Ne sunt afișate informații despre tipul modemului, versiunea de firmware și seria radioului.
De asemenea aceasta fereastră confirmă comunicarea corectă cu dispozitivul.

Dacă radioul nu poate fi interogat, acesta trebuie restaurat la setările din fabrică (acest lucru
se realizează din TAB-ul Modem configuration, selectând firmware-ul corect și apăsând pe WRITE,
cu radioul scos din adaptor. Se introduce radio-ul în sochet în momentul în care apare mesajul de
eroare comunicare).

78
Pasul următor în reprezintă configurarea parametrilor de comunicație, din tabul Modem
Configuration:

Se citesc parametrii existenți (READ), după care se resetează (RESTORE) la setările din
fabrică.

Se alege ca funcție (Function Set): ZIGBEE ROUTER AT, ultima versiune (se descarcă
ultimele versiuni din Download new versions...).

Se bifează Always update firmware, apoi WRITE.

După scrierea funcției de router, se debifează Always upate firmware, și se inițializează


următorii parametrii:

 PAN ID: 7779


 JV Channel Verification: 1 – ENABLED
 Destination Address: 0
 Se apasă WRITE pentru scrierea configurației

79
Configurarea coordonatorului (Mod AT):

Primi pași sunt identici cu cei de la router. Diferă tabul modem configurațion.

Se scrie pe radio funcția de ZIGBEE COORDINATOR AT, după care se configurează


următorii parametrii:

 PAN ID: 7779


 Se apasă WRITE pentru a scrie configurația. Nu sunt necesari pași suplimentari, aceasta
având rolul de coordonator

80
Testarea rețelei:

Se folosește tabul Terminal din aplicația X-CTU (se pornește de două ori aplicația, pentru
fiecare radio conectat):

81
Test raza acoperire (Range TEST)
Pentru a intra în modul programare:

Pentru a comuta dizpozitivul în modul de comanda, tastați +++ fără carriage return (enter).
Când modemul intră în modul de programare, mesajul OK este afișat:

Tastați comanda atnd (Node Discover) urmată de carriage return (enter).


Această comandă descoperă și afișează toate nodurile și modulele pe canalul de operare, precum și
PAN ID-ul lor (ID Parameter).
Toate nodurile conectate ce s-au alăturat rețelei răspund la această comandă:

Pentru a testa raza de acțiune, trebuie să configurăm XBee-urile pentru a trimite pachete de
loopback către gateway.

Acest lucru se realizează introducând următoarea comanda:


atci12

După folosim tabul Range Test. Apăsăm START și selectăm received signal strength indicator
(RSSI).

82
Comanda atci12 (Destination Cluster ID=12) setează ID-ul clusterului în pachetele
transmise de către modulul XBee. Pachetele trimise cu acest cluster ID (12), sunt retransmise către
sursă (origine), atunci când destinatarul le primește (ACK în modulul XBee din gateway).

83
Exercițiu:

Transmiterea infomațiilor folosind ARDUINO

Pentru acest exercițiu vom folosi Arduino pentru a citi datele de la un senzor de temperatură.
Aceste date le vom transmite prin radioul XBee la distanță, către al doilea Arduino, ce va conține un
display, pentru afișarea temperaturii.

Informații: radioul XBee, în modul AT, configurat anterior, se comportă ca liniile TX și RX


pentru Arduino. Codul de a citi și scrie pe linia serială este următorul: Serial.println(variabila);

Pentru a citi datele de pe linia serială, puteți folosi următorul exemplu de cod:

//receiver serial XBee

void setup()
{
Serial.begin(9600);
}

void loop()
{
if(Serial.available() > 0) {
Serial.write(Serial.read());
}
}

84
Bibliografie

1. http://www.adafruit.com/blog/2012/08/27/how-to-install-and-use-the-adafruit-fritzing-
library/
2. http://bildr.org/2011/01/tmp102-arduino/
3. http://arduino.cc/en/Tutorial/HomePage
4. http://www.roroid.ro/wiki/
5. http://en.wikipedia.org/wiki/Atmel
6. http://www.atmel.com/products/microcontrollers/avr/default.aspx
7. Clubul Ingineresc Micro LAB: Introducere in Arhitectura Microcontrolelor
8. https://www.sparkfun.com/tutorials/192#defaults
9. http://tunnelsup.com/tup/2012/11/30/xbee-s2-quick-reference-guide-cheat-sheet/
10. http://www.youtube.com/watch?annotation_id=annotation_262505&feature=iv&src_vid=od
ekkumB3WQ&v=mPx3TjzvE9U

85
86
Rețele de senzori

Achiziționare de date în timp real: Matlab și Arduino

Laboratorul 5

87
Scopul lucrării
Laboratorul de față își propune să familiarizeze studentul cu citirea și prelucrarea datelor de
la periferice și senzori externi, conectați la microcontrollerul Arduino. Datele vor fi prelucrate în
Matlab.

Scopul final este de a expune studenților diverse protocoale de comunicare serială, folosite
în aparatura industrială, precum și generarea interfețelor GUI pentru sistemele SCADA.

Se are în vedere și transmiterea de la PC către microcontroller a datelor, pentru a obține o


cumunicație bidirecțională.

Introducere
Interfețe specializate de comunicație

Tehnicile de măsurare pot fi implementate la nivel fizic prin blocuri funcţionale cu destinaţie
precisă (aparatele de măsurare) sau prin module care pot realiza funcţii multiple (eşantionare,
conversie, memorare) şi a căror selecţie este făcută de o unitate centrală (eventual PC). În cazul
aparatelor de măsurare numerice, dotarea acestora cu interfeţe de comunicaţie (serială sau paralelă)
permite interconectarea lor cu unităţi de calcul puternice şi, deci, lărgirea considerabilă a ariei
funcţiilor ce pot fi efectuate de sistemul astfel realizat. Aparatele numerice memorează datele sub
formă de caractere reprezentate adesea pe 8, 16 sau 32 de biţi. Biţii care formează un caracter se pot
transmite la distanţă către un alt sistem numeric fie prin transmiterea simultană a câte 8 biţi
(comunicaţie paralelă), fie prin transmiterea succesivă a biţilor care formează un caracter
(comunicaţie serială). În primul caz, se utilizează 8 linii de date şi alte linii (conductoare) pentru
semnalul de referinţă (GND) şi cele de control al comunicaţiei.

În al doilea caz, informaţia prezentă de obicei sub formă paralelă este apelată de un registru
de deplasare paralel-serie, comandat de un semnal de tact, transmisă printr-o singură pereche de
conductoare şi apoi, la recepţie, reconstituită în format paralel prin intemediul registrului de
deplasare serie-paralel.

Comunicaţia de tip serial

Interfaţa serială este un sistem de comunicaţie numerică introdus ca urmare a necesităţii de a


controla un ansamblu tehnic cu elemente dispersate pe suprafeţe mari. De asemenea, această
interfaţă este folosită pentru comunicaţia cu PC-ul şi de către dispozitive speciale, cum ar fi
programatoarele EPROM şi PAL, emulatoarele, controller-ele logice programabile sau anumite
interfeţe de achiziţie de date. PC-urile din zilele noastre, în special laptopurile, nu mai conţin astfel
de interfeţe, dar se pot folosi adaptoare USB la serial, ce adaugă un port COM de comunicaţie
serială, virtual.

Achiziţia datelor se efectuează prin executarea unui program de achiziţie de către


calculatorul care asigură comanda mijlocului de măsurare, transferul datelor într-un fişier de date şi
prelucrarea lor imediată sau ulterioară.

88
Denumirea RS-232 (mai exact, RS-232C) corespunde normei americane a interfeţei seriale,
normă propusă iniţial în 1960 şi devenită variantă standard în 1969, apoi remodificată în 1987.
Denumirea V24 este o prescurtare a normei franceze (şi recomandată CEI). În principiu, ambele
norme sunt identice.

În prezent există şi module dedicate comunicaţiei seriale performante, cum este RS-485 (de
tip plug-in) pentru care se poate asigura comunicaţia până la distanţa de 1,2 km, cu o viteză maximă
de transfer de 100 kHz.

Numeroase aparate utilizează conectarea la calculator prin intermediul interfeţei seriale RS-
232. Norma clasifică aparatele în două categorii:

1. DTE (Data Terminal Equipments) – categorie din care fac parte PC-ul, tastatura etc.
2. DCE (Data Communication Equipments) – modem-urile, aparatele de măsurare etc.

Modul de conectare poate să difere de la un aparat la altul. În principiu, se poate conecta


numai un singur aparat la o interfaţă serială. Programarea modului de comunicaţie poate fi, de
asemenea, foarte diferită. De aceea, nu se poate vorbi de un standard. În forma minimală, o
conexiune serială RS-232 se compune din numai 3 conductoare:

1. RXD (Receive Data), conductorul pentru semnalul de recepţie;


2. TXD (Transmit Data), conductorul pentru semnalul de emisie;
3. GND (Ground), conductorul de masă.

Modul de legare a conductoarelor RXD şi TXD la portul calculatorului depinde de aparatul


utilizat. Siguranţa în transmisia datelor poate fi mai mare dacă se introduce o comunicaţie de tip
handshaking. În acest caz se folosesc (fig. 5.1), pe lângă semnalele RXD şi TXD (semnale de date),
şi semnalele RTS (Request To Send) şi CTS (Clear To Send).

RTS (cerere de emisie) şi CTS (autorizare de emisie) sunt semnale care girează funcţionarea
half-duplex (HDX) - de exemplu, a liniei telefonice.

Calculatorul semnalizează modem-ului prin RTS că are un caracter de transmis; transmisia


este posibilă numai atunci când semnalul CTS este primit de calculator. O siguranţă superioară în
transmisia datelor se obţine prin utilizarea semnalelor DTR (Data Terminal Ready) şi DSR (Data
Set Ready). Prin aceste semnale receptorul este anunţat că emiţătorul este pregătit să trimită datele.
Astfel, DTR poate fi perceput ca un semnal de BUSY pentru receptor.

Siguranţa unei transmisii este determinată de lungimea cablurilor de legatură (maximum 2 x


15=30 m), nivelul de tensiune al semnalelor şi viteza de transmisie.

Nivelele de tensiune pentru interfaţa RS-232 sunt:

1. HIGH: -15 V (-25 V);


2. LOW: +15 V (+25 V).

Intervalul de la -3 V la +3 V nu este permis (fig. 5.2).

89
Fig. 5.1: Tipuri de conexiuni utilizate în interfaţarea serială: a) varianta minimală; b) varianta
handshake; c) handshake cu confirmare DTR şi DSR; d) transmisie cu punte pe semnalele de
handshake; e) conectarea unui plotter.

Fig 5.2: Nivelele de tensiune pentru portul serial.

Viteza de transmisie este dată în BAUD. O altă unitate uzuală în cazul transmisiilor este
BPS (Bits Per Second). In cazul comunicaţiei seriale între două echipamente, exprimarea
vitezei de transmisie în BAUD şi BPS este identică. În cazul conectării lor prin intermediul
modem-urilor, însă, acest lucru nu mai este valabil.

90
Valorile uzuale pentru viteza de transmisie (Baudrate) sunt: 50 110 300 600 1200 2400
4800 9600 19200 38400.

Formatul de transmisie al datelor este descris prin următorii parametri:

 Baudrate (viteza de transmisie);


 Startbit (bitul 2 de start);
 Numărul de biţi de date;
 Paritatea;
 Numărul de biţi de stop.

Prin intermediul biţilor de start şi stop se determină începutul, respectiv sfârşitul secvenţei de
date transmisă. Numărul de biţi de date este, de obicei, 7 sau 8. Prin intermediul testului de paritate
se pot evidenţia eventualele erori de transmisie. În acest sens, există trei posibilităţi de detecţie:

 No Parity: Nu se face nici un test de paritate;


 Even parity (paritate pară): Emiţătorul numără toţi biţii de date care au valoarea “1” şi
setează bitul de paritate cu “1”, dacă suma a fost impară, şi cu “0”, dacă suma a fost pară.
Receptorul adună biţii de date cu valoarea bitului de paritate. Suma este totdeauna (în cazul
unei transmisii corecte) pară; în caz contrar, a survenit o eroare la transmisia datelor;
 Odd Parity (paritate impară): Metoda corespunde testului de paritate pară, cu deosebirea
că suma biţilor de date şi a celui de paritate este totdeauna (la emiţător) impară.

În fig. 5.3 se descrie procesul de transmitere a caraterului “2” (în reprezentarea binară
corespunzătoare codului ASCII) cu protocolul “1 bit de start, 7 biţi de date, 2 biţi de stop, paritate
impară”.

Fig. 5.3: Semnalele corespunzătoare transmisiei caracterului “2”.

91
Echipamente folosite în lucrare:

Arduino UNO:

Fig. 5.4: Arduino UNO

Potențiometru analogic:

Fig. 5.5: Potențiometru analogic

92
Desfășurarea lucrării
Cu ajutorul unei plăci Arduino, vom citi datele de la o intrare analogică, pe care o vom
exporta cu ajutorul portului serial (usb to serial converter) către Matlab. Capabilitățile de calcul ale
microcontrollerului ATmega328 sunt destul de reduse, cu siguranță nu putem efectua calcul
matriceal sau operații complexe, necesare în anumite proiecte de automatizare. Matlab, de exemplu,
este foarte bun în astfel de cazuri.

Instalare librării comunicație Matlab:

Se stabilește o comunicație de tip client – server, de aceea este nevoie să instalam în Matlab
un set de librării ce ne permite comunicarea bidirecțională cu microcontrollerul. De asemenea, în
memoria microcontrollerului, se va scrie o aplicație server ce va trimite / primi date din Matlab.

Pentru instalarea librăriilor în Matlab, şi scrierea aplicaţiei server pe microcontroller,


procedaţi în felul următor:

1. Descărcaţi librăria ArduinoIO. Din directorul ArduinoIO\pde\adioes, deschideţi în


Arduino IDE fişierul adioes.pde. Scrieţi acest fişier în microcontroller.
2. Pentru a instala librăria în Matlab, acesta trebuie rulat în modul administrator. Navigăm
în directorul rădăcină al kitului de instalare, şi tastăm comanda "install_arduino".

Fişierul adioes.pde reprezintă aplicaţia „server” ce va rula continuu pe microcontroller.


Aşteaptă comenzi din Matlab, pe portul serial, le execută, apoi, dacă este cazul, returnează un
rezultat.

În Matlab, comanda „install_arduino” adaugă în căile Matlab funcţiile necesare lucrului cu


microcontrollerul.

Utilizarea librăriei

Înainte de a scrie aplicaţii în Matlab, vă asiguraţi că placa este conectată la PC prin portul
USB, şi driverul FTDI-USB este instalat. De asemenenea, vă asiguraţi că portul COM folosit de
Arduino nu este deschis în alte aplicaţii (IDE Arduino, Putty, Serial Monitor, etc).

Din Matlab, se defineşte un obiect nou, de tip arduino, astfel: a=arduino('port'), unde
'port' este portul COM pe care este conectat microcontrollerul. În Windows, de exemplu, poate fi
COM3, COM5, etc. Se mai poate folosi si portul COM denumit 'DEMO', pentru a simula o
conectare.

93
Funcţia returnează:

Attempting connection ........


Basic I/O Script detected !
Arduino successfully connected !

Apoi se folosesc comenzile a.pinMode, a.digitalRead, a.digitalWrite, a.analogRead, şi


a.analogWrite, pentru a schimba modul de operare al portului (input/output), pentru a face o citire
digitală, scriere digitală, citirea unei valori analogice, respectiv scrierea. Puteţi consulta manualul
librariei pentru mai multe informaţii.

Mai sunt câteva funcţii folositoare, a.serial returnează numele portului serial, a.flush pentru a
goli bufferul şi a.roundTrip, pentru a testa timpul de răspuns.

La final, obiectul se distruge folosind a.delete, pentru a închide sesiunea şi pentru a


deconecta Matlab de la portul serial.

Exemplu:

a=arduino('COM5');
av=a.analogRead(5);
a.pinMode(13,'output');
a.digitalWrite(13,1);
delete(a);

Exercițiu: Real time plot

În exemplul următor, se va realiza următorul circuit:

Fig. 5.6: Potenţiometru ataşat portului 0 analogic

94
Cu ajutorul librăriei din Matlab, putem citi şi afişa în timp real variaţia potenţiometrului.
Convertorul A/D, de la portul analog 0, eşantionează semnalul primit în intervalul 0-1023.

Se va implementa şi comenta următorul cod în Matlab:


interv=1000; % intervalul de afişat
rez=1; % rezoluţia
t=1; % pasul
x=0; % vector valori citite

while(t<interv)
b=a.analogRead(0);
x=[x,b];
plot(x);
axis([0,interv,680,800]);
grid
t=t+rez;
drawnow;
end

Se vor afişa în timp real valorile citite:

Fig. 5.7: Afişarea în timp real a datelor citite de la microcontroller

95
Bibliografie

1. Costin Ştefănescu, Nicolae Cupcea, „Electronică Aplicată - Sisteme Inteligente Hardware -


Software de Măsurare şi Control”, Bucureşti 2003, pleluare parte teoretică
2. http://www.mathworks.it/matlabcentral/fileexchange/32374-matlab-support-package-for-
arduino-aka-arduinoio-package
3. http://playground.arduino.cc/Interfacing/Matlab
4. http://www.xploreautomation.com/arduinomatlab-real-time-plot/
5. http://www.megunolink.com/plotting-logged-data-using-matlab/

96
Rețele de senzori

Linux în sistemele embedded: Exemplificare Raspberry PI

Laboratorul 6

97
Scopul lucrării
Laboratorul de față își propune să familiarizeze studentul cu Linux, un sistem de operare în
timp real. Se are în vedere folosirea acestuia într-o aplicație embedded, pentru citirea unor senzori
I2C, prin porturile specifice dispozitivului ARM folosit (GPIO, placă de dezvoltare Raspberry PI).

Scopul final este de a expune studenților modalități prin care se pot construi aplicații
inteligente, de complexitate mai mare decât cele ce rulează pe microcontroller.

Introducere
Miniaturizarea şi creşterea puterii de procesare a unui sistem de calcul cu procesor este un
subiect interesant şi dificil pentru inginerii ce proiectează astfel de sisteme.

Majoritatea sistemelor de calcul întâlnite în ziua de azi au „migrat” din suportul unui
calculator obişnuit şi au fost integrate în alte dispozitive cum ar fi automobilele sau produsele
electronice de larg consum, formând ceea ce se cheamă un sistem embedded. Sistemele embedded
controlează majoritatea dispozitivelor întâlnite astăzi pe piaţă: telefoane mobile, echipamente reţea,
navigatoare GPS, console jocuri portabile, etc.

Termenul „embedded” este strâns legat de noţiunea de SoC. Un sistem embedded este un
calculator construit cu scopul de a îndeplinii anumite sarcini sau funcţii, de cele mai multe ori cu
constrângeri legate de viteza de operare, costul de producţie, etc. Un sistem embedded trebuie să
răspundă în timp real, pentru a oferi un grad de interactivitate ridicat şi să fie ieftin de produs.

De exemplu, un telefon mobil trebuie să fie accesibil unei game largi de utilizatori şi în
primul rând să îndeplinească o funcţie principală, aceea de a putea comunica prin voce. Telefonul
trebuie să fie uşor de utilizat şi să răspundă la comenzi într-un timp relativ scurt, de exemplu
apăsarea tastei de apel să iniţializeze apelul aproape instant. Un sistem embedded este de obicei
construit dintr-un SoC sau microcontroller şi foloseşte limbaje sau arhitecturi cu seturi de
instrucţiuni reduse, de tip RISC.

Fig 6.1: Telefon mobil, cu procesor OMAP850 (ARM) de la Texas Instruments

98
Arhitectura (ARM Advanced RISC Machine, fig 6.1) prezentată în această lucrare este cea
mai răspândită astfel de platformă folosită în sistemele integrate. La nivelul anului 2007, 98% din
cele aproape un miliard de telefoane mobile vândute foloseau cel puţin un procesor ARM. În 2009,
procesoarele de tip ARM sunt responsabile de echiparea a 90% din produsele de larg consum
embedded pe 32-bit, RISC.

Conceptul de procesor RISC


Arhitectura RISC se bazează pe faptul că un set de instrucţiuni simplificat poate da criterii
de performanţă îmbunătăţite dacă această simplificare permite execuţia mai rapidă a fiecărei
instrucţiuni.

Instrucţiuni simple şi instrucţiuni complexe

Instrucţiunile sunt codificate în cod binar şi stocate în memorie; pentru a fi executate ele sunt
decodate de procesor. Instrucţiunile cele mai frecvente sunt cele aritmetice, logice şi de transfer. O
instrucţiune poate fi simplă sau complexă:

 instrucţiunea de incrementare a unui registru intern este simplă; ea constă într-o adunare,
care se execută în interiorul procesorului şi este suficientă (în general) o singură perioadă de
tact pentru execuţie
 instrucţiunea de incrementare a unei locaţii de memorie este o instrucţiune complexă;
operaţiile necesare sunt: selectarea celulei de memorie prin intermediul adresei, transferul
conţinutului ei în interiorul procesorului, într-un registru, incrementarea registrului,
transferul conţinutului înapoi în celula de memorie, la aceeaşi adresă. Desigur, sunt necesare
mai multe perioade de tact pentru execuţia unei asemenea instrucţiuni.

O instrucţiune simplă este executată direct de procesor prin intermediul unei unităţi
specializate (ca de exemplu UAL - unitatea aritmetică şi logică). Execuţia instrucţiunilor complexe,
în acelaşi mod, ar necesita un număr mare de unităţi specializate (pentru fiecare tip de instrucţiune,
o unitate specifică). Există însă o limită fizică şi anume numărul de componente ce pot fi integrate
într-un microprocesor, care, deşi foarte mare, nu permite decât realizarea unui set redus de unităţi
specializate. Ca urmare a fost adoptată altă soluţie, încă de la apariţia primelor microprocesore.

Fiecare instrucţiune complexă este descompusă într-o secvenţă de instrucţiuni simple,


numite microinstrucţiuni. Pentru execuţia unei instrucţiuni complexe se execută de fapt secvenţa de
microinstrucţiuni corespunzătoare. Acestea sunt înregistrate, în procesul de fabricaţie, într-o
memorie ROM, pe pastila de siliciu a procesorului sub formă de microcod. Memoria ROM, pentru
microcod, este accesată prin intermediul unor circuite logice, specializate în extragerea secvenţială,
a microinstrucţiunilor, sub comanda unităţii de instrucţiuni.

Microcodul şi logica de extragere şi asamblare alcătuiesc ceea ce se numeşte firmware,


cuvânt care nu are corespondent în limba română. Acest concept, care a fost aplicat procesoarelor
CISC prezintă avantaje dar şi unele inconveniente. Decodorul de instrucţiuni descifrează
instrucţiunea curentă şi o aplică blocului de microcodaj care o transformă în operaţii elementare ( în
figura 6.2 este dată o reprezentare simplificată a acestor operaţii).

99
Fig 6.2: Etapele prelucrării instrucţiunilor

Aşadar, microcodul este înregistrat de fabricant şi este apelat de instrucţiunile executabile


după decodarea lor; aceeaşi microinstrucţiune poate fi apelată de mai multe instrucţiuni complexe în
procesul de execuţie.

Principalul avantaj al acestui concept constă în scurtarea programelor de aplicaţii: acestea


sunt formate dintr-un număr redus de instrucţiuni complexe, care în procesul de execuţie se
multiplică în instrucţiuni simple. Dacă programul de aplicaţie este scurt, el ocupă în memorie un
număr redus de locaţii.

Dezavantajele utilizării instrucţiunilor microcodate sunt: lungimea instrucţiunilor (în octeţi)


şi timpul de execuţie (în perioade de tact) diferă foarte mult de la o instrucţiune la alta, ceea ce
impune procesorului operaţii logice suplimentare (numărarea octeţilor pentru separarea unei
instrucţiuni, execuţia secvenţială a unui număr diferit de microinstrucţiuni pe instrucţiune etc.).
Viteza de execuţie trebuie corelată cu timpul de execuţie al celei mai complexe instrucţiuni care
este cea mai „cronofagă" – consumatoare de timp.

Pe de altă parte, studiile statistice au arătat că în programele de aplicaţii, instrucţiunile


complexe sunt mult mai puţin frecvente decât cele simple (sub 10%), deci instrucţiunile complexe
penalizează întregul sistem. De aici a pornit şi necesitatea reducerii instrucţiunilor complexe, în
sistemele RISC. De asemenea, memoria ROM, pentru microcod şi circuitele aferente acesteia,
ocupă o suprafaţă importantă, pe pastila de siliciu a procesorului, cu implicaţii directe asupra
preţului de cost. Ca urmare, suprimarea microcodului duce la economii substanţiale.

Ce este Linux?
Linux este un sistem de operare gratuit (open source), compatibil UNIX. UNIX este un
sistem multitasking şi multiuser, în care utilizatorii au acces la resursele calculatorului de la diferite
terminale, plasate local sau la distanţă, putând executa, teoretic, în mod concurent un număr
nedeterminat de programe (limitările apar datorită resurselor hardware limitate, mai ales în cazul
unui sistem SoC). Linux respectă standardul POSIX (Portable Operating System Interface [for
Unix]), suportă toată gama de aplicaţii GNU şi posedă o interfaţă grafică bazată pe X Window
System pentru sistemele desktop, de tip terminal pentru sistemele embedded sau servere.

100
Linux este de fapt o clonă de Unix. O clonă Unix este un sistem de operare care respectă
Single Unix Specification, dar care nu conţine componente din sursele initialte Unix. BSD-urile sau
Solaris sunt direct derivate din codul Unix şi pot fi denumite Unix-uri veritabile. Linux respectă
standardul POSIX.

Linux a apărut iniţial ca un proiect al lui Linus Torvalds, student pe atunci la Universitatea
din Helsinki. Prima versiune utilizabilă a fost lansată pe 5 octombrie 1991. Spre deosebire de alte
sisteme de operare, nicio firmă nu este proprietară a sistemului Linux. Mai mult decât atât, el este
protejat de Licenţa Publică GNU (GNU e o fundaţie care apără interesele autorilor de programe
gratuite), care stipulează faptul că se poate copia şi utiliza gratuit codul programelor, cu condiţia de
a se permite şi altora să facă acelaşi lucru.

Sistemul Linux este alcătuit propriu-zis dintr-un nucleu (kernel) peste care se pot adăuga un
număr nelimitat de programe, utilitare, servere. Este un sistem de operare complet, care conţine,
practic, orice tip de aplicaţie, putând astfel juca o varietate de roluri: server, desktop, sistem integrat
pe dispozitive embedded. După apariţia nucleului Linux, o multitudine de proiecte software, având
la bază acest kernel, au fost înfiinţate, numărul şi importanţa acestora crescând de la an la an. Un
nucleu este doar un mediator între aplicaţii si resursele hardware, este inutil de unul singur. Kernel-
ul Linux e constituit din câteva componente importante: managementul proceselor, a memoriei,
driverele pentru periferice, driver-ele pentru sistemele de fişiere, managementul reţelei plus alte
procese de management resurse. În figura 6.3 sunt ilustrare câteva părţi componente ale nucleului.

Fig 6.3: Părţi componentele ale kernel-ului Linux

101
Echipamente folosite în lucrare:

Placă dezvoltare ARM Raspberry PI + Card SD:

Fig. 6.4: Arduino UNO

Card reader USB:

Fig. 6.5: Card reader USB

102
Router Mikrotik RB-951g:

Fig. 6.6: Router Mikrotik RB951g

Desfășurarea lucrării
Raspberry PI poate fi considerat un mini-computer (capabil să ruleze Linux) de dimensiunea
unui card de credit, cu placă de rețea Ethernet inclusă, conector HDMI, 2 port-uri USB, 512 MB
RAM, procesor ARM la 700 MHz.

Pentru a putea fi utilizat, trebuie folosit un sistem de operare, pentru arhitectura ARM. Linux
exte cea mai bună alegere în acest caz, putând fi și personalizat pentru aplicațiile dorite.

Pregătirea sistemului de operare

Există o multitudine de distribuții Linux compatibile cu această placă de dezvoltare. Întreaga


listă poate fi consultată la adresa http://www.raspberrypi.org/downloads.

Pentru acest laborator, vom alege o distribuție bazată pe Debian Wheezy, Raspbian. Se
descarcă această distribuție de pe site-ul menționat anterior. Dacă acest lucru nu este posibil, se va
folosi imaginea existentă pe serverul din laborator: 2014-01-07-wheezy-raspbian.zip.

103
Pornirea și configurarea sistemului de operare

Urmând pașii următori, vom avea un sistem Linux complet funcțional, ce va rula de pe
cardul SD, pe Raspberry PI.

1. Pe cardul SD putem scrie doar imagini în format .img, de aceea, este necesar să
dezarhivați fișierul .zip ce conține imaginea sistemului de operare: 2014-01-07-wheezy-raspbian.zip
→ 2014-01-07-wheezy-raspbian.img

2. Copiați de pe server utilitarul Win32 Disk Imager. Il vom folosi pentru a scrie imaginea
pe cardul SD (folderul win32diskimager-v0.9-binary).

3. Scrieți imaginea SD pe card, folosind cititorul USB și aplicația Win32 Disk Imager:

Fig. 6.7: Selectați imaginea în câmpul „Image File”, cardul SD în câmpul „Device”

4. Introduceți cardul SD în slotul corespunzător, în Raspberry PI. Alimentați placa,


conectând înainte portul ethernet la router-ul Mikrotik.

5. În interfața de administrare a routerului Mikrotik, în secțiunea IP → DHCP Server, TAB-


ul Leases, căutați MAC-ul și IP-ul plăcii Raspberry PI (alternativ, puteți folosi aplicația netscan, de
pe server, pentru a găsi IP-ul și MAC-ul plăcii).

6. Folosind aplicația PuTTY, vă conectați prin terminal la sistemul Linux:

Fig. 6.8: PuTTY, terminal client. În câmpul host se introduce IP-ul plăcii

104
7. Vi se va cere un username și o parolă. Acestea sunt pi/raspberry.

8. În acest moment sunteți conectat prin terminal la sistemul de operare.

E important de reținut faptul că aplicațiile, în Linux, pot fi instalate de pe internet, folosind


colecții de pachete furnizate de către comunitatea programatorilor distribuției utilizate. Altfel,
instalarea presupune manual copierea, prin WinSCP, a unor pachete .deb, și instalarea lor, sau
compilarea pachetului respectiv, lucru consumator de timp.

Pentru a aduce la zi lista de pachete disponibile, avem nevoie de o conexiune la internet.


Trebuie să vă asigurați că routerul Mikrotik este configurat corect, și aveți conectivitate din sistemul
Linux (testați conectivitatea folosind intrucțiunea ping).

Rulați următoarele comenzi, pe care o linie separată, în terminal:


sudo bash
apt-get update
apt-get upgrade

Așteptați ca sistemul să termine de instalat update-urile.

9. Urmează partea de configurare software a sistemului de operare. Distribuția include un


utilitar, denumit raspi-config, ce permite modificarea unor parametrii de sistem, cum ar fi
hostname-ul, cantitatea de memorie alocată pentru video, mărimea partiției root, etc.

Rulați utilitarul de configurare, folosind comanda: sudo raspi-config.

Fig. 6.9: Utilitarul raspi-config, pentru configurarea unor parametrii de sistem

105
Trebuie efectuate următoarele operațiuni:

a) Expand filesystem
b) Din advanced, memory split, 16 (nu avem nevoie de memorie video pentru a lucra din
terminat)
c) Tot din advanced, schimbăm hostname-ul în „armdevboard”.
d) Finish pentru a ieși din utilitar
e) E recomandat să schimbăm parola, cu una mai scurtă, folosind comanda sudo passwd pi.
f) E necesar un restart, pentru a se activa modificările. Folosiți comanda shutdown -r now

10. În continuare, vom instala câteva aplicații în linia de comandă:

apt-get install mc - (manager fișiere)


apt-get install iotop - (I/O viewer)
apt-get install htop - (task manager)

Fig. 6.10: Instalare aplicații în terminal

11. Migrarea către un IP static se face modificând fișierul /etc/network/interfaces. Aceste


trebuie să conțină un ip din următoarea clasă: 192.168.88.0.

Exemplu configurare IP static:

iface eth0 inet static


address 192.168.1.81
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.254

106
Se poate folosi aplicația nano din terminal pentru a edita fișierul (copy in terminal se poate
realiza cu click dreapta).

DNS-ul se configurează în fișierul /etc/resolv.conf. Putem folosi DNS-ul public 8.8.8.8


(Google).

În acest moment sistemul de bază este configurat. În continuare, putem să începem să scriem
aplicații pentru acest sistem.

Comenzi de bază în Linux

După cum propabil ați observat, în linux nu există drive letter. Toate folderele sunt legate de
root (rădăcina „/”). Sistemul de fișiere poate fi EXT2, EXT4, raiserFS, ZFS, JFFS (pentru sisteme
flash), etc. Toate au o structură arborescentă. Se poate spune, la limită, că în Linux totul este un
fișier!

Tabelul de mai jos prezintă structura ierarhică din sistemele ce rulează o distribuţie Linux:

Director Conţinut
/ directorul rădăcină
/bin comenzi esenţiale necesare boot-ării, întreţinerii şi depanării
sistemului
/boot fişiere necesare boot-ării, precum imaginea kernel-ului
/dev fişiere speciale utilizate pentru accesul direct la dispozitivele
hardware sau logice ale sistemului
/etc fişiere pentru configurarea sistemului, precum inittab, fstab şi
hosts
/home fişierele fiecărui utilizator din sistem - datele unui utilizator se
găsesc în /home/username
/media subdirectoare în care se montează unitătile optice, floppy etc.

/mnt subdirectoare în care se montează alte sisteme de fişiere


/opt pachete de aplicaţii de dimensiuni mari, accesibile tuturor
utilizatorilor
/prcc sistem virtual de fişiere din care se obţin informaţii despre
sistem şi aplicaţiile care rulează la un moment dat
/root directorul home al utilizatorului root
/sbin comenzi de bază accesibile numai utilizatorului root
/tmp fişiere temporare
/usr aplicaţii pentru uzul normal al sistemului de operare -
/usr/local conţine aplicaţiile instalate/compilate de utilizator

/var fişiere al căror continut se schimbă foarte des, precum log-uri,


fişiere temporare, cache (date reutilizabile), spool (date
neprocesate)

Tabelul 6.1: Ierarhia într-un sistem de fişiere din mediul Unix-Linux

107
În continuare, vor fi evidențiate câteva comenzi de bază, folositoare pentru desfășurarea
laboratorului curent:

ls – listează conținutul unui folder


mkdir – crează un director
cat – afișează conțitunul unui fișier
cd – schimbă directorul

Încercați comenzile de mai sus, prentru realizarea următoarelor exerciții:


a) Creați un folder în directorul din /home-ul vostru (/home/pi), numit unu.
b) Creați și folderul doi și trei.
c) Creați fișierul test în folderul unu.
d) Scrieți conținutul fișierului test cu un editor de text.
e) Vizualizati test prin comanda cat.

Permisiunile în Linux sunt un alt aspect important. Aceastea sunt separate în 3 entități:
utilizator, grup și alții:

User – cel care posedă fișierul, de obicei cel care îl crează


Grup – se referă la permisiunile din grupul utilizatorului
Other – permisiunile pentru utilizatorii care nu sunt în grup, sau alți utilizatori decât cei care au
creat fișierul

Exerciții:

a) Vizualizați permisiunile pentru fișierul „test„ prin comanda ls -l.


b) Modificați permisiunile pentru utilizator prin comanda chmod, astfel încât fișierul să poată fi
doar citit. Verificați acest lucru.
c) Cât spațiu există pe card? (df -h).
d) Verificați cât ocupă pe card folderul /etc (du -sh /etc).
e) Folosiți comanda rm pentru a șterge fișierul „test”.
f) Mutați folderul „doi” în folderul „unu”.
g) Stergeți folderul trei (rm -R).
h) Vizualizați arhitectura pe care rulează aplicațiile prin comanda arch. Încercați și uname -a.
i) Documentati-vă în legătură cu comenzile de mai sus prin man și info.
j) Navigați în directorul rădăcină și căutați fișierul ”test” cu comanda find / -name test.
k) Vizualizați procesele care rulează pe un sistem prin comanda top. Incercați și htop.
l) Rulați o comandă în fundal prin parametrul &.
m) Vizualizați tabela de procese prin comanda ps.

Încercați și comenzile următoare, documentând acțiunile acestora: who, whoami, w, cal 2014,
echo Laborator RS, date.

Operatori de redirecționare în terminal

a) | (pipe) – redirecționează ieșirea comenzii anterioare operatorului la intrarea următoare


comenzi
b) > (redirect output) – redirecționează ieșirea către un fișier
c) < (redirect input) – citirea dintr-un fișier
d) >> (append operator) – adăugare la coada unui fișier

108
Utilizarea porturilor GPIO (General-purpose input/output)

Reprezintă un set de pini generici atașați unui circuit integrat (sau chip), care pot fi controlați
(programați) de către utilizator la momentul execuției. Majoritatea dintre ei pot fi configuraţi ca pini
generici de intrare sau ieşire, astfel încât să se poată atribui o valoare logică la ieșirea pinului, sau să
se citească aceasta valoare logică, în cazul în care pinul este configurat ca și intrare.

Portul GPIO al plăcii Raspberry PI se poate accesa relativ ușor printr-o librărie specială
numită WiringPI (librărie pentru Broadcom BCM2835, SoC ce se găsește în Raspberry PI). Această
librărie iți pune la dispoziție numeroase funcții utile cum ar fi: funcții generale de citire/scriere ale
portului, control PWM, timing, prioritate între programe și thread-uri, întreruperi.

Harta pinilor GPIO (a se observa diferențele între rev1 și rev2):

Fig. 6.11: Porturile GPIO, conector principal

Fig. 6.12: Porturile GPIO, conector secundar, doar rev2 (se indentifică prin inscripția Made in UK +
prezența a două găuri de montare pe PCB)

109
Fig. 6.13: Hartă alternativă porturi GPIO

Pentru a instala librăria wiringPI, urmați pașii următori (tastați în linia de comandă, cu drepturi de
root):

sudo apt-get update


sudo apt-get upgrade
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
cd wiringPi
./build

Pentru a testa instalarea corectă a librăriei, tastați următoarea comanda:

gpio -v
gpio readall

110
Comanda unui LED folosind GPIO

Înainte de a folosi comenzi GPIO, putem încerca să aprindem un LED prin simpla
alimentare a lui de la portul 1, +3.3v, și conectarea lui la gnd (0v).

Fig. 6.14: Alimentarea unui LED

Fig. 6.15: Diagrama circuitului LED

111
LED-ul se aprinde, dar nu îl putem controla. Pinul 1 este doar de alimentare, +3.3V. Trebuie
să modificăm diagrama, mutăm firul galben pe portul (pinul) wiringPI pin 0 (GPIO-17), primul pin
ce poate fi controlat de utilizator (ca și locație fizică pe placă, acesta e pinul 11 pe conectorul
GPIO).

Fig. 6.16: LED-ul controlat de portul GPIO

LED va rămâne stins, deoarece la inițializarea plăcii și a sistemului de operare, pinii GPIO
sunt definiți ca și intrare.

Pentru a controla software porturile GPIO, folosim librăria wiringPI instalată anterior.
Executați pe rând comenzile următoare, observând rezultatul.

gpio mode 0 out


gpio write 0 1
gpio write 0 0

Dacă totul a decurs bine, LED-ul ar fi trebuit să se aprindă, apoi să se stingă. Prima comandă
gpio setează pinul 0 ca ieșire. A doua comandă setează pin 0 în valoarea logică 1, ce pune un
semnal de 3.3V pe acesta, și LED-ul se aprinde. Ultima comandă setează valoarea logica 0, adică
0V.

Pentru a folosi numerotarea GPIO a portului, trebuie să adaugăm parametrul -g comenzii


gpio. Exemplu:

gpio -g write 17 1
gpio -g write 17 0

În încheiere, se observă faptul că se pot construii aplicații mult mai complexe decât pe
Arduino. Aceste comenzi gpio se pot folosi în scripturi BASH, Pyhon, sau PHP, prin server WEB.

112
Bibliografie

1. Dragoș Drăghicescu, suport laborator Linux, Master Biosinf, Universitatea Politehnica din
București
2. Alexandru Caranica, „Proiectarea unui micro-sistem Linux pentru procesoare embedded, de
tip RISC”, lucrare licență, Constanța, 2010
3. http://edmundofuentes.com/post/45179343394/raspberry-pi-without-keyboard-mouse-nor-
screen
4. http://lifehacker.com/465323246
5. http://www.robertawood.com/blog/raspberry-pi/raspberry-pi-initial-setup-headless-no-
monitor-or-keyboard-needed.html
6. https://www.modmypi.com/blog/tutorial-how-to-give-your-raspberry-pi-a-static-ip-address
7. http://www.wikihow.com/Make-a-Raspberry-Pi-Web-Server
8. http://engineeringliberty.wordpress.com/2011/10/07/making-great-plots-in-octave-and-
matlab-too/
9. http://www.techusers.net/10/installing-starting-and-stopping-webmin
10. http://www.wikihow.com/Make-a-Raspberry-Pi-Web-Server
11. http://www.raspberrypi.org/archives/1417
12. https://sites.google.com/site/semilleroadt/raspberry-pi-tutorials/gpio
13. https://projects.drogon.net/raspberry-pi/gpio-examples/
14. http://robofun.ro/blog/accesul-portului-gpio-raspberry-pi/
15. http://www.bobtech.ro/tutoriale/raspberry-pi/70-led-blink-in-pyton-pe-raspberry-pi

113
Tiparul executat în
TIPOGRAFIA
UNIVERSITĂŢII MARITIME
din
Constanţa

114