10.07.2017 Views

Sumar

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Transmiterea datelor achiziţionate de la<br />

senzorii robotului NXT la un PC prin<br />

conexiune Bluetooth ®<br />

Cod Student: Huma Karina Elena<br />

Grupa: 152 IC<br />

Îndrumător: Conf. dr. ing. Constantin Ilaş<br />

Iunie 2017


Sinteza<br />

Pornind de la prevederile temei proiectului de diplomă am urmărit să aplic eficient<br />

elementele existente (suportul LEGO Mindstorms NXT), în scopul dezvoltării platformei de<br />

comunicaţii a acestora cu elemente soft care să ofere un mediu favorabil şi fiabil potenţialelor<br />

aplicaţii.<br />

Pentru îndeplinirea cerinţelor şi detaliilor impuse prin temă am realizat următoarele etape<br />

principale ale proiectării:<br />

1. Determinarea resurselor hardware şi software necesare comunicării prin Bluetooth<br />

dintre PC şi robotul LEGO NXT;<br />

2. Configurarea software a PC-ului pentru conexiunea Bluetooth cu robotul NXT;<br />

3. Stabilirea conexiunii Bluetooth la robotul NXT folosind unul dintre porturile seriale ale<br />

PC-ului prin limbajul de programare C# (C Sharp);<br />

4. Conceperea şi implementarea algoritmului de achiziţie a datelor de la senzorii NXT<br />

prin metoda interogării de la PC în limbajul C# (Metoda 1);<br />

5. Aplicaţie practică la Metoda 1, Determinarea poziţiei obiectelor cu senzorul de<br />

ultrasunete, cu prezentarea şi analiza rezultatelor obţinute;<br />

6. Conceperea şi implementarea algoritmului de transmisie a datelor de la senzorii NXT<br />

sub comanda unui program pe robot, în limbajul NXC (Not eXactly C), şi algoritmul de<br />

recepţionare şi interpretare a datelor pe PC în limbajul C# (Metoda 2);<br />

7. Aplicaţie practică la Metoda 2, Evoluţia în timp a mărimilor măsurate de către senzorii<br />

NXT, cu prezentarea şi analiza rezultatelor obţinute;<br />

8. Compararea celor două metode prin elaborarea şi rularea unei aplicaţii speciale.<br />

În afară de elementele consistente menţionate mai sus, pentru realizarea proiectului a fost<br />

necesar să realizez şi o documentare extinsă asupra domeniului roboţilor mobili şi a celorlalte<br />

domenii conexe temei (comunicaţii, programare, senzori, servomotoare), utilizând atât Internetul<br />

cât şi alte surse reflectate în detaliu în bibliografia de la sfârşitul lucrării.


Cuprins<br />

1 Introducere................................................................................................................... 1<br />

2 Roboţi mobili ................................................................................................................ 2<br />

2.1 Definiţii, caracteristici şi structură ........................................................................... 2<br />

2.1.1 Scurt istoric. Definiţii ........................................................................................ 2<br />

2.1.2 Concepte privind existenţa roboţilor................................................................. 2<br />

2.1.3 Roboţi mobili. Elemente de structură ............................................................... 4<br />

2.2 Sisteme de procesare utilizate în roboţi mobili (microcontrolere)............................ 5<br />

2.2.1 Caracterizare generală a microprocesoarelor şi microcontrolerelor ................. 5<br />

2.2.2 Utilizări şi aplicaţii ale microcontrolerelor ......................................................... 7<br />

2.2.3 Clasificări şi arhitecturi constructive ................................................................. 8<br />

2.2.4 Tipuri de memorii folosite în microcontrolere .................................................. 10<br />

2.2.5 Sistemul de intrări-ieşiri .................................................................................. 12<br />

2.2.6 Familii reprezentative de microcontrolere ....................................................... 14<br />

2.2.7 Limbaje de programare şi compilatoare .......................................................... 17<br />

2.3 Senzori ................................................................................................................ 20<br />

2.3.1 Caracteristici generale şi clasificări ale principalelor tipuri de senzori ............ 20<br />

2.3.2 Senzori cu ultrasunete ................................................................................... 22<br />

2.3.2.1 Caracteristici generale ....................................................................................... 22<br />

2.3.2.2 Principiul de funcţionare al senzorului cu ultrasunete ......................................... 23<br />

2.3.2.3 Senzorul cu ultrasunete Parallax PING))) ........................................................... 24<br />

2.3.3 Senzori de contact ......................................................................................... 27<br />

2.4 Servomotoare ...................................................................................................... 28<br />

2.5 Metode de comunicare fără fir (wireless) ............................................................. 32<br />

2.5.1 Comunicaţii în Infraroşu ................................................................................. 33<br />

2.5.2 Comunicaţii prin Bluetooth ® ........................................................................... 34<br />

3 Tehnologia Bluetooth ® ............................................................................................... 36<br />

3.1 Prezentare generală ............................................................................................ 36<br />

3.2 Principalele caracteristici ale standardului Bluetooth / IEEE 802.15.1 .................. 38<br />

3.2.1 Clasele de putere / acoperire şi securitatea Bluetooth ................................... 38<br />

3.2.2 Stiva de protocoale Bluetooth ........................................................................ 39<br />

3.2.3 Descoperirea dispozitivelor Bluetooth ............................................................ 40<br />

3.3 Versiuni în evoluţia Bluetooth ® ............................................................................. 41<br />

3.3.1 Evoluţia specificaţiilor Bluetooth la standardul IEEE ...................................... 41


3.3.2 Bluetooth 1.0 ................................................................................................. 42<br />

3.3.3 Bluetooth 1.1 ................................................................................................. 42<br />

3.3.4 Bluetooth 1.2 (Ratificată ca IEEE Standard 802.15.1-2005) .......................... 42<br />

3.3.5 Bluetooth 2.0 (SIG-2004) ............................................................................... 42<br />

3.3.6 Bluetooth 2.1 (SIG-2007) ............................................................................... 43<br />

3.3.7 Bluetooth 3.0 (SIG-2009) ............................................................................... 43<br />

3.4 Modele şi arhitecturi de utilizare ........................................................................... 43<br />

4 Robotul LEGO Mindstorms NXT ................................................................................. 46<br />

4.1 Generalităţi ........................................................................................................... 46<br />

4.2 Sistemul de procesare al robotului NXT ............................................................... 47<br />

4.3 Senzorii robotului NXT ......................................................................................... 48<br />

4.3.1 Senzorul cu ultrasunete NXT ......................................................................... 48<br />

4.3.2 Protocolul de comunicare I 2 C ........................................................................ 49<br />

4.3.3 Servomotorul NXT ......................................................................................... 49<br />

4.4 Metode de comunicare ......................................................................................... 52<br />

4.5 Programarea robotului LEGO NXT ....................................................................... 52<br />

4.5.1 Limbajul de programare NXC (Not eXactly C) ............................................... 53<br />

5 Citirea datelor achiziţionate de la senzorii NXT prin interogare de la PC .................... 53<br />

5.1 Obiectivele programului de pe PC ........................................................................ 54<br />

5.2 Resurse hardware şi software necesare .............................................................. 54<br />

5.3 Limbajul de programare C# (C Sharp) .................................................................. 56<br />

5.4 Proiectarea şi implementarea aplicaţiei de pe PC ................................................ 59<br />

5.4.1 Iniţierea conexiunii Bluetooth dintre PC şi NXT în C# .................................... 59<br />

5.4.2 Comunicarea PC – NXT prin interogare ........................................................ 60<br />

5.4.3 Implementarea protocolului de control prin „comenzi directe” ........................ 60<br />

5.4.4 Algoritmul metodei de interogare de la PC .................................................... 63<br />

5.5 Aplicaţie la metoda de citire a datelor achiziţionate de la senzorii NXT prin interogare<br />

de la PC ...................................................................................................................... 64<br />

5.5.1 Determinarea poziţiei obiectelor cu senzorul de ultrasunete .......................... 64<br />

5.5.2 Interfaţa grafică şi analiza datelor obţinute .................................................... 66<br />

6 Citirea datelor achiziţionate de la senzorii NXT sub comanda programului NXC ........ 67<br />

6.1 Proiectarea şi implementarea programului de pe NXT (emiţătorul) ...................... 68<br />

6.1.1 Obiectivele programului de pe NXT ............................................................... 68<br />

6.1.2 Achiziţia datelor de la senzorii NXT ............................................................... 68<br />

6.1.3 Serializarea datelor achiziţionate ................................................................... 69<br />

6.1.4 Transmisia datelor prin Bluetooth de la NXT la PC ........................................ 70<br />

6.1.5 Algoritmul programului NXC .......................................................................... 70<br />

6.2 Proiectarea şi implementarea programului de pe PC (receptorul) ........................ 71<br />

6.2.1 Algoritmul programului de pe PC ................................................................... 71


6.2.2 Interfaţa grafică a programului de pe PC ....................................................... 72<br />

6.3 Aplicaţie la metoda de citire a datelor achiziţionate de la senzorii NXT sub comanda<br />

programului NXC ........................................................................................................ 74<br />

6.3.1 Evoluţia în timp a mărimilor măsurate de către senzorii NXT ......................... 74<br />

6.3.2 Rezultatele obţinute ....................................................................................... 75<br />

7 Analiza rezultatelor obţinute ....................................................................................... 77<br />

7.1 Rezultatele obţinute la aplicaţiile implementate .................................................... 77<br />

7.2 Compararea celor două metode ............................................................................ 77<br />

8 Concluzii ..................................................................................................................... 79<br />

9 Anexe ........................................................................................................................ 82<br />

9.1 Anexa 1. Metoda 1. Clasa OperatorNXT .............................................................. 82<br />

9.2 Anexa 2. Metoda 1. Modul de afisare a datelor de la senzorul cu ultrasunete ...... 88<br />

9.3 Anexa 3. Metoda 1. Programul principal al aplicatiei ............................................ 91<br />

9.4 Anexa 4. Metoda 2. Programul NXC .................................................................... 95<br />

9.5 Anexa 5. Metoda 2. Clasa ReceptorNXT .............................................................. 97<br />

9.6 Anexa 6. Metoda 2. Modul de listare şi export date ............................................ 101<br />

9.7 Anexa 7. Metoda 2. Programul principal al aplicatiei .......................................... 102


Lista de figuri<br />

Figura 1. Schiţa microcontrolerului PIC16F84 pe 8 biţi cu arhitectură RISC ..................... 6<br />

Figura 2. Robotul humanoid Johnnie ............................................................................... 8<br />

Figura 3. AIBO ................................................................................................................. 8<br />

Figura 4. ASIMO .............................................................................................................. 8<br />

Figura 5. Arhitecturile Harvard şi von-Neumann ............................................................. 10<br />

Figura 6. Sensibilitatea senzorului Devantech SRF08 .................................................... 22<br />

Figura 7. Sensibilitatea senzorului Devantech SRF10 .................................................... 22<br />

Figura 8. Principiul de funcţionare al senzorului cu ultrasunete ...................................... 23<br />

Figura 9. Senzorul cu ultrasunete Parallax PING))) ....................................................... 24<br />

Figura 10. Cazuri în care obiectul nu este detectat de senzorul cu ultrasunete .............. 25<br />

Figura 11. Test senzor Parallax PING))) pentru un paravan paralel din carton ............... 26<br />

Figura 12. Zona de sensibilitate a senzorului Parallax PING))) pentru testul cu paravan 26<br />

Figura 13. Activarea senzorilor bumper în momentul ciocnirii robotului cu un obiect ...... 27<br />

Figura 14. Componentele unui servomotor. Servomotorul Futaba S3151 ...................... 28<br />

Figura 15. Comanda prin PWM. Servomotor standard şi digital ..................................... 29<br />

Figura 16. Caracteristicile cuplu-timp pentru servomotoarele standard şi digitale .......... 30<br />

Figura 17. Schema bloc a unui sistem de acţionare cu servomotoare de c.c. ................ 31<br />

Figura 18. Sistem de comunicaţii în infraroşu................................................................. 33<br />

Figura 19. Dispozitiv şi retea Bluetooth Piconet ............................................................. 35<br />

Figura 20. Reţele Bluetooth Scatternet .......................................................................... 37<br />

Figura 21. Stiva de protocoale Bluetooth ....................................................................... 39<br />

Figura 22. Arhitecturi Bluetooth ...................................................................................... 42<br />

Figura 23. Structura pachetelor şi asocierea canalelor pentru master/slave ................... 43<br />

Figura 24. Diagrama sistemului de procesare NXT ........................................................ 46


Figura 25. Servomotor NXT. Structura interna ............................................................... 49<br />

Figura 26. Servomotor NXT. Encoder de rotaţie ............................................................ 50<br />

Figura 27. Servomotor NXT. Dispozitiv de protecţie la supracurent ............................... 50<br />

Figura 28. Configurarea conexiunii Bluetooth dintre PC şi NXT ..................................... 55<br />

Figura 29. Arhitectura generala a protocolului de comunicare NXT ................................ 60<br />

Figura 30. Structura unei comenzi trimise prin Bluetooth ............................................... 61<br />

Figura 31. Diagrama simplificata a algoritmului de citire a datelor achiziţionate prin<br />

interogare de la PC ................................................................................................................... 63<br />

Figura 32. Aplicaţie la metoda de citire a datelor de la senzori prin interogare de la PC 64<br />

Figura 33. Interfaţa grafică a aplicaţiei ........................................................................... 65<br />

Figura 34. Diagrama simplificată a algotitmului programului NXC (emiţător) .................. 70 Figura<br />

35. Diagramă simplificată a algoritmului de citirea a datelor de la senzorii NXT transmise la PC de<br />

către programul scris în NXC ...................................................................... 71<br />

Figura 36. Interfaţa grafică a programului. Iniţierea conexiunii Bluetooth ....................... 72<br />

Figura 37. Interfaţa grafică a programului. Datele achiziţionate ...................................... 72<br />

Figura 38. Aplicaţie la metoda de citire a datelor achiziţionate sub comanda programului<br />

NXC .......................................................................................................................................... 74<br />

Figura 39. Evoluţia distanţei parcurse de robot .............................................................. 75<br />

Figura 40. Evoluţia distanţei până la obstacol ................................................................ 75<br />

Figura 41. Rezultatele comparării celor două metode .................................................... 77


1 Introducere<br />

Studiile din domeniu roboticii arată că pentru a putea implementa concepte din domenii<br />

precum inteligenţa artificială, este necesară construirea unor arhitecturi modulare, scalabile şi<br />

eficiente, atât pentru componentele hardware ale robotului cât şi pentru platformele software pe<br />

care acesta le utilizează.<br />

Pentru eficientizarea cercetării pe baza modularităţii şi scalabilităţii amintite mai sus, s-au<br />

dezvoltate produse cu părţi mecanice care respectă binecunoscutul principiu LEGO al<br />

interconexiunii dintre elemente modularizate.<br />

LEGO Mindstorms este o serie de componente LEGO care cuprinde unităţi programabile,<br />

senzori, servomotoare şi alte părţi constructive. Produsul LEGO Mindstorms NXT a fost lansat în<br />

iulie 2006 şi este succesorul primului model, Robotics Invention System (RCX), care a stârnit<br />

interesul unui număr mare de amatori. Succesul setului NXT este argumentat în special de<br />

uşurinţa cu care se poate personaliza şi extinde platforma.<br />

Robotul mobil nu ar fi însă nici pe departe la fel de eficient, dacă nu ar fi susţinut de o<br />

platformă software adecvată aplicaţiilor tot mai complexe şi performante din punctul de vedere al<br />

informaţiilor procesate.<br />

În acest context, tema actualului proiect de diplomă vizează să aplice eficient elementele<br />

existente (suportul LEGO Mindstorms NXT), în scopul dezvoltării platformei de comunicaţii a<br />

acestora cu elemente soft care să ofere un mediu favorabil şi fiabil potenţialelor aplicaţii.<br />

Datorită nevoii tot mai ridicate de transmitere fiabilă a datelor cu viteze mari, tehnologiile<br />

performante utilizate în prezent în diverse domenii ale comunicaţiilor au pătruns şi în roboţii mobili.<br />

Astfel, LEGO Mindstorms NXT conţine ca suport de comunicaţii tehnologia Bluetooth®.<br />

Performanţele, ca tehnologie fiabilă de acces de bandă largă pe distanţe mici, precum şi eficienţa<br />

sa economică şi constructivă (dispozitive cu cost redus şi cele mai mici dimensiuni), au determinat<br />

adoptarea, pe baza specificaţiilor Bluetooth®, a standardului IEEE 802.15.1, care a consacrat şi<br />

a dat un gir corespunător tehnologiei.<br />

Odată creată platforma mecatronică cu suportul de comunicaţii performant oferit de<br />

Bluetooth®, se pune problema dezvoltării unui mediu soft adecvat aestui suport, care să permită<br />

comunicarea datelor în diverse configuraţii cerute de aplicaţii scientifice sau didactice specifice, în<br />

condiţii de viteză şi fiabilitate optimizabile.<br />

Pe această linie proiectul îşi propune studiul şi elaborarea unor elemente soft care să<br />

permită abordarea mai eficientă a sistemului de comunicaţie PC – robot mobil didactic, vizând<br />

realizarea optimă a proceselor de comandă, achiziţie de date şi execuţie.<br />

1


2 Roboţi mobili<br />

2.1 Definiţii, caracteristici şi structură<br />

2.1.1 Scurt istoric. Definiţii<br />

Termenul de "robotics" (în traducere liberă robotică) se referă la ştiinţa care se ocupă de studiul<br />

şi utilizarea roboţilor. Acest termen a fost prima dată folosit de scriitorul şi omul de ştiinţă american<br />

de origine rusă, Isaac Asimov, într-o scurtă povestioară numită "Runaround" în anul 1950.<br />

Primii roboţi s-au numit Unimates şi au apărut în anii '50, fiind dezvoltaţi de George Devol<br />

şi Joe Engelberger. Acesta din urmă a format Unimation şi a fost primul care a vândut roboţi, fiind<br />

considerat de unii „părintele roboticii” [10].<br />

Conform enciclopediei Webster, un robot este "un dispozitiv automat, care execută funcţii<br />

normal atribuite oamenilor, sau o maşină cu asemănare de om".<br />

În timp ce această definiţie ar putea fi satisfăcătoare pentru unii dintre noi, nu este însă<br />

neapărat şi completă. O altă definiţie a fost dată de Institutul de Robotică din America, în anul<br />

1979. Conform acestei definiţii, un robot este "o maşină reprogramabilă, multifuncţională creată<br />

pentru a muta diverse materiale, bucăţi, unelte sau alte dispozitive specializate prin diverse mişcări<br />

programate, pentru realizarea unei varietăţi mari de sarcini".<br />

O definiţie mai scurtă şi larg acceptată la ora actuală este următoarea: un robot este un<br />

sistem inteligent care interacţionează cu mediul fizic înconjurător, prin intermediul unor senzori<br />

efectori.<br />

Pentru a modela lumea încojurătoare este necesar ca un robot să adune date prin<br />

intermediul senzorilor de-a lungul unei perioade de timp. Orice tip de senzor este bineînţeles<br />

predispus la erori.<br />

Prin prisma acestei definiţii, s-ar putea spune că şi omul este un robot. Omul<br />

"interacţionează" cu lumea înconjurătoare prin intermediul unor senzori şi a unor efectori,<br />

reprezentate în lumea biologică de terminaţii nervoase respectiv muşchi. Bineînţeles, diferenţa<br />

cea mai semnificativă între robot şi om, este că robotul a fost creat de om şi nu invers.<br />

2.1.2 Concepte privind existenţa roboţilor<br />

Binecunoscutul autor de literatură Science Fiction, Isaac Asimov, a propus trei "legi ale<br />

roboticii" sau mai bine zis ale existenţei unui robot. Mai târziu acesta a adăugat încă o lege, numită<br />

legea zero. Cu toate că aceste legi au fost privite la început ca fiind o pură ficţiune, ele au fost<br />

2


preluate mai târziu atât de alţi scriitori de Science Fiction cât şi de oameni de ştiinţă, ca şi principii<br />

de bază pentru existenţa unui robot. Astfel, Isaac Asimov este recunoscut de unii ca fiind printre<br />

oamenii care au pus bazele (fie ele pur abstracte) ale ştiinţei pe care astăzi o numim robotică.<br />

Legile existenţei unui robot sunt [10]:<br />

I. Un robot nu are voie să provoace vreun rău umanităţii, sau prin inactivitate, să permită<br />

vreun rău umanităţii.<br />

II. Un robot nu are voie să rănească o persoană umană, sau să permită rănirea unei<br />

persoane umane prin inactivitatea acestuia, cu excepţia cazului când această lege<br />

contravine cu vreo lege anterioară.<br />

III. Un robot trebuie să respecte toate ordinele date de o persoană umană, cu excepţia<br />

acelor reguli care intră în conflict cu vreo lege anterioară.<br />

IV. Un robot trebuie să-şi protejeze propria existenţă atâta timp cât această activitate nu<br />

intră în conflict cu legile anterioare.<br />

Dezvoltarea explozivă a tehnologiilor, incluzând în primul rând pe cele electronice, a<br />

determinat utilizarea roboţilor în majoritatea industriilor. Astfel există atât de multe tipuri de roboţi<br />

folosiţi pentru diverse servicii, încât o enumerare a tuturor tipurilor acestora ar fi aproape<br />

imposibilă. O clasificare aproximativă a celor mai întâlnite tipuri de roboţi ar putea fi:<br />

• Androizi, roboţi construiţi ca să mimeze comportamentul şi înfăţişarea umană;<br />

• Roboţi statici, roboţi folosiţi în diverse fabrici şi laboratoare ca de exemplu braţe robot;<br />

• Roboţi mobili, roboţi care se deplasează într-un anumit mediu fără intervenţie umană<br />

şi realizează anumite obiective;<br />

• Roboţi autonomi, roboţi care îşi îndeplinesc sarcinile fără intervenţie din partea unui<br />

operator uman şi îşi obţin energia necesară funcţionării din mediul înconjurător;<br />

• Tele-roboţi, care sunt ghidaţi prin dispozitive gen telecomandă de un operator uman;<br />

• Linii autonome de producţie în fabrici, sunt tot un fel de roboţi, chiar dacă nu sunt mobili,<br />

deoarece au toate facilităţile definiţiei noastre.<br />

Dintre toate aceste tipuri menţionate mai sus, în proiect se studiază doar roboţii mobili, de<br />

aceea ori de câte ori se va face referire la termenul de robot, se va înţelege de fapt un robot mobil.<br />

3


2.1.3 Roboţi mobili. Elemente de structură<br />

Un robot mobil ar putea fi descris ca un robot care trebuie să se deplaseze într-un anumit mediu,<br />

fără ajutorul unui operator uman şi să execute anumite sarcini date de acesta. Deci principala<br />

caracteristică este mobilitatea.<br />

Roboţii mobili au întrebuinţări multiple. De-a lungul timpului au existat şi există roboţi mobili<br />

cu funcţii diverse, de la aspirator pentru casă la explorator spaţial, de la vehicul ghidat automat<br />

(AGV) folosit în industrie la robot didactic folosit doar pentru scopuri ştiinţifice.<br />

Un robot mobil este alcătuit dintr-o serie de componente, unele de natură fizică (hardware),<br />

iar altele de natură logică, computaţională (software). Din punct de vedere al componentelor<br />

hardware, un robot mobil poate fi considerat ca o colecţie de sisteme pentru [13]:<br />

‣ Locomoţie şi acţiune – modalitatea prin care robotul se mişcă în mediul său ambiant;<br />

‣ Sesizare prin sistem senzorial – modalitatea prin care robotul măsoară proprietăţile<br />

lui şi ale mediului înconjurător;<br />

‣ Procesare – modalitatea prin care robotul procesează şi ia decizii în legătură cu<br />

informaţiile primite de la sistemul senzorial;<br />

‣ Comunicare – modalitatea prin care robotul comunică cu alţi roboţi sau cu un operator<br />

din mediu.<br />

În ce priveşte locomoţia şi acţiunea, pentru a se putea deplasa în mediul ambiant şi a<br />

executa anumite acţiuni prin intermediul organelor sale mobile, roboţii mobili au nevoie de anumite<br />

componente electro-mecanice care să le permită o mişcare precisă, bazate pe transformarea<br />

energiei electrice în energie mecanică de către motoare şi servomotoare specifice.<br />

Printre aceste componente, cele mai reprezentative sunt:<br />

- Motoare, servomotoare, electromagneţi;<br />

- Angrenaje, sisteme de transmisie;<br />

- Roţi, şenile, picioare, perne de aer sau perne magnetice, elice.<br />

4


2.2 Sisteme de procesare utilizate în roboţi mobili (microcontrolere)<br />

2.2.1 Caracterizare generală a microprocesoarelor şi microcontrolerelor<br />

În general se poate considera că şi controlerele fac parte din familia largă a calculatoarelor,<br />

fiind o structură electronică destinată controlului unui proces sau, mai general, unei interacţiuni<br />

caracteristice cu mediul exterior, fără să fie necesară intervenţia operatorului uman.<br />

Primele controlere au fost realizate în tehnologii pur analogice, folosind componente<br />

electronice discrete şi/sau componente electromecanice (de exemplu relee). Cele care fac apel la<br />

tehnica numerică modernă au fost realizate iniţial pe baza logicii cablate (cu circuite integrate<br />

numerice standard SSI şi MSI ) şi a unei electronici analogice uneori complexe, motiv pentru care<br />

"străluceau" prin dimensiuni mari, consum energetic pe măsură şi, nu de puţine ori, o fiabilitate<br />

care lăsa de dorit.<br />

Pe măsură ce procesul de miniaturizare a continuat, a fost posibil ca majoritatea<br />

componentelor necesare realizării unei astfel de structuri să fie încorporate (integrate) la nivelul<br />

unui singur microcircuit (cip). Astfel că un microcontroler ar putea fi descris ca fiind şi o soluţie a<br />

problemei controlului cu ajutorul unui singur dispozitiv integrat (aproximativ).<br />

O definiţie, cu un sens foarte larg de cuprindere, ar fi aceea că un microcontroler este un<br />

microcircuit care încorporează o unitate centrală (CPU) şi o memorie împreună cu resurse care-i<br />

permit interacţiunea cu mediul exterior.<br />

Resursele integrate la nivelul microcircuitului ar trebui să includă, cel puţin, următoarele<br />

componente [15]:<br />

a. o unitate centrală (CPU), cu un oscilator intern pentru ceasul de sistem;<br />

b. o memorie locală tip ROM/PROM / EPROM / FLASH şi eventual una de tip RAM;<br />

c. un sistem de întreruperi;<br />

d. I/O – intrări / ieşiri numerice (de tip port paralel);<br />

e. un port serial de tip asincron şi / sau sincron, programabil;<br />

f. un sistem de timere-temporizatoare / numărătoare programabile.<br />

Este posibil ca la acestea să fie adăugate, la un preţ de cost avantajos, caracteristici<br />

specifice sarcinii de control care trebuie îndeplinite:<br />

g. un sistem de conversie analog numerică (una sau mai multe intrări analogice);<br />

h. un sistem de conversie numeric analogic şi / sau ieşiri PWM (cu modulare în durată);<br />

i. un comparator analogic;<br />

j. memorie de date nevolatilă de tip EEPROM;<br />

k. facilităţi suplimentare pentru sistemul de temporizare / numărare (captare şi<br />

comparare);<br />

5


l. facilităţi pentru optimizarea consumului propriu.<br />

Un microcontroler tipic mai are, la nivelul unităţii centrale, facilităţi de prelucrare a<br />

informaţiei la nivel de bit, de acces direct şi uşor la intrări / ieşiri şi un mecanism de prelucrare a<br />

întreruperilor rapid şi eficient.<br />

Utilizarea unui microcontroler constituie o soluţie prin care se poate reduce dramatic<br />

numărul componentelor electronice precum şi costul proiectării şi al dezvoltării unui produs.<br />

Utilizarea unui microcontroler, oricât de evoluat, nu elimină unele componente ale interfeţei<br />

cu mediul exterior (atunci când ele sunt chiar necesare): subsisteme de prelucrare analogică<br />

(amplificare, redresare, filtrare, protecţie-limitare), elemente pentru realizarea izolării galvanice<br />

(optocuploare, transformatoare), elemente de comutaţie de putere (tranzistoare de putere, relee<br />

electromecanice sau statice).<br />

În Figura 1 se prezintă ca exemplu o structură tipică de microcontroler [15]:<br />

Figura 1. Schiţa microcontrolerului PIC16F84 pe 8 biţi cu arhitectură RISC<br />

În Figura 1 sunt introduse următoarele elemente:<br />

✓ Memorie program (FLASH) - pentru memorarea unui program scris. Pentru că memoria ce<br />

este făcută în tehnologia FLASH poate fi programată şi ştearsă mai mult decât odată, aceasta<br />

face microcontrolerul potrivit pentru dezvoltarea de componentă;<br />

✓ EEPROM - memorie de date ce trebuie să fie salvate când nu mai este alimentare. Este în<br />

mod uzual folosită pentru memorarea de date importante ce nu trebuie pierdute dacă sursa<br />

de alimentare se întrerupe dintr-o dată. De exemplu, o astfel de dată este o temperatură<br />

prestabilită în regulatoarele de temperatură. Dacă în timpul întreruperii alimentării această<br />

6


dată se pierde, va trebui să facem ajustarea încă o dată la revenirea alimentării. Astfel<br />

componenta noastră pierde în privinţa auto-menţinerii;<br />

✓ RAM - memorie de date folosită de un program în timpul executării sale. În RAM sunt<br />

memorate toate rezultatele intermediare sau datele temporare ce nu sunt cruciale la<br />

întreruperea sursei de alimentare;<br />

✓ PORTUL A şi PORTUL B sunt conexiuni fizice între microcontroler şi lumea de afară. Portul<br />

A are 5 pini, iar portul B are 8 pini;<br />

✓ TIMER-UL LIBER (FREE-RUN) este un registru de 8 biţi în interiorul microcontrolerului ce<br />

lucrează independent de program. La fiecare al patrulea impuls de ceas al oscilatorului îşi<br />

încrementează valoarea lui până ce atinge maximul (255), şi apoi începe să numere tot din<br />

nou de la zero;<br />

✓ UNITATEA DE PROCESARE CENTRALĂ are rolul unui element de conectivitate între<br />

celelalte blocuri ale microcontrolerului. Coordonează lucrul altor blocuri şi execută programul<br />

utilizatorului.<br />

2.2.2 Utilizări şi aplicaţii ale microcontrolerelor<br />

Toate aplicaţiile în care se utilizează microcontrolere fac parte din categoria aşa ziselor<br />

sisteme încapsulate-integrate (“embedded systems”), la care existenţa unui sistem de calcul<br />

incorporat este (aproape) transparentă pentru utilizator.<br />

Pentru că utilizarea lor este de foarte multe ori sinonimă cu ideea de control,<br />

microcontrolerele sunt utilizate masiv în robotică şi mecatronică. Conceptul de mecatronică este<br />

până la urmă indisolubil legat de utilizarea microcontrolerelor.<br />

Automatizarea procesului de fabricaţie-producţie este un alt mare beneficiar,(CNC<br />

Computerised Numerical Controls - comenzi numerice pentru maşinile unelte, automate<br />

programabile - PLC, linii flexibile de fabricaţie, etc.). Indiferent de natura procesului automatizat<br />

sarcinile specifice pot fi eventual distribuite la un mare număr de microcontrolere integrate întrun<br />

sistem unic prin intermediul uneia sau mai multor magistrale.<br />

Printre numeroasele domenii unde utilizarea microcontrolerelor este practic un standard<br />

industrial se pot menţiona: în industria de automobile (controlul aprinderii /motorului, climatizare,<br />

diagnoză, sisteme de alarmă, etc.), în aşa zisa electronică de consum (sisteme audio, televizoare,<br />

camere video şi videocasetofoane, telefonie mobilă, GPS-uri, jocuri electronice, etc.), în aparatura<br />

electrocasnică (maşini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în controlul<br />

mediului şi climatizare (sere, locuinţe, hale industriale), în industria aerospaţială, în mijloacele<br />

moderne de măsurare - instrumentaţie (aparate de măsură, senzori şi traductoare inteligente), la<br />

realizarea de periferice pentru calculatoare, în medicină.<br />

7


În Figura 2, Figura 3, Figura 4 se prezintă câteva exemple de roboţi [14]:<br />

Figura 3. AIBO<br />

Figura 2. Robotul humanoid Johnnie<br />

Figura 4. ASIMO<br />

„Johnnie” (Figura 2), un robot umanoid destul de simplu, construit la Universitatea<br />

Tehnică din Munchen în 1998, utilizează 5 microcontrolere, conectate prin intermediul unei<br />

magistrale CAN la un calculator PC.<br />

Un număr foarte mare de microcontrolere sunt folosite şi de aşa zisele jucării inteligente,<br />

din care „capetele de serie” cele mai cunoscute sunt cei doi roboţi, unul canin şi altul umanoid:<br />

AIBO (Sony, Figura 3) şi ASIMO (Honda, Figura 4).<br />

ASIMO foloseşte 26 de microcontrolere numai pentru controlul individual al celor 26 de<br />

elemente de acţionare inteligente (motoare).<br />

Ca exemple din industria de automobile, numai la nivelul anului 1999, un BMW seria 7<br />

utiliza 65 de microcontrolere, iar un Mercedes din clasa S utiliza 63 de microcontrolere.<br />

2.2.3 Clasificări şi arhitecturi constructive<br />

Există la ora actuală un număr extrem de mare de tipuri constructive de microcontrolere.<br />

Un criteriu de clasificare care se poate aplica întotdeauna este lungimea (dimensiunea) cuvântului<br />

de date. Funcţie de puterea de calcul dorită şi de alte caracteristici se pot alege variante având<br />

dimensiunea cuvântului de date de 4, 8, 16 sau 32 de biţi (există chiar şi variante de 64 de biţi).<br />

8


Practic, toate microcontrolerele se realizează la ora actuală în tehnologie CMOS<br />

(tehnologii similare celor utilizate la seriile standard CMOS de circuite numerice: HC, AC, ALV,<br />

etc.). Se pot realiza astfel structuri cu o mare densitate de integrare, cu un consum redus (care va<br />

depinde de frecvenţa de lucru), permiţând eventual alimentarea de la baterie.<br />

Logica internă este statică (total sau în cea mai mare parte) permiţând astfel, în anumite<br />

condiţii, micşorarea frecvenţei de ceas sau chiar oprirea ceasului în ideea optimizării consumului.<br />

Tehnologia este caracterizată şi de o imunitate mai mare la perturbaţii, esenţială într-un mare<br />

număr de aplicaţii specifice. Se realizează variante pentru domeniu extins al temperaturii de<br />

funcţionare (de ex.- 40 +85 0 C).<br />

Arhitectura unităţii centrale de calcul (CPU) este unul din elementele cele mai importante<br />

care trebuie avut în vedere în analiza oricărui sistem de calcul. Principalele concepte sunt<br />

următoarele:<br />

1) Arhitecturi de tip "von Neumann"<br />

Cele mai multe microcontrolere sunt realizate pe baza acestei arhitecturi de sistem.<br />

Microcontrolerele bazate pe această arhitectură au o unitate centrală (CPU) caracterizată de<br />

existenţa unui singur spaţiu de memorie utilizat pentru memorarea atât a codului instrucţiunilor cât<br />

şi a datelor ce fac obiectul prelucrării.<br />

2) Arhitecturi de tip "Harvard"<br />

La această arhitectură există spaţii de memorie separate pentru program şi date. În<br />

consecinţă ar trebui să existe şi magistrale separate (de adrese şi date) pentru codul instrucţiunilor<br />

şi respectiv pentru date. Este arhitectura standard pentru procesoarele numerice de semnal<br />

(DSP).<br />

3) CISC<br />

Aproape toate microcontrolerele au la baza realizării CPU conceptul CISC (Complex<br />

Instruction Set Computer). Aceasta înseamnă un set uzual de peste 80 instrucţiuni, multe din ele<br />

foarte puternice şi specializate. De obicei multe din aceste instrucţiuni sunt foarte diferite între ele:<br />

unele operează numai cu anumite spaţii de adrese sau registre, altele permit numai anumite<br />

moduri de adresare, etc.<br />

4) RISC (Reduced Instruction Set Computer)<br />

Este un concept de realizare a CPU care a început să fie utilizat cu succes de ceva timp şi<br />

la realizarea microcontrolerelor. Prin implementarea unui set redus de instrucţiuni care se pot<br />

executa foarte rapid şi eficient, se obţine o reducere a complexităţii microcircuitului, suprafaţa<br />

disponibilizată putând fi utilizată în alte scopuri.<br />

9


În Figura 5 se prezintă o comparaţie între arhitecturile Harvard şi von-Neuman [15].<br />

Figura 5. Arhitecturile Harvard şi von-Neumann<br />

Arhitectura Harvard este un concept mai nou decât von-Neumann. S-a născut din nevoia<br />

de mărire a vitezei microcontrolerului. În arhitectura Harvard, bus-ul de date şi bus-ul de adrese<br />

sunt separate. Astfel este posibil un mare debit de date prin unitatea de procesare centrală, şi<br />

bineînţeles, o viteză mai mare de lucru. Microcontrolerele cu arhitectură Harvard sunt de<br />

asemenea numite "microcontrolere RISC". Microcontrolerele cu arhitectura von-Newmann sunt<br />

numite "microcontrolere CISC".<br />

2.2.4 Tipuri de memorii folosite în microcontrolere<br />

În afară de memoria locală de tip RAM, de dimensiuni relativ reduse (uzual de la x10 octeţi<br />

la x1k), implementată ca atare sau existentă sub forma unui set de registre şi destinată memorării<br />

datelor (variabilelor), mai există o serie de aspecte specifice, marea majoritate a acestora fiind<br />

legată de implementarea fizică a memoriei de program (şi eventual a unei părţi a memoriei de<br />

date) cu ajutorul unor memorii nevolatile. Clasic, memoria de program era implementată într-o<br />

variantă de tip ROM: EPROM pentru dezvoltare şi producţie pe scară mică/medie sau mask-ROM<br />

pentru producţia de masă.<br />

Principalele concepte noi apărute de a lungul timpului în legătură cu implementarea<br />

memoriei de program sau date sunt enumerate în continuare [15].<br />

10


a. OTP - majoritatea producătorilor oferă variante de microcontrolere la care memoria locală de<br />

program este de tip OTP (One Time Programmable), practic o memorie PROM identică intern<br />

cu varianta EPROM, dar fără fereastra de cuarţ pentru ştergere (deci şi mai ieftine); aceste<br />

variante pot fi utilizate ca o alternativă pentru o producţie limitată, până în momentul testării şi<br />

validării finale a codului, moment în care pot fi comandate variantele (mask) ROM propriu-zise,<br />

cele mai economice pentru o producţie de masă.<br />

b. FLASH EPROM - este o soluţie mai bună decât EPROM-ul propriu-zis atunci când este<br />

necesar un volum mare de memorie program (nevolatilă); mai rapidă şi cu un număr garantat<br />

suficient de mare (x10000) de cicluri de programare (de ştergere/scriere), este caracterizată<br />

şi prin modalităţi mai flexibile de programare; este utilizată numai ca memorie de program.<br />

c. EEPROM - multe microcontrolere au şi o memorie de acest tip, de dimensiune limitată (de la<br />

x10 octeţi la x K octeţi), destinată memorării unui număr limitat de parametric (memorie de<br />

date) care eventual trebuie modificaţi din timp în timp; este o memorie relativ lentă (la scriere),<br />

dar cu un număr de cicluri de ştergere/scriere mai mare ca FLASH-ul (x100000).<br />

d. NOVRAM (RAM nevolatil) - realizat prin alimentarea locală (baterie, acumulator) a unui masiv<br />

RAM CMOS atunci când este necesar un volum mare de memorie de program şi date<br />

nevolatilă; mult mai rapidă decât toate celelalte tipuri şi fără limitări ca număr de cicluri.<br />

e. Programarea "În System" (ISP-În System Programming) - folosirea unor memorii nevolatile<br />

de tip FLASH face posibilă şi "programarea" unui astfel de microcontroler fără a-l scoate din<br />

sistemul în care este încorporat (programare on-line, În System Programming); programarea<br />

se face de regulă prin intermediul unei interfeţe seriale dedicate de tip ISP (poate avea nume<br />

diferite) sau a unei interfeţe standard JTAG. Există microcontrolere la care această<br />

programare se poate face prin intermediul portului serial asincron sau al interfeţei CAN<br />

(Controller Area Network).<br />

f. Bootloader - multe din microcontrolerele recente la care memoria de program este de tip<br />

FLASH au şi facilitatea (au de fapt instrucţiuni dedicate acestui scop) de a putea şi scrie în<br />

această memorie de program fără a utiliza un circuit de programare extern. Astfel în<br />

microcontroler poate exista permanent (rezident) un cod de mici dimensiuni (denumit şi<br />

bootloader) care pur şi simplu va încărca prin intermediul portului serial (este doar un exemplu)<br />

codul utilizator sau constantele pe care acesta vrea eventual să le actualizeze. Bootloader-ul<br />

este şi cel care lansează în execuţie programul utilizator după încărcarea acestuia.<br />

g. Protejarea codului - protejarea codului program dintr-o memorie locală nevolatilă împotriva<br />

accesului neautorizat (la citire –deoarece pirateria soft există şi aici) este oferită ca o opţiune<br />

(ea mai trebuie şi folosită!) la variantele FLASH, EPROM sau OTP. Codul poate fi protejat atât<br />

la citire cât şi la scriere (practic circuitul trebuie şters, înainte de a se mai putea scrie ceva în<br />

el). Este eliminată astfel posibilitatea de a se realiza, în acest caz, de patch-uri (alterări cu un<br />

anumit scop) ale codului original. La variantele mask-ROM propriu-zis protecţia este de cele<br />

mai multe ori implicită.<br />

11


h. Memoria externă de program sau date - marea majoritate a familiilor de microcontrolere<br />

permit şi utilizarea de memorie externă de program (tipic ROM) sau date (tipic RAM). Aceasta<br />

presupune existenţa şi utilizarea unor magistrale externe de adrese şi date.<br />

Conexiunile externe necesare pentru acestea sunt disponibile ca funcţii alternative ale pinilor.<br />

Din păcate, în această situaţie numărul de conexiuni exterioare disponibile pentru interfaţa cu<br />

exteriorul se reduce dramatic, reducând mult din versatilitatea microcontrolerului.<br />

2.2.5 Sistemul de intrări-ieşiri<br />

Toate microcontrolerele au un număr oarecare de intrări / ieşiri numerice (de la x1 la x10)<br />

organizate sub forma unor porturi I/O; conexiunile exterioare sunt bidirecţionale sau<br />

unidirecţionale, unele sunt multifuncţionale (se oferă funcţii alternative pe acelaşi pin), unele pot<br />

avea o capacitate sporită de a absorbi curent, etc.<br />

În afară de acest set de intrări/ieşiri de uz general, pentru interfaţa cu mediul exterior se<br />

oferă o serie de alte facilităţi importante de intrare/ieşire cum ar f [15]i:<br />

a. UART (Universal Asynchronous Receiver Transmitter) este un port serial<br />

bidirecţional destinat implementării unui protocol clasic de comunicaţie asincron; USART<br />

(Universal Synchronous Asynchronous Receiver Transmitter) este un port similar, dar care<br />

permite implementarea şi a unui protocol sincron cu obţinerea unor viteze mai mari de<br />

comunicaţie; SCI (Serial Communications Interface) este un circuit de tip UART îmbunătăţit, definit<br />

şi utilizate de firma Freescale(Motorola). LIN (Local Interconnect Network) reprezintă o<br />

implementare particulară a unui protocol de comunicaţie asincron, utilizată în industria de<br />

automobile ca o alternativă de mică viteză dar cu preţ scăzut pentru magistrala şi protocolul CAN<br />

.<br />

b. Porturi seriale sincrone dedicate - sunt destinate transferului serial de date de<br />

mare viteză cu unele periferice specializate (sisteme de afişare, convertoare analog-numerice,<br />

etc.) sau care permit conectarea într-o reţea de comunicaţie. Presupun existenţa, împreună cu<br />

datele, a unui semnal de ceas (implicit sau explicit) pentru sincronizarea acestora. Implică şi<br />

implementarea unor protocoale mai mult sau mai puţin complexe de transfer al informaţiei, fiind<br />

de fapt vorba de o magistrală serială. Există câteva implementări răspândite (sunt prezentate în<br />

ordinea crescătoare a complexităţii):<br />

- SPI (Serial Peripheral Interface) este un port serial sincron definit de firma Motorola<br />

12


- Microwire / Microwire Plus este o interfaţă serială bidirecţională sincronă definită<br />

şi utilizată de firma National Semiconductors<br />

- I2C (Inter Integrated Circuits bus) este o interfaţă serială bidirecţională (pe numai<br />

2 fire), dezvoltată de Philips, destinată aplicaţiilor de 8 biţi. Există şi multe circuite "periferice" care<br />

sunt prevăzute cu o astfel de interfaţă. Este cunoscută şi sub denumirea TWI (Two Wire Interface)<br />

- CAN (Controller Area Network) proprietate intelectuală a firmei Bosch, foarte<br />

utilizat în Europa şi Japonia, oarecum similar ca funcţionalitate lui SAE J1850 care este utilizat în<br />

America de Nord (SAE -Society of Automotive Engineers), este un standard (o magistrală şi un<br />

protocol) de comunicaţie serială sincronă utilizat în industria de automobile, permiţând<br />

interconectarea într-o reţea a diverselor componente inteligente (senzori, elemente de execuţie,<br />

indicatoare, etc.) omniprezente într-un automobil modern.<br />

În ultimul timp magistrala CAN a început să fie utilizată şi în alte domenii decât industria<br />

de automobile (automatizări industriale, robotică, acţionări electrice).<br />

c. Conectivitate Ethernet/Web – implică existenţa unor resurse care să permită<br />

integrarea cu uşurinţă într-o reţea de tip Ethernet, pentru a face posibilă, în final, implementarea<br />

unui protocol TCP/IP (a unei stive TCP/IP). Resursele respective pot fi de natură software (stivă<br />

soft) care presupun o viteză de prelucrare (putere de calcul) a CPU suficient de mare pentru a nu<br />

afecta vizibil operarea propriu-zisă a controlerului, sau hardware (stivă hardware). Pe baza acestei<br />

stive se poate realiza o conectivitate tip HTTP, FTP, STMP, POP3, etc.<br />

d. Conectivitate USB - magistrala serială USB (Universal Serial Bus) a fost creată<br />

pentru conectarea cu uşurinţă a diverselor periferice la un calculator PC (cu rolul de gazdă - host).<br />

Conexiunea permite şi furnizarea tensiunii de alimentare. Varianta USB 1.1 permite atingerea unei<br />

rate de transfer maxime a datelor de 12Mbytes/sec, iar varianta USB 2.0 a unei rate maxime de<br />

cca. 480MBytes/sec.<br />

e. Conectivitate Wireless- se referă la existenţa unor resurse hardware şi/sau<br />

software care să permită integrarea cu uşurinţă şi la un preţ de cost avantajos într-o reţea de tip<br />

wireless, pentru a face posibilă, în final, implementarea unui protocol (a stivei aferente<br />

protocolului). Exemplele cele mai cunoscute de astfel de reţele, protocoale şi stive sunt Bluetooth<br />

(IEEE 802.15.1) şi Zigbee (IEEE 802.15.4).<br />

f. Convertoarele Analog Numerice (CAN, ADC) Convertoarele utilizate fac parte<br />

de regulă dintr-un sistem de achiziţie de date, existând şi un multiplexor analogic cu mai multe<br />

canale de intrare. Rezoluţia disponibilă este tipic de 8, 10 sau 12 biţi, uneori cu precizia (rezoluţia<br />

adevărată) corespunzătoare unui număr mai mic de biţi. Timpul minim de conversie este în plaja<br />

x µsec la x10 µsec.<br />

13


g. Convertoarele Numeric Analogice (CNA, DAC)<br />

Cea mai răspândită tehnică de conversie numeric analogică folosită este bazată pe<br />

modulaţia în factor de umplere (PWM- Pulse Width Modulation). Există unul sau mai multe canale<br />

pe care se poate genera un tren de impulsuri cu factor de umplere programabil (de la 0 la 100%).<br />

2.2.6 Familii reprezentative de microcontrolere<br />

Cele mai reprezentative familii de microcontrolere de 8 biţi şi 16 biţi sunt următoarele[15]:<br />

a. 8048 (Intel MCS-48 - www.intel.com )<br />

Este considerat "bunicul" microcontrolerelor pe 8 biţi, iar unele dintre caracteristicile sale<br />

arhitecturale se regăsesc la următoarea generaţie (MCS-51, 8051).<br />

b. 8051 (Intel MCS-51 şi mulţi alţii: Atmel, Philips- www.semiconductor.philips.com,<br />

Infineon, Atmel, Dallas-Maxim - www.maxim-ic.com, Cygnal – www.cygnal.com , etc.)<br />

A doua generaţie de microcontrolere de 8 biţi a firmei Intel care, deşi apărută acum 20 de<br />

ani, încă ocupă un segment semnificativ de piaţă. Cu o arhitectură destul de ciudată, este suficient<br />

de puternic şi uşor de programat. Arhitectura sa are spaţii de memorie separate pentru program<br />

şi date. Poate adresa 64KBytes memorie de program, din care primii 4(8..32)KBytes locali (ROM).<br />

Poate adresa 64KBytes memorie de date externă, adresabilă doar indirect. Are 128 (256) octeţi<br />

de RAM local, plus un număr de registre speciale pentru lucrul cu periferia locală. Are facilităţi de<br />

prelucrare la nivel de bit (un procesor boolean, adresare pe bit). Intel a dezvoltat şi un “super 8051”<br />

numit generic 80151.<br />

c. 80C196 (Intel MCS-96)<br />

Este un microcontroler pe 16 biţi făcând parte din generaţia a treia de microcontrolere a<br />

firmei Intel. Destinat iniţial unor aplicaţii din industria de automobile, are o arhitectură von<br />

Neumann, cu un spaţiu de adresare de 64KBytes, o unitate de intrări/ieşiri numerice de mare<br />

viteză (destinată iniţial controlului injecţiei la un motor cu ardere internă), ieşiri PWM, convertor<br />

analog numeric, timer watchdog. Există multe variante, ultimele cronologic apărute, fiind mult<br />

superioare variantei iniţiale. Există şi o dezvoltare recentă sub forma familiei MCS-296 (80C296).<br />

d. 80C186, 80C188 (Intel, AMD)<br />

Derivate din clasicele 8086/88 prin includerea pe acelaşi microcircuit a 2 canale DMA, 2<br />

numărătoare/timere, un sistem de întreruperi şi un controler pentru DRAM. Marele avantaj al<br />

acestor cvasi(aproape) microcontrolere (ele nu au memorie integrată) este legat de utilizarea ca<br />

mediu de dezvoltare a unor platforme de calcul tip IBM-PC, compatibile 80x86, cu tot softul aferent.<br />

14


e. 68HC05 (Freescale - www.freescale.com, ex Motorola )<br />

Are un spaţiu de memorie unic (64Kbytes) în care sunt plasate şi registrele perifericelor<br />

(I/O, timere) cu un indicator de stivă (SP) hard pe 5biţi (stivă de maxim 32 octeţi !). Există variante<br />

cu memorie EEPROM, CAN, port serial, etc. Este unul din cele mai răspândite microcontrolere<br />

(comparabil cu 8051).<br />

f. 68HC11, 68HC12, 68HC16 (Freescale)<br />

68HC11 a fost unul din cele mai puternice microcontrolere pe 8 biţi, foarte răspândit în<br />

ciuda faptului că Motorola a fost un timp singurul producător. Are un set de instrucţiuni asemănător<br />

cu alte produse ale firmei (6801, 6805, 6809). Are un spaţiu de adrese unic de 64K. Nenumărate<br />

variante ca resurse: EEPROM, OTP, CAN, PWM, etc. Prezintă ca particularitate existenţa unui<br />

program de încărcare rezident (bootstrap loader în ROM intern) cu care, la reset, un segment din<br />

memoria RAM externă poate fi încărcat cu cod program prin intermediul portului serial.<br />

g. 683xxx (Freescale)<br />

Microcontrolere pe 32 de biţi construite în jurul unui CPU analog microprocesorului M68020<br />

(CPU32), denumite şi "procesoare integrate". Putere de calcul comparabilă sau mai mare ca a lui<br />

Intel 80386.<br />

h. PIC (Microchip- www.microchip.com )<br />

Primul microcontroler din această familie (PIC1650) a apărut acum mai bine de 20 de ani<br />

pe vremea când firma era proprietatea General Instruments. Este o familie de microcontrolere<br />

care, în ultimii ani, a cunoscut o dezvoltare explozivă. Sunt disponibile actualmente sub forma a 6<br />

serii: PIC10, PIC12, PIC14, PIC16, PIC17 şi PIC18. În seriile respective există variante cu<br />

memorie de program de tip OTP(C) sau FLASH(F). Au fost primele microcontrolere de 8 biţi cu<br />

arhitectură RISC: PIC16C5x avea un set de doar 33 instrucţiuni (Intel 8048 avea 90). Arhitectura<br />

este de tip Harvard şi, ca o particularitate, dimensiunea cuvântului pentru program este de 12, 14<br />

sau 16 biţi, cuvântul de date fiind tot de 8 biţi. Cronologic, ultimul produs al firmei Microchip este<br />

seria dsPIC30F, de fapt un procesor numeric de semnal, de 16 biţi, cu o periferie specifică<br />

optimizată pentru controlul acţionărilor electrice (motoare electrice). Firma Ubicom (ex Scenix,<br />

www.ubicom.com) produce nişte clone ale familiei PIC, mult mai rapide decât originalele. Modulele<br />

Basic Stamp ale firmei Parallax (www.parallax.com) sunt bazate şi pe astfel de microcontrolere<br />

(sunt foarte utilizate, şi nu numai de hobbiştii din robotică).<br />

i. AVR (Atmel- www.atmel.com )<br />

Un concurent puternic al seriei PIC este familia numită AVR, a firmei ATMEL, familie<br />

apărută în ultimii ani, care oferă variante de microcontrolere oarecum asemănătoare ca resurse<br />

15


cu familia PIC, la performanţe similare sau mai bune. Sunt bazate pe o arhitectură diferită, dar<br />

unitatea centrală este tot de tip RISC, cu cuvântul de date de 8 biţi. La fel ca la PIC dimensiunea<br />

cuvântului de program este mai mare, fiind de 16 biţi. Există cel puţin 3 subfamilii mari, în ordinea<br />

complexităţii resurselor, acestea fiind: AT Tiny, AT90 şi ATMega.<br />

j. COP4(00) şi COP8(00) (NS -National Semiconductors - www.national.com )<br />

COP4 este un microcontroler pe 4 biţi, categorie de microcontrolere care, în general,<br />

departe de a fi învechite, ocupă un segment relativ important al pieţii. Printre caracteristici: până<br />

la 2K ROM local, 32x4 până la 160x4 RAM local, Microwire, numărătoare/timere, tensiune de<br />

alimentare 2.3-6V, număr mic de pini.<br />

COP8 reprezintă o serie de microcontrolere pe 8 biţi, versatilă, cu preţ scăzut, disponibilă<br />

în multe variante. Arhitectura este similară lui 8051, dar setul de instrucţiuni este similar lui Z80. k.<br />

Z8 (Zilog, - www.zilog.com )<br />

Un derivat al microprocesorului Z80, reprezintă un compozit al mai multor arhitecturi<br />

diferite. Nu este compatibil cu setul de instrucţiuni şi nici cu perifericele standard Z80. Are trei<br />

spaţii de adrese: program, date şi un masiv de registre. Resurse locale tipice: UART, timere, DMA,<br />

sistem de întreruperi cu până la 37 de surse. Există o variantă cu un interpreter Tiny Basic în<br />

ROM-ul local (analog 8052AH Basic de la Intel) precum şi o variantă cu resurse îmbunătăţite<br />

numită Super-8.<br />

l. Z180(Zilog), Rabbit ( Rabbit Semiconductors- www.rabbitsemiconductor.com )<br />

Z180 -ul firmei Zilog are un CPU similar cu Z80 dar îmbunătăţit, cu resurse locale cum ar<br />

fi: management de memorie (memorie paginată de maxim 1MB), USART (numit SIO), 2 canale<br />

DMA, timere, sistem de întreruperi, eventual PIO. Instrucţiuni suplimentare faţă de setul standard<br />

Z80, printre care şi înmulţirea. Diversele sale variante nu includ memorie locală.<br />

m. TMS370 (Texas Instruments- www.ti.com )<br />

Microcontrolerul standard pe 8 biţi al firmei TI realizat în multe variante (de ordinul zecilor),<br />

prezintă unele asemănări cu 8051 (memoria de date locală, stiva, modurile de adresare). O<br />

varietate extrem de mare a resurselor locale.<br />

n. 80386EX (Intel)<br />

Un 80386 destinat aplicaţiilor de tip controler. Resurse locale: I/O seriale,<br />

timere/numărătoare, DMA, optimizarea consumului, controler de întreruperi, controler pentru RAM<br />

dinamic. Nu au memorie locală. Marele avantaj al unui astfel de microcontroler este că se poate<br />

16


utiliza ca platformă de dezvoltare un sistem de tip IBM PC împreună cu tot mediul de programare<br />

aferent.<br />

o. SC 3/4/5xx, Elan (AMD- www.amd.com )<br />

O serie de microcontrolere deosebit de performante realizate în jurul unei unităţi centrale<br />

de tip 386/486. Permit practic, doar prin adăugarea de memorie externă, obţinerea unui sistem de<br />

calcul compatibil PC, destinat unor aplicaţii de control încapsulate-integrate ("embedded PC").<br />

p. 80C16x (Infineon, ex Siemens www.infineon.com )<br />

Unul din microcontrolerele de 16 biţi foarte utilizat în Europa. Arhitectură deosebit de<br />

performantă a CPU, de tip RISC, are diverse variante, cu resurse complexe: 80C165, 80C166,<br />

80C167, etc.<br />

q. MSP430 (Texas Instruments)<br />

Firma TI oferă şi o familie de microcontrolere de 16 biţi cu arhitectura RISC, cu posibilitatea<br />

controlului compromisului viteză de calcul/consum propriu, destinată aplicaţiilor portabile (şi nu<br />

numai), denumită MSP 430. Cu un spaţiu de adresare de 64KBytes, are diverse variante de<br />

realizare a memoriei interne de program (OTP, FLASH), resurse diverse (printre care şi o interfaţă<br />

pentru un sistem de afişare LCD).<br />

r. ARM (Advanced RISC Machine, www.arm.com ) - este de fapt o unitate<br />

centrală de 32 de biţi (sau de 16/32 biţi) care face parte din categoria structurilor IP<br />

(“Intelectual Property”). Consorţiul ARM a oferit licenţe ale acestei micro arhitecturi (nucleu<br />

ARM) pentru numeroşi producători de circuite (Atmel, Philips, TI, OKI – www.okisemi.com<br />

, etc.).<br />

Pe baza acestor licenţe se realizează şi microcontrolere de mare performanţă. Cele mai<br />

cunoscute şi răspândite variante de nuclee sunt ARM7 şi ARM9, cu implementările lor simplificate<br />

numite ARM7T, ARM9T (T-“Thumb”).<br />

2.2.7 Limbaje de programare şi compilatoare<br />

Limbajul maşină (instrucţiunile maşină) este singura formă de reprezentare a informaţiei<br />

pe care un microcontroler o "înţelege".<br />

Din păcate această formă de reprezentare a informaţiei este total nepractică pentru un<br />

programator, care va utiliza cel puţin un limbaj de asamblare, în care o instrucţiune (o mnemonică<br />

17


cu operanzii aferenţi) are drept corespondent o instrucţiune în limbaj maşină (excepţie fac<br />

macroinstrucţiunile disponibile la unele asambloare).<br />

Un program în limbaj de asamblare este rapid şi compact. Aceasta nu înseamnă că un<br />

astfel de program, prost scris, nu poate fi lent şi de mari dimensiuni, programatorul având controlul<br />

total pentru execuţia programului şi gestiunea resurselor.<br />

Limbajul de asamblare este primul care trebuie învăţat, chiar sumar, atunci când dorim să<br />

proiectăm o aplicaţie hard/soft cu un anume microcontroler (familie), el permiţând înţelegerea<br />

arhitecturii acestuia şi utilizarea ei eficientă.<br />

Un compilator combină uşurinţa în programare oferită de un interpreter (de fapt de limbajul<br />

de nivel înalt) cu o viteză mai mare de execuţie a codului. Pentru aceasta programul, în limbaj de<br />

nivel înalt, este translatat (tradus) direct în limbaj maşină sau în limbaj de asamblare (urmând a fi<br />

apoi asamblat). Codul maşină rezultat are dimensiuni relativ mari (dar mai mici decât cel<br />

interpretat) şi este executat direct, ca un tot, de microcontroler. De regulă codul generat poate fi<br />

optimizat fie ca dimensiune, fie ca timp de execuţie.<br />

Se pot enumera compilatoare pentru limbajele: C, BASIC, Pascal, Forth.<br />

Cele mai populare şi utilizate sunt cele pentru limbajul C, un limbaj universal folosit atât<br />

pentru super computere, cât şi de microcontrolerele de 4 biţi. Este un limbaj puternic şi flexibil,<br />

care deşi de nivel înalt, poate permite şi accesul direct la resursele sistemului de calcul. Un<br />

program bine scris generează un cod rapid şi compact. Totuşi, de multe ori, porţiuni critice din<br />

punct de vedere al vitezei de execuţie, trebuie încă scrise în limbaj de asamblare. Există<br />

numeroase implementări, pentru majoritatea familiilor de microcontrolere. Cu anumite limitări<br />

legate de arhitectură şi mai ales resursele microcontrolerului, asigură portabilitatea unei aplicaţii<br />

scrisă pentru un anumit tip (familie) de microcontroler la un alt tip (familie).<br />

Referitor la asamblor şi compilator, trebuie precizat că pentru acestea codul este obţinut<br />

cu ajutorul unui mediu integrat de dezvoltare a programelor (IDE-Integrated Development<br />

Environment) care conţine în mod tipic următoarele componente software: un editor specializat<br />

(orientat pe codul sursă), un asamblor/compilator, un editor de legături/locator<br />

("linkeditor/locator"), programe de gestiune a unor biblioteci de cod ("librarians"), programe de<br />

conversie a formatelor de reprezentare a codului (de exemplu din binar în format Intel HEX sau<br />

Motorola S) şi, nu în ultimul rând, un simulator şi/sau depanator ("debugger").<br />

18


Codul astfel obţinut trebuie încărcat în memoria de program a maşinii ţintă unde va rula,<br />

fiind de fapt programat într-o memorie de tip (EP)ROM/FLASH sau încărcat direct (uploaded) întro<br />

memorie de tip RAM.<br />

19


2.3 Senzori<br />

2.3.1 Caracteristici generale şi clasificări ale principalelor tipuri de senzori<br />

Senzorii sunt dispozitive componente ale roboţilor mobili care pot măsura diferite<br />

proprietăţi ale mediului din jurul acestora, cum ar fi: temperatura, distanţa, rezistenţa fizică,<br />

greutatea, mărimea, etc.<br />

În cel mai general caz, senzorii pot fi grupaţi în două categorii:<br />

• Senzori de stare internă – senzori care oferă informaţii despre starea internă a<br />

robotului mobil, spre exemplu nivelul bateriei, poziţia roţilor sau altor componente, etc.;<br />

• Senzori de stare externă – senzori care oferă informaţii despre mediul ambiant în<br />

care robotul funcţionează. Senzorii de stare externă se mai pot împărţi la rândul lor în<br />

două categorii: senzori cu contact, mai precis acei senzori care culeg informaţia din<br />

mediu prin atingere (exemplu: senzor "bumper"), respectiv senzori fără contact , care<br />

preiau informaţia din mediu de la distanţă (exemplu: cameră video, senzor ultrasonic)<br />

Un senzor poate fi activ sau pasiv. Senzorii activi sunt acei senzori care emit energie<br />

în mediu pentru a putea observa anumite caracteristici ale acestuia, spre deosebire de<br />

senzorii pasivi care primesc energie din mediu pentru a putea prelua informaţia.<br />

[13]:<br />

La modul general, despre toate categoriile de senzori se pot enunţa următoarele ipoteze<br />

• Orice senzor este afectat de interferente;<br />

• Orice senzor oferă o informaţie incompletă a mediului în care efectuează măsurătorile;<br />

• Nici un senzor nu poate fi modelat complet.<br />

De asemenea, toate tipurile de senzori sunt caracterizate printr-o serie de proprietăţi, cele<br />

mai importante fiind:<br />

• Sensibilitatea: raportul dintre semnalul de ieşire şi semnalul de intrare;<br />

• Liniaritatea: exprimă dacă raportul dintre intrare şi ieşire este constant;<br />

• Intervalul de măsurare: diferenţa între distanţa minimă şi maximă măsurabilă;<br />

• Timpul de răspuns: timpul necesar pentru ca informaţia de la intrare să fie observabilă<br />

la ieşire;<br />

• Acurateţea: diferenţa între semnalul măsurat şi semnalul real;<br />

• Repetabilitatea: diferenţele între măsurători succesive ale aceleiaşi entităţi;<br />

• Rezoluţia: exprimă cea mai mică unitate de incrementare a semnalului măsurat;<br />

20


• Preţul senzorului;<br />

• Puterea de calcul necesară pentru a interpreta rezultatele;<br />

• Tipul de semnal la ieşire;<br />

• Greutatea, mărimea şi cantitatea de energie consumată pentru a face o<br />

măsurătoare.<br />

Din punct de vedere tehnologic/funcţional, roboţii mobili pot fi dotaţi cu diverse tipuri de<br />

senzori [16]:<br />

a. Senzori interni:<br />

- Senzori de poziţie (Incrementali/Potenţiometre);<br />

- Senzori de forţă;<br />

- Senzori de detecţie în infraroşu;<br />

- Senzori de acceleraţie; - Senzori cu efect Hall.<br />

b. Senzori externi:<br />

- Senzori cu ultrasunete;<br />

- Senzori de atingere;<br />

- Senzori de forţă;<br />

- Senzori de culoare;<br />

- Senzori de lumină; - Camere video.<br />

Senzorii din roboţii mobili se pot clasifica şi independent de gruparea interni-externi, numai<br />

pe criteriul funcţional, astfel:<br />

‣ senzori de distanţă – acei senzori care oferă informaţii despre distanţa între senzor şi<br />

obiectul de măsurat din mediu;<br />

‣ senzori de poziţie – acei senzori care oferă informaţii despre poziţia robotului în termeni<br />

absoluţi;<br />

‣ senzori de mediu – acei senzori care oferă informaţii despre diverse proprietăţi şi<br />

caracteristici ale mediului (exemplu: temperatură, culoare);<br />

‣ senzori inerţiali – acei senzori care măsoară proprietăţi diferenţiale ale poziţiei robotului<br />

(exemplu: acceleraţia).<br />

Caracterizarea generală a senzorilor se poate face pe baza relaţiei (f) dintre proprietăţile<br />

fizice de interes ale mediului (e) şi informaţia primită de la un senzor (r) ar putea fi modelată prin<br />

ecuaţia [13]:<br />

21


În principiu, orice model al unui senzor ar trebui să includă şi un model intern al zgomotului<br />

care poate afecta senzorul în momenrul citirii informaţiei. Problema de a recupera informaţia din<br />

mediu din datele primite de la senzor poate fi destul de complexă.<br />

Un senzor este considerat instabil dacă pentru variaţii mici ale intrării, ieşirea se schimbă<br />

radical. În caz general, pentru un senzor cu ieşirea f(e), instabilitatea se referă la: f (e)− f (e+ h)<br />

h h →∞<br />

În principiu orice tip de senzor poate fi afectat de mai multe tipuri de erori.<br />

Dintre acestea, cele mai importante sunt erorile incidentale, erorile sistematice şi erorile<br />

stohastice. Erorile incidentale apar ocazional şi pot avea un efect neprevăzut asupra informaţiei,<br />

ele provenind în cea mai mare parte de la măsurători efectuate greşit. Erorile sistematice au o<br />

influenţă predictibilă asupra acurateţii informaţiei,acestea provenind de la o interpretare greşită a<br />

parametrilor în algoritmii de estimare, sau din cauza unor neconcordanţe (incertitudini) în<br />

modelare. În fine, erorile stohastice au un caracter aleator, ele diferind de fiecare dată când robotul<br />

execută aceeaşi operaţie.<br />

2.3.2 Senzori cu ultrasunete<br />

Categoria de senzori cea mai des întâlnită la un robot mobil o constituie, fără nici o îndoială,<br />

categoria senzorilor ultrasonici. Întâlniţi în literatura de specialitate şi sub denumirea de sonar<br />

senzorii ultrasonici folosesc semnale acustice (sunete).<br />

2.3.2.1 Caracteristici generale<br />

Senzorii cu ultrasunete sunt unii dintre cei mai utili şi eficienţi senzori din dotarea roboţilor.<br />

Ei permit măsurarea suficient de precisă, fără contact, a distanţelor faţă de alte obiecte din mediu<br />

şi asigură astfel premizele pentru unele dintre cele mai importante activităţi ale roboţilor:<br />

• Măsurarea distanţei faţă de unele repere, fixe sau mobile din mediu, pentru ancorarea<br />

propriei poziţii în spaţiul de lucru;<br />

• Identificarea obstacolelor din mediu înconjurator, cu poziţia şi configuraţia lor, în<br />

vederea stabilirii unei strategii optime pentru ocolirea lor, dar şi pentru o eventuală<br />

reconfigurare, în vederea abordării lor directe;<br />

• Identificarea poziţiei şi orientării unor module, în vederea unei eventuale ataşări şi<br />

cuplări;<br />

Un emiţător sonar transmite un semnal acustic în mediu urmând apoi ca reflecţia acestuia<br />

să fie recepţionată de componenta detector a senzorului. Timpul în care semnalul este receptat<br />

înapoi de senzor precum şi atenuarea semnalului reprezintă aspecte exploatate de diferitele tipuri<br />

de senzori sonar.<br />

22


Sunetele transmise de senzorii sonar sunt de regulă în spectrul de sunete ultrasonice,<br />

având o frecvenţă foarte înaltă pentru a nu putea fi detectate de urechea umană.<br />

Principiul de funcţionare al senzorilor sonar a fost împrumutat din lumea animală, atât liliecii<br />

cât şi delfinii folosind aceleaşi tehnici pentru a localiza şi identifica diferitele caracteristici ale unui<br />

anumit robot.<br />

Sensibilitatea unui senzor sonar nu este uniformă, ci consistă dintr-un lob principal şi<br />

câteva loburi laterale mai mici. De asemenea, această sensibilitate diferă de la un senzor sonar<br />

la altul. Diferenţele de sensibilitate ale unora dintre cei mai populari senzori sonar, şi anume<br />

modelele Devantech SRF08 şi SRF10 pot fi observate în Figura 6 şi Figura 7 [9].<br />

Figura 6. Sensibilitatea senzorului Devantech SRF08<br />

Figura 7. Sensibilitatea senzorului Devantech SRF10<br />

2.3.2.2 Principiul de funcţionare al senzorului cu ultrasunete<br />

Principiul de funcţionare al unui senzor ultrasonic tipic este prezentat în Figura 8 (V ss, V dd<br />

- tensiune alimentare sursa-drena).<br />

23


Figura 8. Principiul de funcţionare al senzorului cu ultrasunete<br />

Măsurarea distanţei constă în măsurarea timpului de propagare a undelor între reperele<br />

considerate.<br />

unde<br />

• - distanţa<br />

• - timpul măsurat<br />

• - viteza de propagare a undei în mediul considerat<br />

În general depinde de indicele de refracţie al mediului, care la rândul său depinde de mai<br />

mulţi parametrii (temperatură, presiune, umiditatea aerului, lungimea de undă), iar cunoaşterea<br />

exactă a acestui aspect poate îmbunătăţi precizia măsuratorilor.<br />

2.3.2.3 Senzorul cu ultrasunete Parallax PING)))<br />

Un model pentru analiza şi testarea caracteristicilor tehnice ale acestui tip de senzori poate<br />

fi Parallax PING))), un senzor având configuraţia şi dimensiunile prezentate în Figura 9<br />

[9].<br />

24


Figura 9. Senzorul cu ultrasunete Parallax PING)))<br />

Acest senzor are următoarele caracteristici [9]:<br />

• Tensiune de alimentare – 5V cc.;<br />

• Curent absorbit: 30 mA tipic, 35 mA maxim;<br />

• Domeniu de măsurare – între 2 cm şi 3 m;<br />

• Impulsul de declanşare a măsurarii: impuls pozitiv TTL, 2μs minim, 5μs tipic;<br />

• Semnal receptat ca ecou: impuls pozitiv TTL, între 115 μs şi 18,5 ms;<br />

• Frecvenţa de baleiere: 40 KHz pentru 200 μs;<br />

• Timp de întârziere până la următoarea măsurare: 200 μs:<br />

• Dimensiuni – 22 mm x 46 mm x 16 mm.<br />

Un avantaj major al acestui senzor constă în faptul că nu necesită decât o singură linie<br />

I/E a unui procesor numeric. Senzorul detectează un obiect şi permite măsurarea distanţei până<br />

la el prin emiterea unui scurt impuls cu frecventa de 40 KHz (domeniul ultrasonic), care se<br />

deplasează cu viteza sunetului în aer, de 340 m/s, şi aşteptarea şi sesizarea ecoului, determinat<br />

de reflectarea undelor de către obstacol (Figura 8).<br />

În practică senzorul Parallax PING))) are câteva particularităţi care evidenţiază limitările<br />

acestei tehnologii. În Figura 10 sunt evidentiate aceste limitari.<br />

25


Figura 10. Cazuri în care obiectul nu este detectat de senzorul cu ultrasunete<br />

Nu poate fi măsurată corect distanţa la un obiect care: a. se află la mai mult<br />

de 3m distanţă;<br />

b. prezintă suprafeţe care nu reflectă undele acustice înapoi spre dispozitiv;<br />

c. este prea mic pentru a reflecta destule unde acustice.<br />

O sensibilitate scăzută a senzorului se constată şi în cazul în care obiectul este alcătuit din<br />

materiale moi sau prezintă forme neregulate. Senzorul poate detecta suprafaţa apei, dar este<br />

predispus la deteriorări din cauza umezelii şi condensaţiei, în consecinţă nu este recomandat<br />

pentru uz în aer liber sau în preajma apei.<br />

Deoarece viteza de propagare a sunetului prin aer este influenţată şi de temperatura<br />

ambiantă, se poate ţine cont de această variaţie folosind următoarea formulă:<br />

unde<br />

• – viteza sunetului în aer [m/s]<br />

• – temperatura aerului [ 0 C]<br />

Eroarea de măsurare pentru o variaţie a temperaturii aerului de la 0 0 C la 70 0 C este de 11-<br />

12%. Se recomandă folosirea unor constante de conversie în programare pentru a compensa<br />

pentru erori.<br />

Sensibilitatea senzorului este descrisă de testul din Figura 11.<br />

Figura 11. Test senzor Parallax PING))) pentru un paravan paralel din carton<br />

Testul a fost efectuat de către producător într-o cameră izolată, la temperatura uzuală.<br />

Obiectul ţintă este un paravan din carton de dimesiuni 30.5 cm x 30.5 cm plasat la înălţimea de<br />

1m faţă de podea pentru a elimina reflexii suplimentare ale undelor.<br />

Rezultatele măsuratorilor au dus la următoarea reprezentare grafică a sensibilităţii<br />

senzorului Parallax PING))):<br />

26


Figura 12. Zona de sensibilitate a senzorului Parallax PING))) pentru testul cu paravan<br />

De fapt zona de sensibilitate al senzorului cu ultrasunete este un con (în 3D), iar Figura 12<br />

este o vedere perpendiculară pe generatoarea conului. Doar obiectele din interiorul conului sunt<br />

detectate.<br />

Din Figura 12 se poate trage concluzia că senzorul are o sensibilitate mare concentrată<br />

pe axa acustică (generatoarea conului). Faptul că zona este îngustă este avantajos, deoarece<br />

permite evaluarea poziţiei obiectului. Precizia mare este datorată suprafeţei drepte a paravanului<br />

şi orientarea sa care reflectă majoritatea undelor sonore îinapoi spre senzor.<br />

2.3.3 Senzori de contact<br />

Cel mai des întâlnit tip de senzori de contact în roboţii mobili este reprezentat de senzorii<br />

bumper . Aceste dispozitive pot fi simple întrerupătoare care raportează o valoare binară, 0 sau 1,<br />

valoare corespondentă stării de fapt: deschis sau închis. Astfel, în momentul în care robotul<br />

echipat cu senzori de acest tip se loveşte de un alt obiect, întrerupătorul se va închide semnalând<br />

acest lucru. Un exemplu de caz în care o anumită parte a unui robot mobil se atinge de un obiect<br />

din mediu este prezentat în Figura 13 [13].<br />

27


Figura 13. Activarea senzorilor bumper în momentul ciocnirii robotului cu un obiect<br />

Robotul din Figura 13 are un sistem senzorial format din 8 senzori bumper, situaţi pe robot<br />

la circumferinţa acestuia. În momentul în care robotul se loveşte de obiectul din mediu, senzorii<br />

aflaţi pe partea respectivă a robotului (în acest caz senzorul 4 şi 5) vor raporta acest lucru.<br />

Cu toate că senzorii bumper sunt folosiţi pentru a evita lovirea robotului de obiecte din<br />

mediul ambiant în caz de coliziune cu acestea, dacă forţa de impact este mare, detectarea<br />

coliziunii nu mai este suficientă pentru a evita distrugerea anumitor părţi ale robotului.<br />

Majoritatea roboţilor mobili folosiţi în laboratoare nu sunt echipaţi cu sisteme de frânare<br />

active, şi chiar dacă ar fi pentru o anumită viteză, unui robot mobil tot i-ar lua o distanţă<br />

considerabilă pentru a se opri brusc, datorită inerţiei motoarelor. Unele autovehicule au instalate<br />

totuşi senzori bumper, nu atât pentru detectarea coliziunilor, cât pentru a absorbi din şocul produs<br />

la impactul cu un obiect extern.<br />

2.4 Servomotoare<br />

Servomotoarele reprezintă componente esenţiale, de execuţie şi de precizie, în structura<br />

unui robot mobil, utilizate în principal pentru deplasarea robotului, dar şi pentru realizarea unor<br />

mişcări, ce pot fi complexe şi de mare precizie, ale unor organe/părţi ale robotului. Ultimele decade<br />

au fost marcate de evoluţii remarcabile în ceea ce priveşte dimensiunile, viteza de rotaţie şi cuplul<br />

motor al motoarelor de tip servo.<br />

În Figura 14, se prezintă astfel (spre exemplificare, pentru servomotorul Futaba S3151) o<br />

structură tipică, împreună cu alte caracteristici semnificative [12].<br />

Figura 14. Componentele unui servomotor. Servomotorul Futaba S3151<br />

28


Gabarit:<br />

( mm )<br />

Tabelul 1. Caracteristicile mecanice, electrice şi geometrice ale servomotorului.<br />

Masa:<br />

( g )<br />

Cuplul la<br />

4,8V<br />

(Nmm)<br />

Viteza:<br />

0,16s/45° la<br />

4,8V<br />

Cuplul de<br />

mentinere<br />

(Nmm)<br />

Tensiunea:<br />

( V )<br />

40,5x20x36,1 42 310 0,21 770 4,8 ÷ 6<br />

O îmbunătăţire deosebită constituie dezvoltarea servomotoarelor digitale ce au avantaje<br />

funcţionale semnificative faţă de servomotoarele analogice (standard). În principiu, un servomotor<br />

digital este asemănător cu un servomotor standard, cu excepţia unui microprocesor care<br />

analizează semnalele de intrare şi controlează motorul.<br />

Una din diferenţe constă în modul de procesare a semnalelor de intrare şi transmiterea<br />

puterii iniţiale de la servomotor, reducând timpul mort, crescând rezoluţia şi generând un cuplu de<br />

menţinere superior.<br />

La motoarele servo convenţionale, în faza de repaus, nu se alimentează servomotorul. În<br />

cazul servomotoarelor digitale, când este primită o comandă de pornire a servomotorului, sau<br />

când se aplică un cuplu la axul de ieşire, servo-ul răspunde prin alimentarea cu tensiune a<br />

motorului.<br />

Această tensiune, care este de fapt tensiunea maximă, este pulsată sau transmisă on/off<br />

cu o rată fixă de (spre exemplu 50 de cicluri pe secunda), generând scurte impulsuri de tensiune.<br />

Prin creşterea duratei fiecărui impuls se creează un control al vitezei, care poate creşte progresiv<br />

când se aplică motorului tensiunea maximă fără întrerupere, accelerând servomotorul şi deci<br />

robotul, sau organul acţionat, spre noua poziţie.<br />

Modul concret de aplicare a acestui mecanisnm de comandă se poate realiza conform cu<br />

diagramele prezentate în Figura 15.<br />

29


Figura 15. Comanda prin PWM. Servomotor standard şi digital<br />

Un impuls On de lăţime scurtă, urmat de o pauză scurtă, nu constituie pentru motor o<br />

comandă să se întoarcă, cu condiţia să nu fie mai lungă pauza. Aceasta înseamnă un control al<br />

mişcării, care la întoarcere trimite mici impulsuri iniţiale spre motor, este foarte ineficient, şi de<br />

aceea este denumită banda moartă.<br />

Din cele de mai sus rezultă câteva avantaje importante ale servomotoarelor digitale:<br />

- prin intermediul microprocesorului este posibilă primirea de semnale de intrare de<br />

comandă prin care durata impulsului poate fi ajustată prin programarea<br />

microprocesorului pentru a realiza funcţiile cerute şi pentru a optimiza performanţele<br />

servomotorului;<br />

- la un servomotor digital se pot trimite impulsuri către motor la o frecvenţă semnificativ<br />

mai mare, de regulă între 50 de impulsuri / secunda şi 300 impulsuri / secunda, astfel<br />

că servomotoarele digitale vor răspunde mai rapid la comenzi.<br />

În Figura 16 se prezintă comparativ variaţii tipice ale cuplului în timp pentru servomotoarele<br />

standard şi servomotoarele digitale.<br />

30


Figura 16. Caracteristicile cuplu-timp pentru servomotoarele standard şi digitale<br />

Comanda (controlul) servomotoarelor reprezintă partea esenţială a acestora care asigură<br />

posibilitatea interfaţării cu procesoarele prin care se execută programele şi aplicaţiile specifice<br />

robotului.<br />

De fapt, sistemul de comandă al servomotorului constituie elementul care se adaugă şi<br />

face diferenţa faţă de un simplu motor. În general aceste motoare sunt de curent continuu,<br />

obişnuite sau „pas cu pas”.<br />

Comanda elementelor de execuţie (roboţi sau organe/părţi ale acestora) cu ajutorul<br />

motoarelor pas cu pas şi a servomotoarelor de curent continuu, pentru a obţine o mişcare<br />

incrementală precisă, este o problemă destul de dificilă, cu mai multe tipuri de soluţii în funcţie de<br />

aplicaţie şi de caracteristicile urmărite.<br />

În general, modelul comenzii pentru roboţi mobili se poate aborda şi asimila sistemelor cu<br />

dinamică lentă, care nu sunt supuse perturbaţiilor electromagnetice (spre exemplu: acţionarea<br />

maşinilor cu comandă numerică, a imprimantelor, plotter-elor etc.).<br />

31


Sistemul de comandă pentru un servomotor de c.c este, practic, un sistem de acţionare<br />

electrică, având în componenţă motorul electric (servomotorul de c.c), obiectul acţionat, transmisia<br />

şi elementul de execuţie (Figura 17) [18].<br />

Figura 17. Schema bloc a unui sistem de acţionare cu servomotoare de c.c.<br />

În Figura 17 sunt făcute următoarele notaţii:<br />

• Motorul electric – ME – realizează transformarea puterii electrice în putere mecanică.<br />

• Obiectul acţionat – OA – este antrenat de ME şi realizează anumite mişcări impuse.<br />

• Transmisia – T – reprezintă legatura mecanică dintre ME şi OA cu rolul de a realiza<br />

transferul de putere mecanică şi, eventual, de a schimba parametrii acestei puteri<br />

(viteza unghiulară, cuplu).<br />

• Elementul de execuţie – EE – are drept scop alimentarea cu energie electrică a ME şi<br />

comanda funcţionării în conformitate cu anumite cerinţe.<br />

Pentru proiectarea acestui element (EE), se ţine seama de următorii factori:<br />

• caracteristica viteza unghiulară ( ) – moment/cuplu ( ) în regim staţionar atât a<br />

motorului, cât şi a obiectului acţionat:<br />

•<br />

• gama de viteze de lucru necesare, definită ca fiind raportul dintre viteza unghiulară<br />

minimă şi maximă;<br />

• precizia de menţinere a vitezei.<br />

Comanda concretă a servomotoarelor de c.c. se face cu convertoare statistice de c.c. – c.c.<br />

(chopper-e), care la rândul lor pot fi comandate în funcţie de semnalele asociate cu unul sau mai<br />

mulţi dintre factorii menţionaţi mai sus, dar la aceştia se adaugă semnalele de comandă care<br />

trebuie să asigure, prin procesor, execuţia programelor specifice aplicaţiei.<br />

2.5 Metode de comunicare fără fir (wireless)<br />

Tehnicile şi tehnologiile utilizate în domeniul tehnologiei informaţiei şi comunicaţiilor (TIC)<br />

reprezintă baza dezvoltării societăţii informaţionale şi principalul factor de progres<br />

tehnicoeconomic mondial, astfel explicându-se atât diversitatea, dinamica, complexitatea cât şi<br />

importanţa în cadrul global.<br />

32


Tehnicile de comunicaţie utilizabile pentru transmiterea datelor între un robot mobil şi PC<br />

restrâng, în majoritatea aplicaţiilor specifice, gama tehnologiilor la cele cu o rază de acţiune mobilă<br />

dar limitată, care sunt reprezentate de standardele wireless (fără fir), radio sau infraroşu. Până<br />

acum proiectarea sistemelor de comunicaţie fără fir s-a axat mai mult pe creşterea performanţelor<br />

de transmisie prin aer. În acest context atenuarea şi interferenţele sunt privite ca şi zgomote<br />

inevitabile unui astfel de mediu de transmisie. Ultimele tendinţe au arătat că acum accentul se<br />

pune prepondernt pe creşterea eficienţei spectrale.<br />

2.5.1 Comunicaţii în Infraroşu<br />

Comunicaţiile wireless în infraroşu se referă la propagarea undelor de lumină emisă în<br />

banda infraroşu, unde radiaţa electromagnetica are o lungime de unda mai lunga decat cea a<br />

luminii vizibila, dar mai scurta decat a undelor radio.<br />

O modalitate de caracterizare a unei conexiuni wireless se face în funcţie de tipul legăturii<br />

care se stabileşte: sistemele punct-la-punct şi sistemele cu difuzie.<br />

Cel mai simplu tip de legătură care se poate stabili este cel punct-la-punct (Fig.18, [25]). În<br />

acest caz, atât transmiţătorul cât şi receptorul trebuie “să se vadă reciproc”, deci să existe o cale<br />

neopturată. Aceste legături pot fi stabilite temporar pentru a se putea realiza o sesiune de<br />

schimburi de date între doi utilizatori sau se poate stabili o legătură permanentă atunci când se<br />

foloseşte o unitate mobilă ca şi „base point” în cadrul unei reţele LAN.<br />

Figura 18. Sistem de comunicaţii în infraroşu Un emiţător (T) converteşte<br />

un semnal electric într-unul optic. LED-ul şi dioda semiconductoare laser sunt două dintre cele<br />

mai apropiate soluţii tehnice pentru acest scop. LED-urile au caracteristici de transmisie care<br />

permit un câmp larg de aplicabilitate, în special în cazurile în care se folosesc legăturile indirecte.<br />

LED-urile mai au încă un avantaj în faţa diodelor semiconductoare laser, şi anume că ele<br />

protejează ochiul uman.<br />

Receptorul (R) sau detectorul de semnal converteşte semnalul optic recepţionat de la<br />

emiţător şi îl transpune într-un curent electric. Fotodiodele din siliciu de tip p-i-n sunt cele mai<br />

recomandate pentru astfel de aplicaţii fără fir, ele având o eficienţă sporită în această bandă de<br />

comunicaţie precum şi un preţ destul de bun.<br />

33


În cazul unui sistem de comunicaţii optice care se află într-un mediu deschis, aşa cum este<br />

cazul tipic, detectorul este iluminat şi de alte surse de lumină decât cea de la emiţător, astfel că<br />

ele se manifestă ca nişte zgomote aditive care fac ca la fotodetector curentul generat de către<br />

acesta să nu mai fie cel exact.<br />

În comunicatiile optice partea de spectru de infrarosu care este folosita este impartita în<br />

cateva benzi bazate pe disponibilitatea surselor de lumina, materiale de transmisie şi absorbţie şi<br />

detectori.<br />

Banda C (1530–1565 nm) este banda dominanta pentru retelele de telecomunicatii de<br />

distanta lunga, U cu lungimea de undă ultralungă (1625–1675 nm) iar banda O (1260–1360 nm)<br />

este banda originală IR (lungimea de undă cea mai scurtă) [21].<br />

Transmisia de date prin IR este o comunicare de raza scurta între perfericelele<br />

calculatorului şi asistenti digitali personalizati. Aceste dispozitive se conformeaza standardului<br />

IRDA (Infrared Data Association). Controalele la distanta şi dispozitivele IrDa folosesc LED-uri<br />

(Light Emitting Diodes) infrarosii pentru a emite radiatie infrarosie care este focalizata de o lentila<br />

de plastic într-o raza ingusta. Raza este modulata, pornita sau oprita, pentru a codifica datele.<br />

Receptorul foloseste o fotodioda siliconica pentru a converti radiatia infrarosie în curent electric.<br />

IrDa (Infrared Data Association, asociere de date prin infrarosu) defineste specificatii fizice<br />

pentru standarde de protocale de comunicatii pentru schimbul de date prin lumina infrarosie pe<br />

distanta mica, pentru utilizarea în PAN-uri (Personal Area Networks).<br />

Standardele IrDa includ o serie largă de specificaţii şi protocoale: IrPHY, IrLAP, IrLMP,<br />

IrCOMM, Tiny TP, IrOBEX, IrLAN şi IrSimple.<br />

2.5.2 Comunicaţii prin Bluetooth ®<br />

Comunicaţiile Bluetooth sunt un standard de comunicaţie pentru dispozitive mobile,<br />

standard care se aplică pe distanţe ceva mai mari decât în cazul comunicaţiilor în infraroşu.<br />

Sistemul Bluetooth este cel mai adecvat atunci când distanţa dintre emiţător/receptor este<br />

scurtă, rata de transfer este mare, iar puterea consumată trebuie menţinută cât mai scăzută.<br />

Ideea ce a dat nastere tehnologiei wireless Bluetooth a aparut în 1994 cand compania<br />

Ericsson Mobile Communications a decis investigarea fezabilitatii unei interfete radio de mica<br />

putere şi cost redus între telefoanele mobile şi accesoriile acestora.<br />

Specificaţiile Bluetooth sunt practic acoperite de standardul IEEE 802.15.1(astfel se<br />

justifică termenul „standardul Bluetooth”) şi reprezinta una dintre cele mai avansate tehnologii de<br />

comunicatie fara fir. Cu putere mare de transfer al datelor şi consum foarte scazut de energie,<br />

actionand pe distante mici, de la 1m pana la 100m şi numai "indoor", Bluetooth se afirma ca fiind<br />

mijlocul prin care toate echipamentele care ne inconjoara pot interactiona.<br />

Bluetooth prezinta o tehnologie pentru distante scurte cu costuri reduse, vizând crearea<br />

unor reţele personale (PAN-Personal Area Nework).<br />

34


Principalele tipuri de aplicatii ale Bluetooth sunt:<br />

• controlul wireless al comunicarii între telefonul celular şi castile hands free sau car kitul.<br />

Aceasta aplicatie a devenit cea mai populara.<br />

• retea wireless între calculatoare într-un spatiu limitat şi cerinte mici de lungime de<br />

banda, aici putând include şi cazul PC-robot.<br />

• comunicatie wireless între dispozitivele de intrare şi ieşire ale unui calculator, cele mai<br />

intalnite fiind mouse-ul,tastatura sau imprimanta.<br />

• inlocuirea comunicarii traditionale seriale prin fir în echipamentele de test, receptoeul<br />

GPS şi echipamente medicale.<br />

• pentru controale unde infrarosul era folosit.<br />

• controlul wireless al consolei de jocuri – Nintendo’s Wii şi Sony’s PlayStation 3 folosesc<br />

tehnologia Bluetooth pentru consolele lor wireless.<br />

Pentru a putea analiza eficient soluţiile fără fir (wireless), este utilă comparaţia cu alte<br />

tehnologii [21]:<br />

1) Bluetooth<br />

a) este indreptata către aplicatii de voce şi date;<br />

b) opereaza în spectrul 2.4GHz;<br />

c) functioneaza pe o distanta de la 1m la 100 m;<br />

d) este capabila sa treaca prin obiecte solide, este omnidirectionala şi nu necesita o<br />

pozitionare în linie cu celelalte dispozitive pentru conectare;<br />

e) securitatea este şi va fi o prioritate în dezvoltare;<br />

f) costul unui chip este mic, nu necesita adrese de retea, aprobări şi celelalte setari pentru o<br />

retea tipica de Internet;<br />

2) IrDA<br />

a) este folosit pentru a oferi conectivitate wireless pentru dispozitivele care în mod normal<br />

folosesc cablu pentru conectare;<br />

b) opereaza pe distanţe mici (câţiva metri), la viteze între 9600 bps şi 16 Mbps;<br />

c) nu poate trece prin obiecte solide şi aplicatiile de schimb de date sunt limitate;<br />

d) este mai des folosit în sistemele de plata, în controlul la distanta sau pentru sincronizarea<br />

a 2 PDA-uri;<br />

3) Wi-Fi<br />

a) este mai analog retelei traditionale de Internet şi necesita configurari pentru a impartii<br />

resursele , transmite fisiere, realize legaturi audio;<br />

b) foloseste aceleasi frecvente radio ca şi Bluetooth-ul , dar cu un consum de putere mai<br />

mare, rezultand o conexiune mai puternica;<br />

c) necesita mai multe configurari, dar este cel mai potrivit pentru o retea, realizandu-se o<br />

conexiune mai rapida, o raza de actiune mult mai mare şi o securitate mai ridicata, dar<br />

costul este relativ mare;<br />

Sistemul de comunicaţie Bluetooth a fost proiectat cu scopul de a conecta mai multe<br />

dispozitive pentru a implenta o reţea mică şi de aceea protocolul care dictează regulile de<br />

comunicaţie are în vedere o arhitectură de tip master-slave.<br />

35


În Figura 19 se prezintă un dispozitiv şi o reţea Blutooth (Piconet) [21].<br />

Figura 19. Dispozitiv şi retea Bluetooth Piconet<br />

Având în vedere cerinţele temei proiectului şi caracteristicile generale avantajoase, care<br />

au determinat deja utilizarea sa frecventă la comunicaţiile PC-roboţi mobili, detalii privind structura<br />

şi elementele principale ale standardului Bluetooth (IEEE 802.15.1), precum şi a versiunilor<br />

acestuia, se vor prezenta în Capitolul 3.<br />

3 Tehnologia Bluetooth ®<br />

3.1 Prezentare generală<br />

Tehnologia wireless Bluetooth reprezintă una dintre cele mai avansate şi răspândite<br />

tehnologii de comunicatie fără fir.<br />

Bluetooth prezintă următoarele avantaje principiale:<br />

✓ facilitează atât comunicaţiile de date cât şi pe cele vocale;<br />

✓ oferă posibilitatea implementării unor reţele ad-hoc şi a sincronizării între diverse<br />

dispozitive electronice şi echipamentele periferice ale computerelor care se afla la<br />

distanţe de ordinul a 10 m;<br />

✓ asigură soluţii pentru comunicaţii vocale şi de date fără cabluri, utilizând alimentări<br />

standard low-power, tehnologii de cost redus ce pot fi cu uşurinţă integrate în orice<br />

dispozitiv şi deschide calea unei mobilităţi totale.<br />

Specificaţiile Bluetooth definesc capabilităţi de legături radio pe distanţe scurte<br />

(aproximativ 10m) sau opţional pe distanţe medii (aproximativ 20m) pentru transmisii vocale sau<br />

de date de capacitate maximă 720kbps pe canal [20].<br />

Gama de frecvenţe de operare o constituie banda nelicenţiată industrială, ştiinţifică şi<br />

medicală (ISM) de la 2.4GHz la 2.48Hz, utilizând tehnici de împrăştiere a spectrului (frequency<br />

hopping spread spectrum), cu salturi de frecvenţă ale semnalului duplex de până la 1600 salturi<br />

36


pe secundă. Semnalul execută salturi prin 79 intervale de frecvenţă de 1MHz, pentru a realiza o<br />

bună imunitate la interferenţe. Puterea emisă este conform specificaţiilor 0dBm (1mW) pentru<br />

implementările pentru acoperiri reduse (10m) şi maxim 20dBm (100mW) pentru versiunile pentru<br />

domenii mai extinse (100m).<br />

Când s-au alcătuit specificaţiile radio, un mare accent s-a pus pe posibilitatea implementării<br />

design-ului într-un singur chip CMOS, în consecinţă reducându-se costul, puterea consumată şi<br />

dimensiunile necesare pentru implementarea în dispozitivele mobile.<br />

Comunicaţiile vocale: Sunt utilizate până la trei canale vocale sincrone simultan sau un<br />

canal care suportă simultan transmisie de date asincronă şi transmisie vocală sincronă. Fiecare<br />

canal vocal suportă sincron 64kb/s în fiecare sens.<br />

Comunicaţii de date: Un canal de date asincron poate suporta maxim 723.2kbps în sens<br />

direct în conexiune asimetrică (şi până la 57.6kbps în sens invers), sau 433.9kbps în conexiune<br />

simetrică.<br />

Structura master-slave: Deorece sistemul de comunicaţie Bluetooth a fost proiectat cu<br />

scopul de a conecta mai multe dispozitive pentru a implementa o reţea de tip LAN, protocolul de<br />

sincronizare se bazează pe o structură de tip master-slave.<br />

Fiecare dispozitiv Bluetooth poate stabili conexiuni cu încă 7 alte dispozitive. Numai o<br />

singură conexiune este activă la un moment de timp, restul fiind într-o stare semi-activă. Pe scurt<br />

aceste dispozitive au un număr de adresă fix, dar nu au acees la mediul de transmisie decât atunci<br />

când le vine rândul sau li se cere să comunice cu un master. Sincronizarea frecvenţelor presupune<br />

definirea unor intervale de timp de 625 de microsecunde, unde masterul îşi va transmite pachetele<br />

în intervalele de timp cu număr par, iar slave-urile în intervalele de timp cu număr impar.<br />

Unităţile Bluetooth aflate în acelaşi domeniu spaţial de acţiune radio pot realiza ad-hoc<br />

conexiuni punct-la-punct şi/sau punct-la-multipunct. Unităţile pot fi adăugate sau deconectate în<br />

mod dinamic la reţea. Două sau mai multe unităţi pot utiliza în comun un canal al unui piconet.<br />

Se pot forma mai multe picoreţele şi acestea se pot lega ad-hoc împreună formând scatternet<br />

(Figura 20 [24]), pentru a realiza configuraţii flexibile de comunicaţii şi schimburi de date.<br />

Dacă într-un acelaşi domeniu spaţial se află mai multe pico-reţele, fiecare lucrează<br />

independent şi fiecare are acces la întreaga bandă de frecvenţe. Fiecare pico-reţea este stabilită<br />

pe un canal diferit, cu salt în frecvenţă. Toţi utilizatorii participanţi la aceeaşi pico-reţea sunt<br />

sincronizaţi pe acest canal. Spre deosebire de dispozitivele cu infraroşu (IR), unităţile Bluetooth<br />

nu sunt limitate de necesitatea vederii directe între ele.<br />

37


Figura 20. Reţele Bluetooth Scatternet<br />

Pentru a se respecta normele de imunitate la coliziuni între date, un scatternet poate<br />

cuprinde până la 10 piconet-uri.<br />

3.2 Principalele caracteristici ale standardului Bluetooth / IEEE 802.15.1<br />

Legătura între Bluetooth şi IEEE s-a făcut prin faptul că primele specificaţii Bluetooth (1.0)<br />

-1999 au devenit baza IEEE Standard 802.15.1-2002 (prin care se ratifica Bluetooth 1.1),<br />

consacrând astfel importanţa şi forţa noii tehnologii.<br />

Deşi, în mod firesc, Bluetooth a urmat o evoluţie ascendantă (mai multe versiuni detaliate<br />

la paragraful 3.3), marcată şi de standarde IEEE, principalele caracteristici ale standardului iniţial<br />

(1.0) se păstrează ca majoritare şi definitorii, după cum se prezintă în continuare.<br />

3.2.1 Clasele de putere / acoperire şi securitatea Bluetooth<br />

În funcţie de puterea maximă emisă s-au standardizat 3 clase principale în care se pot<br />

fabrica dispozitivele Bluetooth, acestora corespunzându-le şi diferite acoperiri (raze de acţiune)<br />

maxime (Tabelul 2).<br />

Tabelul 2. Clase Bluetooth<br />

Clasa Puterea maximă permisă Puterea maximă permisă Raza<br />

(mW)<br />

(dBm)<br />

(aproximativă)<br />

Clasa 1 100 mW 20 dBm 100 m<br />

Clasa 2 2.5 mW 4 dBm 10 m<br />

Clasa 3 1 mW 0 dBm 1 m<br />

Deoarece semnalele radio pot fi uşor interceptate, dispozitivele Bluetooth au încorporate<br />

proceduri de securizare, pentru prevenirea receptorilor rău-intenţionaţi şi nevizaţi de mesaj. Trei<br />

sunt metodele de securizare a informaţiei:<br />

38


1. Rutina de interpelare pentru autentificare;<br />

2. Cifrarea fluxului informaţional, ca metodă de criptare;<br />

3. Generarea unor chei de sesiune – aceste chei pot fi oricând schimbate pe parcursul<br />

unei conexiuni stabilite.<br />

În algoritmii de securizare sunt utilizate trei entităţi:<br />

1. Adresa dispozitivului Bluetooth (BD_ADDR pe 48 biţi), care este o entitate publică<br />

unică pentru fiecare dispozitiv (această adresă se obţine prin procedura Inquire);<br />

2. cheie privată specifică utilizatorului (128 biţi), care este o entitate secretă (cheia privată<br />

derivă din procedura de iniţializare şi nu este dezvăluită niciodată);<br />

3. Un număr aleator (128 biţi), care diferă la fiecare nouă tranzacţie. Acest număr este<br />

derivat dintr-un proces pseudo-aleator în unitatea Bluetooth.<br />

În plus faţă de aceste funcţii la nivel de legătură, salturile de frecvenţă şi transmisia limitată<br />

spaţial ajută şi ele la prevenirea recepţionărilor neautorizate.<br />

3.2.2 Stiva de protocoale Bluetooth<br />

O caracteristică cheie a Bluetooth este aceea de a permite dispozitivelor realizate de diverşi<br />

producători să lucreze împreună. Pentru acest scop, Bluetooth nu defineşte doar un sistem radio,<br />

ci şi o stivă de protocoale pentru ca aplicaţiile respective să poată sesiza prezenţa altor dispozitive<br />

Bluetooth, să descopere ce servicii pot acestea oferi şi să utilizeze aceste servicii.<br />

Stiva de protocoale este definită ca o serie de straturi, deşi unele caracteristici nu pot fi<br />

delimitate ca aparţinând unui anumit strat. În Figura 21 este evidenţiat acest aspect [20].<br />

39


Figura 21. Stiva de protocoale Bluetooth<br />

Profilurile Bluetooth ghidează aplicaţiile în utilizarea stivei de protocoale Bluetooth. TCS<br />

(Telephony Control Protocol Specification) oferă servicii telefonice.<br />

SDP (Service Discovery Protocol) lasă dispozitivele Bluetooth să descopere ce servicii<br />

suportă celelalte dispozitive. RFCOMM oferă o interfaţă serială asemănătoare cu RS232. L2CAP<br />

multiplexează date de la straturile superioare şi converteşte dimensiunile pachetelor<br />

informaţionale, după necesităţi. HCI manipulează comunicaţiile între modulul Bluetooth şi aplicaţia<br />

gazdă. LM controlează şi configurează legăturile cu alte dispozitive. BB/LC controlează legăturile<br />

fizice prin radio, asamblează pachetele şi controlează salturile în frecvenţă. Stratul Radio<br />

modulează şi demodulează datele pentru transmisia şi recepţia aeriană.<br />

3.2.3 Descoperirea dispozitivelor Bluetooth<br />

Presupunem că avem de-a-face cu două dispozitive echipate Bluetooth, un telefon celular<br />

şi un laptop. Celularul este capabil să se comporte ca un modem, folosind profilul Dial-Up<br />

Networking şi scanează periodic să vadă dacă cineva doreşte să-l utilizeze. Utilizatorul laptop-ului<br />

deschide o aplicaţie care necesită o legătură Bluetooth dial-up.<br />

Pentru a utiliza această aplicaţie, laptop-ul ştie că are nevoie să stabilească o legătură Bluetooth<br />

cu un dispozitiv ce suportă profilul Dial-Up Networking. Primul pas în stabilirea unei astfel de<br />

40


conexiuni este de a afla ce dispozitive Bluetooth se află în zonă, aşa că laptop-ul iniţiază o<br />

procedură Inquiry pentru a sonda vecinătatea cu alte dispozitive.<br />

Pentru aceasta, laptop-ul transmite o serie de pachete de interogare (inquiry) şi eventual<br />

telefonul celular răspunde cu un pachet FHS (Frequency Hop Synchronisation). Pachetul FHS<br />

conţine toate informaţiile de care laptop-ul are nevoie pentru crearea unei legături cu celularul.<br />

Acesta conţine de asemenea şi informaţii despre clasa dispozitivului, informaţii structurate pe două<br />

nivele: părţi majore – a fost descoperit un telefon şi părţi minore – telefonul descoperit este un<br />

telefon celular.<br />

În acelaşi mod, orice dispozitiv Bluetooth din zonă, care scanează mediul în căutarea de<br />

mesaje Inquiry, va răspunde cu un pachet FHS, astfel încât laptop-ul acumulează o listă cu<br />

dispozitive.<br />

Ceea ce se întâmplă mai departe depinde de proiectantul aplicaţiei. Laptop-ul poate<br />

prezenta utilizatorului o listă a tuturor dispozitivelor descoperite şi îl poate lăsa pe acesta să decidă<br />

cum să continue; de menţionat că în acest stadiu laptop-ul nu-i poate prezenta utilizatorului decât<br />

informaţii referitoare la tipul dispozitivelor descoperite.<br />

3.3 Versiuni în evoluţia Bluetooth ®<br />

3.3.1 Evoluţia specificaţiilor Bluetooth la standardul IEEE<br />

Numele Bluetooth vine de la Harald I Blåtand ("the blue-toothed"), regele Viking al<br />

Danemarcei între anii 940 şi 981 [23]. Ideea ce a dat naştere tehnologiei wireless Bluetooth a<br />

apărut în 1994 când compania Ericsson Mobile Communications a decis investigarea fezabilităţii<br />

unei interfeţe radio de mică putere şi cost redus între telefoanele mobile şi accesoriile acestora.<br />

În februarie 1998 a luat fiinţă Grupul de Interes Special (SIG). Astăzi Bluetooth SIG include<br />

companiile promotoare 3Com, Ericsson, IBM, Intel, Lucent, Microsoft, Motorola, Nokia şi Toshiba,<br />

şi mii de companii – membri asociaţi sau adoptori.<br />

Iniţial misiunea SIG a fost de a monitoriza dezvoltarea tehnologiei radio pentru domenii<br />

restrânse şi de a crea un standard global deschis, prevenind astfel devenirea acestei tehnologii<br />

proprietatea unei singure companii. Acest lucru a avut ca rezultat apariţia primei specificaţii<br />

Bluetooth (1.0) 1999.<br />

În martie 2000 IEEE şi SIG au convenit crearea unui standard IEEE pe baza versiunii<br />

1.1-Bluetooth.<br />

41


În 2002 Bluetooth 1.1 este ratificat ca IEEE Standard 802.15.1-2002.<br />

3.3.2 Bluetooth 1.0<br />

Prima versiune Bluetooth (1.0) apare în 1999. Versiunile 1.0 şi 1.0B au avut multe<br />

probleme şi mai mulţi producatori au avut multe dificultati în a face produsele interoperabile.<br />

Versiunile 1.0 şi 1.0B de asemenea au avut prin regula BD_ADDR(Bluetooth Hardware Device<br />

Address) o adresa de recunoastere, ceea ce crea o imposibilitate a anonimatului la nivelul de<br />

protocol, ducând la o incetinire a procesului de introducere a noi servicii în mediul Bluetooth.<br />

3.3.3 Bluetooth 1.1<br />

Multe din erorile descoperite în versiunea 1.0B au fost corectate:<br />

- a fost adaugat suport pentru canalele necriptate;<br />

- a fost introdus RSSI (Receiver Signal Strenght Indicator) – Indicator de nivel al<br />

semnalului recepţionat;<br />

3.3.4 Bluetooth 1.2 (Ratificată ca IEEE Standard 802.15.1-2005)<br />

Aceasta versiune este compatibila cu 1.1 iar imbunatatirile majore includ:<br />

- AFH (Adaptive Frequency Hopping), care imbunatateste rezistenta la interferentele<br />

frecventei radio, evitand utilizarea frecventelor aglomerate în secventa de salt;<br />

- viteza da transmitere mai mare (maxim 721 kbit/s);<br />

- eSCO(extended Syncronius Connections), care imbunatateste calitatea vocii în<br />

conexiunile audio prin permiterea retransmisiei de pachete alterate.<br />

3.3.5 Bluetooth 2.0 (SIG-2004)<br />

Aceasta versiune este compatibila cu versiunile 1.x. Principala imbunatatire este<br />

introducerea EDR-ului (Enhanced Data Rate) de 3.0 Mbps.<br />

Acest lucru are urmatoarele efecte:<br />

- o viteza de transmitere de 3 ori mai mare, în unele cazuri de 10 ori mai mare raza<br />

de acţiune 100m;<br />

- consum de putere mai mic;<br />

- latime de banda mai mare (important la portabile-PDA, laptop, telefon);<br />

- imbunatatirea BER-ul (Bit Error Rate)<br />

- mai bună gestionare a conexiunii între mai mult de două dispozitive.<br />

42


3.3.6 Bluetooth 2.1 (SIG-2007)<br />

Compatibilă cu 1.2, iar imbunatatirile majore includ:<br />

- Perfecţonarea procedurii “inquire” (Extended Inquiry Response).<br />

- Reducerea consumului în “low-power mode”<br />

- Permite schimbarea cheilor de criptare (Encryption Pause Resume) în cazul legăturilor<br />

lungi peste 23.3 h(one Bluetooth day).<br />

- Creşte nivelul de cunoaştere între dispozitivele reţelei (Secure Simple Pairing +Near<br />

Field Communication -NFC), ducând la creşterea securităţii şi vitezei de conectare;<br />

3.3.7 Bluetooth 3.0 (SIG-2009)<br />

Specificaţia 3.0 a fost adoptată de Bluetooth SIG pe 21 aprilie 2009. Principala noutate<br />

introdusă este AMP (Alternate MAC/PHY), adică adăugarea lui 802.11 (asociat de regulă cu WiFi)<br />

ca un mod de transport de mare viteză. Această extindere măreşte considerabil importanţa şi<br />

potenţialul Bluetooth (Wi-Fi era principalul competitor tehnic şi economic).<br />

3.4 Modele şi arhitecturi de utilizare<br />

Unităţile Bluetooth aflate în acelaşi domeniu spaţial de acţiune radio pot realiza ad-hoc<br />

conexiuni punct-la-punct şi/sau punct-la-multipunct. Unităţile pot fi adăugate sau deconectate în<br />

mod dinamic la reţea. Două sau mai multe unităţi pot utiliza în comun un canal al unui piconet.<br />

Se pot forma mai multe picoreţele şi acestea se pot lega ad-hoc împreună formând scatternet,<br />

pentru a realiza configuraţii flexibile de comunicaţii şi schimburi de date (Figura 22)[22].<br />

Figura 22. Arhitecturi Bluetooth<br />

Pentru a regula traficul pe canal, unul dintre participanţi devine master în piconet, în timp<br />

ce restul unităţilor devin slave.<br />

Dacă într-un acelaşi domeniu spaţial se află mai multe pico-reţele, fiecare lucrează<br />

independent şi fiecare are acces la întreaga bandă de frecvenţe. Fiecare pico-reţea este stabilită<br />

pe un canal diferit, cu salt în frecvenţă. Toţi utilizatorii participanţi la aceeaşi pico-reţea sunt<br />

43


sincronizaţi pe acest canal. Spre deosebire de dispozitivele cu infraroşu (IR), unităţile Bluetooth<br />

nu sunt limitate de necesitatea vederii directe între ele.<br />

În conformitate cu Specificaţiile actuale ale Bluetooth, pot comunica cu un master, simultan<br />

active, până la şapte dispozitive slave. Totuşi, numărul unităţilor virtual ataşate unui master,<br />

capabile să între în comunicaţie este aproape nelimitat.<br />

Nucleul sistemului tehnologiei Bluetooth este format dintr-un dispozitiv emisie/receptie RF,<br />

baseband şi o stiva de protocoale. Sistemul ofera servicii care activeza conexiunea dispozitivelor<br />

şi schimbul de diferite de clase de date între aceste dispozitive.<br />

RF-ul foloseste o modulatie de frecventa binara pentru a minimize complexitatea<br />

emitatorului/receptorului . Rata simbolului este de 1 Megasimbol/sec(Msps) care suporta o rata<br />

de bit de 1 Megabit/sec(Mbps) sau cu EDR(Enhanced Data Rate) o rata de bit în aer de 2 la 3<br />

Mb/s.<br />

Pentru a facilita procesul de transmisie, datele sunt împărţite în entităţi mai mici, numite<br />

pachete. În Figura 23 se prezintă structura pachetelor şi asocierea canalelor pentru master şi<br />

respectiv slave.<br />

Figura 23. Structura pachetelor şi asocierea canalelor pentru master/slave<br />

Saltul în frecvenţă nu este o tehnologie nouă, dar comparativ cu alte dispozitive ce<br />

utilizează banda de 2.4GHz, pentru dispozitivele cu Bluetooth, acesta este rapid şi utilizează<br />

pachete mici. Ţinând cont de faptul că dispozitivele radio Bluetooth lucrează conform unui model<br />

FHSS, acest canal de comunicaţie constă dintr-o secvenţă bine definită de frecvenţe la care se<br />

face transmisiunea, alese pseudo-aleator dintr-un set posibil de valori(79 de frecvenţe între<br />

2.402MHz şi 2.480MHz, cu pasul de 1 MHz) şi care se schimbă de 1600 de ori pe secundă, fapt<br />

pentru care spunem că se face un salt al frecvenţei-frequency hop.<br />

Acest lucru este posibil asignându-le un canal de salt în frecvenţă, determinat de secvenţa<br />

“frequency hopping” (ordinea în care fiecare frecvenţă este folosită) şi de perioda frecvenţei. Întro<br />

reţea “piconet”(pico reţea), succesiunea este determinată de ceasul sistemului dispozitivului<br />

master. În esenţă, dispozitivul slave sincronizează ceasul său intern cu cel al dispozitivului master<br />

, care setează aceeaşi succesiune salturilor în frecvenţă.<br />

Bluetooth utilizează mecanismele Inquiry şi Paging şi SDP (Service Discovery Protocol).<br />

44


Pentru stabilirea unei conexiuni prin tehnologia wireless Bluetooth condiţia principală este<br />

ca ambele terminale să dorească realizarea acestei legături. Unele dispozitive pot fi setate să nu<br />

realizeze scanări pentru mesaje Inquiry; în acest caz, celelalte dispozitive nu le pot descoperi şi<br />

vor fi practic invizibile. În mod similar, unele dispozitive pot fi setate să nu realizeze scanări pentru<br />

mesaje Page; în acest caz, aceste dispozitive pot iniţia legături, dar nu vor auzi încercările altor<br />

dispozitive de a se conecta la ele. Aplicaţiile pot alege dacă să facă dispozitivele conectabile sau<br />

descoperibile. O conexiune nu poate fi realizată forţat cu un dispozitiv care nu este setat pentru a<br />

o accepta.<br />

45


4 Robotul LEGO Mindstorms NXT<br />

4.1 Generalităţi<br />

LEGO Mindstorms este o serie de componente LEGO care cuprinde unităţi programabile,<br />

senzori, servomotoare şi alte părţi constructive.<br />

Produsul LEGO Mindstorms NXT a fost lansat în iulie 2006 şi este succesorul primului<br />

model, Robotics Invention System (RCX), care a stârnit interesul unui număr mare de amatori.<br />

Succesul setului NXT este argumentat în special de uşurinţa cu care se poate personaliza şi<br />

extinde platforma. Au fost dezvoltate numeroase concepte, multe dintre care s-au evidenţiat în<br />

diverse concursuri de robotică din întreaga lume.<br />

Având la dispoziţie elemente mecanice cu care se pot construi structuri şi mecanisme,<br />

elemente electronice cum ar fi senzori, servomotoare şi microcontrolere, rezultă că setul NXT<br />

permite construirea şi programarea unui robot mobil reconfigurabil deosebit de versatil.<br />

Elementele mecanice ale sistemului respectă binecunoscutul principiu LEGO al<br />

interconexiunii dintre elemente modularizate. Utilizarea acestor elemente are ca scop realizarea<br />

subansamblului mecanic al sistemului mecatronic: mecanismul care va fi acţionat şi controlat în<br />

scopul îndeplinirii unui task. Aceste elemente cuprind diferite tipuri de articulaţii (cilindrice, sferice<br />

de translaţie), roţi dinţate (cilindrice şi conice), came, transmisii prin curele, reductoare planetare<br />

etc.<br />

Echipamentul NXT cuprinde:<br />

Unitatea centrală de procesare, caramida<br />

Este centrul operaţional al sistemului. Execută<br />

programele utilizatorului şi controlează<br />

comunicarea cu senzorii, servomotoarele, cu PC-ul<br />

sau cu alte unităţi NXT<br />

3 servomotoare Motoare electrice de curent continuu alimentate la<br />

9V sau 12V (pe perioade scurte).<br />

Senzor cu ultrasunete<br />

Determină distanţa de la senzor până la cel mai<br />

apropiat obiect folosind un sistem similar sonarului<br />

Senzor de contact<br />

Este practic un întreruptor, având două stări:<br />

apăsat sau eliberat<br />

Senzor optic<br />

Senzor fotosensibil capabil să distingă 4 culori sau<br />

variaţii în intensitatea luminii ambiente<br />

Senzor acustic<br />

Măsoară intensitatea sonoră în decibeli (microfon)<br />

Cabluri de interconectare<br />

Servomotoarele şi senzorii se conectează la<br />

unitatea centrală de procesare prin cabluri cu câte<br />

6 fire care suportă interfaţa analoga şi digitala<br />

Cablu USB<br />

Robotul se poate conecta la PC prin USB sau prin<br />

Bluetooth<br />

Suita software pentru PC<br />

Conţine driverele necesare şi mediul de<br />

programare proprietar NXT-G<br />

Alimentarea robotului se face prin 6 baterii standard AA de 1,5V sau se poate achiziţiona<br />

un acumulator dedicat de 1400mAH [4].<br />

46


4.2 Sistemul de procesare al robotului NXT<br />

Sistemul de procesare al robotului cuprinde două microcontrolere, cel principal execută<br />

programele utilizatorului, iar cel auxiliar este destinat controlului prin PWM al servomotoarelor şi<br />

menţinerea vitezei în funcţie de sarcină.<br />

Sub aceeaşi carcasă sunt găzduite şi interfeţele de comunicare cu senzorii, microcontrolerul<br />

de comunicare Bluetooth, afişajul cu cristale lichide, butoanele de navigare prin meniu, un difuzor<br />

şi porturile de conectare cu senzorii şi servomotoarele.<br />

Figura 24. Diagrama sistemului de procesare NXT<br />

Specificaţiile sistemului de procesare [1]:<br />

Main processor Atmel® 32-bit ARM® processor, AT91SAM7S256 -<br />

256 KB FLASH<br />

- 64 KB RAM<br />

- 48 MHz<br />

Co-processor<br />

Atmel® 8-bit AVR processor, ATmega48<br />

- 4 KB FLASH<br />

- 512 Byte RAM - 8 MHz<br />

Bluetooth wireless communication<br />

CSR BlueCoreTM 4 v2.0 +EDR System<br />

- Supporting the Serial Port Profile (SPP)<br />

- Internal 47 KByte RAM<br />

- External 8 MBit FLASH - 26 MHz<br />

USB 2.0 communication<br />

Full speed port (12 Mbit/s)<br />

4 input ports 6-wire interface supporting both digital and analog<br />

interface<br />

- 1 high speed port, IEC 61158 Type 4/EN 50170<br />

compliant<br />

47


3 output ports 6-wire interface supporting input from encoders<br />

Display<br />

100 x 64 pixel LCD black & white graphical display<br />

- View area: 26 X 40.6 mm<br />

Loudspeaker<br />

Sound output channel with 8-bit resolutio<br />

- Supporting a sample rate of 2-16 KHz<br />

4 button user-interface Rubber buttons<br />

Power source<br />

6 AA batteries<br />

- Alkaline batteries are recommended<br />

- Rechargeable Lithium-Ion battery 1400<br />

mAH is available<br />

Connector<br />

6-wire industry-standard connector, RJ12 Right<br />

side adjustment<br />

4.3 Senzorii robotului NXT<br />

Robotului NXT i se pot ataşa 4 senzori la porturile de intrare (1, 2, 3, 4). Senzorii standard<br />

cu care este dotat robotul NXT sunt capabili să măsoare distanţa, intensitatea luminii şi<br />

intensitatea sonoră. Împreună cu posibilitatea de a determina rotaţia fiecărui servomotor (cu<br />

ajutorul unui encoder încorporat), aceşti senzori alcătuiesc un sistem senzorial foarte cuprinzător.<br />

Mai mult, dezvoltatori particulari au îmbogăţit seria de senzori cu diverse intrumente de<br />

măsurare cum ar fi: accelerometru, compas, giroscop, termometru, camera video şi altele.<br />

4.3.1 Senzorul cu ultrasunete NXT<br />

Măsurarea distanţei până la un obiect se poate face cu senzorul cu ultrasunete.<br />

Senzorul cu care este echipat robotul LEGO Mindstorms NXT este similar cu Parallax<br />

PING, prezentat în Figura 9, şi permite citirea distanţei până la cel mai apropiat obiect care se<br />

încadrează în raza de detecţie a senzorului.<br />

Pot fi detectate obiecte aflate la distanţe de la 1-2 cm la aproximativ 255 cm cu o precizie<br />

ridicată. Cel mai uşor de detectat sunt obiectele mari care au forma regulată şi suprafaţa dură.<br />

Obiectele din materiale moi, cu forme neregulate sau foarte subiri nu sunt bine detectate rezultând<br />

în valori alternante ale distanţei până la obiect.<br />

Este recomandat să nu se folosească mai mulţi senzori cu ultrasunete în aceeaşi cameră<br />

deoarece ei se pot preturba reciproc.<br />

Undele ultrasonice se propagă sub forma unui con, astfel încât sensibilitatea senzorului<br />

este maximă de-a lungul axei conului (axa acustică) şi descreşte odată cu apropierea de<br />

generatoare. Pentru a fi perceput, un obiect trebuie să se găsească în interiorul acestui con.<br />

48


4.3.2 Protocolul de comunicare I 2 C<br />

Citirea informaţiei furnizate de către senzorii NXT este realizată prin intermediul<br />

protocolului I2C. Acest protocol a fost inventat de Philips şi este folosit pentru comunicarea dintre<br />

periferice “low-speed” şi sisteme centrale (placa de bază, telefon mobil, etc.).<br />

Protocolul constă în transmisia de message sub forma binară dintre un dispozitiv master<br />

şi unul slave. Pentru comunicarea cu senzorul de ultrasunete al robotului LEGO NXT sunt definite<br />

o serie de comenzi care returnează valoarea senzorului sau iniţiază un anumit mod de funcţionare<br />

al senzorului, printre care:<br />

“Single shot command”: În acest mod de funcţionare, senzorul va măsura de fiecare<br />

dată când se va trimite comanda, iar ultimele 8 valori măsurate vor fi stocate în variabilele “Read<br />

measurement byte 0 – 7”.<br />

“Continuous measurement command”: Acesta este modul de funcţionare implicit, în<br />

care senzorul măsoară la un interval de timp prestabilit şi stochează valoarea în variabila “Read<br />

measurement byte 0”<br />

“Event capture command”: Acest mod de funcţionare permite detectarea altor senzori<br />

cu ultrasunete care sunt în raza de sensibilitate. Astfel se poate decide când să se efectueze o<br />

măsuratoare pentru a nu apărea interferenţe între senzori. [2]<br />

4.3.3 Servomotorul NXT<br />

Setul NXT este dotat cu 3 servomotoare alimentate la 9V. Ele se conectează, prin cablurile<br />

furnizate, la cele 3 porturi de ieşire (A, B, C) ale unităţii centrale. Mufele cablurilor sunt special<br />

proiectate să nu poată fi introduse invers şi să aibă alte dimensiuni decât mufele standard ale<br />

liniilor telefonice.<br />

Spre deosebire de servomotoarele modelului precedent, RCX, noile servomotoare sunt<br />

mai puternice şi au încorporate un sistem de transmisie reductor menit să crească cuplul la ieşire.<br />

De asemenea a fost încorporat şi un encoder de rotaţie care oferă informaţii despre poziţia relativă<br />

a axului motorului faţă de momentul de referinţă.<br />

49


NXT cuprinde 4 componente:<br />

Figura 25. Servomotor NXT. Structura interna Servomotorul<br />

• Motor de c.c. alimentat la 9V nominal (suportă 12V pe perioade scurte)<br />

• Dispozitiv de protecţie la supracurent (termistor RXE065)<br />

• Encoder care returnează rotaţia relativă a motorului<br />

• Sistem de transmisie cu raport reductor de 48:1 de la motor la axul servomoturului<br />

Componentele sunt introduse într-o carcasă rigidă care poate fi uşor ataşată unei structuri<br />

mecanice din elemente LEGO.<br />

Motorul a fost analizat de către amatori LEGO NXT de la www.philohome.com şi au fost<br />

determinaţi următorii parametrii de funcţionare [11]:<br />

Tensiune de<br />

alimentare<br />

Sarcina Turaţie Curent<br />

Putere<br />

debitată<br />

Putere<br />

absorbită<br />

Randament<br />

(mecanică) (electrică)<br />

4.5 V 16.7 Ncm 33 rpm 0.6 A 0.58 W 2.7 W 21.4 %<br />

7 V 16.7 Ncm 82 rpm 0.55 A 1.44 W 3.85 W 37.3 %<br />

9 V 16.7 Ncm 117 rpm 0.55 A 2.03 W 4.95 W 41 %<br />

12 V 16.7 Ncm 177 rpm 0.58 A 3.10 W 6.96 W 44.5 %<br />

Parametrii de funcţionare în gol şi în scurt sunt listaţi în tabelul următor:<br />

Tensiune de<br />

alimentare<br />

Sarcina Turaţie Curent<br />

9 V 0 170 rpm 0,06 A<br />

9 V 50 Ncm 0 2 A<br />

50


Pentru a mări cuplul servomotorului, transmisia se face printr-un angrenaj cu raport<br />

reductor de 48:1. Deşi randamentul scade, cuplul mare este un avantaj în construcţia unui robot<br />

mobil NXT.<br />

Encoderul cu care este echipat servomotorul este un encoder rotativ incremental optic<br />

capabil să depisteze direcţia de rotaţie (quadrature encoder). Este un sistem bine cunoscut care<br />

se bazează pe numărarea impulsurilor optice primite de către o diodă fotosensibilă. Impulsurile<br />

sunt create prin trecerea luminii de la un LED prin fantele unui disc care se roteşte.<br />

Discul prezintă 12 fante şi este antrenat de motor cu raportul de transmisie 10:32 de la<br />

motor la encoder. Considerând şi raportul de transmisie de la motor la axul servomoturului (de<br />

48:1) reiese că pentru o revoluţie completă a axului servomotorului, encoderul detectează 360 de<br />

impulsuri. Astfel se poate măsura o rotaţie de 1 0 a axului servomotorului.<br />

Figura 26. Servomotor NXT. Encoder de rotaţie<br />

Deoarece servomotorul poate fi folosit de către persoane neavizate, el este protejat la<br />

supracurenţi cu un termistor, modelul RAYCHEM RXE065, ilustrat în Figura 27. Dispozitivul<br />

suportă un curent maxim de 40A şi o tensiune maximă de 60V. [11]<br />

Figura 27. Servomotor NXT. Dispozitiv de protecţie la supracurent<br />

51


4.4 Metode de comunicare<br />

Legătura fizică dintre PC şi robotul NXT se poate realiza prin cablu USB sau prin conexiune<br />

Bluetooth 2.0. Avantajele comunicării prin cablul USB se restrâng la o viteză de transfer superioară<br />

şi compatibilitate garantată cu PC-ul. Avantajele conexiunii Bluetooth:<br />

• Nu limitează mobilitatea robotului sau raza de acţiune • Robotul NXT se poate conecta<br />

la maxim 10 alte dispozitive Bluetooth, fie că sunt tot roboti NXT sau PC • Comunicaţia<br />

este rezistentă la interferenţe radio datorită tehnicii spread spectrum (salt de frecvenţă) •<br />

Este omnidirecţională şi nu necesită o poziţionare în linie cu celelalte dispozitive pentru<br />

conectare<br />

Ca atare, pentru dezvoltarea programelor care asigură comunicarea dintre robotul NXT şi<br />

PC, am ales conexiunea Bluetooth.<br />

4.5 Programarea robotului LEGO NXT<br />

Suita software cu care este prevăzut setul NXT conţine atât drivere necesare comunicării<br />

PC-ului cu robotul NXT cât şi un program de tipul IDE (Intergrated Development Environment)<br />

numit NXT-G. Pentru a permite programarea robotului cu o deosebită uşurintă, programarea în<br />

NXT-G este vizuală (graphical programming) similar cu programele LabVIEW şi Microsoft<br />

Robotics Studio.<br />

Programarea în NXT-G prezintă următoarele avantaje:<br />

✓ Este uşor de instalat atât pe Windows cât şi pe Mac OS X<br />

✓ Configurarea calculatorului pentru comunicarea prin USB sau Bluetooth este asigurată<br />

de la instalare<br />

✓ Programarea vizuală este foarte intuitivă şi reprezintă un pas de iniţiere în programarea<br />

clasică<br />

Totuşi, programarea în NXT-G are şi dezavantaje, cum ar fi faptul că nu se poate valorifica<br />

complet varietatea de instrucţiuni ale firmware-ului rezident pe robot.<br />

Deşi produsul LEGO Mindstorms NXT a fost lansat relativ recent, amatorii de robotică au<br />

văzut în acest produs o platformă de dezvoltare versatilă. Printre „pionieri” se regăseşte John<br />

Hansen, creatorul limbajului de programare NXC (Not eXactly C) despre a cărui realizare voi<br />

detalia la punctul 4.5.1.<br />

Alte limbaje de programare / compilere au fost create sau adaptate să suporte arhitectura<br />

robotului NXT. Printre cele mai importante se află: Next Byte Codes şi NXC, RobotC, leJOS NXT,<br />

Matlab, Lua, etc.<br />

52


4.5.1 Limbajul de programare NXC (Not eXactly C)<br />

După cum îi sugerează şi numele, limbajul NXC este un derivat al popularului limbaj de<br />

programare C. NXC a fost creat de către John Hansen (principal software engineer, Nashville, TN,<br />

USA) şi foloseşte compiler-ul NBC (Next Byte Codes). Compiler-ul traduce codul NXC în<br />

instrucţiuni NXT bytecodes care sunt executate direct pe robot. [7]<br />

Fiind un limbaj specific programării pentru robotul NXT, NXC este structurat pe măsură.<br />

Codul este împărţit în seturi de instrucţiuni numite task-uri care pot fi rulate în paralel. De asemena<br />

instrucţiunile se pot grupa în proceduri (metode) sau funcţii, la fel ca în limbajul C.<br />

Sintaxa limbajului NXC este familiară datorită trăsăturilor comune cu limbajul C. Partea<br />

specifică limbajului NXC constă în API (Application Programming Interface) care reprezintă o<br />

colecţie de proceduri şi funcţii (o librărie) care sunt disponibile programatorului pentru a realiza<br />

operaţii specifice robotului NXT.<br />

Documentaţia limbajului NXC este cuprinzătoare şi clarifică rapid setul de operaţii care se<br />

pot executa folosind limbajul NXC.<br />

Avantajele limbajului de programare NXC:<br />

✓ Alternativă la programarea vizuală LEGO NXT-G ✓ Similar limbajului C, dar este<br />

specific programării NXT<br />

Limitări importante:<br />

✓ Nu suportă valori numerice cu zecimale<br />

✓ Nu suportă recursivitate<br />

În ciuda limitărilor, limbajul NXC este competent şi acoperă majoritatea funcţionalităţilor<br />

propuse în lucrarea de faţă. Ca atare, voi folosi acest limbaj pentru programarea robotului NXT.<br />

5 Citirea datelor achiziţionate de la senzorii NXT prin<br />

interogare de la PC<br />

Prima metoda de transmisie a datelor achiziţionate de la senzorii robotului NXT la PC pe<br />

care am implementat-o se bazează pe principiul interogării. De obicei comunicarea prin Bluetooth<br />

dintre două dispozitive presupune stabilirea unui terminal master care iniţiază şi controlează<br />

conexiunea şi unui terminal slave care este subordonat master-ului. În această metodă folosesc<br />

PC-ul ca master şi robotul NXT ca slave.<br />

Practic, am realizat un program pe PC care emite comenzi către robotul NXT, prin<br />

intermediul conexiunii Bluetooth, şi aşteaptă un răspuns la comanda emisă. Interpretarea şi<br />

executarea comenzii se face automat de către firmware-ul rezident în robotul NXT, fără o<br />

53


programare suplimentară. În funcţie de tipul comenzii, răspunsul poate să confirme execuţia<br />

comenzii şi chiar să returneze date achiziţionate de la senzori. Avantajele acestei metode sunt:<br />

✓ Nu necesită programare suplimentară pe robotul NXT<br />

✓ Pot fi folosite diverse limbaje de programare pe PC<br />

✓ Resursele PC-ului sunt nelimitate în comparaţie cu cele ale robotului NXT Dezavantaje:<br />

‣ Prin această metodă nu pot fi valorificate toate funcţionalităţile puse la dispoziţie de<br />

firmware-ul NXT<br />

‣ Apar mici întârzieri între comandă, achiziţie date şi răspuns<br />

5.1 Obiectivele programului de pe PC<br />

Programul care rulează pe PC trebuie să:<br />

✓ Iniţieze şi controleze conexiunea Bluetooth dintre PC şi robotul NXT;<br />

✓ Obţină date achiziţionate de la senzorii NXT în timp real;<br />

✓ Interpreteze datele obţinute pentru a putea fi prelucrate programatic;<br />

✓ Afişeze datele prelucrate într-o formă grafică intuitivă;<br />

✓ Permită exportul lor într-un format compatibil Microsoft Excel<br />

Prelucrarea datelor achiziţionate sau afişarea lor depinde de scopul aplicaţiei şi pot lua<br />

diverse forme. De aceea, eu mi-am propus să asigur o funcţionalitate importantă şi anume, aceea<br />

de a exporta datele achiziţionate într-un format comun, care poate fi apoi uşor procesat. Datele<br />

achiziţionate pot fi salvate în format tabelar (pe rânduri şi coloane) Tab delimited text (.txt) care<br />

este compatibil cu orice versiune de Microsoft Excel.<br />

5.2 Resurse hardware şi software necesare<br />

Pentru realizarea aplicaţiilor prezentate în această lucrare, resursele hardware şi software<br />

necesare sistemului PC-NXT sunt următoarele:<br />

- PC (desktop, laptop, notebook, netbook) care rulează Windows XP şi Microsoft .NET<br />

Framework 2;<br />

- Adaptor pentru conectare Bluetooth 2.0 (intern sau extern);<br />

- Drivere (software) necesare adaptorului Bluetooth;<br />

- Realizarea procesului de împerechere (pairing) Bluetooth dintre PC şi NXT;<br />

- Robotul LEGO NXT cu senzorul cu ultrasunete şi un servomotor ataşate<br />

Un pas important în configurarea PC-ului pentru conexiunea Bluetooth cu robotul NXT este<br />

împerecherea Bluetooth. Procesul presupune recunoaşterea (discovery) reciprocă a celor două<br />

dispozitive PC şi NXT şi cuplarea lor software după introducerea pe fiecare dintre dispozitive a<br />

aceluiaşi cod PIN (Personal Identification Number). În urma confirmării codului PIN fiecare dintre<br />

54


dispozitive stochează adresa MAC (Media Access Control) a corespondentului pentru<br />

recunoaştere ulterioară.<br />

Acest proces se realizează o singură dată pentru aceleaşi două dispozitive, cât timp<br />

înregistrările adreselor MAC sunt păstrate de către fiecare parte. Împerecherea este o măsură de<br />

securitate care poate restricţiona accesul la anumite dispozitive (prin codul PIN).<br />

Pe PC, împerecherea Bluetooth se face folosind soft-ul care este instalat o dată cu diverele<br />

adaptorului Bluetooth.<br />

Comunicarea Bluetooth suportă anumite protocoale numite services specializate pentru<br />

transferul anumitor formate de date. Există un protocol pentru transfer de semnal audio, transfer<br />

de fişiere, transfer de agendă telefonică, etc.<br />

Pentru comunicarea PC-ului cu robotul NXT trebuie configurat protocolul de comunicare<br />

prin port serial. Aceasta se poate face din software de pe PC şi realizează o alocare a conexiunii<br />

Bluetooth cu un anumit dispozitiv la un anumit port serial al PC-ului (exemplu: COM1, COM2,<br />

etc.).<br />

În Figura 28 sunt ilustraţi paşii tipici de configurare a conexiunii Bluetooth dintre PC şi un<br />

robot NXT:<br />

55


Figura 28. Configurarea conexiunii Bluetooth dintre PC şi NXT<br />

Configurarea conexiunii Bluetooth duce la stabilirea unui port serial al calculatorului<br />

dedicat comunicării dintre PC şi robotul NXT (exemplu: COM6). Numele portului rezervat pentru<br />

conexiunea Bluetooth cu robotul NXT poate să difere de la PC la PC. Cu această informaţie se<br />

poate implementa programatic o metodă de iniţiere şi control a conexiunii Bluetooth dintre PC şi<br />

robotul NXT.<br />

În continuare voi prezenta o metodă de iniţiere şi control a conexiunii Bluetooth dintre PC<br />

şi robotul NXT folosind un algoritm scris în limbajul de programare C#.<br />

5.3 Limbajul de programare C# (C Sharp)<br />

Limbajul de programare C# (se citeşte C Sharp) este un limbaj creat de Microsoft pentru<br />

dezvoltarea aplicaţiilor bazate pe .Net Framework. Similar au fost dezvoltate şi limbajele VB.NET,<br />

J#, F#.<br />

Motivele pentru care am ales acest limbaj de programare pentru realizarea aplicaţiilor pe<br />

PC din aceasta lucrare sunt următoarele:<br />

56


• C# este un limbaj destinat RAD (Rapid Application Development)<br />

• Librăriile din Microsoft .Net Framework sunt robuste şi permit implementarea<br />

comunicării prin port serial<br />

• Din punctul de vedere al sintaxei, C# este similar cu popularul C şi C++ cu care mam<br />

familiarizat pe parcursul facultăţii<br />

C# este un limbaj pur Object Oriented şi are la bază conceptul de clasă (class). O clasă<br />

reprezintă un obiect virtual care are proprietăţi, metode, constante, „constructori”, evenimente, etc.<br />

În programare, obiectele virtuale sunt utile deoarece pot reprezenta corespondente ale unor<br />

obiecte din realitate. Aceste obiecte virtuale pot fi folosite pentru a simula sau a controla obiectele<br />

din realitate.<br />

Pentru a descrie acest concept (clasă sau obiect virtual) am ales să consider un exemplu<br />

din realitate care poate fi reprezentat în programare: automobilul. Obiectul sau clasa se va numi<br />

Automobil şi poate fi definit astfel:<br />

Clasa<br />

Automobil<br />

Proprietăţi<br />

Metode<br />

Constante<br />

Sunt parametrii care caracterizează starea sau<br />

tipul clasei: kilometrajul curent, viteza cu care<br />

rulează, turaţia<br />

Se referă la secvenţe de acţiuni pe care le poate<br />

executa clasa: mers înainte, sau mers în<br />

marşarier, sau aprinderea farurilor<br />

Valori folosite frecvent care nu pot fi schimbate:<br />

numărul de roţi, sau volan pe partea stângă sau<br />

dreaptă, sau marca automobilului<br />

„Constructori”<br />

Evenimente<br />

Sunt metode care definesc parametrii iniţiali şi<br />

crează o reprezentare (instance) a clasei. Similar<br />

producătorul construieşte automobilul în funcţie<br />

de speficicaţiile posesorului.<br />

Sunt acţiuni invocate de către clasa care reflectă<br />

o anumită schimbare ţn starea sa şi necesită<br />

intervenţia utilizatorului (posesorului): avertizare<br />

de combustibil redus, sau avertizare faruri aprinse<br />

Este evidentă asemănarea unui automobil cu un robot mobil. Observaţia rămâne valabilă<br />

şi pentru conceptele corespondente din programare.<br />

În C# clasa Automobil ar putea fi definită astfel:<br />

57


public class Automobil<br />

{<br />

// constante<br />

public const int NumarDeRoti = 4;<br />

public const string Marca = "Suzuki";<br />

public const bool VolanPeStanga = true;<br />

// constructor<br />

public Automobil() {<br />

VitezaCurenta = 0;<br />

Kilometraj = 0;<br />

}<br />

// constructor<br />

public Automobil(int km) {<br />

Kilometraj = km;<br />

}<br />

// proprietate<br />

public int VitezaCurenta { // in km / ora<br />

get {return _VitezaCurenta;}<br />

set {_VitezaCurenta = value;}<br />

}<br />

private int _VitezaCurenta;<br />

// proprietate public int<br />

Kilometraj {<br />

get {return<br />

_Kilometraj;}<br />

set<br />

{_Kilometraj = value;}<br />

}<br />

private int _Kilometraj;<br />

// proprietate public int<br />

TuratieCurenta {<br />

get {return<br />

_TuratieCurenta;}<br />

set {_TuratieCurenta = value;}<br />

}<br />

private int _TuratieCurenta;<br />

// metoda<br />

public void PornesteMotorul() {<br />

TuratieCurenta = 900; //rpm<br />

}<br />

// metoda<br />

public void OpresteMotorul() {<br />

TuratieCurenta = 0; //rpm<br />

}<br />

}<br />

// metoda<br />

public int RuleazaInainte(int Durata) {// Durata in ore<br />

Kilometraj = Kilometraj + (VitezaCurenta * Durata);<br />

return Kilometraj;<br />

}<br />

Similar cu exemplul de mai sus am creat o clasă numită OperatorNXT care controlează<br />

robotul NXT. Mai concret, clasa OperatorNXT controlează conexiunea Bluetooth cu robotul NXT<br />

şi citirea datelor achiziţionate de la senzori. Codul care defineşte clasa OperatorNXT<br />

prezentat în Anexa 9.1.<br />

58<br />

este


5.4 Proiectarea şi implementarea aplicaţiei de pe PC<br />

5.4.1 Iniţierea conexiunii Bluetooth dintre PC şi NXT în C#<br />

Urmând paşii de configurare al PC-ului descrişi la sub-capitolul 5.2 rezultă stabilirea unui<br />

port serial (COM1, COM2, etc) prin care se realizează conexiunea Bluetooth cu robotul NXT.<br />

În limbajul de programare C#, clasa SerialPort din librăria System.IO.Ports,<br />

inclusă în Microsoft .Net Framework, supervizează operaţiile de citire sau scriere de date la un<br />

port serial al calculatorului. Am folosit această clasă pentru a iniţia şi controla conexiunea cu<br />

dispozitivul Bluetooth asignat acelui port serial, adică robotul NXT.<br />

La iniţializare, clasa SerialPort primeşte ca parametru numele portului serial. Acest<br />

parametru este un şir de caractere (string) care reprezintă numele portului serial stabilit pentru<br />

comunicarea Bluetooth cu robotul NXT. În aplicaţiile prezentate în acestă lucrare, numele portului<br />

serial folosit este COM6. În consecinţă clasa SerialPort este iniţializată cu parametrul<br />

”COM6”.<br />

private SerialPort PortSerial = new SerialPort("COM6");<br />

În exemplul de mai sus am creat o reprezentare (instance) a clasei SerialPort.<br />

Aceasta reprezentare este o variabilă definită pe baza clasei SerialPort şi dispune de toate<br />

atributele clasei SerialPort.<br />

Pentru a putea comnica prin portul serial al PC-ului trebuie ca acesta să fie deschis.<br />

Deschiderea conexiunii se face apelând metoda Open.<br />

Clasa SerialPort dispune de metodele Write şi Read pe care le folosesc pentru<br />

transmisia de date dintre PC şi NXT. Metoda Write realizează transmisia informaţiei de la PC la<br />

NXT şi primeşte ca parametru un vector de tip byte care conţine seria de octeţi ce va fi trimisă<br />

prin portul serial. Metoda Read este folosită pentru citirea unui vector de tip byte care reprezintă<br />

seria de octeţi primită de la robotul NXT.<br />

59


5.4.2 Comunicarea PC – NXT prin interogare<br />

În calitate de master, PC-ul va iniţia şi controla conexiunea Bluetooth şi va emite comenzi către<br />

robotul NXT. Recepţionarea, interpretarea şi executarea comenzilor pe robotul NXT se face<br />

automat de către firmware-ul rezident, fără o programare suplimentară [2].<br />

În funcţie de tipul comenzii, răspunsul poate să confirme execuţia comenzii sau chiar să<br />

returneze date achiziţionate de la senzori. Acest protocol este numit control prin „comenzi directe”.<br />

Protocolul de control prin „comenzi directe” poate furniza date achiziţionate de la orice senzor<br />

NXT.<br />

Un ciclu de interogare şi răspuns cuprinde următoarele etape generale:<br />

1. Formularea comenzii<br />

2. Trimiterea comenzii la portul serial al PC<br />

3. Transmisia prin Bluetooth de la PC la NXT<br />

4. Interpretarea comenzii pe NXT<br />

5. Executarea comenzii / Achiziţia de date de la senzor<br />

6. Formularea răspunsului<br />

7. Trimiterea răspunsului<br />

8. Transmisia prin Bluetooth de la NXT la PC<br />

9. Recepţionarea răspunsului la portul serial al PC<br />

10. Interpretarea răspunsului<br />

Prin interogări succesive, la un anumit interval de timp, se poate acumula pe PC o serie<br />

de „măsuratori” de la senzorii NXT care reflectă evoluţia în timp a mărimilor respective.<br />

Un aspect important pentru valorificarea datelor achiziţionate este fixarea lor în timp.<br />

Deoarece timpul este măsurat pe PC şi datele sunt achiziţionate de la senzori pe unitatea NXT,<br />

apar întârzieri şi o desincronizare a datelor faţă de momentul achiziţiei. Fiecare etapă din procesul<br />

descris mai sus reprezintă o întârziere. Din fericire suma acestor întârzieri este relativ mică, de<br />

ordinul zecilor de milisecunde. Mai mult, aceste întârzieri sunt în general constante şi se poate<br />

compensa efectul lor din programare.<br />

Deşi subiectul este discutabil, în final voi demonstra experimental că aceste întârzieri sunt<br />

neglijabile în raport cu aplicaţiile prezentate în această lucrare.<br />

În consecinţă, metoda prin interogare de la PC asigură acurateţea şi consistenţa datelor<br />

achiziţionate şi este o metodă fiabilă şi performantă.<br />

5.4.3 Implementarea protocolului de control prin „comenzi directe”<br />

Acest set de instrucţiuni face posibilă comanda robotului NXT de la dispozitive externe.<br />

60


Astfel robotul NXT poate fi controlat de la PC, de la alţi roboţi NXT sau orice dispozitiv capabil de<br />

comunicare Bluetooth sau USB prin port serial.<br />

Protocolul acoperă funcţionalităţile de bază ale robotului NXT, dar permite şi extinderea sa<br />

prin trimiterea unor comenzi personalizate care ar putea fi interpretare de un program suplimentar<br />

care rulează pe robot.<br />

Utilizând “comenzi directe” se poate:<br />

• Comanda un servomotor NXT (turaţie, sens, oprire, frână)<br />

• Citi date de la senzori sau de la encoderul unui servomotor<br />

• Trimite / primi de mesaje tip SMS (Short Message Service) care pot fi preluate /<br />

generate de către un program ce rulează pe NXT<br />

• Executa un anumit program rezident pe robot<br />

• Alte operaţii specifice<br />

Protocolul se bazează pe protocolul standard de comunicare LEGO Mindstorms NXT, şi<br />

anume prin transmisia de „telegrame” cu arhitectura prezentată în Figura 29 [3].<br />

Figura 29. Arhitectura generala a protocolului de comunicare NXT<br />

Primul octet (byte 0) va conţine tipul de comandă. Dacă seria de octeţi este un răspuns,<br />

atunci primul octet va reprezenta tot un tip de comandă (reply) şi va avea valoarea 0x02 în<br />

hexadecimal. Lista completă de tipuri de comandă este prezentată în Tabelul 3.<br />

Tabelul 3. Lista tipurilor de comandă NXT<br />

0x00 Comanda directă, necesită răspuns<br />

0x01 Comanda de sistem, necesită răspuns<br />

0x02 Răspuns<br />

0x80 Comanda directă fără răspuns<br />

0x81 Comanda de sistem fără răspuns<br />

Comenzile de sistem nu fac parte din protocolul de „comenzi directe” şi nu sunt folosite<br />

pentru comanda uzuală a robotului NXT.<br />

61


Al doilea octet (byte 1) va determina care comandă va fi executată, adică va conţine codul<br />

comenzii, iar restul de octeţi vor descrie parametrii specifici respectivei comenzi.<br />

Lungimea maximă a unei „telegrame” care reprezintă o comandă directă este de 64 de<br />

octeţi, începând de la primul octet (byte 0).<br />

Pentru „telegrame” transmise prin Bluetooth ® se adaugă doi octeţi la începutul structurii<br />

conform Figura 30. Acesti doi octeţi descriu lungimea telegramei.<br />

Figura 30. Structura unei comenzi trimise prin Bluetooth<br />

Unde LSB (Least Semnificant Byte) şi MSB (Most Semnificant Byte) descriu lungimea<br />

totală a comenzii.<br />

În C#, formularea comenzilor presupune completarea unui vector de valori byte cu<br />

parametrii specifici comenzii:<br />

byte[] comanda = new byte[3];<br />

comanda[0] = 0x00; // comanda directa, necesita raspuns<br />

comanda[1] = (comanda[2] = (bytebyte))port_motor; CodMesajDirect// portul la care este<br />

atasat servomotorul.CitesteStareMotor; // 0x06 codul comenzii<br />

Comanda este apoi procesată, se construieşte telegrama şi se „scrie” (Write) la portul serial al<br />

PC-ului:<br />

int lungime_comanda = comanda.Length;<br />

byte[] telegrama = new byte[lungime_comanda + 2]; // creeaza telegrama<br />

telegrama[0] = (byte)(lungime_comanda & 0xFF); // calculeaza LSB telegrama[1] =<br />

(byte)((lungime_comanda & 0xFF00) >> 8); // calculeaza MSB<br />

comanda.CopyTo(telegrama, 2); // completeaza telegrama cu continutul comenzii<br />

PortSerial.Write(telegrama, 0, telegrama.Length);<br />

// trimite telegrama<br />

În funcţie de tipul comenzii se aşteaptă apoi un răspuns şi se citeşte de la portul serial al<br />

PC-ului:<br />

62


if (comanda[0] < 0x80) // in cazul in care comanda directa necesita raspuns<br />

{<br />

int lsb = PortSerial.ReadByte(); // citeste primul byte<br />

int msb = PortSerial.ReadByte(); // citeste al doilea byte<br />

int lungime_raspuns = lsb + msb * 256; // calculeaza lungimea raspunsului<br />

byte[] raspuns = new byte[lungime_raspuns];<br />

}<br />

PortSerial.Read(raspuns, 0, lungime_raspuns); // citeste raspunsul<br />

5.4.4 Algoritmul metodei de interogare de la PC<br />

Folosind metodele prezentate la punctele 5.4.1, 5.4.2 şi 5.4.3 am construit programul<br />

propus, implementând un algoritm care presupune citirea datelor de la senzorii NXT prin interogări<br />

succesive.<br />

Pe scurt, algoritmul metodei de citire a datelor achiziţionate prin interogare de la PC<br />

cuprinde următorii paşi:<br />

1. Deschiderea portului serial (iniţierea conexiunii cu NXT)<br />

2. Cât timp se doreşte interogarea:<br />

2.1. Formularea unui vector de valori byte care reprezintă o comandă directă<br />

2.2. Scrierea seriei de byte la portul serial al calculatorului<br />

2.3. Aşteptarea unui răspuns din partea robotului NXT sub forma de serie byte<br />

2.4. Interpretarea răspunsului şi a datelor ataşate<br />

2.5. Stocarea datelor primite<br />

3. Închiderea portului serial (anularea conexiunii cu NXT)<br />

4. Afişarea sau exportul rezultatelor<br />

În Figura 31 este prezentată o diagramă simplificată a algoritmului metodei de citire a<br />

datelor achiziţionate prin interogare de la PC.<br />

63


Figura 31. Diagrama simplificata a algoritmului de citire a datelor achiziţionate prin interogare de la PC<br />

Codul sursă complet este prezentat în Anexa 9.1, Anexa 9.2, Anexa 9.3.<br />

5.5 Aplicaţie la metoda de citire a datelor achiziţionate de la senzorii NXT<br />

prin interogare de la PC<br />

5.5.1 Determinarea poziţiei obiectelor cu senzorul de ultrasunete<br />

Deoarece senzorul cu ultrasunete are un unghi de acoperire mare (aprox. 120o) nu se<br />

poate determina poziţia obiectelor din raza sa de măsurare sau numărul lor.<br />

Pentru determinarea poziţiei obiectelor se poate construi un sistem din componenete<br />

LEGO NXT care cuprinde un servomotor, unitatea centrală şi senzorul cu ultrasunete. Sistemul<br />

funcţionează ca radarul de pe vasele maritime şi scanează împrejurimile pentru construirea unui<br />

contur virtual al obiectelor din jur.<br />

64


Figura 32. Aplicaţie la metoda de citire a datelor de la senzori prin interogare de la PC<br />

Senzorul este ataşat rotorului servomotorului şi se roteşte stânga-dreapta pentru a acoperi<br />

cât mai mult din spaţiul înconjurător. Pe măsură ce senzorul se roteşte, datele colectate de la<br />

senzor sunt asociate cu poziţiile rotorului faţă de unghiul iniţial. Pentru un control mai precis al<br />

rotaţiei se foloseşte un raport de transmisie între servomotor şi suportul senzorului.<br />

În principiu, astfel se poate determina atât poziţia unui obiect cât şi dimensiunile acestuia<br />

(lăţimea sau înălţimea).<br />

Controlul servomotorului şi citirea senzorului cu ultrasunete se face de pe PC prin<br />

Bluetooth folosind metoda şi algoritmul de citire a datelor achiziţionate de la senzorii NXT prin<br />

interogare de la PC descrise mai sus.<br />

Aplicaţia prezintă o interfaţă grafică facilă prin intermediul căreia se poate iniţia conectarea<br />

sau deconectarea prin Bluetooth a PC-ului la NXT.<br />

Aplicaţia realizează următoarele operaţii:<br />

✓ realizează conectarea prin Bluetooth a celor două sisteme: PC şi robot NXT;<br />

✓ setează modul de funcţionare al senzorului cu ultrasunete (“Continous read mode”);<br />

✓ efectuează la un anumit interval de timp citiri ale valorii furnizate de senzorul cu<br />

ultrasunete;<br />

✓ înregistrează fiecare valoare a distanţei citite şi o asociază cu valoarea rotaţiei<br />

motorului (unghiul) din momentul respectiv;<br />

✓ afişează în interfaţă grafică valoarea curentă a distanţei măsurate, a rotaţiei motorului<br />

şi a rotaţiei relative faţă de momentul pornirii procesului;<br />

✓ în funcţie de poziţia rotorului, se decide schimbarea sensului de rotaţie sau continuarea<br />

mişcării în sensul curent;<br />

✓ controlează viteza şi rotaţia motorului după fiecare măsurare a distanţei;<br />

65


Deoarece măsurarea distanţei şi transmisia informaţiei prin Bluetooth cauzează o<br />

întârziere considerabilă din momentul trimiterii comenzii până în momentul returnării rezultatului,<br />

nu se poate măsura în timp ce senzorul cu ultrasunete se roteşte cu viteză constantă.<br />

În consecinţă, măsurarea distanţei se face la intervale de timp precise, sincronizate cu<br />

staţionarea motorului după parcurgerea unei anumite rotaţii. Astfel procesul de colectare a datelor<br />

este sacadat şi lent, dar conferă o precizie superioară.<br />

5.5.2 Interfaţa grafică şi analiza datelor obţinute<br />

Analiza datelor obţinute se poate face în chiar timpul colectării lor datorită interfeţei grafice<br />

care prezintă în mod vizual o hartă virtuală a conturului spaţiului înconjurător Figura 33.<br />

Figura 33. Interfaţa grafică a aplicaţiei<br />

Intuitiv, zonele cu negru reprezintă “umbre” ale obiectelor situate în zona scanată (la<br />

distante mici), iar roşu reprezintă spaţiul gol (distante mari).<br />

În urma diferitelor încercari şi optimizări am ajuns la concluzia ca rezultatele obţinute ofera<br />

o vaga imagine a spatiului scanat. Desi pozitia obiectelor poate fi determinata, o incercare de a<br />

evalua dimensiunile obiectului nu ar oferi rezultate precise.<br />

Consider ca deficienţele sunt în mare parte datorate metodei de control şi comanda prin<br />

Bluetooth care adauga o intarziere semnificativa intre diferite masuratori şi faptului ca prin aceasta<br />

metoda nu se pot accesa anumite functionalitati software ale robotului NXT care ar permite o mai<br />

buna manevrare a servomotorului.<br />

66


6 Citirea datelor achiziţionate de la senzorii NXT sub<br />

comanda programului NXC<br />

Ca alternativă la prima metodă, prezentată la Capitolul 0, am elaborat o a doua metodă<br />

prin care se poate face transmisia datelor achiziţionate de la senzorii NXT la PC.<br />

Această a doua metodă presupune realizarea a două programe:<br />

‣ Programul emiţător care rulează pe robotul NXT (în limbajul de programare NXC) –<br />

acest program stochează date achiziţionate de la senzori, le serializează şi le trimite<br />

prin conexiune Bluetooth către PC;<br />

‣ Programul receptor care rulează pe PC (în limbajul de programare C#) – acest<br />

program monitorizează portul serial al PC-ului, citeşte datele primite de la NXT şi<br />

interpretează datele achiziţionate de la senzori.<br />

Cele două programe conlucrează pentru a realiza transmisia datelor achiziţionate de la<br />

NXT la PC, dar este evident faptul că programul de pe NXT are comanda operaţiunilor.<br />

Deşi rolurile par inversate, din punctul de vedere al conexiunii Bluetooth, cel care iniţiază<br />

conexiunea Bluetooth este tot programul de pe PC-ul, iar acest lucru se face în acelaşi mod descris<br />

la punctul 5.4.1.<br />

Avantajele acestei metode sunt:<br />

✓ Posibilitatea valorificării tuturor funcţiilor robotului prin programarea robotului în<br />

limbajul NXC;<br />

✓ Acces la funcţii care permit control mai precis al robotului;<br />

✓ Întârzieri minime între momentele de achiziţie ale datelor;<br />

✓ Comunicarea se desfăşoară într-un singur sens (de la NXT la PC), ca atare transmisia<br />

datelor durează mai puţin şi este mai sigură;<br />

✓ Posibilitatea transmiterii de date cu scop de depanare (debugging) a aplicatiilor NXC;<br />

Dezavantaje:<br />

‣ Resurse hardware şi software limitate pentru programul în NXC<br />

‣ Necesită programare şi pe partea NXT şi pe partea PC<br />

În continuare voi prezenta pe larg fiecare dintre cele două programe şi o aplicaţie la<br />

această metodă.<br />

67


6.1 Proiectarea şi implementarea programului de pe NXT (emiţătorul)<br />

6.1.1 Obiectivele programului de pe NXT<br />

Programul care rulează pe robotul NXT are rolul de a achiziţiona date de la senzorii NXT<br />

şi de a le transmite prin Bluetooth către PC.<br />

Pe scurt programul în NXC trebuie să:<br />

- Achiziţioneze date de la anumiţi senzori ai robotului NXT;<br />

- Stocheze datele într-un format care permite asocierea valorii achiziţionate de la senzor<br />

cu momentul achiziţiei;<br />

- Serializeze datele achiziţionate pentru transmisia prin Bluetooth;<br />

- Segmenteze calupul de date în pachete pentru a fi transmise prin Bluetooth;<br />

- Expedieze pachetele de date achiziţionate către PC;<br />

Programul va colecta date achiziţionate şi le va trimite la PC în salve (pachete).<br />

6.1.2 Achiziţia datelor de la senzorii NXT<br />

În limbajul de programare NXC sunt disponibile câteva funcţii (metode) destinate citirii datelor de<br />

la senzorii NXT. Pentru aplicaţiile prezentate în această lucrare voi folosi două funcţii pentru a citi<br />

datele de la doi senzori NXT: MotorTachoCount şi SensorUS [7].<br />

Funcţia MotorTachoCount returnează rotaţia axului servomotorului faţă de poziţia<br />

iniţială. Valoarea returnată este în grade şi este un număr întreg stocat pe 16 biţi care poate fi şi<br />

negativ, adică de tipul short. Această informaţie poate fi folosită pentru calcularea distanţei<br />

parcurse de robotul NXT. Encoderul care furnizează această informaţie este descris la punctul<br />

4.3.3. Funcţia SensorUS returnează ultima măsurătoare efectuată de senzorul cu ultrasunete<br />

NXT. Valoarea returnată reprezintă distanţa de la senzor până la cel mai apropiat obiect şi este în<br />

centimetri. Distanţa maximă care poate fi măsurată de către senzorul cu ultrasunete este de 255<br />

cm, adică un număr stocat pe 8 biţi, un octet (byte). Senzorul cu ultrasunete NXT este prezentat<br />

la punctul 2.3.2 şi 4.3.1.<br />

Datele achiziţionate sunt semnificative numai dacă se păstrează şi momentul la care au<br />

fost achiziţionate. Practic trebuie asociată o valoare măsurată cu momentul în care a fost<br />

măsurată. Pentru a realiza acest lucru în programare se poate folosi un vector cu 2 dimensiuni (o<br />

matrice) sau se poate folosi un tip de date numit structura (struct). Am ales varianta a doua<br />

68


deoarece tipul de date struct este similar cu conceptul de obiect virtual întâlnit în programarea<br />

Object Oriented din C# (punctul 5.3). Un alt avantaj al tipului de date struct este că permite mai<br />

uşor serializarea sa.<br />

Tipul de date struct folosit în programul dezvoltat pentru această lucrare este numit<br />

masuratoare şi se defineşte astfel:<br />

struct masuratoare<br />

{<br />

unsigned short timp;<br />

};<br />

short valoare;<br />

Pentru exemplificare, achiziţia de date de la encoderul unui servomotor şi crearea unei<br />

variabile de tipul masuratoare se poate face în felul următor:<br />

masuratoare m; // declararea variabilei de tip masuratoare<br />

m.valoare = MotorTachoCount(OUT_C); // achizitie date encoder<br />

m.timp = CurrentTick(); // nr de milisecunde<br />

Instrucţiunile de mai sus sunt incluse într-o metodă numită SalveazaMasuratoare care<br />

primeşte ca parametru valoarea unui senzor, iar fixarea în timp se face independent de tipul de<br />

senzor care a furnizat valoarea sau de valoare în sine. Mai mult, metoda construieşte un vector<br />

de tip masuratoare în care sunt stocate achiziţiile de date efectuate. Practic, fiecare<br />

masuratoare efectuată este păstrată într-un vector numit SerieMasuratori. Acest vector<br />

va fi serializat şi transmis prin Bluetooth la PC.<br />

Codul complet al programului scris în NXC este prezentat în Anexa 9.4.<br />

6.1.3 Serializarea datelor achiziţionate<br />

Pentru a putea transmite date prin conexiunea Bluetooth şi apoi la PC, datele achiziţionate<br />

de la senzorii NXT de către programul NXC trebuie serializate. Serializarea este folosită<br />

pretutindeni în transmisia informaţiei şi poate fi o tehnică de compresie sau criptare a informaţiilor<br />

transmise.<br />

În programul NXC serializarea datelor achiziţionate de la senzorii NXT se face prin<br />

intermediul unei funcţii native limbajului NXC numite FlattenVar. Funcţia FlattenVar<br />

transformă orice variabilă în reprezentarea sa sub forma de şir de caractere ASCII, adică de tip<br />

69


string. Tipul de date string ascunde în spate un vector de tip byte în care fiecare element<br />

conţine codul ASCII al caracterului reprezentat. [7]<br />

Folosind funcţia FlattenVar se poate transforma un vector de tip masuratoare întro<br />

variabilă de tip string care poate fi trimisă apoi prin Bluetooth la PC.<br />

6.1.4 Transmisia datelor prin Bluetooth de la NXT la PC<br />

În programul NXC dezvoltat pentru această lucrare, trimiterea datelor serializate în<br />

prealabil prin conexiune Bluetooth se face apelând metoda BluetoothWrite care este nativă<br />

limbajului NXC.<br />

Metoda BluetoothWrite primeşte ca parametru o variabilă de tip string care<br />

reprezintă un şir de caractere ASCII, sau mai exact un vector de tip byte. Această metodă<br />

realizează transmisia de date de la NXT la PC prin intermediul conexiunii Bluetooth. Parametrul<br />

ataşat metodei, sub formă de string, reprezintă un „mesaj” care va fi transmis la PC-ului.<br />

6.1.5 Algoritmul programului NXC<br />

Pe scurt, algoritmul programului NXC este definit de următoarele etape:<br />

1. Iniţierea măsurătorii (salvarea momentului iniţial)<br />

2. Cât timp se măsoară:<br />

2.1. Achiziţia valorii unui senzor<br />

2.2. Stocarea valorii într-un tip de date structura numită măsuratoare care permite<br />

asocierea valorii cu momentul măsurării (4 octeţi)<br />

2.3. Adăugarea măsurătorii curente la un vector tip coada de măsurători<br />

3. Încheierea procesului de măsurare<br />

4. Serializarea vectorului de măsurători într-un string numit buffer<br />

5. Segmentarea buffer-ului în pachete de câte 200 octeţi, adică 50 de măsurători<br />

6. Trimiterea pachet cu pachet a datelor serializate către PC<br />

În Figura 34 este prezentată o diagramă simplificată a algoritmului de achiziţionare a<br />

datelor de la senzorii NXT şi transmisia lor la PC de către programul scris în NXC.<br />

70


Figura 34. Diagrama simplificată a algotitmului programului NXC (emiţător)<br />

Codul sursă complet este prezentat în Anexa 9.4.<br />

6.2 Proiectarea şi implementarea programului de pe PC (receptorul)<br />

Programul care rulează pe PC are rolul de a recepţiona datele transmise de către<br />

programul NXC. Această funcţionalitate este similară cu cea îndeplinită de către programul PC de<br />

la Capitolul 5, adică citirea datelor prin interogare de la PC. Ca atare am folosit aceleaşi principii<br />

şi metode perfecţionate pentru comanda robotului prin interogare. De acestă dată accentul a fost<br />

pus pe citirea datelor de la portul serial al calculatorului, interpretarea şi stocarea lor.<br />

Clasa pe care am creat-o pentru acest scop se numeşte ReceptorNXT, iar codul complet<br />

se găseste în Anexa 9.5.<br />

6.2.1 Algoritmul programului de pe PC<br />

Pe scurt, algoritmul programului care rulează pe PC (receptorul) este definit de<br />

următoarele etape:<br />

1. Deschiderea portului serial (conexiune cu NXT)<br />

2. Cât timp se doreşte monitorizarea:<br />

2.1. Citirea seriei de bytes de la SerialPort<br />

2.2. Stabilirea capetelor pachetelor<br />

2.3. Interpretarea fiecărui pachet primit<br />

71


2.4. Conversia de la bytes la tipuri de date utilizabile în C# short, ushort<br />

2.5. Construirea unui vector de tip de date Masuratoare<br />

2.6. Stocarea vectorului de măsurători<br />

3. Afişare sau export măsurători<br />

În Figura 35 este prezentată o diagramă simplificată a algoritmului de citire a datelor de la<br />

senzorii NXT transmise la PC de către programul scris în NXC.<br />

Figura 35. Diagramă simplificată a algoritmului de citirea a datelor de la senzorii NXT transmise la PC de către<br />

programul scris în NXC<br />

Codul sursă complet este prezentat în Anexa 9.5.<br />

6.2.2 Interfaţa grafică a programului de pe PC<br />

Interfaţa grafică a programului de pe PC este ilustrată în figurile de mai jos:<br />

72


Figura 36. Interfaţa grafică a programului. Iniţierea<br />

conexiunii Bluetooth<br />

Figura 37. Interfaţa grafică a programului. Datele<br />

achiziţionate<br />

Primul pas care trebuie efectuat pentru citirea datelor de la robotul NXT este iniţierea conexiunii<br />

Bluetooth. În Figura 36 este evidenţiată zona dedicată iniţierii conexiunii Bluetooth. Aceasta se<br />

face alegând portul serial rezervat pentru comunicarea Bluetooth cu robotul NXT. Pentru rapiditate<br />

este disponibilă o listă cu porturile seriale uzuale (COM1, COM2, COM6, COM13), dar este<br />

posibilă şi introducerea manuală a numelui portului.<br />

Apăsarea butonului Conectează! realizează deschiderea portului serial. Dacă operaţiunea a avut<br />

succes, butonul este iluminat, iar pe afişajul robotului NXT se poate observa că dispozitivelele<br />

sunt cuplate Bluetooth.<br />

În continuare se poate porni monitorizarea portului serial prin apăsarea butonului Start din stânga.<br />

Astfel se porneşte o execuţie repetitivă care verifică portul serial în aşteptarea unui transfer de<br />

date.<br />

Dacă portul serial al PC-ului recepţionează date transmise prin Bluetooth de la robotul NXT,<br />

atunci acestea sunt rapid interpretate şi listate în interfaţa programului (Figura 37).<br />

Odată primite şi interpretate, datele pot fi salvate într-un fişier în format Tab delimited text pentru<br />

postprocesare.<br />

73


6.3 Aplicaţie la metoda de citire a datelor achiziţionate de la senzorii NXT<br />

sub comanda programului NXC<br />

6.3.1 Evoluţia în timp a mărimilor măsurate de către senzorii NXT<br />

Pentru testarea celor două programe prezentate la punctele 6.1 şi 6.2, am realizat robotul<br />

din Figura 38 care face uz de un servomotor NXT şi senzorul cu ultrasunete NXT.<br />

Scopul aplicaţiei este să furnizeze date achiziţionate de la senzorii NXT sub comanda<br />

programului NXC pentru a obţine graficul evoluţiei mărimilor măsurate în timp.<br />

Se va analiza evoluţia în timp a distanţei parcurse de către robot şi a distanţei până la cel<br />

mai apropiat obiect măsurate de către senzorul cu ultrasunete.<br />

Comanda robotului este de partea programului NXC care va executa următoarele<br />

instrucţiuni pentru a pune în mişcare robotul:<br />

task motion()<br />

{<br />

}<br />

// roteste ax servomotor 500 de grade cu viteza 20<br />

RotateMotor(OUT_C, 20, 500);<br />

// asteapta 3000 de ms (3 secunde)<br />

Wait(3000);<br />

// roteste ax servomotor 500 de grade cu viteza -60<br />

// (sens invers)<br />

RotateMotor(OUT_C, -60, 500);<br />

Instrucţiunea RotateMotor(OUT_C, 20, 500) va produce o rotire cu 500 de grade<br />

în sensul acelor de ceasornic a axului servomotorului conectat la portul OUT_C al robotului NXT.<br />

Viteza de rotaţie (20 în prima instrucţiune) este o mărime derivată cu valori între -100 şi 100 şi<br />

se traduce de fapt în tensiunea aplicată bornelor servomotorului (-9V şi +9V).<br />

Având în vedere construcţia robotului prezentat în Figura 38, cu tracţiunea suportată de<br />

către un singur servomotor, este evident faptul că robotul nu se poate deplasa decât pe o singură<br />

direcţie (înainte şi înapoi), iar distanţa parcursă este direct proporţională cu unghiul de rotaţie al<br />

axului servomotorului.<br />

Ca atare, robotul se va deplasa înainte cu o viteză relativ mică pe o distanţă de aprox.<br />

20cm, apoi se va opri timp de 3 secunde şi se va întoarce la poziţia iniţială cu o viteză de 3 ori mai<br />

mare.<br />

74


Pentru evaluarea datelor de la senzorul cu ultrasunete se va plasa în faţa robotului, la<br />

aproximativ 40cm, un obstacol. Pe măsură ce robotul se apropie de obstacol, senzorul cu<br />

ultrasunete ar trebui să înregistreze scăderea distanţei, iar evoluţia acestei mărimi să corespundă<br />

cu evoluţia distanţei parcurse măsurată de către encoderul servomotorului.<br />

Figura 38. Aplicaţie la metoda de citire a datelor achiziţionate sub comanda programului NXC<br />

6.3.2 Rezultatele obţinute<br />

În urma executării aplicaţiei şi a transmisiei datelor achiziţionate la PC, rezultatele au fost<br />

exportate într-un fişier Tab delimited text care a fost apoi introdus în programul Microsoft Excel<br />

pentru interpretare.<br />

75


Figura 39. Evoluţia distanţei parcurse de robot<br />

Figura 40. Evoluţia distanţei până la obstacol<br />

76


7 Analiza rezultatelor obţinute<br />

7.1 Rezultatele obţinute la aplicaţiile implementate<br />

Lucrarea de faţă prezintă două metode de transmisie a datelor achiziţionate de la senzorii<br />

NXT la PC:<br />

1. Citirea datelor achiziţionate de la senzorii NXT prin interogare de la PC (cap. 5)<br />

2. Citirea datelor achiziţionate de la senzorii NXT sub comanda unui program scris în<br />

limbajul NXC care rulează pe NXT (cap. 6)<br />

La fiecare dintre cele două metode elaborate am realizat şi câte o aplicaţie practică.<br />

Aplicaţiile respective au fost:<br />

1) Determinarea poziţiei obiectelor cu senzorul de ultrasunete (punctul 5.5)<br />

2) Evoluţia în timp a mărimilor măsurate de către senzorii NXT (punctul 6.3)<br />

Deoarece aplicaţiile implementate au obiective distincte şi modalităţi de interpretare<br />

specifice, rezultatele obţinute la fiecare dintre cele două aplicaţii sunt prezentate la capitolele<br />

respective, adică punctul 5.5 şi punctul 6.3.<br />

7.2 Compararea celor două metode<br />

Pentru compararea celor două metode am realizat o aplicaţie similară cu aplicaţia de la<br />

punctul 6.3 (Evoluţia în timp a mărimilor măsurate de către senzorii NXT).<br />

Aplicaţia realizează monitorizarea senzorilor NXT folosind simultan ambele metode în<br />

timpul executării unui set de instrucţiuni NXC care determină mişcarea robotului NXT astfel încât<br />

mărimile monitorizate să varieze în timp.<br />

Se va analiza evoluţia unghiului de rotire al axului servomotorului. Având în vedere<br />

construcţia robotului prezentat în Figura 38, cu tracţiunea suportată de către un singur servomotor,<br />

este evident faptul că robotul nu se poate deplasa decât pe o singură direcţie (înainte şi înapoi),<br />

iar distanţa parcursă este direct proporţională cu unghiul de rotaţie al axului servomotorului.<br />

Instrucţiunile de mişcare sunt: mers înainte cu viteza 20 pe o distanţă corespunzătoare<br />

unei rotiri cu 500 de grade a axului servomotorului, oprire 1 secundă, revenire la poziţia iniţială<br />

(rotire 500 grade înapoi) cu viteză de 3 ori mai mare.<br />

Rulând aplicaţia am obţinut graficul comparativ din Figura 41.<br />

77


Figura 41. Rezultatele comparării celor două metode<br />

După cum se observă în graficul din Figura 41, cele două metode furnizează rezultate<br />

aproape identice. Acestă concluzie a constituit o surpriză, deoarece mă aşteptam ca metoda 1<br />

(achiziţia datelor prin interogare de la PC) să sufere întârzieri datorate unui algoritm mai complex<br />

şi traficului mai frecvent prin conexiune Bluetooth, iar curba să se decaleze faţă de curba metodei<br />

2.<br />

Ambele metode au presupus efectuarea de măsurători (achiziţii de date de la senzori) la<br />

intervale de 100ms. Prin reducerea intervalelor este posibilă apariţia decalajului menţionat mai<br />

sus, dar o rezoluţie atât de mare a datelor achiziţionate nu reprezintă un beneficiu considerabil în<br />

aplicaţiile uzuale ale robotului NXT.<br />

Fiecare dintre cele două metode elaborate în lucrarea de faţă prezintă avantaje şi<br />

dezavantaje. Având în vedere că rezultatele furnizate de către cele două metode sunt aproape<br />

identice, diferenţierea acestora în proiectare se poate face în funcţie de impactul specific aplicaţiei<br />

cu avantajele/dezavantajele menţionate.<br />

78


8 Concluzii<br />

Tema proiectului de diplomă se referă la un domeniu de actualitate, vizând valorificarea<br />

eficientă a unor elemente disponibile în domeniul roboţilor mobili de uz ştiinţific şi didactic (suportul<br />

LEGO Mindstorms NXT) în scopul dezvoltării platformei de comunicaţii prin Bluetooth a acestora<br />

cu elemente soft care să ofere un mediu favorabil şi fiabil potenţialelor aplicaţii.<br />

Acest scop a fost realizat, conform cerinţelor şi detaliilor impuse prin temă, prin elaborarea<br />

a două metode de transmitere a datelor achiziţionate de la senzorii NXT, de la robotul mobil la PC.<br />

Pentru fiecare metodă s-a realizat un program-soft corespunzător, precum şi câte o aplicaţie care<br />

să concretizeze şi să verifice eficienţa metodei, iar acest aspect a fost confirmat, atât prin<br />

rezultatele aplicaţiilor asociate, cât şi prin rezultatele unei aplicaţii elaborată special pentru<br />

compararea celor două metode.<br />

Dificultăţile întâlnite în elaborarea proiectului au fost legate de particularităţile programării<br />

robotului LEGO NXT. Limitările software cât şi cele hardware ale robotului NXT m-au motivat să<br />

gasesc modalităţi inedite de a realiza obiectivele propuse. În final eforturile mele au dus la<br />

obţinerea unor algoritmi şi programe performante care utilizează în mod optim resursele<br />

disponibile.<br />

Faptul că, la compararea rezultatelor aplicării celor două metode, s-au obţinut date<br />

aproape identice determină concluzia că ambele metode sunt caracterizate de un nivel ridicat de<br />

acurateţe în domeniul timp. Întârzierea transferului de date prin conexiune Bluetooth este<br />

neglijabilă în raport cu reacţia în timp a elementelor de execuţie ale robotului (servomotorul) sau<br />

reacţia în timp a anumitor senzori.<br />

Ca urmare, metodele şi programele create asigură un nivel de performanţă ridicat şi oferă<br />

o rezervă considerabilă în perspectiva unor aplicaţii cu elemente de execuţie mai rapide.<br />

Este important de menţionat că cele două metode nu exclud, pentru viitor, elaborarea şi a<br />

altor programe (îmbunătăţite) cu acelaşi scop, iar programele pe care le-am realizat reprezintă o<br />

bază flexibilă pentru rularea unei diversităţi de aplicaţii ştiinţifice sau didactice.<br />

Bibliografie<br />

[1] ***, LEGO® Mindstorms® NXT® Hardware Developer Kit.<br />

79


[2] ***, LEGO® Mindstorms® NXT® Bluetooth Developer Kit<br />

[3] ***, LEGO® Mindstorms® NXT® Direct commands<br />

[4] ***, Mindstorms® Education NXT® User Guide<br />

[5] Dave Astolfo, Mario Ferrari, Giulio Ferrari, Building Robots with LEGO® Mindstorms® NXT®<br />

[6] Michael Gasperi, Philippe “Philo” Hurbain, Isabelle Hurbain, Extreme NXT® Extending the<br />

LEGO® MINDSTORMS® NXT® to the Next Level<br />

[7] John Hansen, Not eXactly C (NXC) Programmer's Guide.<br />

[8] Daniele Benedettelli, Programming LEGO® NXT® Robots using NXC [9] *** ,<br />

www.parallax.com<br />

[10] Radu Bogdan Rusu, Robotux - a multiagent robot security system. Master's Thesis, Faculty<br />

of Automation and Computer Science, Technical University of Cluj-Napoca, Romania, 2004. [11]<br />

*** http://www.philohome.com/nxt.htm<br />

[12] *** , http://me.mecatronica.pub.ro/romar/etape/etapa_3/Legatura%202_1.pdf<br />

[13] Radu Bogdan Rusu, Modern architectures for mobile robots: Javaclient and ZeeRO.<br />

Advanced Master's Thesis, Faculty of Automation and Computer Science, Technical<br />

University of Cluj-Napoca Romania, 2005<br />

[14] *** , http://yo9hnh.files.wordpress.com/2008/10/introducere-în-microcontrollere.pdf<br />

[15] *** , www.mikroe.com/ro/product/books/PICbook/2_01Poglavlje.htm<br />

[16] Dumitriu, A., Bucşan, C., Demian, T., Sisteme senzoriale pentru roboţi, Editura MEDRO,<br />

Bucureşti, 1996.<br />

[17] Dumitriu, A., Mecatronică, volumul I, Editura Universităţii „Transilvania” din Braşov, 2006.<br />

[18] Grigore, O., An Incremental Motion Tracking Controller for on Board Directly Platform, În:<br />

Rev. Roum. Sci. Techn. – Electrotehn. Et Energ., 3, Bucharest, 2000.<br />

[19] *** , www.LegoDacta.com<br />

[20] *** , http://telecom.etc.tuiasi.ro/telecom/staff/ccomsa/Lucru/<br />

Introducere_în_Bluetooth.pdf<br />

[21] *** , http://stst.elia.pub.ro/RIC/Teme_RIC_2006_7/AlexandraAlmasan/<br />

RETELE%20WIRELESS%20DE%20MICI%20DIMENSIUNI.doc<br />

[22] *** , ftp.utcluj.ro/pub/users/cmil/rwcm/week3/bluetooth01.ppt<br />

[23] *** , http://en.wikipedia.org/wiki/Bluetooth<br />

[24] *** , IEEE Oregon bluetooth seminar-2001<br />

[25] *** , http://me.mecatronica.pub.ro/romar/etape/etapa_2/Legatura%203.pdf<br />

80


[26] *** , http://www.bluetooth.com/<br />

[27] Jon Inouye, Introduction to BluetoothWireless Technology -Mobile Platforms Group Intel<br />

Corporation<br />

[28] *** , Ericsson Mobile Communications AB „Users Manual – Bluetooth PC Reference Stack<br />

by Ericsson”, 2000<br />

[29] Muller, Nathan J., „Bluetooth Demistified” – McGraw-Hill Telecom, 2001<br />

[30] Coiffet, P., La robotique – principles et applications, Editions Hermes Paris, 1986,<br />

81


Anexe<br />

9 Anexe<br />

9.1 Anexa 1. Metoda 1. Clasa OperatorNXT<br />

using System;<br />

using System.Collections.Generic;<br />

using System.Text; using<br />

System.IO.Ports; using<br />

Bram.Utilities;<br />

namespace PC2NXT<br />

{<br />

public class OperatorNXT {<br />

public OperatorNXT(string portname){<br />

_portName = portname;<br />

}<br />

private string _portName;<br />

private SerialPort port = null;<br />

public void Connect(){<br />

if(port != null){<br />

Disconnect();<br />

}<br />

port = new SerialPort(_portName);<br />

port.Open();<br />

IsConnected = true;<br />

}<br />

public void Disconnect(){<br />

IsConnected = false;<br />

if(port.IsOpen){<br />

port.Close();<br />

port.Dispose();<br />

}<br />

port = null;<br />

}<br />

/// <br />

/// semafor care marcheaza conexiune activa sau nu<br />

/// <br />

public bool IsConnected {<br />

get {<br />

return _isConnected;<br />

}<br />

private set {<br />

_isConnected = value;<br />

}<br />

}<br />

bool _isConnected = false;<br />

82


/// trimite serie bytes la portul serial<br />

/// <br />

private byte[] TrimiteComanda(byte[] comanda){<br />

if(!IsConnected){<br />

throw new InvalidOperationException("trebuie conectat");<br />

} else {<br />

lock(this){<br />

int length = comanda.Length;<br />

byte[] btMessage = new byte[comanda.Length + 2];<br />

btMessage[0] = (byte)(length & 0xFF);<br />

btMessage[1] = (byte)((length & 0xFF00) >> 8);<br />

comanda.CopyTo(btMessage, 2);<br />

port.Write(btMessage, 0, btMessage.Length);<br />

if(comanda[0] < 0x80){<br />

// A reply is<br />

expected. Check it. int lsb =<br />

port.ReadByte();<br />

int msb = port.ReadByte();<br />

int size = lsb + msb * 256;<br />

byte[] reply = new byte[size];<br />

port.Read(reply, 0, size);<br />

return reply;<br />

} else { return<br />

null;<br />

}<br />

}<br />

}<br />

}<br />

/// <br />

/// seteaza starea unui motor<br />

/// <br />

public void SetStareMotor(PortNxtMotor port, sbyte power, ModNxtMotor<br />

mode, RegModNxtMotor regulationMode, sbyte turnRatio, FunctNxtMotor runState, uint<br />

tachoLimit){<br />

byte[] comanda = new byte[12];<br />

comanda[0] = 0x80;<br />

comanda[1] = (byte)CodMesajDirect.SetOutputState;<br />

comanda[2] = (byte)port;<br />

comanda[3] = (byte)power; comanda[4] =<br />

(byte)mode; comanda[5] =<br />

(byte)regulationMode; comanda[6] =<br />

(byte)turnRatio; comanda[7] =<br />

(byte)runState;<br />

Util.SetUInt32(comanda,<br />

8, tachoLimit);<br />

TrimiteComanda(comanda);<br />

}<br />

/// <br />

/// returneaza starea unui motor<br />

/// <br />

public StareMotor GetStareMotor(PortNxtMotor port){<br />

byte[] comanda = new byte[3];<br />

comanda[0] = 0x00;<br />

comanda[1] = (byte)CodMesajDirect.GetOutputState;<br />

comanda[2] = (byte)port;<br />

byte[]<br />

reply = TrimiteComanda(comanda);<br />

StareMotor<br />

raspuns = new StareMotor(); raspuns.Power =<br />

(sbyte)reply[4]; raspuns.Mode =<br />

(ModNxtMotor)reply[5]; raspuns.RegulationMode =<br />

(RegModNxtMotor)reply[6];<br />

raspuns.TurnRatio = (sbyte)reply[7];<br />

raspuns.RunState = (FunctNxtMotor)reply[8];<br />

83


aspuns.TachoLimit = Util.GetUInt32(reply, 9);<br />

raspuns.TachoCount = Util.GetInt32(reply, 13);<br />

raspuns.BlockTachoCount = Util.GetInt32(reply, 17);<br />

raspuns.RotationCount = Util.GetInt32(reply, 21);<br />

return raspuns;<br />

}<br />

/// <br />

/// seteaza modul de functionare al unui senzor<br />

/// <br />

public void SetInputMode(PortNxtSenzor port, TipNxtSenzor type,<br />

ModNxtSenzor mode){<br />

byte[] comanda = new byte[5];<br />

comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;<br />

comanda[1] = (byte)CodMesajDirect.SetInputMode;<br />

comanda[2] = (byte)port;<br />

comanda[3] = (byte)type;<br />

comanda[4] = (byte)mode;<br />

TrimiteComanda(comanda);<br />

}<br />

/// <br />

/// citeste date achiziţionate de la un senzor<br />

/// <br />

public StareSenzor GetInputValues(PortNxtSenzor port){<br />

StareSenzor raspuns = new StareSenzor();<br />

byte[] comanda = new byte[3]; comanda[0] = 0x00;<br />

// Expect an answer<br />

comanda[1] = (byte)CodMesajDirect.GetInputValues;<br />

comanda[2] = (byte)port;<br />

byte[] reply<br />

= TrimiteComanda(comanda); raspuns.Valid = (reply[4]<br />

== 1) ? true : false; raspuns.Calibrated = (reply[5]<br />

== 1) ? true : false; raspuns.Type =<br />

(TipNxtSenzor)reply[6]; raspuns.Mode =<br />

(ModNxtSenzor)reply[7]; raspuns.RawAD =<br />

Util.GetUInt16(reply, 8); raspuns.NormalizedAD =<br />

Util.GetUInt16(reply, 10); raspuns.ScaledValue =<br />

Util.GetInt16(reply, 12);<br />

raspuns.CalibratedValue = Util.GetInt16(reply, 14);<br />

return raspuns;<br />

}<br />

/// <br />

/// citeste numarul de bytes disponibil la magistrala I2C (Low speed)<br />

/// <br />

public int LSGetStatus(PortNxtSenzor port){<br />

byte[] comanda = new byte[3];<br />

comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;<br />

comanda[1] = (byte)CodMesajDirect.LSGetStatus;<br />

comanda[2] = (byte)port;<br />

byte[] reply = TrimiteComanda(comanda);<br />

return reply[3];<br />

}<br />

/// <br />

/// scrie un mesaj la magistrala I2C (low speed)<br />

/// <br />

public void LSWrite(PortNxtSenzor port, byte[] data, int<br />

returnMessageLength){<br />

if(data.Length < 1 || data.Length > 16){<br />

throw new InvalidOperationException("data length must be between 1 and 16 bytes");<br />

}<br />

byte[] comanda = new byte[5 + data.Length];<br />

comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;<br />

comanda[1] = (byte)CodMesajDirect.LSWrite;<br />

comanda[2] = (byte)port; comanda[3] =<br />

(byte)data.Length; comanda[4] =<br />

84


(byte)returnMessageLength; Array.Copy(data,<br />

0, comanda, 5, data.Length);<br />

TrimiteComanda(comanda);<br />

}<br />

/// <br />

/// citeste tot de la magistrala I2C (low speed)<br />

/// <br />

public byte[] LSRead(PortNxtSenzor port){<br />

byte[] comanda = new byte[3];<br />

comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;<br />

comanda[1] = (byte)CodMesajDirect.LSRead;<br />

comanda[2] = (byte)port;<br />

byte[] reply = TrimiteComanda(comanda);<br />

int length = (int)reply[3];<br />

byte[] raspuns = new byte[length];<br />

Array.Copy(reply, 4, raspuns, 0, length);<br />

return raspuns;<br />

}<br />

/// <br />

/// scrie un byte de la interfata I2C (low speed)<br />

/// <br />

public void I2CSetByte(PortNxtSenzor port, byte address, byte value){<br />

byte[] i2cCmd = new byte[3]; i2cCmd[0] = 0x02;<br />

i2cCmd[1] = address;<br />

i2cCmd[2] = value;<br />

LSWrite(port, i2cCmd, 0);<br />

}<br />

/// <br />

/// citeste un byte de la interfata I2C (low speed)<br />

/// <br />

public byte I2CGetByte(PortNxtSenzor port, byte address){<br />

byte[] i2cCmd = new byte[2];<br />

i2cCmd[0]<br />

= 0x02; i2cCmd[1] = address;<br />

int bytesRead = 0;<br />

do {<br />

LSWrite(port, i2cCmd, 1);<br />

try {<br />

bytesRead = LSGetStatus(port);<br />

}<br />

catch(Exception){<br />

bytesRead = 0;<br />

}<br />

} while(bytesRead < 1);<br />

return LSRead(port)[0];<br />

}<br />

}<br />

public struct StareMotor {<br />

public sbyte Power;<br />

public<br />

ModNxtMotor Mode;<br />

public RegModNxtMotor<br />

RegulationMode;<br />

public sbyte TurnRatio;<br />

public FunctNxtMotor RunState;<br />

public uint TachoLimit;<br />

public int<br />

TachoCount;<br />

public int BlockTachoCount;<br />

public int RotationCount;<br />

}<br />

public struct StareSenzor {<br />

public bool Valid; public<br />

bool Calibrated; public<br />

TipNxtSenzor Type; public<br />

ModNxtSenzor Mode; public<br />

UInt16 RawAD; public<br />

85


UInt16 NormalizedAD;<br />

public Int16 ScaledValue;<br />

public Int16<br />

CalibratedValue;<br />

}<br />

public enum CodMesajDirect : byte {<br />

StartProgram = 0x00,<br />

StopProgram = 0x01,<br />

PlaySoundFile = 0x02,<br />

PlayTone = 0x03,<br />

SetOutputState = 0x04,<br />

SetInputMode = 0x05,<br />

GetOutputState = 0x06,<br />

GetInputValues = 0x07,<br />

MessageWrite = 0x09,<br />

ResetMotorPosition = 0x0A,<br />

GetBatteryLevel = 0x0B,<br />

KeepAlive = 0x0D,<br />

LSGetStatus = 0x0E,<br />

LSWrite = 0x0F,<br />

LSRead = 0x10,<br />

MessageRead = 0x13,<br />

OpenRead = 0x80,<br />

OpenWrite = 0x81,<br />

Read = 0x82,<br />

Write = 0x83,<br />

SetBrickName = 0x98<br />

}<br />

public enum CodRaspuns : byte {<br />

OK = 0x00,<br />

PendingCommunicationInProgress = 0x20,<br />

SpecifiedMailBoxEmpty = 0x40,<br />

RequestFailed = 0xBD,<br />

UnknownCommand = 0xBE,<br />

InsanePacket = 0xBF,<br />

publicOfRangeData = 0xC0,<br />

CommBusError = 0xDD,<br />

publicOfMemoryInCommunicationBuffer = 0xDE,<br />

ChannelInvalid = 0xDF,<br />

ChannelBusy = 0xE0,<br />

NoActiveProgram = 0xEC,<br />

IllegalSizeSpecified = 0xED,<br />

IllegalMailboxID = 0xEE,<br />

InvalidFieldAccess = 0xEF,<br />

BadData = 0xF0,<br />

publicOfMemory = 0xFB,<br />

BadArguments = 0xFF<br />

}<br />

[Flags()]<br />

public enum ModNxtMotor : byte {<br />

None = 0x00,<br />

MotorOn = 0x01,<br />

Brake = 0x02,<br />

Regulated = 0x04<br />

}<br />

[Flags]<br />

public enum RegModNxtMotor : byte {<br />

Idle = 0x00,<br />

MotorSpeed = 0x01,<br />

MotorSynchronization = 0x02<br />

86


}<br />

[Flags]<br />

public enum FunctNxtMotor : byte {<br />

Idle = 0x00,<br />

RampUp = 0x10,<br />

Running = 0x20,<br />

Rampdown = 0x40<br />

}<br />

public enum PortNxtMotor {<br />

PortA = 0x00,<br />

PortB = 0x01,<br />

PortC = 0x02,<br />

None = 0xFE,<br />

All = 0xFF<br />

}<br />

public enum PortNxtSenzor {<br />

Port1 = 0x00,<br />

Port2 = 0x01,<br />

Port3 = 0x02,<br />

Port4 = 0x03,<br />

None = 0xFE<br />

}<br />

public enum TipNxtSenzor {<br />

None = 0x00,<br />

Switch = 0x01,<br />

Temperature = 0x02,<br />

Reflection = 0x03,<br />

Angle = 0x04,<br />

LightActive = 0x05,<br />

LightInactive = 0x06,<br />

SoundDB = 0x07,<br />

SoundDBA = 0x08,<br />

Custom = 0x09,<br />

LowSpeed = 0x0A,<br />

LowSpeed_9V = 0x0B<br />

}<br />

public enum ModNxtSenzor {<br />

Raw = 0x00,<br />

Boolean = 0x20,<br />

TransitionCounter = 0x40,<br />

PeriodCounter = 0x60,<br />

Percentage = 0x80,<br />

Celsius = 0xA0,<br />

Fahrenheit = 0xC0,<br />

AngleStep = 0xE0<br />

}<br />

public enum NxtCommandType {<br />

DirectCommandWithResponse = 0x00,<br />

SystemCommandWithResponse = 0x01,<br />

Reply,<br />

DirectCommandNoResponse = 0x80,<br />

SystemCommandNoResponse = 0x81<br />

}<br />

}<br />

87


9.2 Anexa 2. Metoda 1. Modul de afisare a datelor de la senzorul cu<br />

ultrasunete<br />

using<br />

System;<br />

using System.Collections.Generic;<br />

using System.ComponentModel;<br />

using System.Drawing; using<br />

System.Data; using System.Text;<br />

using System.Windows.Forms; using<br />

System.Collections; using<br />

System.Drawing.Drawing2D;<br />

namespace PC2NXT<br />

{<br />

public partial class SonarMap : UserControl<br />

{<br />

private Brush brush1 = new SolidBrush(Color.Red);<br />

private Brush brush2 = new SolidBrush(Color.Black);<br />

private<br />

Brush brush3 = new SolidBrush(Color.AliceBlue);<br />

public int<br />

RotationRange = 0;<br />

public SonarMap()<br />

{<br />

InitializeComponent();<br />

}<br />

private void SonarMap_Load(object sender, EventArgs e)<br />

{<br />

}<br />

public void Init(int RotationRange)<br />

{<br />

this.RotationRange = RotationRange;<br />

this.Clear();<br />

label1.Text = "";<br />

label2.Text = "";<br />

}<br />

private ArrayList _FoundObjects;<br />

public ArrayList FoundObjects<br />

{<br />

get<br />

{<br />

return _FoundObjects;<br />

}<br />

set<br />

{<br />

_FoundObjects = value;<br />

}<br />

}<br />

public void Clear()<br />

{<br />

panel1.CreateGraphics().Clear(panel1.BackColor);<br />

}<br />

public void Draw(SomeObject obj)<br />

{<br />

Draw(obj, panel1.CreateGraphics());<br />

}<br />

public void Draw(SomeObject obj, Graphics graphics)<br />

{<br />

int W = panel1.Width;<br />

int H = panel1.Height - 10;<br />

88


int w = (int)(W / RotationRange);<br />

int h = (int)(H * obj.Distance / 255);<br />

int x = (int)(w * obj.Rotation);<br />

graphics.FillRectangle(brush1, x, 10 + H - h, 4, h);<br />

graphics.FillRectangle(brush2, x, 10, 4, H - h);<br />

graphics.FillRectangle(brush3, 0, 0, W, 10);<br />

graphics.FillPolygon(brush1, new Point[] {new Point(x - 3, 0), new<br />

Point(x, 8), new Point(x + 4, 0)});<br />

}<br />

private void DrawAll(Graphics graphics)<br />

{<br />

if (this.FoundObjects != null)<br />

for (int i = 0; i < this.FoundObjects.Count; i++)<br />

Draw((SomeObject)this.FoundObjects[i], graphics);<br />

}<br />

public void DrawAll(ArrayList PartiallyFoundObjects)<br />

{<br />

this.FoundObjects = PartiallyFoundObjects;<br />

DrawAll(panel1.CreateGraphics());<br />

}<br />

private void panel1_Paint(object sender, PaintEventArgs e)<br />

{<br />

DrawAll(e.Graphics);<br />

}<br />

private void SonarMap_Resize(object sender, EventArgs e)<br />

{<br />

panel1.Width = this.Width;<br />

}<br />

private int? SelectionStart = null;<br />

private void panel1_MouseDown(object sender, MouseEventArgs e)<br />

{<br />

if (e.Button == MouseButtons.Right)<br />

{<br />

if (SelectionStart != null)<br />

{<br />

SelectionStart = null;<br />

panel1.Cursor = Cursors.Default;<br />

}<br />

else<br />

{<br />

SelectionStart = e.X;<br />

panel1.Cursor = Cursors.VSplit;<br />

}<br />

}<br />

}<br />

private void panel1_MouseMove(object sender, MouseEventArgs e)<br />

{<br />

if (SelectionStart != null)<br />

{<br />

label1.Text = "Distanta minima: " +<br />

GetMinDistanceBetween((int)SelectionStart, e.X);<br />

label1.Text = "intre " + SelectionStart + " şi " + e.X;// +<br />

GetWidthBetween((int)SelectionStart, e.X);<br />

}<br />

else<br />

{<br />

89


label1.Text = "Distanta: " + GetDistanceAround(e.X);<br />

label2.Text = "";<br />

}<br />

}<br />

private int GetDistanceAround(int x)<br />

{<br />

if (FoundObjects == null) return 0; int<br />

r = XToRotation(x); ArrayList vals = new<br />

ArrayList(); for (int i = 0; i <<br />

FoundObjects.Count; i++)<br />

{<br />

int R = ((SomeObject)FoundObjects[i]).Rotation;<br />

if (R == r)<br />

{<br />

return ((SomeObject)FoundObjects[i]).Distance;<br />

}<br />

else if (Math.Abs(R - r) < 3)<br />

{<br />

vals.Add(((SomeObject)FoundObjects[i]).Distance);<br />

}<br />

}<br />

if (vals.Count > 0)<br />

{<br />

int sum = 0;<br />

for (int i = 0; i < vals.Count; i++)<br />

{<br />

sum += (int)vals[i];<br />

}<br />

return (int)(sum / vals.Count);<br />

}<br />

return 0;<br />

}<br />

private int GetMinDistanceBetween(int StartX, int x)<br />

{<br />

if (FoundObjects == null) return 0;<br />

int r1 = XToRotation(StartX);<br />

int r2 = XToRotation(x);<br />

if (r1 > r2){<br />

int a = r1; r1 =<br />

r2; r2 = a;<br />

}<br />

ArrayList vals = new ArrayList();<br />

for (int i = 0; i < FoundObjects.Count; i++)<br />

{<br />

int R = ((SomeObject)FoundObjects[i]).Rotation;<br />

if (r1


}<br />

}<br />

private int XToRotation(int x)<br />

{<br />

return (int)(x / (panel1.Width / RotationRange));<br />

}<br />

}<br />

9.3 Anexa 3. Metoda 1. Programul principal al aplicatiei<br />

using System;<br />

using System.Collections.Generic;<br />

using System.ComponentModel;<br />

using System.Data; using<br />

System.Drawing; using<br />

System.Text; using<br />

System.Windows.Forms; using<br />

System.Collections;<br />

namespace PC2NXT<br />

{<br />

public partial class Form1 : Form<br />

{<br />

private const int SonarConeAngle = 100;<br />

private const int SonarConeAngleInDegrees = 90;<br />

public Form1()<br />

{<br />

InitializeComponent();<br />

}<br />

private OperatorNXT nxt = new OperatorNXT("COM6");<br />

private PortNxtSenzor SonarPort = PortNxtSenzor.Port1;<br />

private PortNxtMotor MotorPort = PortNxtMotor.PortC;<br />

private ArrayList FoundObjects = new ArrayList();<br />

private int RotationDirection = 1;<br />

private int RotationReference = 0;<br />

private int RotationDiff = 0;<br />

private<br />

int RotationLimit = 400;<br />

private bool<br />

scanning = false;<br />

private void button1_Click(object sender, EventArgs e)<br />

{<br />

if (nxt.IsConnected)<br />

Disconnect();<br />

else<br />

Connect();<br />

}<br />

private void button2_Click(object sender, EventArgs e)<br />

{<br />

if (scanning)<br />

{<br />

scanning = false;<br />

button2.Text = "Start";<br />

}<br />

else<br />

{<br />

FoundObjects.Clear();<br />

RotationLimit = Int32.Parse(textBox1.Text);<br />

MotorInit();<br />

sonarMap.FoundObjects = this.FoundObjects;<br />

sonarMap.Init(RotationLimit);<br />

sonarGauge.Init(RotationToAngle(RotationReference), 0);<br />

button2.Text = "Stop";<br />

91


scanning = true;<br />

}<br />

}<br />

private void Connect()<br />

{<br />

nxt.Connect();<br />

if (nxt.IsConnected)<br />

{<br />

SonarInit();<br />

MotorInit();<br />

timer1.Enabled = true;<br />

timer1.Interval = 1600;<br />

button1.Text = "Disconnect";<br />

}<br />

}<br />

private void Disconnect()<br />

{<br />

timer1.Enabled = false;<br />

nxt.Disconnect();<br />

button1.Text = "Connect";<br />

}<br />

private void SonarInit()<br />

{<br />

nxt.SetInputMode(SonarPort, TipNxtSenzor.LowSpeed_9V,<br />

ModNxtSenzor.Raw);<br />

if (nxt.LSGetStatus(SonarPort) > 0)<br />

{<br />

nxt.LSRead(SonarPort);<br />

}<br />

nxt.I2CSetByte(SonarPort, (byte)NxtSonarRegister.Mode, 0x02);<br />

}<br />

private int SonarGetDistance()<br />

{<br />

return SonarGetDistance(NxtSonarRegister.MeasurementByte0);<br />

}<br />

private int SonarGetDistance(NxtSonarRegister meas)<br />

{<br />

try<br />

{<br />

return nxt.I2CGetByte(SonarPort, (byte)meas);<br />

}<br />

catch (Exception ex)<br />

{<br />

return -1;<br />

}<br />

}<br />

private void timer1_Tick(object sender, EventArgs e){<br />

if (nxt.IsConnected == false) return;<br />

int<br />

Rotation = MotorGetRotation(); int Distance =<br />

SonarGetDistance();<br />

int RelativeRotation = Rotation<br />

- RotationReference; lblSonar.Text = "Distanta: " +<br />

Distance;<br />

lblRotation.Text = "Rotatie: " + Rotation + " : " +<br />

(RelativeRotation);<br />

lblRotationReference.Text = "Rotatie de referinta: " +<br />

RotationReference;<br />

if (!scanning) return;<br />

// log info<br />

txtLog.AppendText(RelativeRotation + " : " + Distance + "\r\n");<br />

92


store distance<br />

ObjectCheckNew(Distance, RelativeRotation);<br />

// what to do next?<br />

if (RelativeRotation > RotationLimit)<br />

{<br />

RotationDirection = -1;<br />

RotationDiff++;<br />

}<br />

else if (RelativeRotation < 0)<br />

{<br />

RotationDirection = 1;<br />

RotationDiff++;<br />

}<br />

else if (RelativeRotation == 0)<br />

{<br />

RotationDirection = 1;<br />

RotationDiff++;<br />

}<br />

sonarMap.FoundObjects = this.FoundObjects;<br />

sonarMap.Draw(new ObiectDetectat(Distance, RelativeRotation));<br />

//sonarGauge.Angle = RotationToAngle(Rotation);<br />

//sonarGauge.Distance = Distance;<br />

//sonarGauge.Draw();<br />

RotesteServo(10, 20 + RotationDiff);<br />

}<br />

private void ObjectCheckNew(int Distance, int Rotation){<br />

ObiectDetectat CurrentObject = new ObiectDetectat(Distance,<br />

Rotation);<br />

if (FoundObjects.Count == 0)<br />

ObjectAdd(CurrentObject);<br />

else<br />

{<br />

//ObiectDetectat PreviousObject =<br />

(ObiectDetectat)FoundObjects[FoundObjects.Count - 1];<br />

//if (PreviousObject.CompareDistance(CurrentObject) != 0)<br />

ObjectAdd(CurrentObject);<br />

}<br />

}<br />

private void ObjectAdd(ObiectDetectat obj){<br />

// parcurge valorile existente pentru a asigura ordinea crescatoare<br />

for (int i = 0; i < FoundObjects.Count; i++){<br />

if (((ObiectDetectat)FoundObjects[i]).Rotation > obj.Rotation){<br />

FoundObjects.Insert(i, obj);<br />

return;<br />

}<br />

}<br />

FoundObjects.Add(obj);<br />

}<br />

private void MotorInit(){<br />

RotationReference = MotorGetRotation();<br />

}<br />

private int MotorGetRotation(){<br />

StareMotor motorState = nxt.GetStareMotor(MotorPort);<br />

return motorState.TachoCount;<br />

}<br />

private int RotationToAngle(int rotation){<br />

double angle = ((180.00 / 420.00) * (rotation -<br />

RotationReference));<br />

double offset = ((180.00 / 420.00) * ((double)RotationLimit / 2));<br />

return (int)(angle + offset);<br />

93


}<br />

/// <br />

/// porneste motorul<br />

/// <br />

public void RotesteServo(int speed, int degrees){<br />

SetStareMotor(<br />

speed,<br />

ModNxtMotor.MotorOn | ModNxtMotor.Brake,<br />

RegModNxtMotor.MotorSpeed,<br />

0,<br />

FunctNxtMotor.Running,<br />

degrees<br />

);<br />

}<br />

/// <br />

/// opreste motorul prin compensarea inertiei<br />

/// <br />

public void Frana(){<br />

SetStareMotor(<br />

0,<br />

ModNxtMotor.MotorOn | ModNxtMotor.Brake |<br />

ModNxtMotor.Regulated,<br />

RegModNxtMotor.MotorSpeed,<br />

0,<br />

FunctNxtMotor.Running,<br />

0<br />

);<br />

}<br />

/// <br />

/// seteaza starea motorului<br />

/// <br />

public void SetStareMotor(int power, ModNxtMotor mode, RegModNxtMotor<br />

regulationMode, int turnRate, FunctNxtMotor runState, int tachoLimit){<br />

nxt.SetStareMotor(<br />

MotorPort,<br />

(sbyte)(power * RotationDirection),<br />

mode,<br />

regulationMode,<br />

(sbyte)turnRate,<br />

runState,<br />

(uint)tachoLimit<br />

);<br />

}<br />

}<br />

public class ObiectDetectat<br />

{<br />

public int Distance = 0;<br />

public int Rotation = 0;<br />

public ObiectDetectat(int Distance, int Rotation)<br />

{<br />

this.Distance = Distance;<br />

this.Rotation = Rotation;<br />

}<br />

public int CompareDistance(ObiectDetectat other)<br />

{<br />

if (this.Distance < other.Distance)<br />

return -1;<br />

else if (this.Distance > other.Distance)<br />

return 1;<br />

else<br />

return 0;<br />

94


}<br />

}<br />

public enum NxtSonarRegister {<br />

MeasurementUnits = 0x14,<br />

PollInterval = 0x40,<br />

Mode = 0x41,<br />

MeasurementByte0 = 0x42,<br />

MeasurementByte1 = 0x43,<br />

MeasurementByte2 = 0x44,<br />

MeasurementByte3 = 0x45,<br />

MeasurementByte4 = 0x46,<br />

MeasurementByte5 = 0x47,<br />

MeasurementByte6 = 0x48<br />

}<br />

}<br />

9.4 Anexa 4. Metoda 2. Programul NXC<br />

#define BT_CONN 0<br />

#define BT_PACKET_LEN 200 //bytes struct<br />

masuratoare<br />

{<br />

unsigned short timp;<br />

short valoare;<br />

};<br />

masuratoare SerieMasuratori1[], SerieMasuratori2[];<br />

unsigned long MasuratoareLastTime1,<br />

MasuratoareLastTime2; bool SeMasoara; int<br />

VerificaStatusBT()<br />

{<br />

CommBTCheckStatusType StatusArgs;<br />

StatusArgs.Connection = BT_CONN;<br />

TextOut(0, LCD_LINE2, "SysCommBTCheckStatus", true);<br />

SysCommBTCheckStatus(StatusArgs);<br />

switch(StatusArgs.Result)<br />

{ case<br />

LDR_SUCCESS:<br />

break;<br />

TextOut(0, LCD_LINE2, "LDR_SUCCESS", true);<br />

case STAT_COMM_PENDING:<br />

TextOut(0, LCD_LINE2, "STAT_COMM_PENDING", true);<br />

Wait(100);<br />

break;<br />

case<br />

ERR_INVALID_PORT:<br />

TextOut(0, LCD_LINE2, "ERR_INVALID_PORT", true);<br />

Wait(1000);<br />

break;<br />

case<br />

ERR_COMM_CHAN_NOT_READY:<br />

TextOut(0, LCD_LINE2, "ERR_COMM_CHAN_NOT_READY", true);<br />

Wait(1000);<br />

break;<br />

default:<br />

string str = NumToStr(StatusArgs.Result);<br />

TextOut(0, LCD_LINE2, StrCat("other err = ", str), true);<br />

Wait(2000);<br />

break;<br />

}<br />

return StatusArgs.Result;<br />

}<br />

95


ool TrimitePrinBT(string str)<br />

{<br />

until (VerificaStatusBT() == LDR_SUCCESS);<br />

BluetoothWrite(BT_CONN, str); until<br />

(VerificaStatusBT() == LDR_SUCCESS);<br />

return true;<br />

}<br />

void StartMasuratori()<br />

{<br />

MasuratoareLastTime1 = CurrentTick();<br />

MasuratoareLastTime2 = CurrentTick();<br />

SeMasoara = true;<br />

}<br />

void StopMasuratori()<br />

{<br />

SeMasoara = false;<br />

}<br />

void SalveazaMasuratoare(byte SeriesNumber, short valoare)<br />

{<br />

if (!SeMasoara){<br />

return; }<br />

unsigned long now = CurrentTick();<br />

masuratoare m, tmp[];<br />

m.valoare = valoare;<br />

switch(SeriesNumber)<br />

{<br />

case 1:<br />

m.timp = now - MasuratoareLastTime1;<br />

//MasuratoareLastTime1 = now; tmp =<br />

SerieMasuratori1;<br />

ArrayBuild(SerieMasuratori1, tmp, m);<br />

break; case 2:<br />

m.timp = now - MasuratoareLastTime2;<br />

//MasuratoareLastTime2 = now; tmp =<br />

SerieMasuratori2;<br />

ArrayBuild(SerieMasuratori2, tmp, m);<br />

break;<br />

} }<br />

string SerializeazaVectorMasuratori(masuratoare ms[])<br />

{<br />

return FlattenVar(ms);<br />

}<br />

bool TrimiteMasuratori(byte SeriesNumber)<br />

{<br />

masuratoare clear_series[];<br />

string buffer, sn, packet; buffer<br />

= "";<br />

sn = FlattenVar(SeriesNumber);<br />

switch(SeriesNumber)<br />

{<br />

case 1:<br />

buffer = SerializeazaVectorMasuratori(SerieMasuratori1);<br />

SerieMasuratori1 = clear_series;<br />

break; case 2:<br />

96


uffer = SerializeazaVectorMasuratori(SerieMasuratori2);<br />

SerieMasuratori2 = clear_series;<br />

break;<br />

} int i, len;<br />

len = StrLen(buffer);<br />

for (i = 0; i < len; i += BT_PACKET_LEN)<br />

{<br />

packet = SubStr(buffer, i, BT_PACKET_LEN);<br />

packet = StrCat(sn, packet);<br />

TrimitePrinBT(packet);<br />

} return<br />

true;<br />

} task<br />

motion()<br />

{<br />

RotateMotor(OUT_C, 20, 500);<br />

Wait(3000);<br />

RotateMotor(OUT_C, -60, 500);<br />

}<br />

task masuratori()<br />

{<br />

while (SeMasoara && ButtonPressed(BTNCENTER, true) == false)<br />

{ short i = 0;<br />

i = MotorTachoCount(OUT_C);<br />

SalveazaMasuratoare(1, i);<br />

i = SensorUS(IN_1);<br />

SalveazaMasuratoare(2, i);<br />

Wait(100);<br />

}<br />

StopMasuratori();<br />

int i = 0; string<br />

s = "";<br />

i = ArrayLen(SerieMasuratori1);<br />

s = NumToStr(i);<br />

TextOut(0, LCD_LINE1, StrCat("Series1 ", s), true);<br />

i = ArrayLen(SerieMasuratori2);<br />

s = NumToStr(i);<br />

TextOut(0, LCD_LINE2, StrCat("Series2 ", s), false);<br />

Wait(5000);<br />

TrimiteMasuratori(1);<br />

TrimiteMasuratori(2);<br />

Stop(true);<br />

} task<br />

main()<br />

{<br />

SetSensorLowspeed(IN_1);<br />

StartMasuratori(); start<br />

masuratori; start<br />

motion;<br />

}<br />

9.5 Anexa 5. Metoda 2. Clasa ReceptorNXT<br />

using System;<br />

97


using System.Collections.Generic;<br />

using System.Text; using System.IO;<br />

using System.IO.Ports; using<br />

System.Windows.Forms; using<br />

System.Runtime.InteropServices;<br />

namespace NXT2PC<br />

{<br />

public class Masuratoare<br />

{<br />

public ushort Timp;<br />

public short Valoare;<br />

}<br />

public class ReceptorNXT<br />

{<br />

public ReceptorNXT()<br />

{<br />

}<br />

private SerialPort PortSerial = new SerialPort();<br />

public string NumePort<br />

{<br />

get<br />

{<br />

return PortSerial.PortName;<br />

}<br />

set<br />

{<br />

if (!EsteConectat)<br />

PortSerial.PortName = value;<br />

}<br />

}<br />

public bool EsteConectat<br />

{<br />

get<br />

{<br />

return PortSerial.IsOpen;<br />

}<br />

}<br />

public bool Conecteaza()<br />

{<br />

if (!EsteConectat)<br />

{<br />

PortSerial.ReadBufferSize = 1024 * 10; //10 KB<br />

PortSerial.Open();<br />

PortSerial.DiscardInBuffer();<br />

}<br />

return EsteConectat;<br />

}<br />

public void Deconecteaza()<br />

{<br />

if (EsteConectat)<br />

PortSerial.Close();<br />

}<br />

public byte[] CitesteDeLaPortSerial()<br />

{<br />

byte[] reply = {};<br />

if (EsteConectat)<br />

{<br />

int size = PortSerial.BytesToRead;<br />

if (size > 0)<br />

98


{<br />

}<br />

}<br />

return reply;<br />

reply = new byte[size];<br />

PortSerial.Read(reply, 0, size);<br />

PortSerial.DiscardInBuffer();<br />

}<br />

public void CitesteMasuratoriInSeriile(ref SerieMasuratori Series1, ref<br />

SerieMasuratori Series2)<br />

{<br />

byte[] data = CitesteDeLaPortSerial();<br />

if (data.Length > 2)<br />

{<br />

int Offset, SeriesNumber;<br />

Offset = 0;<br />

Masuratoare[] ms = CitesteMasuratori(ref data, ref Offset,<br />

out SeriesNumber);<br />

while (ms != null && ms.Length > 0)<br />

{<br />

if (SeriesNumber == 1)<br />

Series1.AfiseazaMasuratorile(ms);<br />

if (SeriesNumber == 2)<br />

Series2.AfiseazaMasuratorile(ms);<br />

ms = CitesteMasuratori(ref data, ref Offset, out<br />

SeriesNumber);<br />

}<br />

}<br />

}<br />

public Masuratoare[] CitesteMasuratori(ref byte[] data, ref int offset, out int<br />

NumarSerie)<br />

{<br />

Masuratoare[] ms = null;<br />

NumarSerie = 0;<br />

if (data.Length > offset + 2)<br />

{<br />

short data_count = BytesToShort(data, offset + 0);<br />

if (data.Length >= offset + 2 + data_count)<br />

{<br />

byte struct_len = 4;<br />

byte struct_start = 2 + 1;<br />

short struct_count = 0;<br />

NumarSerie = data[offset + 2];<br />

if (Math.IEEERemainder(data_count - 2, struct_len) ==<br />

0)<br />

{<br />

struct_count = (short)((data_count - 2) /<br />

struct_len);<br />

ms = new Masuratoare[struct_count];<br />

for (int i = 0; i < struct_count; i++)<br />

{<br />

ms[i] = BytesToMasuratoare(data, offset<br />

+ struct_start + (i * struct_len));<br />

}<br />

offset += 2 + data_count;<br />

}<br />

else<br />

MessageBox.Show(String.Format("Transfer corupt<br />

(2): \ndata.Length = {0}\ndata_count = {1}\noffset = {2}", data.Length, data_count,<br />

offset));<br />

99


}<br />

else<br />

MessageBox.Show(String.Format("Transfer corupt (1):<br />

\ndata.Length = {0}\ndata_count = {1}\noffset = {2}", data.Length, data_count,<br />

offset));<br />

}<br />

return ms;<br />

}<br />

public string BytesToList(byte[] data){<br />

if (data != null && data.Length > 0){<br />

StringBuilder str = new StringBuilder();<br />

for (int i = 0; i < data.Length; i++){<br />

str.AppendLine(data[i].ToString());<br />

}<br />

return str.ToString();<br />

}<br />

return string.Empty;<br />

}<br />

public Masuratoare BytesToMasuratoare(byte[] data, int offset){<br />

Masuratoare m = new Masuratoare();<br />

m.Timp = BytesToUShort(data, offset);<br />

m.Valoare = BytesToShort(data, offset +<br />

Marshal.SizeOf(m.Timp.GetType()));<br />

return m;<br />

}<br />

public int BytesToInt(byte[] data, int offset){<br />

int len = Marshal.SizeOf(typeof(int)); //4 bytes<br />

IntPtr i = Marshal.AllocHGlobal(len);<br />

Marshal.Copy(data, offset, i, len);<br />

int val = (int)Marshal.PtrToStructure(i, typeof(int));<br />

Marshal.FreeHGlobal(i);<br />

return val;<br />

}<br />

public uint BytesToUInt(byte[] data, int offset){<br />

int len = Marshal.SizeOf(typeof(uint)); //4 bytes<br />

IntPtr i = Marshal.AllocHGlobal(len);<br />

Marshal.Copy(data, offset, i, len);<br />

uint val = (uint)Marshal.PtrToStructure(i, typeof(uint));<br />

Marshal.FreeHGlobal(i);<br />

return val;<br />

}<br />

public ushort BytesToUShort(byte[] data, int offset){<br />

int len = Marshal.SizeOf(typeof(ushort)); //2 bytes<br />

IntPtr i = Marshal.AllocHGlobal(len);<br />

Marshal.Copy(data, offset, i, len);<br />

ushort val = (ushort)Marshal.PtrToStructure(i, typeof(ushort));<br />

Marshal.FreeHGlobal(i);<br />

return val;<br />

}<br />

public short BytesToShort(byte[] data, int offset){<br />

int len = Marshal.SizeOf(typeof(short)); //2 bytes<br />

IntPtr i = Marshal.AllocHGlobal(len);<br />

Marshal.Copy(data, offset, i, len);<br />

short val = (short)Marshal.PtrToStructure(i, typeof(short));<br />

Marshal.FreeHGlobal(i);<br />

return val;<br />

}<br />

}<br />

}<br />

100


9.6 Anexa 6. Metoda 2. Modul de listare şi export date<br />

using System;<br />

using System.Collections.Generic;<br />

using System.ComponentModel;<br />

using System.Drawing; using<br />

System.Data; using System.Text;<br />

using System.Windows.Forms; using<br />

System.IO; using NXT2PC;<br />

namespace NXT2PC<br />

{<br />

public partial class SerieMasuratori : UserControl<br />

{<br />

public SerieMasuratori() {<br />

InitializeComponent();<br />

}<br />

public Masuratoare[] Masuratori {<br />

get {<br />

return _Masuratori;<br />

}<br />

set {<br />

if (value != null) {<br />

int len = _Masuratori.Length;<br />

Array.Resize(ref _Masuratori,<br />

_Masuratori.Length + value.Length);<br />

Array.Copy(value, 0, _Masuratori, len, value.Length);<br />

Salvat = false;<br />

}<br />

}<br />

}<br />

private Masuratoare[] _Masuratori = new Masuratoare[0];<br />

public string TitluSerie {<br />

get {<br />

return _TitluSerie;<br />

}<br />

set {<br />

_TitluSerie = value;<br />

groupBox1.Text = _TitluSerie;<br />

groupBox1.Text += String.Format(" ({0})",<br />

_Masuratori.Length);<br />

groupBox1.Text += Salvat ? "" : " *";<br />

}<br />

}<br />

private string _TitluSerie;<br />

public bool Salvat {<br />

get {<br />

return _Salvat;<br />

}<br />

private set {<br />

_Salvat = value;<br />

TitluSerie = TitluSerie;<br />

}<br />

}<br />

private bool _Salvat;<br />

public void AfiseazaMasuratorile() {<br />

if (Masuratori != null) {<br />

textBox1.Text = "se incarca ...";<br />

string txt = MasuratoriConcatenate();<br />

101


textBox1.Text = "Timp\tValoare" + Environment.NewLine;<br />

textBox1.AppendText("---------------" +<br />

Environment.NewLine);<br />

textBox1.AppendText(txt);<br />

}<br />

}<br />

public string MasuratoriConcatenate() {<br />

StringBuilder str = new StringBuilder();<br />

if (Masuratori != null && Masuratori.Length > 0){<br />

Masuratoare m;<br />

string line;<br />

for (int i = 0; i < Masuratori.Length; i++) {<br />

m = Masuratori[i];<br />

line = m.Timp.ToString() + "\t" +<br />

m.Valoare.ToString();<br />

str.AppendLine(line);<br />

}<br />

}<br />

return str.ToString();<br />

}<br />

public void AfiseazaMasuratorile(Masuratoare[] ms) {<br />

this.Masuratori = ms;<br />

AfiseazaMasuratorile();<br />

}<br />

private void button1_Click(object sender, EventArgs e) {<br />

SaveFileDialog FereastraSave = new SaveFileDialog();<br />

FereastraSave.DefaultExt = "txt";<br />

FereastraSave.Filter = "Tab delimited text file (*.txt)|*.txt|All files (*.*)|*.*";<br />

FereastraSave.AddExtension = true;<br />

FereastraSave.RestoreDirectory = true;<br />

FereastraSave.Title = "Salveaza pe disk: " + this.TitluSerie;<br />

FereastraSave.InitialDirectory =<br />

System.Environment.GetEnvironmentVariable("desktop"); ;<br />

if (FereastraSave.ShowDialog() == DialogResult.OK) {<br />

string filepath = FereastraSave.FileName;<br />

StreamWriter writer = new StreamWriter(filepath);<br />

writer.Write(MasuratoriConcatenate());<br />

writer.Close();<br />

Salvat = true;<br />

}<br />

FereastraSave.Dispose();<br />

FereastraSave = null;<br />

}<br />

}<br />

}<br />

9.7 Anexa 7. Metoda 2. Programul principal al aplicatiei<br />

using System;<br />

using System.Collections.Generic;<br />

using System.ComponentModel;<br />

using System.Data; using<br />

System.Drawing; using<br />

System.Text; using<br />

System.Windows.Forms;<br />

namespace NXT2PC<br />

{<br />

public partial class Form1 : Form<br />

{<br />

102


public Form1(){<br />

InitializeComponent();<br />

}<br />

private ReceptorNXT nxt2pc = new ReceptorNXT();<br />

private void button1_Click(object sender, EventArgs e){<br />

if (nxt2pc.EsteConectat)<br />

nxt2pc.Deconecteaza();<br />

else {<br />

nxt2pc.NumePort = comboBox1.Text;<br />

nxt2pc.Conecteaza();<br />

}<br />

if (nxt2pc.EsteConectat){<br />

button1.Text = "Deconecteaza";<br />

button1.BackColor = Color.PaleGreen;<br />

}<br />

else {<br />

button1.Text = "Conecteaza!";<br />

button1.BackColor = Color.LimeGreen;<br />

}<br />

}<br />

private void button2_Click(object sender, EventArgs e){<br />

timer1.Interval = 1000;<br />

timer1.Enabled = !timer1.Enabled;<br />

if<br />

(timer1.Enabled)<br />

button2.Text = "Stop";<br />

else<br />

button2.Text = "Start!";<br />

}<br />

private void timer1_Tick(object sender, EventArgs e){<br />

if (nxt2pc.EsteConectat){<br />

nxt2pc.CitesteMasuratoriInSeriile(ref measurementSeries1, ref measurementSeries2);<br />

}<br />

}<br />

private void Form1_FormClosing(object sender, FormClosingEventArgs e){<br />

if (nxt2pc.EsteConectat){<br />

if<br />

(MessageBox.Show("Aplicatia este conectata la robot.<br />

Sigur doriti sa abandonati conexiunea?", "Conexiune activa", MessageBoxButtons.YesNo,<br />

MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No){<br />

e.Cancel = true;<br />

return;<br />

}<br />

timer1.Enabled = false;<br />

nxt2pc.Deconecteaza();<br />

}<br />

}<br />

}<br />

}<br />

103

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!