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