Documente Academic
Documente Profesional
Documente Cultură
Grupa: 152 IC
Iunie 2017
Sinteza
Pentru ndeplinirea cerinelor i detaliilor impuse prin tem am realizat urmtoarele etape
principale ale proiectrii:
3. Stabilirea conexiunii Bluetooth la robotul NXT folosind unul dintre porturile seriale ale
PC-ului prin limbajul de programare C# (C Sharp);
8. Compararea celor dou metode prin elaborarea i rularea unei aplicaii speciale.
n afar de elementele consistente menionate mai sus, pentru realizarea proiectului a fost
necesar s realizez i o documentare extins asupra domeniului roboilor mobili i a celorlalte
domenii conexe temei (comunicaii, programare, senzori, servomotoare), utiliznd att Internetul
ct i alte surse reflectate n detaliu n bibliografia de la sfritul lucrrii.
Cuprins
1 Introducere................................................................................................................... 1
2 Roboi mobili ................................................................................................................ 2
2.1 Definiii, caracteristici i structur ........................................................................... 2
2.1.1 Scurt istoric. Definiii ........................................................................................ 2
2.1.2 Concepte privind existena roboilor................................................................. 2
2.1.3 Roboi mobili. Elemente de structur ............................................................... 4
2.2 Sisteme de procesare utilizate n roboi mobili (microcontrolere)............................ 5
2.2.1 Caracterizare general a microprocesoarelor i microcontrolerelor ................. 5
2.2.2 Utilizri i aplicaii ale microcontrolerelor ......................................................... 7
2.2.3 Clasificri i arhitecturi constructive ................................................................. 8
2.2.4 Tipuri de memorii folosite n microcontrolere .................................................. 10
2.2.5 Sistemul de intrri-ieiri .................................................................................. 12
2.2.6 Familii reprezentative de microcontrolere ....................................................... 14
2.2.7 Limbaje de programare i compilatoare .......................................................... 17
2.3 Senzori ................................................................................................................ 20
2.3.1 Caracteristici generale i clasificri ale principalelor tipuri de senzori ............ 20
2.3.2 Senzori cu ultrasunete ................................................................................... 22
2.3.2.1 Caracteristici generale ....................................................................................... 22
2.3.2.2 Principiul de funcionare al senzorului cu ultrasunete ......................................... 23
2.3.2.3 Senzorul cu ultrasunete Parallax PING))) ........................................................... 24
2.3.3 Senzori de contact......................................................................................... 27
2.4 Servomotoare ...................................................................................................... 28
2.5 Metode de comunicare fr fir (wireless) ............................................................. 32
2.5.1 Comunicaii n Infrarou................................................................................. 33
2.5.2 Comunicaii prin Bluetooth ........................................................................... 34
3 Tehnologia Bluetooth ............................................................................................... 36
3.1 Prezentare general ............................................................................................ 36
3.2 Principalele caracteristici ale standardului Bluetooth / IEEE 802.15.1 .................. 38
3.2.1 Clasele de putere / acoperire i securitatea Bluetooth ................................... 38
3.2.2 Stiva de protocoale Bluetooth ........................................................................ 39
3.2.3 Descoperirea dispozitivelor Bluetooth............................................................ 40
3.3 Versiuni n evoluia Bluetooth ............................................................................. 41
3.3.1 Evoluia specificaiilor Bluetooth la standardul IEEE ...................................... 41
3.3.2 Bluetooth 1.0 ................................................................................................. 42
3.3.3 Bluetooth 1.1 ................................................................................................. 42
3.3.4 Bluetooth 1.2 (Ratificat ca IEEE Standard 802.15.1-2005) .......................... 42
3.3.5 Bluetooth 2.0 (SIG-2004)............................................................................... 42
3.3.6 Bluetooth 2.1 (SIG-2007)............................................................................... 43
3.3.7 Bluetooth 3.0 (SIG-2009)............................................................................... 43
3.4 Modele i arhitecturi de utilizare ........................................................................... 43
4 Robotul LEGO Mindstorms NXT ................................................................................. 46
4.1 Generaliti ........................................................................................................... 46
4.2 Sistemul de procesare al robotului NXT ............................................................... 47
4.3 Senzorii robotului NXT ......................................................................................... 48
4.3.1 Senzorul cu ultrasunete NXT ......................................................................... 48
4.3.2 Protocolul de comunicare I2C ........................................................................ 49
4.3.3 Servomotorul NXT ......................................................................................... 49
4.4 Metode de comunicare ......................................................................................... 52
4.5 Programarea robotului LEGO NXT ....................................................................... 52
4.5.1 Limbajul de programare NXC (Not eXactly C) ............................................... 53
5 Citirea datelor achiziionate de la senzorii NXT prin interogare de la PC .................... 53
5.1 Obiectivele programului de pe PC ........................................................................ 54
5.2 Resurse hardware i software necesare .............................................................. 54
5.3 Limbajul de programare C# (C Sharp).................................................................. 56
5.4 Proiectarea i implementarea aplicaiei de pe PC ................................................ 59
5.4.1 Iniierea conexiunii Bluetooth dintre PC i NXT n C# .................................... 59
5.4.2 Comunicarea PC NXT prin interogare ........................................................ 60
5.4.3 Implementarea protocolului de control prin comenzi directe ........................ 60
5.4.4 Algoritmul metodei de interogare de la PC .................................................... 63
5.5 Aplicaie la metoda de citire a datelor achiziionate de la senzorii NXT prin interogare
de la PC ...................................................................................................................... 64
5.5.1 Determinarea poziiei obiectelor cu senzorul de ultrasunete .......................... 64
5.5.2 Interfaa grafic i analiza datelor obinute .................................................... 66
6 Citirea datelor achiziionate de la senzorii NXT sub comanda programului NXC ........ 67
6.1 Proiectarea i implementarea programului de pe NXT (emitorul) ...................... 68
6.1.1 Obiectivele programului de pe NXT ............................................................... 68
6.1.2 Achiziia datelor de la senzorii NXT ............................................................... 68
6.1.3 Serializarea datelor achiziionate ................................................................... 69
6.1.4 Transmisia datelor prin Bluetooth de la NXT la PC ........................................ 70
6.1.5 Algoritmul programului NXC .......................................................................... 70
6.2 Proiectarea i implementarea programului de pe PC (receptorul) ........................ 71
6.2.1 Algoritmul programului de pe PC ................................................................... 71
6.2.2 Interfaa grafic a programului de pe PC ....................................................... 72
6.3 Aplicaie la metoda de citire a datelor achiziionate de la senzorii NXT sub comanda
programului NXC ........................................................................................................ 74
6.3.1 Evoluia n timp a mrimilor msurate de ctre senzorii NXT ......................... 74
6.3.2 Rezultatele obinute ....................................................................................... 75
7 Analiza rezultatelor obinute ....................................................................................... 77
7.1 Rezultatele obinute la aplicaiile implementate .................................................... 77
7.2 Compararea celor dou metode ............................................................................ 77
8 Concluzii ..................................................................................................................... 79
9 Anexe ........................................................................................................................ 82
9.1 Anexa 1. Metoda 1. Clasa OperatorNXT .............................................................. 82
9.2 Anexa 2. Metoda 1. Modul de afisare a datelor de la senzorul cu ultrasunete ...... 88
9.3 Anexa 3. Metoda 1. Programul principal al aplicatiei ............................................ 91
9.4 Anexa 4. Metoda 2. Programul NXC .................................................................... 95
9.5 Anexa 5. Metoda 2. Clasa ReceptorNXT .............................................................. 97
9.6 Anexa 6. Metoda 2. Modul de listare i export date ............................................ 101
9.7 Anexa 7. Metoda 2. Programul principal al aplicatiei .......................................... 102
Lista de figuri
Figura 10. Cazuri n care obiectul nu este detectat de senzorul cu ultrasunete .............. 25
Figura 11. Test senzor Parallax PING))) pentru un paravan paralel din carton ............... 26
Figura 12. Zona de sensibilitate a senzorului Parallax PING))) pentru testul cu paravan 26
Figura 13. Activarea senzorilor bumper n momentul ciocnirii robotului cu un obiect ...... 27
Figura 17. Schema bloc a unui sistem de acionare cu servomotoare de c.c. ................ 31
Figura 38. Aplicaie la metoda de citire a datelor achiziionate sub comanda programului
NXC .......................................................................................................................................... 74
Pentru eficientizarea cercetrii pe baza modularitii i scalabilitii amintite mai sus, s-au
dezvoltate produse cu pri mecanice care respect binecunoscutul principiu LEGO al
interconexiunii dintre elemente modularizate.
LEGO Mindstorms este o serie de componente LEGO care cuprinde uniti programabile,
senzori, servomotoare i alte pri constructive. Produsul LEGO Mindstorms NXT a fost lansat n
iulie 2006 i este succesorul primului model, Robotics Invention System (RCX), care a strnit
interesul unui numr mare de amatori. Succesul setului NXT este argumentat n special de
uurina cu care se poate personaliza i extinde platforma.
n acest context, tema actualului proiect de diplom vizeaz s aplice eficient elementele
existente (suportul LEGO Mindstorms NXT), n scopul dezvoltrii platformei de comunicaii a
acestora cu elemente soft care s ofere un mediu favorabil i fiabil potenialelor aplicaii.
Datorit nevoii tot mai ridicate de transmitere fiabil a datelor cu viteze mari, tehnologiile
performante utilizate n prezent n diverse domenii ale comunicaiilor au ptruns i n roboii mobili.
Astfel, LEGO Mindstorms NXT conine ca suport de comunicaii tehnologia Bluetooth.
Performanele, ca tehnologie fiabil de acces de band larg pe distane mici, precum i eficiena
sa economic i constructiv (dispozitive cu cost redus i cele mai mici dimensiuni), au determinat
adoptarea, pe baza specificaiilor Bluetooth, a standardului IEEE 802.15.1, care a consacrat i
a dat un gir corespuntor tehnologiei.
Pe aceast linie proiectul i propune studiul i elaborarea unor elemente soft care s
permit abordarea mai eficient a sistemului de comunicaie PC robot mobil didactic, viznd
realizarea optim a proceselor de comand, achiziie de date i execuie.
1
2 Roboi mobili
Termenul de "robotics" (n traducere liber robotic) se refer la tiina care se ocup de studiul
i utilizarea roboilor. Acest termen a fost prima dat folosit de scriitorul i omul de tiin american
de origine rus, Isaac Asimov, ntr-o scurt povestioar numit "Runaround" n anul 1950.
Primii roboi s-au numit Unimates i au aprut n anii '50, fiind dezvoltai de George Devol
i Joe Engelberger. Acesta din urm a format Unimation i a fost primul care a vndut roboi, fiind
considerat de unii printele roboticii [10].
Conform enciclopediei Webster, un robot este "un dispozitiv automat, care execut funcii
normal atribuite oamenilor, sau o main cu asemnare de om".
n timp ce aceast definiie ar putea fi satisfctoare pentru unii dintre noi, nu este ns
neaprat i complet. O alt definiie a fost dat de Institutul de Robotic din America, n anul
1979. Conform acestei definiii, un robot este "o main reprogramabil, multifuncional creat
pentru a muta diverse materiale, buci, unelte sau alte dispozitive specializate prin diverse micri
programate, pentru realizarea unei varieti mari de sarcini".
O definiie mai scurt i larg acceptat la ora actual este urmtoarea: un robot este un
sistem inteligent care interacioneaz cu mediul fizic nconjurtor, prin intermediul unor senzori
efectori.
Pentru a modela lumea ncojurtoare este necesar ca un robot s adune date prin
intermediul senzorilor de-a lungul unei perioade de timp. Orice tip de senzor este bineneles
predispus la erori.
Prin prisma acestei definiii, s-ar putea spune c i omul este un robot. Omul
"interacioneaz" cu lumea nconjurtoare prin intermediul unor senzori i a unor efectori,
reprezentate n lumea biologic de terminaii nervoase respectiv muchi. Bineneles, diferena
cea mai semnificativ ntre robot i om, este c robotul a fost creat de om i nu invers.
Binecunoscutul autor de literatur Science Fiction, Isaac Asimov, a propus trei "legi ale
roboticii" sau mai bine zis ale existenei unui robot. Mai trziu acesta a adugat nc o lege, numit
legea zero. Cu toate c aceste legi au fost privite la nceput ca fiind o pur ficiune, ele au fost
2
preluate mai trziu att de ali scriitori de Science Fiction ct i de oameni de tiin, ca i principii
de baz pentru existena unui robot. Astfel, Isaac Asimov este recunoscut de unii ca fiind printre
oamenii care au pus bazele (fie ele pur abstracte) ale tiinei pe care astzi o numim robotic.
Legile existenei unui robot sunt [10]:
I. Un robot nu are voie s provoace vreun ru umanitii, sau prin inactivitate, s permit
vreun ru umanitii.
II. Un robot nu are voie s rneasc o persoan uman, sau s permit rnirea unei
persoane umane prin inactivitatea acestuia, cu excepia cazului cnd aceast lege
contravine cu vreo lege anterioar.
III. Un robot trebuie s respecte toate ordinele date de o persoan uman, cu excepia
acelor reguli care intr n conflict cu vreo lege anterioar.
IV. Un robot trebuie s-i protejeze propria existen atta timp ct aceast activitate nu
intr n conflict cu legile anterioare.
Roboi statici, roboi folosii n diverse fabrici i laboratoare ca de exemplu brae robot;
Roboi mobili, roboi care se deplaseaz ntr-un anumit mediu fr intervenie uman
i realizeaz anumite obiective;
Roboi autonomi, roboi care i ndeplinesc sarcinile fr intervenie din partea unui
operator uman i i obin energia necesar funcionrii din mediul nconjurtor;
Tele-roboi, care sunt ghidai prin dispozitive gen telecomand de un operator uman;
Linii autonome de producie n fabrici, sunt tot un fel de roboi, chiar dac nu sunt mobili,
deoarece au toate facilitile definiiei noastre.
Dintre toate aceste tipuri menionate mai sus, n proiect se studiaz doar roboii mobili, de
aceea ori de cte ori se va face referire la termenul de robot, se va nelege de fapt un robot mobil.
3
2.1.3 Roboi mobili. Elemente de structur
Un robot mobil ar putea fi descris ca un robot care trebuie s se deplaseze ntr-un anumit mediu,
fr ajutorul unui operator uman i s execute anumite sarcini date de acesta. Deci principala
caracteristic este mobilitatea.
Roboii mobili au ntrebuinri multiple. De-a lungul timpului au existat i exist roboi mobili
cu funcii diverse, de la aspirator pentru cas la explorator spaial, de la vehicul ghidat automat
(AGV) folosit n industrie la robot didactic folosit doar pentru scopuri tiinifice.
Un robot mobil este alctuit dintr-o serie de componente, unele de natur fizic (hardware),
iar altele de natur logic, computaional (software). Din punct de vedere al componentelor
hardware, un robot mobil poate fi considerat ca o colecie de sisteme pentru [13]:
4
2.2 Sisteme de procesare utilizate n roboi mobili (microcontrolere)
n general se poate considera c i controlerele fac parte din familia larg a calculatoarelor,
fiind o structur electronic destinat controlului unui proces sau, mai general, unei interaciuni
caracteristice cu mediul exterior, fr s fie necesar intervenia operatorului uman.
g. un sistem de conversie analog numeric (una sau mai multe intrri analogice);
h. un sistem de conversie numeric analogic i / sau ieiri PWM (cu modulare n durat);
i. un comparator analogic;
j. memorie de date nevolatil de tip EEPROM;
k. faciliti suplimentare pentru sistemul de temporizare / numrare (captare i
comparare);
5
l. faciliti pentru optimizarea consumului propriu.
Un microcontroler tipic mai are, la nivelul unitii centrale, faciliti de prelucrare a
informaiei la nivel de bit, de acces direct i uor la intrri / ieiri i un mecanism de prelucrare a
ntreruperilor rapid i eficient.
Utilizarea unui microcontroler constituie o soluie prin care se poate reduce dramatic
numrul componentelor electronice precum i costul proiectrii i al dezvoltrii unui produs.
Utilizarea unui microcontroler, orict de evoluat, nu elimin unele componente ale interfeei
cu mediul exterior (atunci cnd ele sunt chiar necesare): subsisteme de prelucrare analogic
(amplificare, redresare, filtrare, protecie-limitare), elemente pentru realizarea izolrii galvanice
(optocuploare, transformatoare), elemente de comutaie de putere (tranzistoare de putere, relee
electromecanice sau statice).
Memorie program (FLASH) - pentru memorarea unui program scris. Pentru c memoria ce
este fcut n tehnologia FLASH poate fi programat i tears mai mult dect odat, aceasta
face microcontrolerul potrivit pentru dezvoltarea de component;
EEPROM - memorie de date ce trebuie s fie salvate cnd nu mai este alimentare. Este n
mod uzual folosit pentru memorarea de date importante ce nu trebuie pierdute dac sursa
de alimentare se ntrerupe dintr-o dat. De exemplu, o astfel de dat este o temperatur
prestabilit n regulatoarele de temperatur. Dac n timpul ntreruperii alimentrii aceast
6
dat se pierde, va trebui s facem ajustarea nc o dat la revenirea alimentrii. Astfel
componenta noastr pierde n privina auto-meninerii;
RAM - memorie de date folosit de un program n timpul executrii sale. n RAM sunt
memorate toate rezultatele intermediare sau datele temporare ce nu sunt cruciale la
ntreruperea sursei de alimentare;
PORTUL A i PORTUL B sunt conexiuni fizice ntre microcontroler i lumea de afar. Portul
A are 5 pini, iar portul B are 8 pini;
TIMER-UL LIBER (FREE-RUN) este un registru de 8 bii n interiorul microcontrolerului ce
lucreaz independent de program. La fiecare al patrulea impuls de ceas al oscilatorului i
ncrementeaz valoarea lui pn ce atinge maximul (255), i apoi ncepe s numere tot din
nou de la zero;
UNITATEA DE PROCESARE CENTRAL are rolul unui element de conectivitate ntre
celelalte blocuri ale microcontrolerului. Coordoneaz lucrul altor blocuri i execut programul
utilizatorului.
Toate aplicaiile n care se utilizeaz microcontrolere fac parte din categoria aa ziselor
sisteme ncapsulate-integrate (embedded systems), la care existena unui sistem de calcul
incorporat este (aproape) transparent pentru utilizator.
Pentru c utilizarea lor este de foarte multe ori sinonim cu ideea de control,
microcontrolerele sunt utilizate masiv n robotic i mecatronic. Conceptul de mecatronic este
pn la urm indisolubil legat de utilizarea microcontrolerelor.
7
n Figura 2, Figura 3, Figura 4 se prezint cteva exemple de roboi [14]:
Figura 3. AIBO
Figura 4. ASIMO
Figura 2. Robotul humanoid Johnnie
Ca exemple din industria de automobile, numai la nivelul anului 1999, un BMW seria 7
utiliza 65 de microcontrolere, iar un Mercedes din clasa S utiliza 63 de microcontrolere.
8
Practic, toate microcontrolerele se realizeaz la ora actual n tehnologie CMOS
(tehnologii similare celor utilizate la seriile standard CMOS de circuite numerice: HC, AC, ALV,
etc.). Se pot realiza astfel structuri cu o mare densitate de integrare, cu un consum redus (care va
depinde de frecvena de lucru), permind eventual alimentarea de la baterie.
Logica intern este static (total sau n cea mai mare parte) permind astfel, n anumite
condiii, micorarea frecvenei de ceas sau chiar oprirea ceasului n ideea optimizrii consumului.
Tehnologia este caracterizat i de o imunitate mai mare la perturbaii, esenial ntr-un mare
numr de aplicaii specifice. Se realizeaz variante pentru domeniu extins al temperaturii de
funcionare (de ex.- 40 +85 0C).
Arhitectura unitii centrale de calcul (CPU) este unul din elementele cele mai importante
care trebuie avut n vedere n analiza oricrui sistem de calcul. Principalele concepte sunt
urmtoarele:
Cele mai multe microcontrolere sunt realizate pe baza acestei arhitecturi de sistem.
Microcontrolerele bazate pe aceast arhitectur au o unitate central (CPU) caracterizat de
existena unui singur spaiu de memorie utilizat pentru memorarea att a codului instruciunilor ct
i a datelor ce fac obiectul prelucrrii.
3) CISC
Este un concept de realizare a CPU care a nceput s fie utilizat cu succes de ceva timp i
la realizarea microcontrolerelor. Prin implementarea unui set redus de instruciuni care se pot
executa foarte rapid i eficient, se obine o reducere a complexitii microcircuitului, suprafaa
disponibilizat putnd fi utilizat n alte scopuri.
9
n Figura 5 se prezint o comparaie ntre arhitecturile Harvard i von-Neuman [15].
Arhitectura Harvard este un concept mai nou dect von-Neumann. S-a nscut din nevoia
de mrire a vitezei microcontrolerului. n arhitectura Harvard, bus-ul de date i bus-ul de adrese
sunt separate. Astfel este posibil un mare debit de date prin unitatea de procesare central, i
bineneles, o vitez mai mare de lucru. Microcontrolerele cu arhitectur Harvard sunt de
asemenea numite "microcontrolere RISC". Microcontrolerele cu arhitectura von-Newmann sunt
numite "microcontrolere CISC".
n afar de memoria local de tip RAM, de dimensiuni relativ reduse (uzual de la x10 octei
la x1k), implementat ca atare sau existent sub forma unui set de registre i destinat memorrii
datelor (variabilelor), mai exist o serie de aspecte specifice, marea majoritate a acestora fiind
legat de implementarea fizic a memoriei de program (i eventual a unei pri a memoriei de
date) cu ajutorul unor memorii nevolatile. Clasic, memoria de program era implementat ntr-o
variant de tip ROM: EPROM pentru dezvoltare i producie pe scar mic/medie sau mask-ROM
pentru producia de mas.
10
a. OTP - majoritatea productorilor ofer variante de microcontrolere la care memoria local de
program este de tip OTP (One Time Programmable), practic o memorie PROM identic intern
cu varianta EPROM, dar fr fereastra de cuar pentru tergere (deci i mai ieftine); aceste
variante pot fi utilizate ca o alternativ pentru o producie limitat, pn n momentul testrii i
validrii finale a codului, moment n care pot fi comandate variantele (mask) ROM propriu-zise,
cele mai economice pentru o producie de mas.
b. FLASH EPROM - este o soluie mai bun dect EPROM-ul propriu-zis atunci cnd este
necesar un volum mare de memorie program (nevolatil); mai rapid i cu un numr garantat
suficient de mare (x10000) de cicluri de programare (de tergere/scriere), este caracterizat
i prin modaliti mai flexibile de programare; este utilizat numai ca memorie de program.
c. EEPROM - multe microcontrolere au i o memorie de acest tip, de dimensiune limitat (de la
x10 octei la x K octei), destinat memorrii unui numr limitat de parametric (memorie de
date) care eventual trebuie modificai din timp n timp; este o memorie relativ lent (la scriere),
dar cu un numr de cicluri de tergere/scriere mai mare ca FLASH-ul (x100000).
d. NOVRAM (RAM nevolatil) - realizat prin alimentarea local (baterie, acumulator) a unui masiv
RAM CMOS atunci cnd este necesar un volum mare de memorie de program i date
nevolatil; mult mai rapid dect toate celelalte tipuri i fr limitri ca numr de cicluri.
e. Programarea "n System" (ISP-n System Programming) - folosirea unor memorii nevolatile
de tip FLASH face posibil i "programarea" unui astfel de microcontroler fr a-l scoate din
sistemul n care este ncorporat (programare on-line, n System Programming); programarea
se face de regul prin intermediul unei interfee seriale dedicate de tip ISP (poate avea nume
diferite) sau a unei interfee standard JTAG. Exist microcontrolere la care aceast
programare se poate face prin intermediul portului serial asincron sau al interfeei CAN
(Controller Area Network).
f. Bootloader - multe din microcontrolerele recente la care memoria de program este de tip
FLASH au i facilitatea (au de fapt instruciuni dedicate acestui scop) de a putea i scrie n
aceast memorie de program fr a utiliza un circuit de programare extern. Astfel n
microcontroler poate exista permanent (rezident) un cod de mici dimensiuni (denumit i
bootloader) care pur i simplu va ncrca prin intermediul portului serial (este doar un exemplu)
codul utilizator sau constantele pe care acesta vrea eventual s le actualizeze. Bootloader-ul
este i cel care lanseaz n execuie programul utilizator dup ncrcarea acestuia.
g. Protejarea codului - protejarea codului program dintr-o memorie local nevolatil mpotriva
accesului neautorizat (la citire deoarece pirateria soft exist i aici) este oferit ca o opiune
(ea mai trebuie i folosit!) la variantele FLASH, EPROM sau OTP. Codul poate fi protejat att
la citire ct i la scriere (practic circuitul trebuie ters, nainte de a se mai putea scrie ceva n
el). Este eliminat astfel posibilitatea de a se realiza, n acest caz, de patch-uri (alterri cu un
anumit scop) ale codului original. La variantele mask-ROM propriu-zis protecia este de cele
mai multe ori implicit.
11
h. Memoria extern de program sau date - marea majoritate a familiilor de microcontrolere
permit i utilizarea de memorie extern de program (tipic ROM) sau date (tipic RAM). Aceasta
presupune existena i utilizarea unor magistrale externe de adrese i date.
Conexiunile externe necesare pentru acestea sunt disponibile ca funcii alternative ale pinilor.
Din pcate, n aceast situaie numrul de conexiuni exterioare disponibile pentru interfaa cu
exteriorul se reduce dramatic, reducnd mult din versatilitatea microcontrolerului.
- SPI (Serial Peripheral Interface) este un port serial sincron definit de firma Motorola
12
- Microwire / Microwire Plus este o interfa serial bidirecional sincron definit
i utilizat de firma National Semiconductors
- I2C (Inter Integrated Circuits bus) este o interfa serial bidirecional (pe numai
2 fire), dezvoltat de Philips, destinat aplicaiilor de 8 bii. Exist i multe circuite "periferice" care
sunt prevzute cu o astfel de interfa. Este cunoscut i sub denumirea TWI (Two Wire Interface)
n ultimul timp magistrala CAN a nceput s fie utilizat i n alte domenii dect industria
de automobile (automatizri industriale, robotic, acionri electrice).
d. Conectivitate USB - magistrala serial USB (Universal Serial Bus) a fost creat
pentru conectarea cu uurin a diverselor periferice la un calculator PC (cu rolul de gazd - host).
Conexiunea permite i furnizarea tensiunii de alimentare. Varianta USB 1.1 permite atingerea unei
rate de transfer maxime a datelor de 12Mbytes/sec, iar varianta USB 2.0 a unei rate maxime de
cca. 480MBytes/sec.
13
g. Convertoarele Numeric Analogice (CNA, DAC)
Cea mai rspndit tehnic de conversie numeric analogic folosit este bazat pe
modulaia n factor de umplere (PWM- Pulse Width Modulation). Exist unul sau mai multe canale
pe care se poate genera un tren de impulsuri cu factor de umplere programabil (de la 0 la 100%).
Este considerat "bunicul" microcontrolerelor pe 8 bii, iar unele dintre caracteristicile sale
arhitecturale se regsesc la urmtoarea generaie (MCS-51, 8051).
A doua generaie de microcontrolere de 8 bii a firmei Intel care, dei aprut acum 20 de
ani, nc ocup un segment semnificativ de pia. Cu o arhitectur destul de ciudat, este suficient
de puternic i uor de programat. Arhitectura sa are spaii de memorie separate pentru program
i date. Poate adresa 64KBytes memorie de program, din care primii 4(8..32)KBytes locali (ROM).
Poate adresa 64KBytes memorie de date extern, adresabil doar indirect. Are 128 (256) octei
de RAM local, plus un numr de registre speciale pentru lucrul cu periferia local. Are faciliti de
prelucrare la nivel de bit (un procesor boolean, adresare pe bit). Intel a dezvoltat i un super 8051
numit generic 80151.
Derivate din clasicele 8086/88 prin includerea pe acelai microcircuit a 2 canale DMA, 2
numrtoare/timere, un sistem de ntreruperi i un controler pentru DRAM. Marele avantaj al
acestor cvasi(aproape) microcontrolere (ele nu au memorie integrat) este legat de utilizarea ca
mediu de dezvoltare a unor platforme de calcul tip IBM-PC, compatibile 80x86, cu tot softul aferent.
14
e. 68HC05 (Freescale - www.freescale.com, ex Motorola )
Are un spaiu de memorie unic (64Kbytes) n care sunt plasate i registrele perifericelor
(I/O, timere) cu un indicator de stiv (SP) hard pe 5bii (stiv de maxim 32 octei !). Exist variante
cu memorie EEPROM, CAN, port serial, etc. Este unul din cele mai rspndite microcontrolere
(comparabil cu 8051).
68HC11 a fost unul din cele mai puternice microcontrolere pe 8 bii, foarte rspndit n
ciuda faptului c Motorola a fost un timp singurul productor. Are un set de instruciuni asemntor
cu alte produse ale firmei (6801, 6805, 6809). Are un spaiu de adrese unic de 64K. Nenumrate
variante ca resurse: EEPROM, OTP, CAN, PWM, etc. Prezint ca particularitate existena unui
program de ncrcare rezident (bootstrap loader n ROM intern) cu care, la reset, un segment din
memoria RAM extern poate fi ncrcat cu cod program prin intermediul portului serial.
g. 683xxx (Freescale)
Primul microcontroler din aceast familie (PIC1650) a aprut acum mai bine de 20 de ani
pe vremea cnd firma era proprietatea General Instruments. Este o familie de microcontrolere
care, n ultimii ani, a cunoscut o dezvoltare exploziv. Sunt disponibile actualmente sub forma a 6
serii: PIC10, PIC12, PIC14, PIC16, PIC17 i PIC18. n seriile respective exist variante cu
memorie de program de tip OTP(C) sau FLASH(F). Au fost primele microcontrolere de 8 bii cu
arhitectur RISC: PIC16C5x avea un set de doar 33 instruciuni (Intel 8048 avea 90). Arhitectura
este de tip Harvard i, ca o particularitate, dimensiunea cuvntului pentru program este de 12, 14
sau 16 bii, cuvntul de date fiind tot de 8 bii. Cronologic, ultimul produs al firmei Microchip este
seria dsPIC30F, de fapt un procesor numeric de semnal, de 16 bii, cu o periferie specific
optimizat pentru controlul acionrilor electrice (motoare electrice). Firma Ubicom (ex Scenix,
www.ubicom.com) produce nite clone ale familiei PIC, mult mai rapide dect originalele. Modulele
Basic Stamp ale firmei Parallax (www.parallax.com) sunt bazate i pe astfel de microcontrolere
(sunt foarte utilizate, i nu numai de hobbitii din robotic).
Un concurent puternic al seriei PIC este familia numit AVR, a firmei ATMEL, familie
aprut n ultimii ani, care ofer variante de microcontrolere oarecum asemntoare ca resurse
15
cu familia PIC, la performane similare sau mai bune. Sunt bazate pe o arhitectur diferit, dar
unitatea central este tot de tip RISC, cu cuvntul de date de 8 bii. La fel ca la PIC dimensiunea
cuvntului de program este mai mare, fiind de 16 bii. Exist cel puin 3 subfamilii mari, n ordinea
complexitii resurselor, acestea fiind: AT Tiny, AT90 i ATMega.
Z180 -ul firmei Zilog are un CPU similar cu Z80 dar mbuntit, cu resurse locale cum ar
fi: management de memorie (memorie paginat de maxim 1MB), USART (numit SIO), 2 canale
DMA, timere, sistem de ntreruperi, eventual PIO. Instruciuni suplimentare fa de setul standard
Z80, printre care i nmulirea. Diversele sale variante nu includ memorie local.
Microcontrolerul standard pe 8 bii al firmei TI realizat n multe variante (de ordinul zecilor),
prezint unele asemnri cu 8051 (memoria de date local, stiva, modurile de adresare). O
varietate extrem de mare a resurselor locale.
n. 80386EX (Intel)
16
utiliza ca platform de dezvoltare un sistem de tip IBM PC mpreun cu tot mediul de programare
aferent.
Din pcate aceast form de reprezentare a informaiei este total nepractic pentru un
programator, care va utiliza cel puin un limbaj de asamblare, n care o instruciune (o mnemonic
17
cu operanzii afereni) are drept corespondent o instruciune n limbaj main (excepie fac
macroinstruciunile disponibile la unele asambloare).
Limbajul de asamblare este primul care trebuie nvat, chiar sumar, atunci cnd dorim s
proiectm o aplicaie hard/soft cu un anume microcontroler (familie), el permind nelegerea
arhitecturii acestuia i utilizarea ei eficient.
Cele mai populare i utilizate sunt cele pentru limbajul C, un limbaj universal folosit att
pentru super computere, ct i de microcontrolerele de 4 bii. Este un limbaj puternic i flexibil,
care dei de nivel nalt, poate permite i accesul direct la resursele sistemului de calcul. Un
program bine scris genereaz un cod rapid i compact. Totui, de multe ori, poriuni critice din
punct de vedere al vitezei de execuie, trebuie nc scrise n limbaj de asamblare. Exist
numeroase implementri, pentru majoritatea familiilor de microcontrolere. Cu anumite limitri
legate de arhitectur i mai ales resursele microcontrolerului, asigur portabilitatea unei aplicaii
scris pentru un anumit tip (familie) de microcontroler la un alt tip (familie).
Referitor la asamblor i compilator, trebuie precizat c pentru acestea codul este obinut
cu ajutorul unui mediu integrat de dezvoltare a programelor (IDE-Integrated Development
Environment) care conine n mod tipic urmtoarele componente software: un editor specializat
(orientat pe codul surs), un asamblor/compilator, un editor de legturi/locator
("linkeditor/locator"), programe de gestiune a unor biblioteci de cod ("librarians"), programe de
conversie a formatelor de reprezentare a codului (de exemplu din binar n format Intel HEX sau
Motorola S) i, nu n ultimul rnd, un simulator i/sau depanator ("debugger").
18
Codul astfel obinut trebuie ncrcat n memoria de program a mainii int unde va rula,
fiind de fapt programat ntr-o memorie de tip (EP)ROM/FLASH sau ncrcat direct (uploaded) ntr-
o memorie de tip RAM.
19
2.3 Senzori
Senzorii sunt dispozitive componente ale roboilor mobili care pot msura diferite
proprieti ale mediului din jurul acestora, cum ar fi: temperatura, distana, rezistena fizic,
greutatea, mrimea, etc.
Senzori de stare intern senzori care ofer informaii despre starea intern a
robotului mobil, spre exemplu nivelul bateriei, poziia roilor sau altor componente, etc.;
Senzori de stare extern senzori care ofer informaii despre mediul ambiant n
care robotul funcioneaz. Senzorii de stare extern se mai pot mpri la rndul lor n
dou categorii: senzori cu contact, mai precis acei senzori care culeg informaia din
mediu prin atingere (exemplu: senzor "bumper"), respectiv senzori fr contact , care
preiau informaia din mediu de la distan (exemplu: camer video, senzor ultrasonic)
Un senzor poate fi activ sau pasiv. Senzorii activi sunt acei senzori care emit energie
n mediu pentru a putea observa anumite caracteristici ale acestuia, spre deosebire de
senzorii pasivi care primesc energie din mediu pentru a putea prelua informaia.
La modul general, despre toate categoriile de senzori se pot enuna urmtoarele ipoteze
[13]:
20
Preul senzorului;
Puterea de calcul necesar pentru a interpreta rezultatele;
Tipul de semnal la ieire;
Greutatea, mrimea i cantitatea de energie consumat pentru a face o
msurtoare.
Din punct de vedere tehnologic/funcional, roboii mobili pot fi dotai cu diverse tipuri de
senzori [16]:
a. Senzori interni:
- Senzori de poziie (Incrementali/Poteniometre);
- Senzori de for;
- Senzori de detecie n infrarou;
- Senzori de acceleraie; - Senzori cu efect Hall.
b. Senzori externi:
- Senzori cu ultrasunete;
- Senzori de atingere;
- Senzori de for;
- Senzori de culoare;
- Senzori de lumin; - Camere video.
Senzorii din roboii mobili se pot clasifica i independent de gruparea interni-externi, numai
pe criteriul funcional, astfel:
senzori de distan acei senzori care ofer informaii despre distana ntre senzor i
obiectul de msurat din mediu;
senzori de poziie acei senzori care ofer informaii despre poziia robotului n termeni
absolui;
senzori de mediu acei senzori care ofer informaii despre diverse proprieti i
caracteristici ale mediului (exemplu: temperatur, culoare);
senzori ineriali acei senzori care msoar proprieti difereniale ale poziiei robotului
(exemplu: acceleraia).
Caracterizarea general a senzorilor se poate face pe baza relaiei (f) dintre proprietile
fizice de interes ale mediului (e) i informaia primit de la un senzor (r) ar putea fi modelat prin
ecuaia [13]:
21
n principiu, orice model al unui senzor ar trebui s includ i un model intern al zgomotului
care poate afecta senzorul n momenrul citirii informaiei. Problema de a recupera informaia din
mediu din datele primite de la senzor poate fi destul de complex.
Un senzor este considerat instabil dac pentru variaii mici ale intrrii, ieirea se schimb
radical. n caz general, pentru un senzor cu ieirea f(e), instabilitatea se refer la: f (e) f (e+ h)
h h
n principiu orice tip de senzor poate fi afectat de mai multe tipuri de erori.
Dintre acestea, cele mai importante sunt erorile incidentale, erorile sistematice i erorile
stohastice. Erorile incidentale apar ocazional i pot avea un efect neprevzut asupra informaiei,
ele provenind n cea mai mare parte de la msurtori efectuate greit. Erorile sistematice au o
influen predictibil asupra acurateii informaiei,acestea provenind de la o interpretare greit a
parametrilor n algoritmii de estimare, sau din cauza unor neconcordane (incertitudini) n
modelare. n fine, erorile stohastice au un caracter aleator, ele diferind de fiecare dat cnd robotul
execut aceeai operaie.
Categoria de senzori cea mai des ntlnit la un robot mobil o constituie, fr nici o ndoial,
categoria senzorilor ultrasonici. ntlnii n literatura de specialitate i sub denumirea de sonar
senzorii ultrasonici folosesc semnale acustice (sunete).
Senzorii cu ultrasunete sunt unii dintre cei mai utili i eficieni senzori din dotarea roboilor.
Ei permit msurarea suficient de precis, fr contact, a distanelor fa de alte obiecte din mediu
i asigur astfel premizele pentru unele dintre cele mai importante activiti ale roboilor:
Msurarea distanei fa de unele repere, fixe sau mobile din mediu, pentru ancorarea
propriei poziii n spaiul de lucru;
Identificarea obstacolelor din mediu nconjurator, cu poziia i configuraia lor, n
vederea stabilirii unei strategii optime pentru ocolirea lor, dar i pentru o eventual
reconfigurare, n vederea abordrii lor directe;
Identificarea poziiei i orientrii unor module, n vederea unei eventuale atari i
cuplri;
Un emitor sonar transmite un semnal acustic n mediu urmnd apoi ca reflecia acestuia
s fie recepionat de componenta detector a senzorului. Timpul n care semnalul este receptat
napoi de senzor precum i atenuarea semnalului reprezint aspecte exploatate de diferitele tipuri
de senzori sonar.
22
Sunetele transmise de senzorii sonar sunt de regul n spectrul de sunete ultrasonice,
avnd o frecven foarte nalt pentru a nu putea fi detectate de urechea uman.
Principiul de funcionare al senzorilor sonar a fost mprumutat din lumea animal, att liliecii
ct i delfinii folosind aceleai tehnici pentru a localiza i identifica diferitele caracteristici ale unui
anumit robot.
Sensibilitatea unui senzor sonar nu este uniform, ci consist dintr-un lob principal i
cteva loburi laterale mai mici. De asemenea, aceast sensibilitate difer de la un senzor sonar
la altul. Diferenele de sensibilitate ale unora dintre cei mai populari senzori sonar, i anume
modelele Devantech SRF08 i SRF10 pot fi observate n Figura 6 i Figura 7 [9].
Figura 6. Sensibilitatea senzorului Devantech SRF08 Figura 7. Sensibilitatea senzorului Devantech SRF10
Principiul de funcionare al unui senzor ultrasonic tipic este prezentat n Figura 8 (Vss, Vdd
- tensiune alimentare sursa-drena).
23
Figura 8. Principiul de funcionare al senzorului cu ultrasunete
unde
- distana
- timpul msurat
- viteza de propagare a undei n mediul considerat
n general depinde de indicele de refracie al mediului, care la rndul su depinde de mai
muli parametrii (temperatur, presiune, umiditatea aerului, lungimea de und), iar cunoaterea
exact a acestui aspect poate mbunti precizia msuratorilor.
Un model pentru analiza i testarea caracteristicilor tehnice ale acestui tip de senzori poate
fi Parallax PING))), un senzor avnd configuraia i dimensiunile prezentate n Figura 9
[9].
24
Figura 9. Senzorul cu ultrasunete Parallax PING)))
Un avantaj major al acestui senzor const n faptul c nu necesit dect o singur linie
I/E a unui procesor numeric. Senzorul detecteaz un obiect i permite msurarea distanei pn
la el prin emiterea unui scurt impuls cu frecventa de 40 KHz (domeniul ultrasonic), care se
deplaseaz cu viteza sunetului n aer, de 340 m/s, i ateptarea i sesizarea ecoului, determinat
de reflectarea undelor de ctre obstacol (Figura 8).
n practic senzorul Parallax PING))) are cteva particulariti care evideniaz limitrile
acestei tehnologii. n Figura 10 sunt evidentiate aceste limitari.
25
Figura 10. Cazuri n care obiectul nu este detectat de senzorul cu ultrasunete
de 3m distan;
O sensibilitate sczut a senzorului se constat i n cazul n care obiectul este alctuit din
materiale moi sau prezint forme neregulate. Senzorul poate detecta suprafaa apei, dar este
predispus la deteriorri din cauza umezelii i condensaiei, n consecin nu este recomandat
pentru uz n aer liber sau n preajma apei.
unde
Figura 11. Test senzor Parallax PING))) pentru un paravan paralel din carton
Testul a fost efectuat de ctre productor ntr-o camer izolat, la temperatura uzual.
Obiectul int este un paravan din carton de dimesiuni 30.5 cm x 30.5 cm plasat la nlimea de
1m fa de podea pentru a elimina reflexii suplimentare ale undelor.
26
Figura 12. Zona de sensibilitate a senzorului Parallax PING))) pentru testul cu paravan
De fapt zona de sensibilitate al senzorului cu ultrasunete este un con (n 3D), iar Figura 12
este o vedere perpendicular pe generatoarea conului. Doar obiectele din interiorul conului sunt
detectate.
Din Figura 12 se poate trage concluzia c senzorul are o sensibilitate mare concentrat
pe axa acustic (generatoarea conului). Faptul c zona este ngust este avantajos, deoarece
permite evaluarea poziiei obiectului. Precizia mare este datorat suprafeei drepte a paravanului
i orientarea sa care reflect majoritatea undelor sonore inapoi spre senzor.
Cel mai des ntlnit tip de senzori de contact n roboii mobili este reprezentat de senzorii
bumper . Aceste dispozitive pot fi simple ntreruptoare care raporteaz o valoare binar, 0 sau 1,
valoare corespondent strii de fapt: deschis sau nchis. Astfel, n momentul n care robotul
echipat cu senzori de acest tip se lovete de un alt obiect, ntreruptorul se va nchide semnalnd
acest lucru. Un exemplu de caz n care o anumit parte a unui robot mobil se atinge de un obiect
din mediu este prezentat n Figura 13 [13].
27
Figura 13. Activarea senzorilor bumper n momentul ciocnirii robotului cu un obiect
Robotul din Figura 13 are un sistem senzorial format din 8 senzori bumper, situai pe robot
la circumferina acestuia. n momentul n care robotul se lovete de obiectul din mediu, senzorii
aflai pe partea respectiv a robotului (n acest caz senzorul 4 i 5) vor raporta acest lucru.
Cu toate c senzorii bumper sunt folosii pentru a evita lovirea robotului de obiecte din
mediul ambiant n caz de coliziune cu acestea, dac fora de impact este mare, detectarea
coliziunii nu mai este suficient pentru a evita distrugerea anumitor pri ale robotului.
2.4 Servomotoare
Servomotoarele reprezint componente eseniale, de execuie i de precizie, n structura
unui robot mobil, utilizate n principal pentru deplasarea robotului, dar i pentru realizarea unor
micri, ce pot fi complexe i de mare precizie, ale unor organe/pri ale robotului. Ultimele decade
au fost marcate de evoluii remarcabile n ceea ce privete dimensiunile, viteza de rotaie i cuplul
motor al motoarelor de tip servo.
n Figura 14, se prezint astfel (spre exemplificare, pentru servomotorul Futaba S3151) o
structur tipic, mpreun cu alte caracteristici semnificative [12].
28
Tabelul 1. Caracteristicile mecanice, electrice i geometrice ale servomotorului.
Gabarit: Masa: Cuplul la Viteza: Cuplul de Tensiunea:
( mm ) (g) 4,8V 0,16s/45 la mentinere (V)
(Nmm) 4,8V (Nmm)
Aceast tensiune, care este de fapt tensiunea maxim, este pulsat sau transmis on/off
cu o rat fix de (spre exemplu 50 de cicluri pe secunda), genernd scurte impulsuri de tensiune.
Prin creterea duratei fiecrui impuls se creeaz un control al vitezei, care poate crete progresiv
cnd se aplic motorului tensiunea maxim fr ntrerupere, accelernd servomotorul i deci
robotul, sau organul acionat, spre noua poziie.
29
Figura 15. Comanda prin PWM. Servomotor standard i digital
Din cele de mai sus rezult cteva avantaje importante ale servomotoarelor digitale:
- prin intermediul microprocesorului este posibil primirea de semnale de intrare de
comand prin care durata impulsului poate fi ajustat prin programarea
microprocesorului pentru a realiza funciile cerute i pentru a optimiza performanele
servomotorului;
n Figura 16 se prezint comparativ variaii tipice ale cuplului n timp pentru servomotoarele
standard i servomotoarele digitale.
30
Figura 16. Caracteristicile cuplu-timp pentru servomotoarele standard i digitale
n general, modelul comenzii pentru roboi mobili se poate aborda i asimila sistemelor cu
dinamic lent, care nu sunt supuse perturbaiilor electromagnetice (spre exemplu: acionarea
mainilor cu comand numeric, a imprimantelor, plotter-elor etc.).
31
Sistemul de comand pentru un servomotor de c.c este, practic, un sistem de acionare
electric, avnd n componen motorul electric (servomotorul de c.c), obiectul acionat, transmisia
i elementul de execuie (Figura 17) [18].
Cel mai simplu tip de legtur care se poate stabili este cel punct-la-punct (Fig.18, [25]). n
acest caz, att transmitorul ct i receptorul trebuie s se vad reciproc, deci s existe o cale
neopturat. Aceste legturi pot fi stabilite temporar pentru a se putea realiza o sesiune de
schimburi de date ntre doi utilizatori sau se poate stabili o legtur permanent atunci cnd se
folosete o unitate mobil ca i base point n cadrul unei reele LAN.
33
n cazul unui sistem de comunicaii optice care se afl ntr-un mediu deschis, aa cum este
cazul tipic, detectorul este iluminat i de alte surse de lumin dect cea de la emitor, astfel c
ele se manifest ca nite zgomote aditive care fac ca la fotodetector curentul generat de ctre
acesta s nu mai fie cel exact.
n comunicatiile optice partea de spectru de infrarosu care este folosita este impartita n
cateva benzi bazate pe disponibilitatea surselor de lumina, materiale de transmisie i absorbie i
detectori.
IrDa (Infrared Data Association, asociere de date prin infrarosu) defineste specificatii fizice
pentru standarde de protocale de comunicatii pentru schimbul de date prin lumina infrarosie pe
distanta mica, pentru utilizarea n PAN-uri (Personal Area Networks).
Standardele IrDa includ o serie larg de specificaii i protocoale: IrPHY, IrLAP, IrLMP,
IrCOMM, Tiny TP, IrOBEX, IrLAN i IrSimple.
Sistemul Bluetooth este cel mai adecvat atunci cnd distana dintre emitor/receptor este
scurt, rata de transfer este mare, iar puterea consumat trebuie meninut ct mai sczut.
Ideea ce a dat nastere tehnologiei wireless Bluetooth a aparut n 1994 cand compania
Ericsson Mobile Communications a decis investigarea fezabilitatii unei interfete radio de mica
putere i cost redus ntre telefoanele mobile i accesoriile acestora.
Bluetooth prezinta o tehnologie pentru distante scurte cu costuri reduse, viznd crearea
unor reele personale (PAN-Personal Area Nework).
34
Principalele tipuri de aplicatii ale Bluetooth sunt:
controlul wireless al comunicarii ntre telefonul celular i castile hands free sau car kitul.
Aceasta aplicatie a devenit cea mai populara.
retea wireless ntre calculatoare ntr-un spatiu limitat i cerinte mici de lungime de
banda, aici putnd include i cazul PC-robot.
comunicatie wireless ntre dispozitivele de intrare i ieire ale unui calculator, cele mai
intalnite fiind mouse-ul,tastatura sau imprimanta.
inlocuirea comunicarii traditionale seriale prin fir n echipamentele de test, receptoeul
GPS i echipamente medicale.
pentru controale unde infrarosul era folosit.
controlul wireless al consolei de jocuri Nintendos Wii i Sonys PlayStation 3 folosesc
tehnologia Bluetooth pentru consolele lor wireless.
Pentru a putea analiza eficient soluiile fr fir (wireless), este util comparaia cu alte
tehnologii [21]:
1) Bluetooth
a) este indreptata ctre aplicatii de voce i date;
b) opereaza n spectrul 2.4GHz;
3 Tehnologia Bluetooth
3.1 Prezentare general
Tehnologia wireless Bluetooth reprezint una dintre cele mai avansate i rspndite
tehnologii de comunicatie fr fir.
36
pe secund. Semnalul execut salturi prin 79 intervale de frecven de 1MHz, pentru a realiza o
bun imunitate la interferene. Puterea emis este conform specificaiilor 0dBm (1mW) pentru
implementrile pentru acoperiri reduse (10m) i maxim 20dBm (100mW) pentru versiunile pentru
domenii mai extinse (100m).
Cnd s-au alctuit specificaiile radio, un mare accent s-a pus pe posibilitatea implementrii
design-ului ntr-un singur chip CMOS, n consecin reducndu-se costul, puterea consumat i
dimensiunile necesare pentru implementarea n dispozitivele mobile.
Comunicaiile vocale: Sunt utilizate pn la trei canale vocale sincrone simultan sau un
canal care suport simultan transmisie de date asincron i transmisie vocal sincron. Fiecare
canal vocal suport sincron 64kb/s n fiecare sens.
Comunicaii de date: Un canal de date asincron poate suporta maxim 723.2kbps n sens
direct n conexiune asimetric (i pn la 57.6kbps n sens invers), sau 433.9kbps n conexiune
simetric.
Unitile Bluetooth aflate n acelai domeniu spaial de aciune radio pot realiza ad-hoc
conexiuni punct-la-punct i/sau punct-la-multipunct. Unitile pot fi adugate sau deconectate n
mod dinamic la reea. Dou sau mai multe uniti pot utiliza n comun un canal al unui piconet.
Se pot forma mai multe picoreele i acestea se pot lega ad-hoc mpreun formnd scatternet
(Figura 20 [24]), pentru a realiza configuraii flexibile de comunicaii i schimburi de date.
Dac ntr-un acelai domeniu spaial se afl mai multe pico-reele, fiecare lucreaz
independent i fiecare are acces la ntreaga band de frecvene. Fiecare pico-reea este stabilit
pe un canal diferit, cu salt n frecven. Toi utilizatorii participani la aceeai pico-reea sunt
sincronizai pe acest canal. Spre deosebire de dispozitivele cu infrarou (IR), unitile Bluetooth
nu sunt limitate de necesitatea vederii directe ntre ele.
37
Figura 20. Reele Bluetooth Scatternet
Dei, n mod firesc, Bluetooth a urmat o evoluie ascendant (mai multe versiuni detaliate
la paragraful 3.3), marcat i de standarde IEEE, principalele caracteristici ale standardului iniial
(1.0) se pstreaz ca majoritare i definitorii, dup cum se prezint n continuare.
n funcie de puterea maxim emis s-au standardizat 3 clase principale n care se pot
fabrica dispozitivele Bluetooth, acestora corespunzndu-le i diferite acoperiri (raze de aciune)
maxime (Tabelul 2).
38
1. Rutina de interpelare pentru autentificare;
2. Cifrarea fluxului informaional, ca metod de criptare;
3. Generarea unor chei de sesiune aceste chei pot fi oricnd schimbate pe parcursul
unei conexiuni stabilite.
Stiva de protocoale este definit ca o serie de straturi, dei unele caracteristici nu pot fi
delimitate ca aparinnd unui anumit strat. n Figura 21 este evideniat acest aspect [20].
39
Figura 21. Stiva de protocoale Bluetooth
40
conexiuni este de a afla ce dispozitive Bluetooth se afl n zon, aa c laptop-ul iniiaz o
procedur Inquiry pentru a sonda vecintatea cu alte dispozitive.
n acelai mod, orice dispozitiv Bluetooth din zon, care scaneaz mediul n cutarea de
mesaje Inquiry, va rspunde cu un pachet FHS, astfel nct laptop-ul acumuleaz o list cu
dispozitive.
n februarie 1998 a luat fiin Grupul de Interes Special (SIG). Astzi Bluetooth SIG include
companiile promotoare 3Com, Ericsson, IBM, Intel, Lucent, Microsoft, Motorola, Nokia i Toshiba,
i mii de companii membri asociai sau adoptori.
Iniial misiunea SIG a fost de a monitoriza dezvoltarea tehnologiei radio pentru domenii
restrnse i de a crea un standard global deschis, prevenind astfel devenirea acestei tehnologii
proprietatea unei singure companii. Acest lucru a avut ca rezultat apariia primei specificaii
Bluetooth (1.0) 1999.
n martie 2000 IEEE i SIG au convenit crearea unui standard IEEE pe baza versiunii
1.1-Bluetooth.
41
n 2002 Bluetooth 1.1 este ratificat ca IEEE Standard 802.15.1-2002.
Prima versiune Bluetooth (1.0) apare n 1999. Versiunile 1.0 i 1.0B au avut multe
probleme i mai muli producatori au avut multe dificultati n a face produsele interoperabile.
Versiunile 1.0 i 1.0B de asemenea au avut prin regula BD_ADDR(Bluetooth Hardware Device
Address) o adresa de recunoastere, ceea ce crea o imposibilitate a anonimatului la nivelul de
protocol, ducnd la o incetinire a procesului de introducere a noi servicii n mediul Bluetooth.
- o viteza de transmitere de 3 ori mai mare, n unele cazuri de 10 ori mai mare raza
de aciune 100m;
- consum de putere mai mic;
- latime de banda mai mare (important la portabile-PDA, laptop, telefon);
- imbunatatirea BER-ul (Bit Error Rate)
- mai bun gestionare a conexiunii ntre mai mult de dou dispozitive.
42
3.3.6 Bluetooth 2.1 (SIG-2007)
Specificaia 3.0 a fost adoptat de Bluetooth SIG pe 21 aprilie 2009. Principala noutate
introdus este AMP (Alternate MAC/PHY), adic adugarea lui 802.11 (asociat de regul cu WiFi)
ca un mod de transport de mare vitez. Aceast extindere mrete considerabil importana i
potenialul Bluetooth (Wi-Fi era principalul competitor tehnic i economic).
Pentru a regula traficul pe canal, unul dintre participani devine master n piconet, n timp
ce restul unitilor devin slave.
Dac ntr-un acelai domeniu spaial se afl mai multe pico-reele, fiecare lucreaz
independent i fiecare are acces la ntreaga band de frecvene. Fiecare pico-reea este stabilit
pe un canal diferit, cu salt n frecven. Toi utilizatorii participani la aceeai pico-reea sunt
43
sincronizai pe acest canal. Spre deosebire de dispozitivele cu infrarou (IR), unitile Bluetooth
nu sunt limitate de necesitatea vederii directe ntre ele.
Nucleul sistemului tehnologiei Bluetooth este format dintr-un dispozitiv emisie/receptie RF,
baseband i o stiva de protocoale. Sistemul ofera servicii care activeza conexiunea dispozitivelor
i schimbul de diferite de clase de date ntre aceste dispozitive.
Pentru a facilita procesul de transmisie, datele sunt mprite n entiti mai mici, numite
pachete. n Figura 23 se prezint structura pachetelor i asocierea canalelor pentru master i
respectiv slave.
Acest lucru este posibil asignndu-le un canal de salt n frecven, determinat de secvena
frequency hopping (ordinea n care fiecare frecven este folosit) i de perioda frecvenei. ntr-
o reea piconet(pico reea), succesiunea este determinat de ceasul sistemului dispozitivului
master. n esen, dispozitivul slave sincronizeaz ceasul su intern cu cel al dispozitivului master
, care seteaz aceeai succesiune salturilor n frecven.
44
Pentru stabilirea unei conexiuni prin tehnologia wireless Bluetooth condiia principal este
ca ambele terminale s doreasc realizarea acestei legturi. Unele dispozitive pot fi setate s nu
realizeze scanri pentru mesaje Inquiry; n acest caz, celelalte dispozitive nu le pot descoperi i
vor fi practic invizibile. n mod similar, unele dispozitive pot fi setate s nu realizeze scanri pentru
mesaje Page; n acest caz, aceste dispozitive pot iniia legturi, dar nu vor auzi ncercrile altor
dispozitive de a se conecta la ele. Aplicaiile pot alege dac s fac dispozitivele conectabile sau
descoperibile. O conexiune nu poate fi realizat forat cu un dispozitiv care nu este setat pentru a
o accepta.
45
4 Robotul LEGO Mindstorms NXT
4.1 Generaliti
LEGO Mindstorms este o serie de componente LEGO care cuprinde uniti programabile,
senzori, servomotoare i alte pri constructive.
Produsul LEGO Mindstorms NXT a fost lansat n iulie 2006 i este succesorul primului
model, Robotics Invention System (RCX), care a strnit interesul unui numr mare de amatori.
Succesul setului NXT este argumentat n special de uurina cu care se poate personaliza i
extinde platforma. Au fost dezvoltate numeroase concepte, multe dintre care s-au evideniat n
diverse concursuri de robotic din ntreaga lume.
46
4.2 Sistemul de procesare al robotului NXT
Sistemul de procesare al robotului cuprinde dou microcontrolere, cel principal execut
programele utilizatorului, iar cel auxiliar este destinat controlului prin PWM al servomotoarelor i
meninerea vitezei n funcie de sarcin.
47
3 output ports 6-wire interface supporting input from encoders
Display 100 x 64 pixel LCD black & white graphical display
- View area: 26 X 40.6 mm
Loudspeaker Sound output channel with 8-bit resolutio
- Supporting a sample rate of 2-16 KHz
4 button user-interface Rubber buttons
Power source 6 AA batteries
- Alkaline batteries are recommended
- Rechargeable Lithium-Ion battery 1400
mAH is available
Connector 6-wire industry-standard connector, RJ12 Right
side adjustment
Senzorul cu care este echipat robotul LEGO Mindstorms NXT este similar cu Parallax
PING, prezentat n Figura 9, i permite citirea distanei pn la cel mai apropiat obiect care se
ncadreaz n raza de detecie a senzorului.
Undele ultrasonice se propag sub forma unui con, astfel nct sensibilitatea senzorului
este maxim de-a lungul axei conului (axa acustic) i descrete odat cu apropierea de
generatoare. Pentru a fi perceput, un obiect trebuie s se gseasc n interiorul acestui con.
48
4.3.2 Protocolul de comunicare I2C
Citirea informaiei furnizate de ctre senzorii NXT este realizat prin intermediul
protocolului I2C. Acest protocol a fost inventat de Philips i este folosit pentru comunicarea dintre
periferice low-speed i sisteme centrale (placa de baz, telefon mobil, etc.).
Protocolul const n transmisia de message sub forma binar dintre un dispozitiv master
i unul slave. Pentru comunicarea cu senzorul de ultrasunete al robotului LEGO NXT sunt definite
o serie de comenzi care returneaz valoarea senzorului sau iniiaz un anumit mod de funcionare
al senzorului, printre care:
Event capture command: Acest mod de funcionare permite detectarea altor senzori
cu ultrasunete care sunt n raza de sensibilitate. Astfel se poate decide cnd s se efectueze o
msuratoare pentru a nu aprea interferene ntre senzori. [2]
Setul NXT este dotat cu 3 servomotoare alimentate la 9V. Ele se conecteaz, prin cablurile
furnizate, la cele 3 porturi de ieire (A, B, C) ale unitii centrale. Mufele cablurilor sunt special
proiectate s nu poat fi introduse invers i s aib alte dimensiuni dect mufele standard ale
liniilor telefonice.
49
Figura 25. Servomotor NXT. Structura interna Servomotorul
Putere Putere
Tensiune de
Sarcina Turaie Curent debitat absorbit Randament
alimentare
(mecanic) (electric)
4.5 V 16.7 Ncm 33 rpm 0.6 A 0.58 W 2.7 W 21.4 %
7V 16.7 Ncm 82 rpm 0.55 A 1.44 W 3.85 W 37.3 %
9V 16.7 Ncm 117 rpm 0.55 A 2.03 W 4.95 W 41 %
12 V 16.7 Ncm 177 rpm 0.58 A 3.10 W 6.96 W 44.5 %
Tensiune de
Sarcina Turaie Curent
alimentare
9V 0 170 rpm 0,06 A
9V 50 Ncm 0 2A
50
Pentru a mri cuplul servomotorului, transmisia se face printr-un angrenaj cu raport
reductor de 48:1. Dei randamentul scade, cuplul mare este un avantaj n construcia unui robot
mobil NXT.
Encoderul cu care este echipat servomotorul este un encoder rotativ incremental optic
capabil s depisteze direcia de rotaie (quadrature encoder). Este un sistem bine cunoscut care
se bazeaz pe numrarea impulsurilor optice primite de ctre o diod fotosensibil. Impulsurile
sunt create prin trecerea luminii de la un LED prin fantele unui disc care se rotete.
51
4.4 Metode de comunicare
Legtura fizic dintre PC i robotul NXT se poate realiza prin cablu USB sau prin conexiune
Bluetooth 2.0. Avantajele comunicrii prin cablul USB se restrng la o vitez de transfer superioar
i compatibilitate garantat cu PC-ul. Avantajele conexiunii Bluetooth:
Nu limiteaz mobilitatea robotului sau raza de aciune Robotul NXT se poate conecta
la maxim 10 alte dispozitive Bluetooth, fie c sunt tot roboti NXT sau PC Comunicaia
este rezistent la interferene radio datorit tehnicii spread spectrum (salt de frecven)
Este omnidirecional i nu necesit o poziionare n linie cu celelalte dispozitive pentru
conectare
Ca atare, pentru dezvoltarea programelor care asigur comunicarea dintre robotul NXT i
PC, am ales conexiunea Bluetooth.
Dei produsul LEGO Mindstorms NXT a fost lansat relativ recent, amatorii de robotic au
vzut n acest produs o platform de dezvoltare versatil. Printre pionieri se regsete John
Hansen, creatorul limbajului de programare NXC (Not eXactly C) despre a crui realizare voi
detalia la punctul 4.5.1.
Alte limbaje de programare / compilere au fost create sau adaptate s suporte arhitectura
robotului NXT. Printre cele mai importante se afl: Next Byte Codes i NXC, RobotC, leJOS NXT,
Matlab, Lua, etc.
52
4.5.1 Limbajul de programare NXC (Not eXactly C)
Dup cum i sugereaz i numele, limbajul NXC este un derivat al popularului limbaj de
programare C. NXC a fost creat de ctre John Hansen (principal software engineer, Nashville, TN,
USA) i folosete compiler-ul NBC (Next Byte Codes). Compiler-ul traduce codul NXC n
instruciuni NXT bytecodes care sunt executate direct pe robot. [7]
Fiind un limbaj specific programrii pentru robotul NXT, NXC este structurat pe msur.
Codul este mprit n seturi de instruciuni numite task-uri care pot fi rulate n paralel. De asemena
instruciunile se pot grupa n proceduri (metode) sau funcii, la fel ca n limbajul C.
Sintaxa limbajului NXC este familiar datorit trsturilor comune cu limbajul C. Partea
specific limbajului NXC const n API (Application Programming Interface) care reprezint o
colecie de proceduri i funcii (o librrie) care sunt disponibile programatorului pentru a realiza
operaii specifice robotului NXT.
Documentaia limbajului NXC este cuprinztoare i clarific rapid setul de operaii care se
pot executa folosind limbajul NXC.
Limitri importante:
Practic, am realizat un program pe PC care emite comenzi ctre robotul NXT, prin
intermediul conexiunii Bluetooth, i ateapt un rspuns la comanda emis. Interpretarea i
executarea comenzii se face automat de ctre firmware-ul rezident n robotul NXT, fr o
53
programare suplimentar. n funcie de tipul comenzii, rspunsul poate s confirme execuia
comenzii i chiar s returneze date achiziionate de la senzori. Avantajele acestei metode sunt:
Prelucrarea datelor achiziionate sau afiarea lor depinde de scopul aplicaiei i pot lua
diverse forme. De aceea, eu mi-am propus s asigur o funcionalitate important i anume, aceea
de a exporta datele achiziionate ntr-un format comun, care poate fi apoi uor procesat. Datele
achiziionate pot fi salvate n format tabelar (pe rnduri i coloane) Tab delimited text (.txt) care
este compatibil cu orice versiune de Microsoft Excel.
Un pas important n configurarea PC-ului pentru conexiunea Bluetooth cu robotul NXT este
mperecherea Bluetooth. Procesul presupune recunoaterea (discovery) reciproc a celor dou
dispozitive PC i NXT i cuplarea lor software dup introducerea pe fiecare dintre dispozitive a
aceluiai cod PIN (Personal Identification Number). n urma confirmrii codului PIN fiecare dintre
54
dispozitive stocheaz adresa MAC (Media Access Control) a corespondentului pentru
recunoatere ulterioar.
Acest proces se realizeaz o singur dat pentru aceleai dou dispozitive, ct timp
nregistrrile adreselor MAC sunt pstrate de ctre fiecare parte. mperecherea este o msur de
securitate care poate restriciona accesul la anumite dispozitive (prin codul PIN).
Pe PC, mperecherea Bluetooth se face folosind soft-ul care este instalat o dat cu diverele
adaptorului Bluetooth.
55
Figura 28. Configurarea conexiunii Bluetooth dintre PC i NXT
Motivele pentru care am ales acest limbaj de programare pentru realizarea aplicaiilor pe
PC din aceasta lucrare sunt urmtoarele:
56
C# este un limbaj destinat RAD (Rapid Application Development)
Librriile din Microsoft .Net Framework sunt robuste i permit implementarea
comunicrii prin port serial
Din punctul de vedere al sintaxei, C# este similar cu popularul C i C++ cu care mam
familiarizat pe parcursul facultii
C# este un limbaj pur Object Oriented i are la baz conceptul de clas (class). O clas
reprezint un obiect virtual care are proprieti, metode, constante, constructori, evenimente, etc.
n programare, obiectele virtuale sunt utile deoarece pot reprezenta corespondente ale unor
obiecte din realitate. Aceste obiecte virtuale pot fi folosite pentru a simula sau a controla obiectele
din realitate.
Pentru a descrie acest concept (clas sau obiect virtual) am ales s consider un exemplu
din realitate care poate fi reprezentat n programare: automobilul. Obiectul sau clasa se va numi
Automobil i poate fi definit astfel:
Clasa Automobil
Este evident asemnarea unui automobil cu un robot mobil. Observaia rmne valabil
i pentru conceptele corespondente din programare.
57
public class Automobil
{
// constante
public const int NumarDeRoti = 4;
public const string Marca = "Suzuki";
public const bool VolanPeStanga = true;
// constructor
public Automobil() {
VitezaCurenta = 0;
Kilometraj = 0;
}
// constructor
public Automobil(int km) {
Kilometraj = km;
}
// proprietate
public int VitezaCurenta { // in km / ora
get {return _VitezaCurenta;}
set {_VitezaCurenta = value;}
}
private int _VitezaCurenta;
// metoda
public void PornesteMotorul() {
TuratieCurenta = 900; //rpm
}
// metoda
public void OpresteMotorul() {
TuratieCurenta = 0; //rpm
}
// metoda
public int RuleazaInainte(int Durata) {// Durata in ore
Kilometraj = Kilometraj + (VitezaCurenta * Durata);
return Kilometraj;
}
}
Similar cu exemplul de mai sus am creat o clas numit OperatorNXT care controleaz
robotul NXT. Mai concret, clasa OperatorNXT controleaz conexiunea Bluetooth cu robotul NXT
i citirea datelor achiziionate de la senzori. Codul care definete clasa OperatorNXT este
prezentat n Anexa 9.1.
58
5.4 Proiectarea i implementarea aplicaiei de pe PC
Urmnd paii de configurare al PC-ului descrii la sub-capitolul 5.2 rezult stabilirea unui
port serial (COM1, COM2, etc) prin care se realizeaz conexiunea Bluetooth cu robotul NXT.
inclus n Microsoft .Net Framework, supervizeaz operaiile de citire sau scriere de date la un
port serial al calculatorului. Am folosit aceast clas pentru a iniia i controla conexiunea cu
dispozitivul Bluetooth asignat acelui port serial, adic robotul NXT.
Aceasta reprezentare este o variabil definit pe baza clasei SerialPort i dispune de toate
Pentru a putea comnica prin portul serial al PC-ului trebuie ca acesta s fie deschis.
Deschiderea conexiunii se face apelnd metoda Open.
NXT i primete ca parametru un vector de tip byte care conine seria de octei ce va fi trimis
prin portul serial. Metoda Read este folosit pentru citirea unui vector de tip byte care reprezint
59
5.4.2 Comunicarea PC NXT prin interogare
n calitate de master, PC-ul va iniia i controla conexiunea Bluetooth i va emite comenzi ctre
robotul NXT. Recepionarea, interpretarea i executarea comenzilor pe robotul NXT se face
automat de ctre firmware-ul rezident, fr o programare suplimentar [2].
n funcie de tipul comenzii, rspunsul poate s confirme execuia comenzii sau chiar s
returneze date achiziionate de la senzori. Acest protocol este numit control prin comenzi directe.
Protocolul de control prin comenzi directe poate furniza date achiziionate de la orice senzor
NXT.
1. Formularea comenzii
2. Trimiterea comenzii la portul serial al PC
3. Transmisia prin Bluetooth de la PC la NXT
4. Interpretarea comenzii pe NXT
5. Executarea comenzii / Achiziia de date de la senzor
6. Formularea rspunsului
7. Trimiterea rspunsului
8. Transmisia prin Bluetooth de la NXT la PC
9. Recepionarea rspunsului la portul serial al PC
10. Interpretarea rspunsului
Un aspect important pentru valorificarea datelor achiziionate este fixarea lor n timp.
Deoarece timpul este msurat pe PC i datele sunt achiziionate de la senzori pe unitatea NXT,
apar ntrzieri i o desincronizare a datelor fa de momentul achiziiei. Fiecare etap din procesul
descris mai sus reprezint o ntrziere. Din fericire suma acestor ntrzieri este relativ mic, de
ordinul zecilor de milisecunde. Mai mult, aceste ntrzieri sunt n general constante i se poate
compensa efectul lor din programare.
Dei subiectul este discutabil, n final voi demonstra experimental c aceste ntrzieri sunt
neglijabile n raport cu aplicaiile prezentate n aceast lucrare.
Acest set de instruciuni face posibil comanda robotului NXT de la dispozitive externe.
60
Astfel robotul NXT poate fi controlat de la PC, de la ali roboi NXT sau orice dispozitiv capabil de
comunicare Bluetooth sau USB prin port serial.
Protocolul acoper funcionalitile de baz ale robotului NXT, dar permite i extinderea sa
prin trimiterea unor comenzi personalizate care ar putea fi interpretare de un program suplimentar
care ruleaz pe robot.
Primul octet (byte 0) va conine tipul de comand. Dac seria de octei este un rspuns,
atunci primul octet va reprezenta tot un tip de comand (reply) i va avea valoarea 0x02 n
Comenzile de sistem nu fac parte din protocolul de comenzi directe i nu sunt folosite
pentru comanda uzual a robotului NXT.
61
Al doilea octet (byte 1) va determina care comand va fi executat, adic va conine codul
comenzii, iar restul de octei vor descrie parametrii specifici respectivei comenzi.
Pentru telegrame transmise prin Bluetooth se adaug doi octei la nceputul structurii
conform Figura 30. Acesti doi octei descriu lungimea telegramei.
Unde LSB (Least Semnificant Byte) i MSB (Most Semnificant Byte) descriu lungimea
total a comenzii.
Comanda este apoi procesat, se construiete telegrama i se scrie (Write) la portul serial al
PC-ului:
62
if (comanda[0] < 0x80) // in cazul in care comanda directa necesita raspuns
{
int lsb = PortSerial.ReadByte(); // citeste primul byte
int msb = PortSerial.ReadByte(); // citeste al doilea byte
int lungime_raspuns = lsb + msb * 256; // calculeaza lungimea raspunsului
byte[] raspuns = new byte[lungime_raspuns];
PortSerial.Read(raspuns, 0, lungime_raspuns); // citeste raspunsul
}
63
Figura 31. Diagrama simplificata a algoritmului de citire a datelor achiziionate prin interogare de la PC
Codul surs complet este prezentat n Anexa 9.1, Anexa 9.2, Anexa 9.3.
64
Figura 32. Aplicaie la metoda de citire a datelor de la senzori prin interogare de la PC
n principiu, astfel se poate determina att poziia unui obiect ct i dimensiunile acestuia
(limea sau nlimea).
Aplicaia prezint o interfa grafic facil prin intermediul creia se poate iniia conectarea
sau deconectarea prin Bluetooth a PC-ului la NXT.
65
Deoarece msurarea distanei i transmisia informaiei prin Bluetooth cauzeaz o
ntrziere considerabil din momentul trimiterii comenzii pn n momentul returnrii rezultatului,
nu se poate msura n timp ce senzorul cu ultrasunete se rotete cu vitez constant.
Analiza datelor obinute se poate face n chiar timpul colectrii lor datorit interfeei grafice
care prezint n mod vizual o hart virtual a conturului spaiului nconjurtor Figura 33.
Intuitiv, zonele cu negru reprezint umbre ale obiectelor situate n zona scanat (la
distante mici), iar rou reprezint spaiul gol (distante mari).
Consider ca deficienele sunt n mare parte datorate metodei de control i comanda prin
Bluetooth care adauga o intarziere semnificativa intre diferite masuratori i faptului ca prin aceasta
metoda nu se pot accesa anumite functionalitati software ale robotului NXT care ar permite o mai
buna manevrare a servomotorului.
66
6 Citirea datelor achiziionate de la senzorii NXT sub
comanda programului NXC
Ca alternativ la prima metod, prezentat la Capitolul 0, am elaborat o a doua metod
prin care se poate face transmisia datelor achiziionate de la senzorii NXT la PC.
Dei rolurile par inversate, din punctul de vedere al conexiunii Bluetooth, cel care iniiaz
conexiunea Bluetooth este tot programul de pe PC-ul, iar acest lucru se face n acelai mod descris
la punctul 5.4.1.
Dezavantaje:
n continuare voi prezenta pe larg fiecare dintre cele dou programe i o aplicaie la
aceast metod.
67
6.1 Proiectarea i implementarea programului de pe NXT (emitorul)
Programul care ruleaz pe robotul NXT are rolul de a achiziiona date de la senzorii NXT
i de a le transmite prin Bluetooth ctre PC.
n limbajul de programare NXC sunt disponibile cteva funcii (metode) destinate citirii datelor de
la senzorii NXT. Pentru aplicaiile prezentate n aceast lucrare voi folosi dou funcii pentru a citi
datele de la doi senzori NXT: MotorTachoCount i SensorUS [7].
68
deoarece tipul de date struct este similar cu conceptul de obiect virtual ntlnit n programarea
Object Oriented din C# (punctul 5.3). Un alt avantaj al tipului de date struct este c permite mai
uor serializarea sa.
Tipul de date struct folosit n programul dezvoltat pentru aceast lucrare este numit
struct masuratoare
{
unsigned short timp; short valoare;
};
Instruciunile de mai sus sunt incluse ntr-o metod numit SalveazaMasuratoare care
primete ca parametru valoarea unui senzor, iar fixarea n timp se face independent de tipul de
senzor care a furnizat valoarea sau de valoare n sine. Mai mult, metoda construiete un vector
de tip masuratoare n care sunt stocate achiziiile de date efectuate. Practic, fiecare
masuratoare efectuat este pstrat ntr-un vector numit SerieMasuratori. Acest vector
va fi serializat i transmis prin Bluetooth la PC.
Pentru a putea transmite date prin conexiunea Bluetooth i apoi la PC, datele achiziionate
de la senzorii NXT de ctre programul NXC trebuie serializate. Serializarea este folosit
pretutindeni n transmisia informaiei i poate fi o tehnic de compresie sau criptare a informaiilor
transmise.
o variabil de tip string care poate fi trimis apoi prin Bluetooth la PC.
reprezint un ir de caractere ASCII, sau mai exact un vector de tip byte. Aceast metod
70
Figura 34. Diagrama simplificat a algotitmului programului NXC (emitor)
Clasa pe care am creat-o pentru acest scop se numete ReceptorNXT, iar codul complet
se gseste n Anexa 9.5.
71
2.4. Conversia de la bytes la tipuri de date utilizabile n C# short, ushort
Construirea unui vector de tip de date
2.5. Masuratoare
2.6. Stocarea vectorului de msurtori
3. Afiare sau export msurtori
Figura 35. Diagram simplificat a algoritmului de citirea a datelor de la senzorii NXT transmise la PC de ctre
programul scris n NXC
72
Figura 36. Interfaa grafic a programului. Iniierea Figura 37. Interfaa grafic a programului. Datele
conexiunii Bluetooth achiziionate
Primul pas care trebuie efectuat pentru citirea datelor de la robotul NXT este iniierea conexiunii
Bluetooth. n Figura 36 este evideniat zona dedicat iniierii conexiunii Bluetooth. Aceasta se
face alegnd portul serial rezervat pentru comunicarea Bluetooth cu robotul NXT. Pentru rapiditate
este disponibil o list cu porturile seriale uzuale (COM1, COM2, COM6, COM13), dar este
posibil i introducerea manual a numelui portului.
Apsarea butonului Conecteaz! realizeaz deschiderea portului serial. Dac operaiunea a avut
succes, butonul este iluminat, iar pe afiajul robotului NXT se poate observa c dispozitivelele
sunt cuplate Bluetooth.
n continuare se poate porni monitorizarea portului serial prin apsarea butonului Start din stnga.
Astfel se pornete o execuie repetitiv care verific portul serial n ateptarea unui transfer de
date.
Dac portul serial al PC-ului recepioneaz date transmise prin Bluetooth de la robotul NXT,
atunci acestea sunt rapid interpretate i listate n interfaa programului (Figura 37).
Odat primite i interpretate, datele pot fi salvate ntr-un fiier n format Tab delimited text pentru
postprocesare.
73
6.3 Aplicaie la metoda de citire a datelor achiziionate de la senzorii NXT
sub comanda programului NXC
Pentru testarea celor dou programe prezentate la punctele 6.1 i 6.2, am realizat robotul
din Figura 38 care face uz de un servomotor NXT i senzorul cu ultrasunete NXT.
Scopul aplicaiei este s furnizeze date achiziionate de la senzorii NXT sub comanda
programului NXC pentru a obine graficul evoluiei mrimilor msurate n timp.
}
Instruciunea RotateMotor(OUT_C, 20, 500) va produce o rotire cu 500 de grade
n sensul acelor de ceasornic a axului servomotorului conectat la portul OUT_C al robotului NXT.
Viteza de rotaie (20 n prima instruciune) este o mrime derivat cu valori ntre -100 i 100 i
se traduce de fapt n tensiunea aplicat bornelor servomotorului (-9V i +9V).
74
Pentru evaluarea datelor de la senzorul cu ultrasunete se va plasa n faa robotului, la
aproximativ 40cm, un obstacol. Pe msur ce robotul se apropie de obstacol, senzorul cu
ultrasunete ar trebui s nregistreze scderea distanei, iar evoluia acestei mrimi s corespund
cu evoluia distanei parcurse msurat de ctre encoderul servomotorului.
Figura 38. Aplicaie la metoda de citire a datelor achiziionate sub comanda programului NXC
75
Figura 39. Evoluia distanei parcurse de robot
76
7 Analiza rezultatelor obinute
7.1 Rezultatele obinute la aplicaiile implementate
Lucrarea de fa prezint dou metode de transmisie a datelor achiziionate de la senzorii
NXT la PC:
La fiecare dintre cele dou metode elaborate am realizat i cte o aplicaie practic.
Aplicaiile respective au fost:
77
Figura 41. Rezultatele comparrii celor dou metode
Dup cum se observ n graficul din Figura 41, cele dou metode furnizeaz rezultate
aproape identice. Acest concluzie a constituit o surpriz, deoarece m ateptam ca metoda 1
(achiziia datelor prin interogare de la PC) s sufere ntrzieri datorate unui algoritm mai complex
i traficului mai frecvent prin conexiune Bluetooth, iar curba s se decaleze fa de curba metodei
2.
78
8 Concluzii
Tema proiectului de diplom se refer la un domeniu de actualitate, viznd valorificarea
eficient a unor elemente disponibile n domeniul roboilor mobili de uz tiinific i didactic (suportul
LEGO Mindstorms NXT) n scopul dezvoltrii platformei de comunicaii prin Bluetooth a acestora
cu elemente soft care s ofere un mediu favorabil i fiabil potenialelor aplicaii.
Acest scop a fost realizat, conform cerinelor i detaliilor impuse prin tem, prin elaborarea
a dou metode de transmitere a datelor achiziionate de la senzorii NXT, de la robotul mobil la PC.
Pentru fiecare metod s-a realizat un program-soft corespunztor, precum i cte o aplicaie care
s concretizeze i s verifice eficiena metodei, iar acest aspect a fost confirmat, att prin
rezultatele aplicaiilor asociate, ct i prin rezultatele unei aplicaii elaborat special pentru
compararea celor dou metode.
Faptul c, la compararea rezultatelor aplicrii celor dou metode, s-au obinut date
aproape identice determin concluzia c ambele metode sunt caracterizate de un nivel ridicat de
acuratee n domeniul timp. ntrzierea transferului de date prin conexiune Bluetooth este
neglijabil n raport cu reacia n timp a elementelor de execuie ale robotului (servomotorul) sau
reacia n timp a anumitor senzori.
Este important de menionat c cele dou metode nu exclud, pentru viitor, elaborarea i a
altor programe (mbuntite) cu acelai scop, iar programele pe care le-am realizat reprezint o
baz flexibil pentru rularea unei diversiti de aplicaii tiinifice sau didactice.
Bibliografie
79
[2] ***, LEGO Mindstorms NXT Bluetooth Developer Kit
[3] ***, LEGO Mindstorms NXT Direct commands
[4] ***, Mindstorms Education NXT User Guide
[5] Dave Astolfo, Mario Ferrari, Giulio Ferrari, Building Robots with LEGO Mindstorms NXT
[6] Michael Gasperi, Philippe Philo Hurbain, Isabelle Hurbain, Extreme NXT Extending the
LEGO MINDSTORMS NXT to the Next Level
[7] John Hansen, Not eXactly C (NXC) Programmer's Guide.
[8] Daniele Benedettelli, Programming LEGO NXT Robots using NXC [9] *** ,
www.parallax.com
[10] Radu Bogdan Rusu, Robotux - a multiagent robot security system. Master's Thesis, Faculty
of Automation and Computer Science, Technical University of Cluj-Napoca, Romania, 2004. [11]
*** http://www.philohome.com/nxt.htm
[12] *** , http://me.mecatronica.pub.ro/romar/etape/etapa_3/Legatura%202_1.pdf
[13] Radu Bogdan Rusu, Modern architectures for mobile robots: Javaclient and ZeeRO.
Advanced Master's Thesis, Faculty of Automation and Computer Science, Technical
University of Cluj-Napoca Romania, 2005
[14] *** , http://yo9hnh.files.wordpress.com/2008/10/introducere-n-microcontrollere.pdf
[15] *** , www.mikroe.com/ro/product/books/PICbook/2_01Poglavlje.htm
[16] Dumitriu, A., Bucan, C., Demian, T., Sisteme senzoriale pentru roboi, Editura MEDRO,
Bucureti, 1996.
[17] Dumitriu, A., Mecatronic, volumul I, Editura Universitii Transilvania din Braov, 2006.
[18] Grigore, O., An Incremental Motion Tracking Controller for on Board Directly Platform, n:
Rev. Roum. Sci. Techn. Electrotehn. Et Energ., 3, Bucharest, 2000.
[19] *** , www.LegoDacta.com
[20] *** , http://telecom.etc.tuiasi.ro/telecom/staff/ccomsa/Lucru/
Introducere_n_Bluetooth.pdf
[21] *** , http://stst.elia.pub.ro/RIC/Teme_RIC_2006_7/AlexandraAlmasan/
RETELE%20WIRELESS%20DE%20MICI%20DIMENSIUNI.doc
[22] *** , ftp.utcluj.ro/pub/users/cmil/rwcm/week3/bluetooth01.ppt
80
[26] *** , http://www.bluetooth.com/
[27] Jon Inouye, Introduction to BluetoothWireless Technology -Mobile Platforms Group Intel
Corporation
[28] *** , Ericsson Mobile Communications AB Users Manual Bluetooth PC Reference Stack
by Ericsson, 2000
[29] Muller, Nathan J., Bluetooth Demistified McGraw-Hill Telecom, 2001
[30] Coiffet, P., La robotique principles et applications, Editions Hermes Paris, 1986,
81
Anexe
9 Anexe
9.1 Anexa 1. Metoda 1. Clasa OperatorNXT
using System;
using System.Collections.Generic;
using System.Text; using
System.IO.Ports; using
Bram.Utilities;
namespace PC2NXT
{
public class OperatorNXT {
public OperatorNXT(string portname){
_portName = portname;
}
private string _portName;
private SerialPort port = null;
public void Connect(){
if(port != null){
Disconnect();
}
port = new SerialPort(_portName);
port.Open();
IsConnected = true;
}
public void Disconnect(){
IsConnected = false;
if(port.IsOpen){
port.Close();
port.Dispose();
}
port = null;
}
/// <summary>
/// semafor care marcheaza conexiune activa sau nu
/// </summary>
public bool IsConnected {
get {
return _isConnected;
}
private set {
_isConnected = value;
}
}
bool _isConnected = false;
82
/// <summary>
/// trimite serie bytes la portul serial
/// </summary>
private byte[] TrimiteComanda(byte[] comanda){
if(!IsConnected){
throw new InvalidOperationException("trebuie conectat");
} else {
lock(this){
int length = comanda.Length;
byte[] btMessage = new byte[comanda.Length + 2];
btMessage[0] = (byte)(length & 0xFF);
btMessage[1] = (byte)((length & 0xFF00) >> 8);
comanda.CopyTo(btMessage, 2);
port.Write(btMessage, 0, btMessage.Length);
if(comanda[0] < 0x80){ // A reply is
expected. Check it. int lsb =
port.ReadByte(); int msb = port.ReadByte();
int size = lsb + msb * 256;
byte[] reply = new byte[size];
port.Read(reply, 0, size);
return reply;
} else { return
null;
}
}
}
}
/// <summary>
/// seteaza starea unui motor
/// </summary>
public void SetStareMotor(PortNxtMotor port, sbyte power, ModNxtMotor
mode, RegModNxtMotor regulationMode, sbyte turnRatio, FunctNxtMotor runState, uint
tachoLimit){
byte[] comanda = new byte[12];
comanda[0] = 0x80;
comanda[1] = (byte)CodMesajDirect.SetOutputState;
comanda[2] = (byte)port;
comanda[3] = (byte)power; comanda[4] =
(byte)mode; comanda[5] =
(byte)regulationMode; comanda[6] =
(byte)turnRatio; comanda[7] =
(byte)runState; Util.SetUInt32(comanda,
8, tachoLimit);
TrimiteComanda(comanda);
}
/// <summary>
/// returneaza starea unui motor
/// </summary>
public StareMotor GetStareMotor(PortNxtMotor port){
byte[] comanda = new byte[3];
comanda[0] = 0x00;
comanda[1] = (byte)CodMesajDirect.GetOutputState;
comanda[2] = (byte)port; byte[]
reply = TrimiteComanda(comanda); StareMotor
raspuns = new StareMotor(); raspuns.Power =
(sbyte)reply[4]; raspuns.Mode =
(ModNxtMotor)reply[5]; raspuns.RegulationMode =
(RegModNxtMotor)reply[6];
raspuns.TurnRatio = (sbyte)reply[7];
raspuns.RunState = (FunctNxtMotor)reply[8];
83
raspuns.TachoLimit = Util.GetUInt32(reply, 9);
raspuns.TachoCount = Util.GetInt32(reply, 13);
raspuns.BlockTachoCount = Util.GetInt32(reply, 17);
raspuns.RotationCount = Util.GetInt32(reply, 21);
return raspuns;
}
/// <summary>
/// seteaza modul de functionare al unui senzor
/// </summary>
public void SetInputMode(PortNxtSenzor port, TipNxtSenzor type,
ModNxtSenzor mode){
byte[] comanda = new byte[5];
comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;
comanda[1] = (byte)CodMesajDirect.SetInputMode;
comanda[2] = (byte)port; comanda[3] = (byte)type;
comanda[4] = (byte)mode; TrimiteComanda(comanda);
}
/// <summary>
/// citeste date achiziionate de la un senzor
/// </summary>
public StareSenzor GetInputValues(PortNxtSenzor port){
StareSenzor raspuns = new StareSenzor();
byte[] comanda = new byte[3]; comanda[0] = 0x00;
// Expect an answer
comanda[1] = (byte)CodMesajDirect.GetInputValues;
comanda[2] = (byte)port; byte[] reply
= TrimiteComanda(comanda); raspuns.Valid = (reply[4]
== 1) ? true : false; raspuns.Calibrated = (reply[5]
== 1) ? true : false; raspuns.Type =
(TipNxtSenzor)reply[6]; raspuns.Mode =
(ModNxtSenzor)reply[7]; raspuns.RawAD =
Util.GetUInt16(reply, 8); raspuns.NormalizedAD =
Util.GetUInt16(reply, 10); raspuns.ScaledValue =
Util.GetInt16(reply, 12);
raspuns.CalibratedValue = Util.GetInt16(reply, 14);
return raspuns;
}
/// <summary>
/// citeste numarul de bytes disponibil la magistrala I2C (Low speed)
/// </summary>
public int LSGetStatus(PortNxtSenzor port){
byte[] comanda = new byte[3];
comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;
comanda[1] = (byte)CodMesajDirect.LSGetStatus;
comanda[2] = (byte)port; byte[] reply = TrimiteComanda(comanda);
return reply[3];
}
/// <summary>
/// scrie un mesaj la magistrala I2C (low speed)
/// </summary>
public void LSWrite(PortNxtSenzor port, byte[] data, int
returnMessageLength){
if(data.Length < 1 || data.Length > 16){
throw new InvalidOperationException("data length must be between 1 and 16 bytes");
}
byte[] comanda = new byte[5 + data.Length];
comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;
comanda[1] = (byte)CodMesajDirect.LSWrite;
comanda[2] = (byte)port; comanda[3] =
(byte)data.Length; comanda[4] =
84
(byte)returnMessageLength; Array.Copy(data,
0, comanda, 5, data.Length);
TrimiteComanda(comanda);
}
/// <summary>
/// citeste tot de la magistrala I2C (low speed)
/// </summary>
public byte[] LSRead(PortNxtSenzor port){
byte[] comanda = new byte[3];
comanda[0] = (byte)NxtCommandType.DirectCommandWithResponse;
comanda[1] = (byte)CodMesajDirect.LSRead;
comanda[2] = (byte)port;
byte[] reply = TrimiteComanda(comanda);
int length = (int)reply[3];
byte[] raspuns = new byte[length];
Array.Copy(reply, 4, raspuns, 0, length);
return raspuns;
}
/// <summary>
/// scrie un byte de la interfata I2C (low speed)
/// </summary>
public void I2CSetByte(PortNxtSenzor port, byte address, byte value){
byte[] i2cCmd = new byte[3]; i2cCmd[0] = 0x02;
i2cCmd[1] = address; i2cCmd[2] = value;
LSWrite(port, i2cCmd, 0);
}
/// <summary>
/// citeste un byte de la interfata I2C (low speed)
/// </summary>
public byte I2CGetByte(PortNxtSenzor port, byte address){
byte[] i2cCmd = new byte[2]; i2cCmd[0]
= 0x02; i2cCmd[1] = address;
int bytesRead = 0;
do {
LSWrite(port, i2cCmd, 1);
try {
bytesRead = LSGetStatus(port);
}
catch(Exception){
bytesRead = 0;
}
} while(bytesRead < 1);
return LSRead(port)[0];
}
}
public struct StareMotor {
public sbyte Power; public
ModNxtMotor Mode; public RegModNxtMotor
RegulationMode; public sbyte TurnRatio;
public FunctNxtMotor RunState;
public uint TachoLimit; public int
TachoCount; public int BlockTachoCount;
public int RotationCount;
}
public struct StareSenzor {
public bool Valid; public
bool Calibrated; public
TipNxtSenzor Type; public
ModNxtSenzor Mode; public
UInt16 RawAD; public
85
UInt16 NormalizedAD;
public Int16 ScaledValue;
public Int16
CalibratedValue;
}
public enum CodMesajDirect : byte {
StartProgram = 0x00,
StopProgram = 0x01,
PlaySoundFile = 0x02,
PlayTone = 0x03,
SetOutputState = 0x04,
SetInputMode = 0x05,
GetOutputState = 0x06,
GetInputValues = 0x07,
MessageWrite = 0x09,
ResetMotorPosition = 0x0A,
GetBatteryLevel = 0x0B,
KeepAlive = 0x0D,
LSGetStatus = 0x0E,
LSWrite = 0x0F,
LSRead = 0x10,
MessageRead = 0x13,
OpenRead = 0x80,
OpenWrite = 0x81,
Read = 0x82,
Write = 0x83,
SetBrickName = 0x98
}
public enum CodRaspuns : byte {
OK = 0x00,
PendingCommunicationInProgress = 0x20,
SpecifiedMailBoxEmpty = 0x40,
RequestFailed = 0xBD,
UnknownCommand = 0xBE,
InsanePacket = 0xBF,
publicOfRangeData = 0xC0,
CommBusError = 0xDD,
publicOfMemoryInCommunicationBuffer = 0xDE,
ChannelInvalid = 0xDF,
ChannelBusy = 0xE0,
NoActiveProgram = 0xEC,
IllegalSizeSpecified = 0xED,
IllegalMailboxID = 0xEE,
InvalidFieldAccess = 0xEF,
BadData = 0xF0,
publicOfMemory = 0xFB,
BadArguments = 0xFF
}
[Flags()]
public enum ModNxtMotor : byte {
None = 0x00,
MotorOn = 0x01,
Brake = 0x02,
Regulated = 0x04
}
[Flags]
public enum RegModNxtMotor : byte {
Idle = 0x00,
MotorSpeed = 0x01,
MotorSynchronization = 0x02
86
}
[Flags]
public enum FunctNxtMotor : byte {
Idle = 0x00,
RampUp = 0x10,
Running = 0x20,
Rampdown = 0x40
}
public enum PortNxtMotor {
PortA = 0x00,
PortB = 0x01,
PortC = 0x02,
None = 0xFE,
All = 0xFF
}
public enum PortNxtSenzor {
Port1 = 0x00,
Port2 = 0x01,
Port3 = 0x02,
Port4 = 0x03,
None = 0xFE
}
public enum TipNxtSenzor {
None = 0x00,
Switch = 0x01,
Temperature = 0x02,
Reflection = 0x03,
Angle = 0x04,
LightActive = 0x05,
LightInactive = 0x06,
SoundDB = 0x07,
SoundDBA = 0x08,
Custom = 0x09,
LowSpeed = 0x0A,
LowSpeed_9V = 0x0B
}
public enum ModNxtSenzor {
Raw = 0x00,
Boolean = 0x20,
TransitionCounter = 0x40,
PeriodCounter = 0x60,
Percentage = 0x80,
Celsius = 0xA0,
Fahrenheit = 0xC0,
AngleStep = 0xE0
}
public enum NxtCommandType {
DirectCommandWithResponse = 0x00,
SystemCommandWithResponse = 0x01,
Reply,
DirectCommandNoResponse = 0x80,
SystemCommandNoResponse = 0x81
}
}
87
9.2 Anexa 2. Metoda 1. Modul de afisare a datelor de la senzorul cu
ultrasunete
using
System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing; using
System.Data; using System.Text;
using System.Windows.Forms; using
System.Collections; using
System.Drawing.Drawing2D;
namespace PC2NXT
{
public partial class SonarMap : UserControl
{
private Brush brush1 = new SolidBrush(Color.Red);
private Brush brush2 = new SolidBrush(Color.Black); private
Brush brush3 = new SolidBrush(Color.AliceBlue); public int
RotationRange = 0;
public SonarMap()
{
InitializeComponent();
}
private void SonarMap_Load(object sender, EventArgs e)
{
}
public void Init(int RotationRange)
{
this.RotationRange = RotationRange;
this.Clear();
label1.Text = "";
label2.Text = "";
}
private ArrayList _FoundObjects;
public ArrayList FoundObjects
{
get
{
return _FoundObjects;
}
set
{
_FoundObjects = value;
}
}
public void Clear()
{
panel1.CreateGraphics().Clear(panel1.BackColor);
}
public void Draw(SomeObject obj)
{
Draw(obj, panel1.CreateGraphics());
}
public void Draw(SomeObject obj, Graphics graphics)
{
int W = panel1.Width;
int H = panel1.Height - 10;
88
int w = (int)(W / RotationRange);
int h = (int)(H * obj.Distance / 255);
int x = (int)(w * obj.Rotation);
graphics.FillRectangle(brush1, x, 10 + H - h, 4, h);
graphics.FillRectangle(brush2, x, 10, 4, H - h);
graphics.FillRectangle(brush3, 0, 0, W, 10);
graphics.FillPolygon(brush1, new Point[] {new Point(x - 3, 0), new
Point(x, 8), new Point(x + 4, 0)});
}
private void DrawAll(Graphics graphics)
{
if (this.FoundObjects != null)
for (int i = 0; i < this.FoundObjects.Count; i++)
Draw((SomeObject)this.FoundObjects[i], graphics);
}
public void DrawAll(ArrayList PartiallyFoundObjects)
{
this.FoundObjects = PartiallyFoundObjects;
DrawAll(panel1.CreateGraphics());
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
DrawAll(e.Graphics);
}
private void SonarMap_Resize(object sender, EventArgs e)
{
panel1.Width = this.Width;
}
private int? SelectionStart = null;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (SelectionStart != null)
{
SelectionStart = null;
panel1.Cursor = Cursors.Default;
}
else
{
SelectionStart = e.X;
panel1.Cursor = Cursors.VSplit;
}
}
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (SelectionStart != null)
{
label1.Text = "Distanta minima: " +
GetMinDistanceBetween((int)SelectionStart, e.X);
label1.Text = "intre " + SelectionStart + " i " + e.X;// +
GetWidthBetween((int)SelectionStart, e.X);
}
else
{
89
label1.Text = "Distanta: " + GetDistanceAround(e.X);
label2.Text = "";
}
}
private int GetDistanceAround(int x)
{
if (FoundObjects == null) return 0; int
r = XToRotation(x); ArrayList vals = new
ArrayList(); for (int i = 0; i <
FoundObjects.Count; i++)
{
int R = ((SomeObject)FoundObjects[i]).Rotation;
if (R == r)
{
return ((SomeObject)FoundObjects[i]).Distance;
}
else if (Math.Abs(R - r) < 3)
{
vals.Add(((SomeObject)FoundObjects[i]).Distance);
}
}
if (vals.Count > 0)
{
int sum = 0;
for (int i = 0; i < vals.Count; i++)
{
sum += (int)vals[i];
}
return (int)(sum / vals.Count);
}
return 0;
}
90
}
private int XToRotation(int x)
{
return (int)(x / (panel1.Width / RotationRange));
}
}
}
9.3 Anexa 3. Metoda 1. Programul principal al aplicatiei
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data; using
System.Drawing; using
System.Text; using
System.Windows.Forms; using
System.Collections;
namespace PC2NXT
{
public partial class Form1 : Form
{
private const int SonarConeAngle = 100;
private const int SonarConeAngleInDegrees = 90;
public Form1()
{
InitializeComponent();
}
private OperatorNXT nxt = new OperatorNXT("COM6");
private PortNxtSenzor SonarPort = PortNxtSenzor.Port1;
private PortNxtMotor MotorPort = PortNxtMotor.PortC;
private ArrayList FoundObjects = new ArrayList();
private int RotationDirection = 1;
private int RotationReference = 0;
private int RotationDiff = 0; private
int RotationLimit = 400; private bool
scanning = false;
private void button1_Click(object sender, EventArgs e)
{
if (nxt.IsConnected)
Disconnect();
else
Connect();
}
private void button2_Click(object sender, EventArgs e)
{
if (scanning)
{
scanning = false;
button2.Text = "Start";
}
else
{
FoundObjects.Clear();
RotationLimit = Int32.Parse(textBox1.Text);
MotorInit();
sonarMap.FoundObjects = this.FoundObjects;
sonarMap.Init(RotationLimit);
sonarGauge.Init(RotationToAngle(RotationReference), 0);
button2.Text = "Stop";
91
scanning = true;
}
}
private void Connect()
{
nxt.Connect();
if (nxt.IsConnected)
{
SonarInit();
MotorInit();
timer1.Enabled = true;
timer1.Interval = 1600;
button1.Text = "Disconnect";
}
}
private void Disconnect()
{
timer1.Enabled = false;
nxt.Disconnect();
button1.Text = "Connect";
}
private void SonarInit()
{
nxt.SetInputMode(SonarPort, TipNxtSenzor.LowSpeed_9V,
ModNxtSenzor.Raw);
if (nxt.LSGetStatus(SonarPort) > 0)
{
nxt.LSRead(SonarPort);
}
nxt.I2CSetByte(SonarPort, (byte)NxtSonarRegister.Mode, 0x02);
}
private int SonarGetDistance()
{
return SonarGetDistance(NxtSonarRegister.MeasurementByte0);
}
private int SonarGetDistance(NxtSonarRegister meas)
{
try
{
return nxt.I2CGetByte(SonarPort, (byte)meas);
}
catch (Exception ex)
{
return -1;
}
}
92
// store distance
ObjectCheckNew(Distance, RelativeRotation);
// what to do next?
if (RelativeRotation > RotationLimit)
{
RotationDirection = -1;
RotationDiff++;
}
else if (RelativeRotation < 0)
{
RotationDirection = 1;
RotationDiff++;
}
else if (RelativeRotation == 0)
{
RotationDirection = 1;
RotationDiff++;
}
sonarMap.FoundObjects = this.FoundObjects;
sonarMap.Draw(new ObiectDetectat(Distance, RelativeRotation));
//sonarGauge.Angle = RotationToAngle(Rotation);
//sonarGauge.Distance = Distance;
//sonarGauge.Draw();
RotesteServo(10, 20 + RotationDiff);
}
private void ObjectCheckNew(int Distance, int Rotation){
ObiectDetectat CurrentObject = new ObiectDetectat(Distance,
Rotation);
if (FoundObjects.Count == 0)
ObjectAdd(CurrentObject);
else
{
//ObiectDetectat PreviousObject =
(ObiectDetectat)FoundObjects[FoundObjects.Count - 1];
//if (PreviousObject.CompareDistance(CurrentObject) != 0)
ObjectAdd(CurrentObject);
}
}
private void ObjectAdd(ObiectDetectat obj){
// parcurge valorile existente pentru a asigura ordinea crescatoare
for (int i = 0; i < FoundObjects.Count; i++){
if (((ObiectDetectat)FoundObjects[i]).Rotation > obj.Rotation){
FoundObjects.Insert(i, obj);
return;
}
}
FoundObjects.Add(obj);
}
private void MotorInit(){
RotationReference = MotorGetRotation();
}
private int MotorGetRotation(){
StareMotor motorState = nxt.GetStareMotor(MotorPort);
return motorState.TachoCount;
}
private int RotationToAngle(int rotation){
double angle = ((180.00 / 420.00) * (rotation -
RotationReference));
double offset = ((180.00 / 420.00) * ((double)RotationLimit / 2));
return (int)(angle + offset);
93
}
/// <summary>
/// porneste motorul
/// </summary>
public void RotesteServo(int speed, int degrees){
SetStareMotor(
speed,
ModNxtMotor.MotorOn | ModNxtMotor.Brake,
RegModNxtMotor.MotorSpeed,
0,
FunctNxtMotor.Running,
degrees
);
}
/// <summary>
/// opreste motorul prin compensarea inertiei
/// </summary>
public void Frana(){
SetStareMotor(
0,
ModNxtMotor.MotorOn | ModNxtMotor.Brake |
ModNxtMotor.Regulated,
RegModNxtMotor.MotorSpeed,
0,
FunctNxtMotor.Running,
0
);
}
/// <summary>
/// seteaza starea motorului
/// </summary>
public void SetStareMotor(int power, ModNxtMotor mode, RegModNxtMotor
regulationMode, int turnRate, FunctNxtMotor runState, int tachoLimit){
nxt.SetStareMotor(
MotorPort,
(sbyte)(power * RotationDirection),
mode,
regulationMode,
(sbyte)turnRate,
runState,
(uint)tachoLimit
);
}
}
public class ObiectDetectat
{
public int Distance = 0;
public int Rotation = 0;
public ObiectDetectat(int Distance, int Rotation)
{
this.Distance = Distance;
this.Rotation = Rotation;
}
public int CompareDistance(ObiectDetectat other)
{
if (this.Distance < other.Distance)
return -1;
else if (this.Distance > other.Distance)
return 1; else
return 0;
94
}
}
public enum NxtSonarRegister {
MeasurementUnits = 0x14,
PollInterval = 0x40,
Mode = 0x41,
MeasurementByte0 = 0x42,
MeasurementByte1 = 0x43,
MeasurementByte2 = 0x44,
MeasurementByte3 = 0x45,
MeasurementByte4 = 0x46,
MeasurementByte5 = 0x47,
MeasurementByte6 = 0x48
}
}
9.4 Anexa 4. Metoda 2. Programul NXC
#define BT_CONN 0
#define BT_PACKET_LEN 200 //bytes struct
masuratoare
{
unsigned short timp;
short valoare;
};
masuratoare SerieMasuratori1[], SerieMasuratori2[];
unsigned long MasuratoareLastTime1,
MasuratoareLastTime2; bool SeMasoara; int
VerificaStatusBT()
{
CommBTCheckStatusType StatusArgs;
StatusArgs.Connection = BT_CONN;
TextOut(0, LCD_LINE2, "SysCommBTCheckStatus", true);
SysCommBTCheckStatus(StatusArgs);
switch(StatusArgs.Result)
{ case
LDR_SUCCESS:
TextOut(0, LCD_LINE2, "LDR_SUCCESS", true);
break; case STAT_COMM_PENDING:
TextOut(0, LCD_LINE2, "STAT_COMM_PENDING", true);
Wait(100);
break; case
ERR_INVALID_PORT:
TextOut(0, LCD_LINE2, "ERR_INVALID_PORT", true);
Wait(1000);
break; case
ERR_COMM_CHAN_NOT_READY:
TextOut(0, LCD_LINE2, "ERR_COMM_CHAN_NOT_READY", true);
Wait(1000);
break; default:
string str = NumToStr(StatusArgs.Result);
TextOut(0, LCD_LINE2, StrCat("other err = ", str), true);
Wait(2000);
break;
}
return StatusArgs.Result;
}
95
bool TrimitePrinBT(string str)
{
until (VerificaStatusBT() == LDR_SUCCESS);
BluetoothWrite(BT_CONN, str); until
(VerificaStatusBT() == LDR_SUCCESS);
return true;
}
void StartMasuratori()
{
MasuratoareLastTime1 = CurrentTick();
MasuratoareLastTime2 = CurrentTick();
SeMasoara = true;
}
void StopMasuratori()
{
SeMasoara = false;
}
void SalveazaMasuratoare(byte SeriesNumber, short valoare)
{
if (!SeMasoara){
return; }
unsigned long now = CurrentTick();
masuratoare m, tmp[];
m.valoare = valoare;
switch(SeriesNumber)
{
case 1:
m.timp = now - MasuratoareLastTime1;
//MasuratoareLastTime1 = now; tmp =
SerieMasuratori1;
ArrayBuild(SerieMasuratori1, tmp, m);
break; case 2:
m.timp = now - MasuratoareLastTime2;
//MasuratoareLastTime2 = now; tmp =
SerieMasuratori2;
ArrayBuild(SerieMasuratori2, tmp, m);
break;
} }
string SerializeazaVectorMasuratori(masuratoare ms[])
{
return FlattenVar(ms);
}
bool TrimiteMasuratori(byte SeriesNumber)
{
masuratoare clear_series[];
string buffer, sn, packet; buffer
= "";
sn = FlattenVar(SeriesNumber);
switch(SeriesNumber)
{
case 1:
buffer = SerializeazaVectorMasuratori(SerieMasuratori1);
SerieMasuratori1 = clear_series;
break; case 2:
96
buffer = SerializeazaVectorMasuratori(SerieMasuratori2);
SerieMasuratori2 = clear_series;
break;
} int i, len;
len = StrLen(buffer);
for (i = 0; i < len; i += BT_PACKET_LEN)
{
packet = SubStr(buffer, i, BT_PACKET_LEN);
packet = StrCat(sn, packet);
TrimitePrinBT(packet);
} return
true;
} task
motion()
{
RotateMotor(OUT_C, 20, 500);
Wait(3000);
RotateMotor(OUT_C, -60, 500);
}
task masuratori()
{
while (SeMasoara && ButtonPressed(BTNCENTER, true) == false)
{ short i = 0;
i = MotorTachoCount(OUT_C);
SalveazaMasuratoare(1, i);
i = SensorUS(IN_1);
SalveazaMasuratoare(2, i);
Wait(100);
}
StopMasuratori();
int i = 0; string
s = "";
i = ArrayLen(SerieMasuratori1);
s = NumToStr(i);
TextOut(0, LCD_LINE1, StrCat("Series1 ", s), true);
i = ArrayLen(SerieMasuratori2);
s = NumToStr(i);
TextOut(0, LCD_LINE2, StrCat("Series2 ", s), false);
Wait(5000);
TrimiteMasuratori(1);
TrimiteMasuratori(2);
Stop(true);
} task
main()
{
SetSensorLowspeed(IN_1);
StartMasuratori(); start
masuratori; start
motion;
}
97
using System.Collections.Generic;
using System.Text; using System.IO;
using System.IO.Ports; using
System.Windows.Forms; using
System.Runtime.InteropServices;
namespace NXT2PC
{
public class Masuratoare
{
public ushort Timp;
public short Valoare;
}
public class ReceptorNXT
{
public ReceptorNXT()
{
}
private SerialPort PortSerial = new SerialPort();
public string NumePort
{
get
{
return PortSerial.PortName;
}
set
{
if (!EsteConectat)
PortSerial.PortName = value;
}
}
public bool EsteConectat
{
get
{
return PortSerial.IsOpen;
}
}
public bool Conecteaza()
{
if (!EsteConectat)
{
PortSerial.ReadBufferSize = 1024 * 10; //10 KB
PortSerial.Open();
PortSerial.DiscardInBuffer();
}
return EsteConectat;
}
public void Deconecteaza()
{
if (EsteConectat)
PortSerial.Close();
}
public byte[] CitesteDeLaPortSerial()
{
byte[] reply = {};
if (EsteConectat)
{
int size = PortSerial.BytesToRead;
if (size > 0)
98
{
reply = new byte[size];
PortSerial.Read(reply, 0, size);
PortSerial.DiscardInBuffer();
}
}
return reply;
}
public void CitesteMasuratoriInSeriile(ref SerieMasuratori Series1, ref
SerieMasuratori Series2)
{
byte[] data = CitesteDeLaPortSerial();
if (data.Length > 2)
{
int Offset, SeriesNumber;
Offset = 0;
Masuratoare[] ms = CitesteMasuratori(ref data, ref Offset,
out SeriesNumber);
while (ms != null && ms.Length > 0)
{
if (SeriesNumber == 1)
Series1.AfiseazaMasuratorile(ms);
if (SeriesNumber == 2)
Series2.AfiseazaMasuratorile(ms);
ms = CitesteMasuratori(ref data, ref Offset, out
SeriesNumber);
}
}
}
public Masuratoare[] CitesteMasuratori(ref byte[] data, ref int offset, out int
NumarSerie)
{
Masuratoare[] ms = null;
NumarSerie = 0;
if (data.Length > offset + 2)
{
short data_count = BytesToShort(data, offset + 0);
if (data.Length >= offset + 2 + data_count)
{
byte struct_len = 4;
byte struct_start = 2 + 1;
short struct_count = 0;
NumarSerie = data[offset + 2];
if (Math.IEEERemainder(data_count - 2, struct_len) ==
0)
{
struct_count = (short)((data_count - 2) /
struct_len);
ms = new Masuratoare[struct_count];
for (int i = 0; i < struct_count; i++)
{
ms[i] = BytesToMasuratoare(data, offset
+ struct_start + (i * struct_len));
}
offset += 2 + data_count;
}
else
MessageBox.Show(String.Format("Transfer corupt
(2): \ndata.Length = {0}\ndata_count = {1}\noffset = {2}", data.Length, data_count,
offset));
99
}
else
MessageBox.Show(String.Format("Transfer corupt (1):
\ndata.Length = {0}\ndata_count = {1}\noffset = {2}", data.Length, data_count,
offset));
}
return ms;
}
public string BytesToList(byte[] data){
if (data != null && data.Length > 0){
StringBuilder str = new StringBuilder();
for (int i = 0; i < data.Length; i++){
str.AppendLine(data[i].ToString());
}
return str.ToString();
}
return string.Empty;
}
public Masuratoare BytesToMasuratoare(byte[] data, int offset){
Masuratoare m = new Masuratoare();
m.Timp = BytesToUShort(data, offset);
m.Valoare = BytesToShort(data, offset +
Marshal.SizeOf(m.Timp.GetType()));
return m;
}
public int BytesToInt(byte[] data, int offset){
int len = Marshal.SizeOf(typeof(int)); //4 bytes
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(data, offset, i, len);
int val = (int)Marshal.PtrToStructure(i, typeof(int));
Marshal.FreeHGlobal(i);
return val;
}
public uint BytesToUInt(byte[] data, int offset){
int len = Marshal.SizeOf(typeof(uint)); //4 bytes
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(data, offset, i, len);
uint val = (uint)Marshal.PtrToStructure(i, typeof(uint));
Marshal.FreeHGlobal(i);
return val;
}
public ushort BytesToUShort(byte[] data, int offset){
int len = Marshal.SizeOf(typeof(ushort)); //2 bytes
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(data, offset, i, len);
ushort val = (ushort)Marshal.PtrToStructure(i, typeof(ushort));
Marshal.FreeHGlobal(i);
return val;
}
public short BytesToShort(byte[] data, int offset){
int len = Marshal.SizeOf(typeof(short)); //2 bytes
IntPtr i = Marshal.AllocHGlobal(len);
Marshal.Copy(data, offset, i, len);
short val = (short)Marshal.PtrToStructure(i, typeof(short));
Marshal.FreeHGlobal(i);
return val;
}
}
}
100
9.6 Anexa 6. Metoda 2. Modul de listare i export date
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing; using
System.Data; using System.Text;
using System.Windows.Forms; using
System.IO; using NXT2PC;
namespace NXT2PC
{
public partial class SerieMasuratori : UserControl
{
public SerieMasuratori() {
InitializeComponent();
}
public Masuratoare[] Masuratori {
get {
return _Masuratori;
}
set {
if (value != null) {
int len = _Masuratori.Length;
Array.Resize<Masuratoare>(ref _Masuratori,
_Masuratori.Length + value.Length);
Array.Copy(value, 0, _Masuratori, len, value.Length);
Salvat = false;
}
}
}
private Masuratoare[] _Masuratori = new Masuratoare[0];
public string TitluSerie {
get {
return _TitluSerie;
}
set {
_TitluSerie = value;
groupBox1.Text = _TitluSerie;
groupBox1.Text += String.Format(" ({0})",
_Masuratori.Length);
groupBox1.Text += Salvat ? "" : " *";
}
}
private string _TitluSerie;
public bool Salvat {
get {
return _Salvat;
}
private set {
_Salvat = value;
TitluSerie = TitluSerie;
}
}
private bool _Salvat;
public void AfiseazaMasuratorile() {
if (Masuratori != null) {
textBox1.Text = "se incarca ...";
string txt = MasuratoriConcatenate();
101
textBox1.Text = "Timp\tValoare" + Environment.NewLine;
textBox1.AppendText("---------------" +
Environment.NewLine);
textBox1.AppendText(txt);
}
}
public string MasuratoriConcatenate() {
StringBuilder str = new StringBuilder();
if (Masuratori != null && Masuratori.Length > 0){
Masuratoare m;
string line;
for (int i = 0; i < Masuratori.Length; i++) {
m = Masuratori[i];
line = m.Timp.ToString() + "\t" +
m.Valoare.ToString();
str.AppendLine(line);
}
}
return str.ToString();
}
public void AfiseazaMasuratorile(Masuratoare[] ms) {
this.Masuratori = ms; AfiseazaMasuratorile();
}
private void button1_Click(object sender, EventArgs e) {
SaveFileDialog FereastraSave = new SaveFileDialog();
FereastraSave.DefaultExt = "txt";
FereastraSave.Filter = "Tab delimited text file (*.txt)|*.txt|All files (*.*)|*.*";
FereastraSave.AddExtension = true;
FereastraSave.RestoreDirectory = true;
FereastraSave.Title = "Salveaza pe disk: " + this.TitluSerie;
FereastraSave.InitialDirectory =
System.Environment.GetEnvironmentVariable("desktop"); ;
if (FereastraSave.ShowDialog() == DialogResult.OK) {
string filepath = FereastraSave.FileName;
StreamWriter writer = new StreamWriter(filepath);
writer.Write(MasuratoriConcatenate());
writer.Close();
Salvat = true;
}
FereastraSave.Dispose();
FereastraSave = null;
}
}
}
namespace NXT2PC
{
public partial class Form1 : Form
{
102
public Form1(){
InitializeComponent();
}
private ReceptorNXT nxt2pc = new ReceptorNXT();
private void button1_Click(object sender, EventArgs e){
if (nxt2pc.EsteConectat)
nxt2pc.Deconecteaza();
else {
nxt2pc.NumePort = comboBox1.Text;
nxt2pc.Conecteaza();
}
if (nxt2pc.EsteConectat){
button1.Text = "Deconecteaza";
button1.BackColor = Color.PaleGreen;
}
else {
button1.Text = "Conecteaza!";
button1.BackColor = Color.LimeGreen;
}
}
private void button2_Click(object sender, EventArgs e){
timer1.Interval = 1000;
timer1.Enabled = !timer1.Enabled; if
(timer1.Enabled)
button2.Text = "Stop";
else
button2.Text = "Start!";
}
private void timer1_Tick(object sender, EventArgs e){
if (nxt2pc.EsteConectat){
nxt2pc.CitesteMasuratoriInSeriile(ref measurementSeries1, ref measurementSeries2);
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e){
if (nxt2pc.EsteConectat){ if
(MessageBox.Show("Aplicatia este conectata la robot.
Sigur doriti sa abandonati conexiunea?", "Conexiune activa", MessageBoxButtons.YesNo,
MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.No){
e.Cancel = true;
return;
}
timer1.Enabled = false;
nxt2pc.Deconecteaza();
}
}
}
103