Proiect Final
-
Upload
astefanoaei-razvan -
Category
Documents
-
view
387 -
download
4
Transcript of Proiect Final
Cuprins
Capitolul I. Introducere........................................................................................................3
Capitolul II. Domeniul roboților mobili..............................................................................5
2.1 Generalități legate de roboții mobili..........................................................................5
2.1.1 Roboți mobili.......................................................................................................5
2.1.2 Clasificarea roboților mobili................................................................................6
2.1.3 Utilizări ale roboților mobili................................................................................7
2.1.4 Structura unui robot mobil...................................................................................8
2.1.5 Acționarea roboților mobili.................................................................................9
2.1.6 Sistemul senzorial..............................................................................................11
2.2 Constrângeri cinematice privind mobilitatea roboților pe roți................................12
2.3 Structura roboților pe roți........................................................................................16
2.4 Partea senzorială a roboților mobili.........................................................................18
2.4.1 Senzori de tip sonar............................................................................................18
2.4.2 Senzori infraroșu (IR)........................................................................................24
Capitolul III. Studiu de caz; Construcția și programarea unui robot mobil cu roți diferențiale.........................................................................................................................25
3.1 Elementele componente ale robotului......................................................................25
3.2 Realizarea structurii mecanice a robotului...............................................................26
3.3 Realizarea structurii electrice și de control a robotului...........................................29
1
3.4 Schema de control folosind microcontrolerul ATmega328......................................33
3.5 Senzorii de proximitate............................................................................................37
3.5.1 Senzorul cu utrasunete DYP-ME007.................................................................37
3.5.2 Senzorul cu infraroșu QTR-1RC........................................................................39
3.6 Programarea robotului..............................................................................................41
3.7 Testarea robotului și a codului sursă........................................................................47
Capitolul IV. Concluzii......................................................................................................49
Bibliografie........................................................................................................................51
Anexă.................................................................................................................................52
2
Capitolul I. Introducere
Tema acestei lucrări este construirea si programarea unui robot mobil cu două roți diferențiale, echipat cu microcontroler ATmega328P-PV și având ca modalități de
detecție senzori cu infraroșu și cu ultrasunete. Robotul trebuie să fie capabil să
urmarească în mod autonom un traseu realizat în prealabil și sa evite eventualele
obstacole ce ar putea apărea în calea sa, revenind la traseul prestabilit.
Unul din cele mai importante aspecte în evoluţia fiinţei umane este folosirea
uneltelor care să simplifice munca fizică. În această categorie se înscriu şi roboţii, ei
ocupând totuşi o poziţie privilegiată datorită complexităţii lor.
În cultura populară, termenul “robot” denotă în general unele caracteristici antopo-
morfe (asemanatoare omului). Tendința de a ne gândi la roboți că ar avea caracteristici
umane poate fi cauzată de originile termenului ”robot”. Acesta a fost făcut public pe 25
Ianuarie 1921, în Praga, odată cu prima ecranizare a piesei lui Karel Capek, “Roboții Universali ai lui Rossum“. În această piesă, un inventator anonim, Rossum, crează o rasă
de muncitori, construiți din părți biologice, îndeajuns de inteligenți ca să înlocuiască
omul în orice sarcină (de aici și termenul de “universal”). Această viziune asupra
roboților a dus oamenii acelor timpuri cu gândul că aceste creaturi artificiale au unicul
scop de a elibera oamenii de orice fel de muncă [2].
Revoluţia informatică a marcat saltul de la societatea industrializată la societatea
avansat informatizată, generând un val de înnoiri în tehnologie şi în educaţie, acest lucru
permiţând realizarea de roboţi.
Odata cu trecerea timpului, s-a schimbat și percepția omului asupra roboților: de
la creaturi asemănătoare omului la roboți ce iau orice formă utilă îndeplinirii sarcinilor
impuse. Nu mai există nevoia ca roboții să aibe caracteristici antropo-morfe, nici măcar
asemănătoare cu ale animalelor. Devine clar că forma nu furnizează o definiție utilă a
3
unui robot. Așadar, o definiție demnă de luat în seamă este urmatoarea: ”Un robot
inteligent este o creatură mecanică ce poate funcționa autonom” [2].
Roboţii oferă beneficii substanțiale muncitorilor, industriilor și implicit ţărilor. În
situația folosirii în scopuri paşnice, roboţii industriali pot influenţa pozitiv calitatea vieţii
oamenilor prin înlocuirea acestora în spaţii periculoase, cu condiții de mediu dăunătoare
omului, cu condiții necunoscute de exploatare etc.
Domeniile de aplicare a tehnicii roboţilor se lărgesc mereu, ei putând fi utilizaţi în
industrie, transporturi şi agricultură, în sfera serviciilor, în cunoasterea oceanului şi a
spatiului cosmic, în cercetarea ştiinţifică etc.
Principalele contribuții aduse de proiectul acesta sunt proiectarea și construcția
robotului mobil, realizarea schemei electrice și de control, programarea robotului și
testarea caracteristicilor și a performanțelor acestuia.
Proiectul este structurat pe patru capitole. Primul capitol este unul introductiv, în
care sunt prezentate scopul lucrării, câteva date despre roboți, precum și structurarea
lucrării. În capitolul doi este prezentată partea teoretică necesară realizarii robotului
mobil, cuprinzând considerații cinematice necesare mișcării și orientării robotului, tipuri
de structuri ce caracterizează diferiți roboți și metode de detecție folosind senzorii
disponibili. În capitolul trei este prezentată construcția și programarea robotului,
parcurgând toate etapele necesare finalizării părții practice a proiectului: realizarea
structurii mecanice, a celei electrice și de control a robotului și programarea acestuia. În
ultimul capitol se vor regăsi concluziile trase ca urmare a realizării acestui proiect. La
sfârșitul lucrării se va găsi o anexă care va cuprinde codul sursă pe care îl utilzează
robotul.
4
Capitolul II. Domeniul roboților mobili
2.1 Generalități legate de roboții mobili
2.1.1 Roboți mobili
Robotul mobil este un sistem complex care poate efectua diferite activităţi într-o
varietate de situaţii specifice lumii reale. El este o combinaţie de dispozitive echipate cu
servomotoare şi senzori (aflate sub controlul unui sistem ierarhic de calcul) ce operează
într-un spaţiu real, marcat de o serie de proprietăţi fizice (de exemplu gravitaţia care
influenţează mişcarea tuturor roboţilor care funcţionează pe pământ) şi care trebuie să
planifice mişcările astfel încât robotul să poată realiza o sarcină în funcţie de starea
iniţială a sistemului şi în funcţie de informaţia apriori existentă, legată de mediul de lucru
[3].
Succesul în îndeplinirea acestor sarcini depinde atât de cunoştinţele pe care robotul
le are asupra configuraţiei iniţiale a spaţiului de lucru, cât şi de cele obţinute pe parcursul
evoluţiei sale.
Problemele specifice ce apar la roboţii mobili ar fi următoarele: evitarea
impactului cu obiectele staţionare sau în mişcare, determinarea poziţiei şi orientării
robotului pe teren, planificarea unei traiectorii optime de mişcare.
În cazul unui sistem robotic automat distribuit poziţiile spaţiale sunt de o extremă
importanţă şi de ele depinde îndeplinirea scopurilor dorite şi funcţionarea întregului
sistem. Cu alte cuvinte, robotul trebuie să fie capabil să-şi planifice mişcările, să decidă
automat ce mişcări să execute pentru a îndeplini o sarcină, în funcţie de aranjamentul
momentan al obiectelor din spaţiul de lucru. Planificarea mişcărilor nu constă dintr-o
problemă unică şi bine determinată, ci dintr-un ansamblu de probleme dintre care unele
sunt mai mult sau mai puţin variante ale celorlaltor.
5
Evitarea coliziunii cu obstacole fixe sau mobile (de exemplu alţi roboţi mobili)
aflate în spaţiul de lucru al robotului se poate face prin mai multe metode: realizarea unei
apărători mecanice care prin deformare opreşte robotul, folosirea senzorilor care măsoară
distanţa până la obstacolele de pe direcţia de deplasare, folosirea senzorilor de
proximitate, folosirea informaţiilor corelate de la mai multe tipuri de senzori. Localizarea
obiectelor se poate realiza şi prin contact fizic, dar acesta impune restricţii asupra vitezei
de mişcare a structurii manipulate. Contactul fizic dintre robot şi obiectele din mediu
generează forţe de reacţiune care modifică starea robotului. Vitezele mari de lucru fac ca
efectele dinamice ale unui contact fizic cu obstacole sau obiecte manipulate să fie riscante
(pot duce la deteriorarea obiectelor sau a robotului).
Navigarea robotului este posibilă şi fără o determinare a poziţiei şi orientării faţă
de un sistem de coordonate fix, dar această informaţie este utilă pentru sisteme de
comandă a mişcării. Dintre metodele de navigaţie mai des utilizate se pot menţiona:
măsurarea numărului de rotaţii făcute de roţile motoare, folosirea de acceleratoare şi
giroscoape, geamanduri electromagnetice instalate în teren, semnalizatoare pasive sau
semipasive de tip optic sau magnetic.
2.1.2 Clasificarea roboților mobili
Roboții mobili pot fi clasificați după mai multe criterii, după cum urmează:
a) În funcție de dimensiuni:
- macro-roboți;- micro-roboți;- nano-roboți.
6
b) În funcție de mediul în care acționează:
- roboți tereștri;
- roboți acvatici și subacvatici;
- roboți zburători;
- roboți care actionează în spațiul extraterestru.
c) În funcție de sistemul de locomoție:
- roboți pe roți (Fig. 2.3) sau șenile;
- roboți pășitori (bipezi (Fig. 2.2), patrupezi, hezapozi (Fig. 2.1), miriapozi);
- roboți care se deplasează prin salturi;
- roboți care se deplasează prin rostogolire [1].
Fig. 2.1: Robot hexapod Fig. 2.2: Robot biped Fig. 2.3: Robot mobil pe
două roți
7
2.1.3 Utilizări ale roboților mobili
Roboții mobili sunt concepuți pentru a putea fi utilizați in cele mai diverse
domenii. Mulţi roboţi din zona micro îşi găsesc utilizarea în medicină, fiind capabili să se
deplaseze de-a lungul vaselor şi tuburilor corpului omenesc, în scopul investigaţiilor,
intervenţiilor chirurgicale, dozării şi distribuirii de medicamente, etc.
În domeniul industrial, roboţii mobili sunt reprezentaţi de AGV-uri (Automated-
Guided Vehicles), vehicule pe roţi, cu ghidare automată, care transportă şi manipulează
piese, constituind o alternativă flexibilă la benzile de montaj. În agricultură există
tractoare şi maşini agricole fără pilot, capabile să execute singure lucrările pe suprafeţele
pentru care au fost programate. În domeniul forestier roboţii mobili pot escalada copacii
înalţi, sau efectua transportul lemnului pentru a elibera o zonă defrișată recent.
În domeniul militar este luată în considerare de către armata americană perspectiva
înlocuirii soldaţilor combatanţi cu roboţi, pentru a reduce riscul pierderilor umane în
luptă. Roboţi mobili de cele mai ingenioase şi robuste configuraţii sunt aruncaţi în clădiri
şi incinte din zone de conflict, în scopuri de investigare şi chiar anihilare a inamicului;
În domeniul utilităţilor publice, una dintre cele mai utile şi economice utilizări ale
roboţilor mobili o reprezintă inspectarea conductelor de combustibili gazoşi şi lichizi şi a
canalizărilor. De exemplu, reţeaua de canalizare a Germaniei însumează 400.000 km, iar
inspectarea şi curăţirea acesteia presupune costuri de 3.6 Euro pe metru. Numai 20% din
conducte sunt accesibile, iar utilizarea roboţilor poate reduce costurile cu un 25%.
În domeniul serviciilor publice există posibilităţi deosebit de largi de
implementare. Sunt roboţi pentru: deservirea bolnavilor în spitale, ajutorarea persoanelor
bătrâne sau cu diferite handicapuri, ghidarea şi informarea publicului în muzee, aspirarea
şi curăţirea încăperilor, spălarea geamurilor şi a pereţilor clădirilor.
În domeniul operaţiilor de salvare, roboţii salvatori (Rescue robots) sunt utilizaţi în
operaţiile de salvare a victimelor unor calamităţi: cutremure, incendii, inundaţii.
În domeniul securităţii multe operaţii de inspectare şi dezamorsare a unor obiecte
şi bagaje suspecte sunt executate de către roboţi.
8
Roboţii mobili au următoarele caracteristici comune:
1. Structura mecanică este un lanţ cinematic serie sau paralel respectiv tip “master-
slave”;
2. Sistemul de acţionare utilizat este electric pentru sarcini mici şi medii şi
hidraulic pentru sarcini mari;
3.Sistemul senzorial utilizează senzori interni (de turaţie, poziţie, efort) la nivelul
articulaţiilor, senzori externi(camere TV) pentru scanarea mediului şi senzori de
securitate( de proximitate, de prezenţă cu ultrasunete);
4. Sistemul de comandă este ierarhizat, de obicei multiprocesor;
5.Limbajele de programare utilizate sunt preluate de la roboţii staţionari.
2.1.4 Structura unui robot mobil
Structura unui robot mobil este formată din două mari părti:
- Structura mecanică, adică manuipulatorul, care determină performanțele
tehnice. Aceasta este formată, la randul ei, din:
- sistemul de locomoție, prin care se asigură deplasarea robotului în spațiul de
lucru;
- sistemul de manipulare, care asigură poziționarea si orientarea organului de
lucru.
În procesul de deplasare pe o anumită traiectorie, un robot mobil este caracterizat
de următoarele funcții:1. Funcția de locomoție;
2. Funcția de percepție-decizie;
9
3. Funcția de localizare.
Funcţia de locomoţie cuprinde sistemul de acţionare electric (de propulsie) şi
sistemul de sprijinire (suspensie). Modalităţile de propulsare sunt dintre cele mai diverse,
cum ar fi: pe roţi, cu jet de apă, cu aer etc. Roboţii mobili pot fii dotaţi cu cameră video
sau alţi senzori de percepere a mediului în care activează. Memoria robotului conţinută în
microcontroler înmagazinează cunoştinţele necesare localizării tuturor segmentelor de
traseu posibile.
Indiferent de generaţia robotului, probleme complexe apar la realizarea structurii
mecanice de volum, greutate şi cost reduse, la transmiterea mişcării şi adaptarea la
structura mecanică a motoarelor electrice şi hidraulice, la proiectarea mâinilor mecanice
pentru a apuca obiecte de diferite forme. Robotul mobil interacţionează cu mediul
înconjurător prin structura sa mecanică, asigurând astfel deplasarea, poziţionarea şi
orientarea organului de execuţie.
- Structura electronică, respectiv de comandă-control, care condiționează
calitatea performanțelor robotului mobil.
Referitor la structura electronică, posibilităţile actuale permit folosirea a câte unui
microprocesor pentru comanda fiecărui grad de mobilitate, precum şi a altor
microprocesoare specializate pentru tratarea semnalului senzorial.
2.1.5 Acționarea roboților mobili
Se face cu motoare electrice de putere mică, cu moment de inerţie redus, cu
capacitate de suprasarcină, cu reductoare de raport mare (i>100) şi moment de inerţie
10
redus de tip procesional sau armonic. Se pot folosi şi unităţi integrate motor-reductor.
Motoarele electrice utilizate pot fi de urmatoarele tipuri:
- motoare de curent continuu;
- servo-motoare;
- motoare pas cu pas.
Motoarele de curent continuu
Sunt des folosite în robotică datorită dimensiunilor reduse și energiei furnizate
ridicate. Sunt excelente pentru acționarea roților roboților mobili, cât și a altor
componente. Tensiunea de operare a majorității motoarelor de curent continuu este de la
1.5 V și până la 100 V. În robotică, cele mai folosite sunt de 6V, 12 V și 24 V.
Viteza este specificată de obicei în rotații pe minut (RPM) a motorului atunci când
nu este în sarcină, sau la mersul în gol. Motoarele de curent continuu obișnuite au viteze
de la cateva sute până la zece mii de rotații [5].
Cuplul unui motor este forța de rotație produsă de axul său. Când motorul este
blocat, acesta produce maximum de cuplu de care este capabil. Cuplul motor se măsoară
în kg*cm, ceea ce înseamnă că motorul exercită o forță tangențială de 1kg la o rază de
1cm de centrul axului. Acesta poate varia de la mai puțin de 1 kg*cm la zeci de kg*cm în
cazul motoarelor mari.
, (2.1)
unde
T – cuplul motor
F – forța aplicată
d – distanța față de centrul de rotație
11
Puterea unui motor este combinația dintre viteză și cuplul său. Aceasta ia valoarea
maximă undeva între stările de mers în gol (viteză maximă, cuplu 0, deci putere 0) și de
blocare (viteză 0, cuplu maxim, deci putere tot 0).
, (2.2)
unde
P – puterea
T – cuplul motor
v – viteza, exprimată in RPM.
De aceea se folosesc reductoare de turație. Acestea sunt angrenaje de roți dințate,
care reduc turația motorului, dar păstrează puterea, prin creșterea cuplului.
Servo-motoarele
Servo-motoarele încorporează mai multe componente:
- un motor de curent continuu de dimensiuni mici;
- un reductor de turație;
- un circuit de control al axului.
Axul servo-motorului nu se rotește liber, ci este comandat să se deplaseze la
anumite poziții unghiulare. Circuitul de control al axului acționează motorul să miște
axul la poziția comandată. Dacă poziția se află înafara razei de mișcare a axului, motorul
va continua să învârtă axul spre poziția comandată.
Motoarele pas cu pas
Acestea au câteva bobine electromagnetice care trebuie alimentate secvențial
pentru ca motorul să funcționeze. Prin inversarea ordinii în care bobinele sunt alimentate,
12
motorul se rotește în direcția opusă. Rata la care bobinele sunt alimentate determină
viteza motorului pas cu pas. Motoarele pas cu pas obișnuite au două sau patru bobine.
Axul motorului se mișcă de la o bobină la alta, în ordinea în care acestea au fost
alimentate.
2.1.6 Sistemul senzorial
Robotul mobil este pus în situaţia de a desfăşura acţiuni similare cu cele ale
operatorului uman. Acest lucru determină existenţa unor anumite dispositive prin care să
se culeagă informaţii din mediul de lucru, care să realizeze interacţiunea robot-mediu cu
ajutorul unor caracteristici ale mediului sau ale obiectelor din mediu şi o unitate centrală
care să prelucreze în timp real informaţia senzorială, să o transforme într-o formă utilă
pentru sistemul de comandă.
Sistemul senzorial mai este numit şi sistem de măsurare. El asigură măsurarea
unor mărimi fizice şi eventual perceperea unor modificări semnificative a acestor mărimi.
Datorită sistemului senzorial se pot pune în evidenţă şi caracteristicile geometrice şi
chimice ale obiectelor din mediul de lucru. Senzorii, datorită caracteristicilor pe care le
au, pot explora zona de lucru, zona de contact, cea apropiată, cea îndepărtată, iar senzorii
foarte puternici chiar şi zone foarte îndepărtate. Informaţiile culese cu ajutorul sistemului
senzorial servesc la construirea unui model al lumii în care evoluează robotul, model
funcţie de care aceasta îşi va genera planurile de acţiuni viitoare.
În funcţie de soluţia constructivă, senzorii sunt pasivi sau activi. Senzorii activi
folosesc caracteristicile intrinseci ale mediului, iar cei pasivi generează modificări în
mediu pentru a măsura unele caracteristici. Alte două categorii de senzori cu care poate fi
dotat un robot mobil sunt senzori de mărimi interne ai robotului (poziţie, viteză sau
13
acceleraţia unor componente mecanice proprii) şi senzori de mărimi externe (greutate,
formă, poziţie, temperatură, culoare, etc ale obiectelor asupra cărora acţionează robotul).
Caracteristicile senzoriale ale unui robot depind foarte mult de gradul său de autonomie,
de aplicaţiile pentru care a fost proiectat şi de tipul mediului de lucru.
În general percepţia se realizează în două etape:
- conversia proprietăţilor fizice într-un semnal, de obicei electric;
- prelucrarea acestui semnal în vederea extragerii informaţiei care interesează.
Există mai multe criterii de clasificare a senzorilor utilizaţi în sistemele de
comandă ale robotului industrial:
1. După cum vine sau nu în contact cu obiectul a cărui proprietate fizică o
măsoară, distingem:
- senzori cu contact ;
- senzori fără contact;
2. După proprietăţile pe care le pun în evidenţă:
- senzori pentru determinarea formelor şi dimensiunilor (pentru evaluarea în
mediu de lucru);
- senzori pentru determinarea proprietăţilor fizice ale obiectelor (de forţă,
de cuplu, de densitate şi elastici);
- senzori pentru proprietăţi chimice (de compoziţie, de concentraţie,
analizatoare complexe);
- după mediul de culegere a informaţiei (senzori pentru mediul extern sau
senzori pentru funcția internă);
- după distanţa la care sunt culese informaţiile (senzori de contact).
14
2.2 Constrângeri cinematice privind mobilitatea roboților pe roțiPresupunem că robotul mobil supus studiului este format dintr-un șasiu rigid,
echipat cu roți nedeformabile și care se mișcă pe un plan orizontal. Poziția robotului pe
acel plan este descrisă, în raport cu un reper de referință inerțial arbitrar ales, de vectorul
de poziție , unde x și y sunt coordonatele punctului de referință P a șasiului
robotului, în timp ce descrie orientarea șasiului robotului, în raport cu reperul de
referință inerțial (Fig. 2.4).
Fig. 2.4: Definirea poziției unui robot mobil pe un plan
Presupunem că, în timpul mișcării, planul fiecărei roți rămâne vertical iar roata se
învârte în jurul axului orizontal, a cărui orientare in raport cu șasiul poate fi fixată sau
variabilă. Vom presupune că se reduce contactul dintre roată si suprafața de deplasare la
un singur punct. Constrângerile cinematice rezultă din faptul că viteza punctului material
al roții în contact cu solul este egală cu zero. Pentru o roată convențională, constrângerile
cinematice implică faptul că viteza centrului roții este paralelă cu planul roții (condiția
de non-alunecare) și este proportional cu viteza de rotație a roții (condiția de pură
15
rostogolire). Pentru fiecare roată, constrângerile cinematice rezultă, așadar, în două
condiții independente [4].
Există cateva variații in designul unei roți convenționale.
Fig. 2.5: a) Roată fixă pasivă; b) Roată omnidirecțională cu centrul deplasat; c) Roată directoare
activă, fără deplasare a centrului
În primul rând, ne concentrăm asupra roții directoare din Fig. 2.5b. Centrul roții, B, este conectat la șasiu prin intermediul unei tije rigide din punctul A (un punct fix de pe șasiu) la punctual B, aliniat cu planul roții. Tija, a cărei lungime este dată de mărimea d,
se poate roti in jurul unui ax vertical în punctul A. Poziția punctului A este specificată cu
ajutorul a două coordinate polare constante, l și α, în raport cu punctul de referință P.
Rotația tijei în raport cu șasiul este reprezentată de unghiul β. Raza roții este desemnată
de r, iar unghiul său de rotație în jurul axului ei orizontal este desemnat de φ. Așadar,
descrierea implică patru parametri constanți: α, l, r și d, și două variabile: φ(t) și β(t). Cu
ajutorul acestor notații, constrângerile cinematice sunt derivate după cum urmează în
continuare.
Pentru roti fixe sau directoare, trebuie să luăm în considerare fie cazul în care d =
0 și β constant (cazul roților fixe), fie cazul în care d = 0 si β variabil (cazul roților
directoare).
Pentru început vom evalua viteza centrului roții, care rezultă din urmatoarea
expresie vectorială (vezi Fig. 2.5b):
16
, (2.3)
unde O este originea reperului de referință inerțial arbitrar ales.
Cele două componente ale vectorului sunt exprimate astfel:
(2.4)și
(2.5)
Proiecțiile acestui vector pe direcția planului roții, de exemplu pe vectorul
(cos(α + β - π/2), sin(α + β – π/2)) și vectorul axului roții (cos(α+β), sin(α+β)), sunt r și 0, corespunzând condițiilor de pură rostogolire și non-alunecare. După cateva
manipulări, aceste condiții pot fi rescrise sub următoarea formă compactă:
Condiția de pură rostogolire:
(2.6)
Condiția de non-alunecare:
(2.7)
În aceste expresii, R(θ) este matricea ortogonală de rotație care exprimă orientarea
robotului în raport cu reperul de referință inerțial.
17
(2.8)
Aceste expresii generale pot fi simplificate pentru diferite tipuri de roți convenționale.
Pentru roțile fixe, centrul roții este fix în raport cu șasiul iar orientarea roții este
constantă. Această situație corespunde unei valori constante a lui β si d=0. Ecuația de
non-alunecare se reduce la:
(2.9)
Pentru roțile directoare, centrul roții este deasemeni fix în raport cu șasiul (d=0),
cu β variind în timp, astfel ecuația de non-alunecare ia forma din ecuația (2.7).
Situația descrisă de ecuațiile (2.6) și (2.7), cu lungimea tijei AB nenulă și
orientarea unghiului β variabilă în timp corespunde roților pasive, care se pot mișca în
orice direcție din plan (omnidirecționale).
Cele cinci clase de roboți mobili pe roțiExistă cinci clase de roboți, în funcție de tipurile de roți folosite și numărul lor:
Tipul 1 de roboțiAcești roboți nu au roți fixe sau directoare, ci sunt echipați cu roți
omnidirecționale. Acești roboți sunt denumiți omnimobili, deoarece au mobilitate
18
maximă în plan, ceea ce înseamnă că sunt capabili să se miște în orice direcție fără a
avea nevoie de reorientare.
Tipul 2 de roboțiAcești roboți nu au roți directoare, dar au fie una sau mai multe roți fixe cu un ax
comun. Mobilitatea este redusă, în sensul că sunt necesare mai multe corecții de curs
pentru a atinge destinația dorită. Un exemplu al acestui robot este scaunul cu rotile.
Tipul 3 de roboțiAcești roboți nu au roti fixe și cel puțin o roată directoare.
Tipul 4 de roboțiAcești roboți au una sau mai multe roti fixe pe un singur ax comun, și deasemeni
una sau mai multe roți directoare, cu condiția ca centrele lor să nu fie pe axul comun al
roților fixe, iar orientările lor sunt coordonate. Acestei clase aparțin roboții mobili
construiți după modelul automobilelor.
Tipul 5 de roboțiAcești roboți nu au roți fixe, dar au cel puțin două roti directoare.
2.3 Structura roboților pe roțiExistă multe tipuri de design pentru roboții mobili pe roți. Printre problemele de
proiectare ale robotului mobil se numără selecția tipului potrivit de roți, plasamentul
19
acestora și determinarea parametrilor cinematici. Obiectivele proiectării trebuie
specificate în conformitate cu mediul în care robotul va opera și în conformitate cu
sarcinile pe care le va efectua, precum și ținând cont de costul inițial și cel de
funcționare al robotului. În continuare, ne vom axa pe designul roboților cu două roți, acesta fiind și cazul studiat în această lucrare [1].
Roboți cu două roțiÎn general, sunt două tipuri de roboți pe două roți. Figura 2.6a arată un robot de
tip bicicletă, la care roata din față este folosită pentru virare si dirijare a roții din spate.
Din moment ce stabilitatea dinamică a robotului de tip bicicletă crește odată cu viteza sa,
un mecanism de balansare nu este neapărat necesar. Avantajul acestui tip de construcție
este acela că lățimea robotului este redusă. Totuși, robotul de tip bicicletă nu este des
folosit deoarece nu-și poate menține poziția atunci când stă nemișcat. Figura 2.6b
ilustrează un robot cu roți diferențiale, de tipul celui ce va fi realizat în cadrul acestui
proiect..
Este posibil să atingem stabilitatea pe durata de timp în care robotul nu se mișcă
dacă plasăm centrul de greutate al robotului pe axul roților. Totuși, este des întâlnit
procedeul de aplicare a controlului dinamic de balansare, care este asemănator problemei
controlului uzual pentru un robot cu roți diferențiale. O aplicație uzuală a acestui tip de
robot este proiectarea unei structuri asemănătoare unui robot cu patru roti, care este
formată din doi roboți cu roți diferențiale inter-conectați. Astfel, robotul poate urca
trepte ridicându-și roțile din față în timp ce ajunge la treapta următoare. Un dezavantaj
major al acestui tip de design este acela că este nevoie permanent de control pentru balans
dinamic [4].
20
Fig. 2.6: a) Robot de tip bicicletă; b) Robot cu roți diferențiale
2.4 Partea senzorială a roboților mobili
Detecția este considerată transformarea entităților fizice, cum ar fi forța, lumina,
distanța,intensitatea, într-o reprezentare internă a computer-ului. Percepția este
extragerea componentelor cheie din datele furnizate de senzori și integrarea informațiilor
senzoriale în timp. De obicei, percepția este o sarcină de compirmare a datelor, în sensul
extragerii caracteristicilor care permit recunoașterea, urmărirea și descrierea
proprietăților speciale din mediul înconjurător, ce sunt necesare pentru ca robotul să-și
21
execute sarcinile. Robotica se spune că este cuplarea inteligentă a percepției si a
acțiunilor intreprinse.
2.4.1 Senzori de tip sonar
Detecția cu ajutorul sonarelor sau a senzorilor cu ultrasunete utilizează propagarea
energiei acustice la frecvențe mai ridicate decăt cele audibile, pentru a extrage informații despre mediul înconjurător. În continuare sunt prezentate fundamentele si proprietățile
detecției cu ajutorul sonarelor pentru localizarea obiectelor, măsurarea reperelor și
clasificarea acestora în cadrul roboticii.
Principiile sonarelor
Sonarul este un senzor popular în robotică, ce folosește pulsuri acustice și ecourile
acestora pentru a măsura distanța pană la un anumit obiect. Din moment ce viteza
sunetului este cunoscută, distanța până la obiect este proporțională cu durata de deplasare
a ecoului. La frecvențe ultrasonice, energia sonarului este concentrată într-o undă care
furnizează informații și despre direcție, pe lângă cele despre distanță. Popularitatea
acestui tip de senzor se datorează costului scăzut, masei reduse și consumului de energie
scăzut, în comparație cu alți senzori de proximitate. În unele aplicații, cum ar fi mediile
subacvatice sau cele cu vizibilitate redusă, sonarul este deseori singura opțiune viabilă
[4].
În robotică, sonarele au trei scopuri diferite, dar aflate în legătură:
1. Evitarea obstacolelor: primul ecou detectat se presupune că măsoară distanța
până la cel mai apropiat obiect. Robotul utilizează această informație pentru a planifica
trasee ce ocolesc obstacolele si pentru a evita coliziunile.
22
2. Cartografierea: o colecție de ecouri recepționate prin efectuarea unei scanări
prin rotirea unei rețele de sonare este folosită pentru a crea o hartă a mediului
înconjurător. Similar cu monitorizarea radar, un punct este plasat pe obiectul detectat, pe
direcția pulsului de sondare.
3. Recunoașterea obiectelor: o secvența de ecouri sau harți este procesată pentru a
clasifica structurile care produc ecouri, compuse din unul sau mai multe obiecte fizice. În
caz de succes, această informație este utilă navigației robotului.
Fig. 2.7: a) Principiul de funcționare a unui sonar;
b) Unda ecou; c) Distanța pană la obiect; d) Harta sonarului
Figura 2.7 ilustrează un sonar simplificat, de la forma sa la harta care rezultă în
urma detecției. Un traductor (T/R) se comportă atât ca transmițător (T), ce emite un puls
acustic (P), cât și ca receptor (R) ce preia ecourile (E). Un obiect (O) ce se află în raza
undei sonarului va reflecta pulsul emis de sonar. O parte a semnalului reflectat afectează
traductorul, aceasta fiind detectat ca ecou. Durata de deplasare a ecoului t0, care mai este
23
denumit timp de propagare (din eng. time-of-flight – TOF ), este măsurată din timpul de
transmisie al pulsului emis. În acest caz, forma de undă a ecoului este o replică a pulsului
emis, care de obicei constă în nu mai puțin de 16 cicluri la frecvența de rezonanță a
traductorului. Distanța până la obiect r0 este dedusă din t0 folosind relația:
, (2.10)
unde c este viteza sunetului (343 m/s la temperatură și presiune standard). Valoarea 2
transformă distanța parcursă dus-întors (P+E) în distanța până la obiect. Pierderile
datorate răspândirii undei emise și absorbțiile acustice limitează raza sonarului.
Modelul undei sonarului
Pentru a obține o descriere calitativă a traductorului sonarului, vom aplica ipoteze
acustice elementare unui model simplificat, obținând o formă analitică simplă (2.10).
Emițătorul unui sonar este adesea modelat ca suprafața circulară a unui piston de rază a,
care vibrează cu frecvența f într-o diagramă plană infinită. Lungimea de undă λ va fi:
, (2.11)
unde c este viteza sunetului în aer (343 m/s la 25°C). Atunci când a > λ, câmpul de
presiune emis va forma o undă ce constă într-un lob principal încadrat de lobi secundari
(Fig. 2.8).
24
Fig. 2.8: Amplitudinea normalizată a ecoului produs de un obiect de dimensiuni reduse, precizat
de modelul pistonului ca o funcție de unghi. a) Scala liniară; b) Scala în decibeli.
De exemplu, un traductor des utilizat are raza a = 1.8 cm și este acționat la o
frecvența f = 49.4 kHz, având lungimea de undă λ = 0.7 cm. Un obiect care este mic
comparativ cu λ si este poziționat în câmpul de presiune emis, produce un ecou cu un
front de undă sferic, a cărui amplitudine se degradează odată cu inversul distanței
parcurse de undă. Într-un senzor de distanță ce folosește un singur traductor puls-ecou
(monostatic), doar o parte a frontului de undă al ecoului afectează diafragma receptoare.
Tipuri de traductoare
Traductoarele electrostatice si cele piezoelectrice sunt cele două categorii majore
disponibile, care operează în aer, și care pot funcționa atât ca transmițătoare cât și ca
receptoare. De obicei, dispozitivele electrostatice au sensibilitatea și lățimea de bandă
mai ridicate, dar necesită o tensiune de polarizare de peste 100 V. Dispozitivele
25
piezoelectrice operează la voltaje mai scăzute, insă au un cristal de cuarț rezonant, fapt ce
implică un răspuns in frecvență mai îngust decat la traductoarele electrostatice.
Fig. 2.9: Trei tipuri de traductoare: primul din
stânga piezoelectric și celelalte două electrostatice.
Traductoarele electrostatice
Un exemplu de traductor electrostatic este cel produs de Polaroid (cel din mijloc
din Figura 2.9), construit dintr-o membrană de plastic acoperită cu aur, întinsă peste o
placa rotundă, canelată, de aluminiu. Membrana conductoare este încărcată cu o tensiune
de polarizare de 150 V. Undele sonore fac membrana să vibreze astfel modificându-se
distanța dintre membrană si placa din spatele acesteia, astfel modificând capacitanța
membranei. Presupunând că sarcina q este constantă, voltajul v(t) este generat
proporțional cu capacitanța variabilă C(t), astfel v(t)=qC(t). Ca transmițător, membrana
traductorului oscilează aplicând capacitorului pulsuri cuprinse între 0-300 V folosind un
transformaror de puls. Sarcina indusă capacitorului de cei 300 V cauzează o forță de
atracție electrostatică între membrană și placa de aluminiu. Canelurile de pe placă permit
întinderea membranei, și creând neregularități în asprimea plăcii se obține o rezonanță
mare în răspunsul în frecvență. De exemplu, lățimea de bandă a seriei 7000 a
traductoarelor Polaroid este de 20 kHz.
26
Tradcutoarele piezoelectrice
Traductoarele ceramice piezoelectrice pot fi filosite atât ca transmițătoare cât și ca
receptoare, însă, unii producători vând transmițătoarele și receptoarele separat, pentru a
optimiza puterea transmisă respectiv sensibilitatea receptorului. Un cristal pizeoelectric
oscilează când îi este aplicat un voltaj și reciproc, generează un voltaj atunci când
oscilează mecanic. Adeseori un con concav este montat peste cristal pentru a potrivi din
punct de vedere acustic impedanță acustică a cristalului cu cea a aerului. Un bun exemplu
este emițătorul/receptorul Murata MA40A5R/S, care operează la frecvența de 40 kHz.
Dispozitivul are un diametru de 16 mm și un unghi al undei transmise de 60°, pentru o
pierdere de -20 dB comparată cu sensibilitatea maximă. Lațimea de bandă efectivă a
transmițătorului si a receptorului este de numai câțiva kHz datorită naturii rezonante a
cristalului. Aceasta limitează timpul de propagare a semnalului modulator al pulsului la
0.5 ms. Un avantaj al acestui fapt este abilitatea de a folosi dispozitivele piezoelectrice la
voltaje scăzute, de exemplu conectând fiecare terminal la iesiri logice complementare ale
CMOS. Există o gamă largă de frecvențe rezonante pentru traductoarele piezoelectrice,
de la 20 kHz pâna la ordinul MHz-lor. De asemenea mai este disponibilă o peliculă
piezoelectrică denumită flouropolimer polarizat, florura de polivinilin (PVDF). Această
peliculă flexibilă poate fi decupată în diferite forme pentru a forma transmițătoare și
receptoare ultrasonice. Sensibilitatea dispozitivelor făcute din PVDF este de obicei mai
scăzută decât a traductoarelor cu cristal iar majoriatea aplicațiilor sunt de distanță scurtă,
unde banda largă a PVDF permite formarea de pulsuri scurte, care permit detecția de tip
puls-ecou până la 30 mm.
27
Tipuri de ecouri recepționate
Modelarea proceselor de reflexie ajută în interpretarea informațiilor primite din
ecou. Vom considera trei modele simple: plane, colțuri și muchii. Aceste modele se
aplică atat traductoarelor simple cât și rețelelor formate din acestea.
Fig. 2.10: Modele de reflexie: a) plan; b) colț; c) muchie.
Un plan este o suprafață netedă, care se comportă ca o oglindă acustică. Pereții netezi si ușile se comportă ca plane reflectoare. Planul trebuie să fie suficient de lat
pentru a produce cele două reflexii a căror traseu este marcat cu linie punctată (Fig.
2.10a). Planul reflector este așadar puțin mai mare decât aria de intersecție a undei cu
planul. Planele mai mici produc ecouri mai slabe datorită suprafeței reflectoare și
interferențe negative datorită ecourilor difractate de marginile planului. O oglindă
acustică permite o analiza folosind un traductor virtual, indicat de numerele prime din
figură.
Un colț este unghiul drept concav format de intersecția dintre două suprafețe.
Colțurile formate prin intersecția pereților, a dulapurilor si a glafurilor sunt câteva
exemple de colțuri reflectoare. O caracteristică a colțurilor este aceea că undele se
reflectă în aceeași direcție de unde au plecat. Acest fenomen este cauzat de reflexiile
planelor a fiecăreia dintre suprafețele care definesc colțul. Traductorul virtual este așadar
obținut prin reflectarea undei dintr-un plan al colțului apoi din celălalt plan. Acest fapt dă
naștere la o reflexie prin punctul de intersecție a planelor ce formează colțul (Fig. 2.10b).
28
Analiza traductorului virtual indică faptul că, pentru un sonar monostatic, ecourile
reflectate dintr-un plan si dintr-un colț sunt identice, astfel planele și colțurile generează
harti sonare identice. Modul diferit de orientare a traductorului virtual între plane și
colțuri a fost exploatat utilizând rețele de traductoare, pentru a diferenția aceste tipuri de
reflectoare.
Muchia prezentată în Fig. 2.10c modelează obiecte fizice, cum ar fi colțuri
convexe și suprafețe cu o curbură ridicată, unde punctul de reflexie este aproape
independent de poziția traductorului. Pe când planele și colțurile generează ecouri
puternice, muchiile generează ecouri slabe, care sunt detectate numai de la distanțe mici,
făcându-le obiecte greu de detectat. Cercetătorii timpurii din domeniul sonarelor au pus
folii cu bule de împachetat pe muchii pentru a le înlesni detectarea cu ajutorul sonarelor.
Multe obiecte din mediul înconjurător pot fi considerate o colecție de plane,
colțuri si muchii. Modele ale ecourilor indică faptul că forma de undă totală a ecoului
pT(t) este suma ecourilor individuale pi(t) la distanța ri și direcție θi , scalate de
amplitudinea ai :
, (2.12)
unde este un factor de amplitudine in raport cu direcția undei. Ecourile cu lățimea
de bandă mare sunt mai complicate deoarece forma lor de undă se modifică într-o
manieră deterministă datorită difracției. Sonarele care analizează pT(t) necesită
convertoare analog-digital pentru a obține exemple de undă.
29
2.4.2 Senzori infraroșu (IR)
Senzorii infraroșu sunt un alt tip de senzori de proximitate. Aceștia sunt formați dintr-un emițător de lumină în spectrul infraroșu, de obicei un led, și un receptor, de
obicei un foto-tranzistor sau o foto-diodă, care detectează și măsoară cantitatea de lumină
reflectată de eventualele obiecte aflate în raza de acțiune a senzorului. Senzorii infraroșu
au o rază de acțiune de la câțiva milimetri la câțiva metri, în funcție de frecvența luminii
folosite și a sensibilității receptorului.
Cei mai simpli senzori infraroșu de proximitate sunt construiți din led-uri și au o
rază de acțiune de 5-15 cm. Aceștia nu sunt foarte practici, deoarece lumina emisă este
deseori afectată de lumina din mediul înconjurător, făcând astfel detecția imposibilă, iar
în alte cazuri, lumina emisă este absorbită de materialele închise la culoare din jur.
Senzorii mai sofisticați folosesc diferite benzi de lungime de undă în infraroșu,
care pot fi selectate sau modulate pentru a schimba rapotrul dintre semnal și zgomot.
Acest fapt asigură că un obiect din raza de acțiune nu absoarbe lumina emisă, astfel încât
robotul sa nu detecteze acel obiect [6]
30
Capitolul III. Studiu de caz; Construcția și programarea
unui robot mobil cu roți diferențiale
3.1 Elementele componente ale robotului???
Pentru realizarea fizică a robotului vor fi utilizate următoarele componente
mecanice si electronice:
- două bucăți dreptunghiulare de plexiglas cu dimensiunile 140x110x5 mm;
- două motoare de curent continuu cu reductor de turație;
- un servomotor de tipul SG-90 Nano;
31
- două placuțe de oțel folosite pentru suportul motoarelor pe șasiu;
- două roți din material plastic, (7cm diametru), prevăzute cu membrană de cauciuc;
- o sferă de plastic încastrată într-o bucșă (ball-caster);
- șuruburi, piulițe și șaibe de diferite dimensiuni, utilizate pentru a prinde diferitele
componente ale robotului de șasiu și între ele;
- un kit cu microcontroler Arduino Duemilanove, pe care se află microcontrolerul
ATmega328;
- un driver motor punte H dublă de tipul L298N, folosit pentru controlul motoarelor;
32
- 8 diode redresoare de tipul Zener;
- 2 foto-tranzistori de tipul NPN;
- 4 LED-uri emițătoare de lumină infraroșie;
- 4 rezistențe de 220 Ω și două de 180 kΩ;
- 2 condensatori de 100 nF;
- o placă suport pentru circuite electronice;
- conectori de tip pini mamă și tată;
- un senzor cu ultrasunete de tipul DYP-ME007;
- trei senzori cu infraroșu de tipul QTR-1RC;
- un suport de metal pentru cei cinci senzori IR;
- o baterie de 9V;
- patru baterii de 1.5V de tipul AA;
- un suport pentru cele patru baterii, cu comutator.
3.2 Realizarea structurii mecanice a robotului
Robotul va fi un robot mobil cu două roți diferențiale și o bilă încastrată într-o
bucșă, situată în spatele celor două roți, pentru sprijin, aceasta mișcându-se liber în
lagărul său. Cele două roți vor fi antrenate de două motoare prevăzute cu reductoare de
turație, necesare pentru reducerea turației motoarelor și creșterea cuplului în același
33
timp, pentru a facilita deplasarea cât mai ușoară a robotului. Cele două motoare vor fi
comandate de un circuit cu punte H dublă, asociat unui microcontroler. Robotul va avea,
deasemeni, o rețea compusă din cinci senzori cu infraroșu, folosiți pentru a putea urmări
traseul desemnat, și un senzor cu ultrasunete, utilizat pentru depistarea eventualelor
obstacole ce ar putea să apară în calea sa, și să le evite. Toate piesele componente vor fi
susținute de două plăci de plexiglas, situate una deasupra celeilalte, pentru a face robotul
cât mai robust și mai mobil.
Pentru început, vor fi tăiate la dimensiunile dorite cele două bucăți de plexiglas.
Pentru a spori robustețea robotului, au fost aplicate următoarele constrângeri din punct de
vedere constructiv:
- lungimea maximă va fi de 22 cm;???
- lățimea maximă va fi de 13 cm;
- garda la sol va fi cuprinsă între 3 și 5 mm (datorită distanței mici la care senzorii
cu infraroșu au performanțele maxime).
Ulterior vor fi alese motoarele. Am decis să folosesc 2 motoare de curent continuu,
fiecare din ele fiind prevăzut cu cutie de viteze. Cutia de viteze constă, de fapt, dintr-un
ansamblu de roți dințate, folosit pentru reducerea turației concomitent cu creșterea
cuplului motor, după cum se poate observa în Fig. 3.1. Rația utilizată de reductorul de
turație este de 120:1,??? furnizând atât o viteză destul de ridicată, cât și un cuplu motor
suficient de mare pentru a nu exista probleme în dinamica mișcării robotului.
34
Fig. 3.1: Motorul și reductorul de turațiePe una din cele două bucăți de plexiglas vor fi montate cele două motoare
împreună cu roțile aferente, ținând cont de constrângerile cinematice care se aplică
acestui tip de robot (distanța dintre cele două doți va fi de 11 cm, pentru a face posibilă
virarea robotului într-un spațiu cat mai mic), roțile fiind de tipul celor din Fig. 2.5a,
prezentate în Capitolul II, cu precizarea că nu sunt pasive, ci active.??? Apoi va fi
montată bila omnidirecțională, asemănătoare din punct de vedere al cinematicii si
proprietăților cu roata pasivă din Fig. 2.5b prezentată tot în Capitolul II, care va avea rol
de punct de sprijin al platformei robotului, cele patru baterii de 1.5V instalate în suportul
lor, bateria de 9V și cei cinci senzori cu infraroșu, montați în prealabil pe un suport
metalic, la distanța de 1.5 cm unul de celălalt, fiind plasați la 4 mm deasupra solului
pentru o detecție cât mai precisă a traseului de urmat. Pe cealaltă placă de plexiglas vor fi
montate placa cu microcontrolerul, placa cu circuitul cu punte H dublă, necesară pentru
comanda motoarelor și servo-motorul, de care va fi atașat senzorul cu ultrasunete. Apoi
cele două plăci de plexiglas vor fi montate una deasupra celeilalte cu ajutorul a patru șuruburi, robotul fiind unul pe două nivele.
35
Fig. 3.2: Vedere laterală a robotului
36
3.3 Realizarea structurii electrice și de control a robotului
Fig. 3.3: Schema electrică și de control a robotului
37
Partea electrică a robotului va fi compusă din placa cu microcontrolerul, circuitul de
comandă al motoarelor de tip punte H dublă, cei cinci senzori cu infraroșu (dintre care
trei sunt digitali, aceștia fiind kituri preinstalate???, iar ceilalți doi sunt analogici, fiind
construiți, după cum va fi prezentat în continuare), senzorul cu ultrasunete, cele două
motoare de curent continuu, servo-motorul și bateriile necesare alimentării tuturor
componentelor, după cum apare in Fig. 3.3.
Realizarea circuitului de comandă al motoarelor de curent continuu
Acest circuit are rolul de a furniza puterea necesară funcționării celor două
motoare, astfel încât ele să poată fi controlate de microcontroler. Acest circuit, a cărui
structură este prezentată în Fig. 3.4, poate controla independent două motoare de curent
continuu bidirecționale. Voltajul recomandat pentru alimentarea celor două motoare este
de 3-9V. Se va folosi tensiunea de 6V, obținută prin legarea în serie a patru baterii de
1.5V.
Pentru realizarea circuitului de comandă, vor fi necesare următoarele componente:
- un driver motor punte H dublă de tipul L298N;
- 8 diode Zener ce suportă un curent maxim de 2 A;???
- 2 condensatori cu capacitatea de 100nF;
- o placă pentru sisținerea componentelor.
Nu este absolut necesară folosirea diodelor și a condensatorilor, însă este indicată
folosirea lor deoarece regulează tensiunea ce ajunge la motoare, fiind o protecție
împotriva curenților autoinduși de motoare.
38
Fig.3.4: Schema electrică a circuitului de control al motoarelor de curent continuu
Driverul motor L298N este un circuit integrat de mare voltaj (poate opera până la 46V).
Acesta se folosește la controlul releelor, solenoizilor, motoarelor de curent continuu și a
motoarelor pas-cu-pas. Acesta integrează două faze de putere. O fază de putere este o punte a
cărei ieșiri pot conduce diferite motoare în mod obișnuit sau diferențial, în funcție de starea
intrării.???
Realizarea senzorilor analogici cu infraroșu
Acești doi senzori cu infraroșu vor completa rețeaua de senzori deja existență, formată
din ceilalți trei senzori digitali, pentru a îmbunătați detecția și urmărirea traseului prestabilit.
Senzorul este format dintr-un foto-tranzistor, cu rolul de receptor, două led-uri emițătoare de
lumină infraroșie, două rezistențe de 220 Ω și una de 180 kΩ, după cum se vede în Fig. 3.5.
Senzorii vor fi alimentați de la linia de +5V a microcontrolerului. Metoda de detecție constă în
compararea curentului care iese din foto-tranzistor cu cel de pe ieșirea senzorului???. În cazul în
care este detectată o suprafață de culoare neagră (reflectanță minimă), senzorul va furniza o
39
valoare numerică apropiată de 1000, iar în cazul în care este detectată o suprafață albă, senzorul
va furniza o valoare numerică apropiată de 0.
Fig. 3.5: Schema electrică a senzorului analogic cu infraroșu
Conectarea părților componente la microcontroler
Circuitul de comandă al motoarelor de curent continuu se conectează la
microcontroler și la motoare astfel:
- pinii 2, 3, 13 și 14, care sunt porturile de ieșire, se conectează la bornele celor
două motoare;
- pinii 5,7,10 și 12, care sunt porturile de intrare, se conectează la patru porturi
digitale ai microcontrolerului, ce pot fi configurate ca PWM-uri, și anume
porturile nr. 3,5,6 și 11;
- pinul 4 este folosit pentru alimentarea circuitului și implicit al motoarlor, astfel el
va fi conectat la borna pozitivă a bateriilor de 1.5V;
- pinul 9 este folosit pentru alimentarea componentelor logice a driverului motor,
fiind conectat la ieșirea de +5V a microcontrolerului;
- pinii 6 și 11 sunt intrerupătoarele celor două punți, aceștia fiind conectați tot la
portul de +5V a microcontrolerului;
40
- pinii 1 și 15 reprezintă pinii de control ai curentului prin cele două motoare, în
sensul că se poate monta o rezistență între fiecare din cei doi pini și împământare;
aceștia nu vor fi folosiți, deci vor fi legați direct la împământare;
- pinul 8 reprezintă împământarea, acesta fiind legat la pinul împământare al
microcontrolerului.
Servomotorul are trei porturi: unul pentru alimentare, unul este împământarea iar
unul pentru controlul voltajului prin servo-motor. Se conectează la microcontroler astfel:
- pinul de alimentare se conectează la sursa de 6V;
- pinul de control al voltajului la portul digital nr. 7 al microcontrolerului.
Senzorul cu ultrasunete are patru porturi: unul este pentru alimentare, unul este
împământarea, unul este pentru declanșarea undei de detecție iar celălalt pentru a prelua
informațiile furnizate de ecoul undei emise. Aceștia se conectează la microcontroler
astfel:
- pinul de alimentare se conectează la portul de +5V al microcontrolerului;
- pinul de declanșare a pulsului este conectat la portul digital 9 al
microcontrolerului;
- pinul de preluare a informațiilor furnizate de ecoul pulsului se conectează la portul
digital 10 al microcontrolerului.
Fiecare din cei cinci senzori cu infraroșu are câte trei pini: unul de alimentare,
unul este împământarea iar al treilea este ieșirea senzorului. Rețeaua formată din cei
cinci senzori se va conecta la placa microcontrolerului astfel:
- alimentările celor cinci senzori se vor conecta la portul de +5V al
microcontrolerului;
- ieșirile celor trei senzori digitali se vor conecta la pinii digitali 2, 8 și 12 ai
microcontrolerului;
41
- ieșirile celor doi sensori analogici se vor conecta la pinii analogici 0 și 1 ai
microcontrolerului.
3.4 Schema de control folosind microcontrolerul ATmega328
În rezolvarea structurii de control a robotului am folosit kit-ul Arduino
Duemilanove, echipat cu microcontrolerul ATmega328. Deține 14 pini ce pot fi
configurați ca intrări sau ieșiri digitale (dintre care 6 pot fi utilizați ca ieșiri PWM), 6
intrări analogice, un cristal oscilator cu frecvența de 16 MHz, o conexiune USB, o mufă
de alimentare, un conector folosit pentru programarea microcontrolerului prin portul
serial (conector ICSP) și un buton de reset [7].
Fig. 3.6: Schema electrică a kit-ului cu microcontroler
42
Alimentarea
Kit-ul Arduino Duemilanove poate fi alimentat cu ajutorul conexiunii USB sau de
la o sursă externă de alimentare. Sursa de alimentare este selectată automat de către
microcontroler.
Sursa externă de alimentare (non-USB) poate fi un acumulator, un adaptor AC-DC
sau baterii. Adaptorul poate fi conectat la placă cu ajutorul unui conector de 2.1 mm???.
Altă modalitate de a conecta acumulatoare sau baterii la placă este prin conectarea celor
două borne prin fire la pinii Vin și Gnd ai conectorului de alimentare de pe placă???.
Placa poate opera fiina alimentată la o sursă externă de 6 până la 20V. Dacă este
alimentată totuși la mai puțin de 7 V, pinul +5V este posibil să furnizeze mai puțin de
5V, iar regimul de funcționare a plăcii poate fi instabil. Dacă placa este alimentată la mai
mult de 12V, regulatorul de voltaj se poate incălzi, astfel existând posibilitatea de a se
deteriora placa. Gama de voltaj recomandată este de 7-12V???.
Pinii de alimentare de pe placă sunt următorii:
- Vin: pinul de alimentare al plăcii atunci când se utilizează o sursă externă de
alimentare (înafară de conexiunea USB sau alte surse de alimentare regulate). În
cazul înc are placa este alimentată de la o sursă externă prin conectorul de 2.1 mm,
această sursă poate fi accesată prin pinul Vin.
- 5V: sursa de alimentare regulată care alimentează microcontrolerul ci celelalte
componente de pe placă. Această tensiune poate proveni fie de la pinul Vin printr-
un regulator de pe placă, fie de la coneiunea USB sau alte surse regulate de 5V.
- 3.3V: sursa de alimentare de 3.3V generați de cipul FTDI. Consumul maxim de
curent pe acest pin este de 50mA.
- GND: pinul împământare.
43
Memoria
Microcontrolerul ATmega328 are 32 KB de memorie flash, folosită pentru
stocarea codului (din care 2 KB sunt folosiți pentru bootloader), 2 KB de memorie
SRAM și 1 KB de memorie EEPROM???.
Interfațarea microcontrolerului
Fiecare dintre cei 14 pini digitali ai plăcii pot fi utilizați atât ca intrări, cât și ca
ieșiri, folosind funcțiile pinMode(), digitalWrite() și digitalRead(). Aceștia operează la
tensiunea de 5V. Fiecare dintre acești pini poate primi sau furniza un curent de maximum
40mA și are rezistență cu întrerupător internă (aceasta este deconectată implicit) de 20-
50 kOhmi???. În plus, acești pini au utilizări specializate:
- Serial: 0 (RX) și 1 (TX): sunt utilizați pentru a recepționa (RX) și transmite
(TX) date prin portul serial. Acești pini sunt conectați la pinii corespunzători ai
cipului FTDI serial USB-TTL.
- Întreruperi externe: 2 și 3: acești pini pot fi configurați să declanșeze o
întrerupere. Se poate executa o funcție (attachInterrupt() ) în cazul unei
întreruperi dictate de acești pini.
- PWM: 3, 5, 6, 9, 10, și 11: furnizează ieșiri de tip PWM de 8 biți, cu ajutorul
funcției analogWrite().
- Interfață serială cu periferice: 10 (Slave select - SS), 11 (Master Out Slave In
- MOSI), 12 (Master In Slave Out - MISO) și 13 (Serial Clock - SCK): acești
pini susțin comunicația serială utilizând librăria SPI.
- Led: 13: un led este conectat la pinul digital 13. Când pinul respectiv are o valoare
ridicată, led-ul este aprins, iar când valoarea este mică, led-ul este stins.
Placa mai posedă 6 intrări analogice, fiecare dintre aestea fiind capabile de o
rezoluție de 10 biți (pot lua 11024 de valori diferite). Implcicit, aceștia sunt capabili să
măsoare la voltaje cuprinse între 0 și 5V, însă este posibilă modificarea limitei
44
superioare, utilizând pinul AREF și funcția analogReference(). În plus, unii pini au
funcții specializate:
- I2C (Inter-Integrated Circuit): pinii A4 (Serial Data – SDA) și A5 (Serial
Clock – SCL): acești pini susțin comunicația între placă și diferite periferice,
folosind librăria Wire.
Pe lângă pinii menționați mai sus, pe placă se mai afla și alte tipuri de pini:
- AREF: acest pin poate modifica tensiunea maximă sub care operează pinii
analogici, utilizând funcția analogReference().
- Reset: folosit pentru întreruperea alimentării în scopul resetării microcontrolerului.
De obicei, acest pin se folosește pentru adăugarea unui buton de reset, care îl
anulează pe cel deja existent pe placă.
Sistemul de comunicațieArduino Duemilanove deține o serie de facilități pentru comunicația cu un
computer, cu altă placă Arduino, sau cu alte microcontrolere. Microcontrolerul
ATmega328 furnizează comunicația serială UART TTL (5V), care este disponibilă
utilizând pinii digitali 0 (RX) și 1 (TX). Un chip FTDI FT232RL canalizează această
comunicație serială înspre portul USB, iar driverele chipului FDTI (incluse in software-ul
furnizat de Arduino) furnizează un port COM virtual pe computer. Software-ul Arduino
include un instrument de monitorizare a portului serial, care permite transmisia de date
spre și de la placă. Led-urile RX și TX de pe placă vor clipi atunci când se transmit date
prin cipul FDTI și portul USB către computer. O librărie SoftwareSerial permite
comunicația serială pe fiecare dintre pinii digitali ai plăcii. Microcontrolerul ATmega328
suportă deasemenea comunicația de tipul SPI (Interfață serială cu periferice) și I2C
(TWI). Software-ul Arduino include o librărie Wire pentru a simplifica utilizarea
magistralei I2C și o librărie SPI pentru comunicația SPI.
45
Programarea microcontrolerului
Arduino Duemilanove poate fi programat cu ajutorul software-ului pus la
dispoziție de către producător. Microcontrolerul ATmega328 conține un bootloader, care
permite încărcarea unui nou cod, fără a fi nevoie să utilizăm un dispozitiv programator
extern. Acesta comunică folosind protocolul STK500. De asemenea, se poate evita
folosirea bootloaderului, prin programarea microcontrolerului utilizând programarea prin
portul serial, cu ajutorul conectorului ICSP.???
Resetarea automată (din software)
Înafară de a fi nevoie de apăsarea butonului de reset de pe placă, Arduino
Duemilanove este proiectat să permită resetarea sa din software-ul ce rulează pe un
computer. Una dintre liniile de alimentare a cipului FT232RL este conectată la linia de
reset a microcontrolerului, printr-un condensator de 100nF. Când această linie este
întreruptă, microcontrolerul este resetat. Software-ul Arduino utilizează această
capabilitate pentru a permite încărcarea unui nou cod prin simpla apăsare a butonului
Upload din mediul de programare, timp în care microcontrolerul este resetat iar codul
este încărcat. Placa conține o linie ce poate fi tăiată, pentru a dezactiva funcția de auto-
reset???. Pinii de pe fiecare parte a liniei pot fi conectați pentru a reface acea linie.
Aceștia sunt etichetați pe placă cu “ RESET-EN”. Funcția de auto-reset mai poate fi
dezactivată prin conectarea unei rezistențe de 110 ohmi la pinii +5V si RESET.
Protecția de supracurent a portului USB
Arduino Duemilanove conține o siguranță resetabilă care protejează porturile USB
ale computerului de sepracurent și scurtcircuit. Cu toate că majoritatea computerelor
dețin protecții asemănatoare, această siguranță sporește nivelul de protecție. Dacă un
46
curent mai mare de 500mA este aplicat portului USB, atunci siguranță intrerupe automat
conexiunea, până când supracurentul sau scurtcircuitul este îndepărtat.
3.5 Senzorii de proximitate
3.5.1 Senzorul cu utrasunete DYP-ME007
Senzorul cu ultrasunete este folosit pentru detecția și evitarea eventualelor
obstacole ce ar putea să apară în calea robotului. Acesta are un dublu rol: de detecție a
obstacolelor și de măsurare a distanței până la acestea. Acest senzor furnizează
măsurători ale distanței precise, începând de la 3 cm și până la 3 m. Senzorul
funcționează prin emiterea unui puls ultrasonic și măsurarea timpului care trece între
emiterea pulsului și captarea ecoului acestuia. Ieșirea senzorului este de forma unui puls
cu lățimea variabilă, care corespunde distanței până la obiectul detectat. DYP-ME007
detectează obiecte prin emiterea unui puls ultrasonic cu frecvența de 40kHz care
călatorește prin aer cu viteza de 343 m/s (viteza sunetului), atinge un obiect și apoi se
respinge înapoi din acesta. Prin măsurarea timpului scurs între emiterea pulsului și
întoarcerea ecoului, poate fi determinată distanța până la obiectul detectat (principiul este
ilustrat în Fig. 3.7). Distanța este calculată folosind următoarea formulă (echivalentă cu
formula 2.15 prezentată în Capitolul II):
, (3.1)
unde
d = distanța până la obiect
t = durata de deplasare a undei ultrasonice (dus-întors)
Vs = viteza sunetului
47
Fig. 3.7: Diagrama detecției la senzorul DYP-ME007
Caracteristicile senzorului:
- Tensiunea de alimentare: 5V
- Curentul consumat: max 15 mA
- Frecvența: 40kHz
- Distanța minimă de detecție: 2 cm
- Distanța maximă de detecție: 450 m
- Rezolutie: 1 cm
- Senzorul are un unghi de detecție de 15° (Fig. 3.8)
- Pulsul declanșator al undei de detecție are durata de cel puțin 10µs
48
Fig. 3.8: Unghiul de detecție a sonarului DYP-ME007
Sonarul este construit astfel încât sa aibă un cost cât mai mic. Utilizează un
PIC12C508 pentu a efectua funcțiile de control??? și traductoare piezoelevtrice cu
frecvența de 40kHz. Dacă este alimentat la 5V (tensiunea standard de alimentare),
sonarul va detacta cu succes obiectele mari aflate in raza sa, dar detecția obiectelor de
dimensiuni reduse poate fi problematică. Astfel, tensiunea de alimentare se poate crește
până la limita maximă de 20V.
Mai există o problemă, și anume aceea de a detecta obiecte mai apropiate de 3cm.
Teoretic este posibil, însă în practică nu se va efectua o detecție corectă, deoarece
receptorul va prelua direct unda emisă de transmițător, care se afla chiar lângă el. Pentru
a îngreuna și mai mult situația, traductorul piezoelectric este un mecanism care continuă
să mai oscileze o perioadă de timp după ce pulsul ultrasonic a fost emis, de obicei până la
1ms. astfel, este foarte dificil de făcut diferența dintre această citire falsă și ecoul care ar
putea proveni de la un obiect aflat așa de aproape.
49
3.5.2 Senzorul cu infraroșu QTR-1RC
Senzorul QTR-1RC este un mod foarte practic de a adăuga capabilități de urmărire
a liniei sau a marginii unui robot, datorită timpului său de răspuns foarte bun. Acesta este
format dintr-un led care emite lumină în spectrul infraroșu și un foto-tranzistor. Foto-
tranzistorul utilizează un circuit cu condensator, care permite unei intrări/ieșiri digitale a
unui microcontroler să preia o citire analogică a reflexiei luminii infraroșii prin
măsurarea timpului de descărcare a condensatorului. Timpul de descărcare mai mic este o
indicație a unei reflexii mai ridicate. Rezistența cu care este prevăzut led-ul emițător este
setată să livreze aproximativ 20-25mA către led, când tensiunea de alimentare este de 5V.
Acest curent poate fi furnizat de către intrările/ieșirile unor microcontrolere, permițând
senzorului să fie alimentat pe această cale, pentru conservarea energiei. Distanța optimă
de la care se realizează detecția este de 3mm, însă senzorul poate opera de la distanța
maximă de 9.5mm. Senzorul este prevăzut cu trei pini: unul de alimentare, unul este
împământarea iar al treilea este ieșirea digitală.
Fig. 3.10: Schema electrică a senzorului QTR-1RC
50
Inrerfața dintre senzor și microcontroler
Senzorul QTR-1RC are ieșiri ce necesită conexiunea cu un pin I/O digital de pe
un microcontroler, capabil în primul rând să încarce condensatorul, apoi să măsoare
timpul necesar condensatorului să se descarce prin foto-tranzistor. Această metodă de
măsurare are câteva avantaje, mai ales dacă se folosesc mai mulți senzori:
- nu este necesar un convertor analog-digital;
- sensibilitate sporită față desenzorii ce folosesc ieșiri analogice cu potențiometru;
- citirea în paralel a datelor provenite de la mai mulți senzori este posibilă la
majoritatea microcontrolerelor.
Modul obișnuit de citire a datelor de la senzor este următorul:
- se setează linia I/O ca ieșire și se aplică tensiune pe ea;
- se permite trecerea a cel puțin 10µs, timp necesar ca să se încarce condensatorul
de 10nF;
- se setează linia I/O ca intrare (având impedanța ridicată);
- se măsoară timpul necesar condensatorului să se descarce.
Acești pași pot fi efectuați în paralel asupra mai multor senzori.
În cazul unei reflexii puternice, timpul de descărcare a condensatorului este de
cateva zeci de microsecunde. În cazul în care nu există reflexie, timpul de descărcare este
de câteva milisecunde, fiind mult mai mare, după cum se poate vedea în Fig. 3.11.
Timpul exact de descărcare a condensatorului depinde de caracteristicile liniilor I/O a
microcontrolerului. Rezultate semnificative sunt obținute de obicei in perioada de 1ms
(nu în cazul în care se încarcă măsurarea diferențelor mici de culoare în mediile cu
liminozitate scăzută), permițând o eșantionare de 1kHz.
a) b)
51
Fig.3.11: Semnalul de ieșire al senzorului (galben) când acesta se află deasupra unei linii albe (a) și negre (b) și cronometrarea timpului de descărcare a condensatorului (albastru)
3.6 Programarea robotului
Programarea robotului constă, de fapt, în programarea microcontrolerului
ATmega328. Pentru acest lucru, este necesar software-ul pus la dispoziție de producător.
Mediul de programare și dezvoltare Arduino conține un editor de text pentru a scrie cod,
o zonă de mesaje, o consolă, o bară de instrumente cu diferite butoane pentru funcțiile
comune și o serie de meniuri. Acesta se conectează la echipamentele Arduino pentru a
încărca în memoria acestora diverse programe și pentru a comunica cu ele. Limbajul de
programare folosit de microcontrolerul ATmega328 este limbajul C++. Încărcarea
programelor în memoria microcontrolerului se face prn conexiunea USB a kit-ului cu
microcontroler. În momentul apăsării butonului Upload din fereastra de editare,
microcontrolerul se resetează, permițând încărcarea programului.
52
Fig. 3.12: Interfața programului Arduino
Controlul motoarelor
Scopul robotului este acela de a urmări un traseu predefinit și de a evita
eventualele obstacole ce ar putea surveni în calea sa, urmând a reveni la traseul inițial.
Pentru a face acest lucru posibil, va fi programat microcontrolerul pentru a controla
motoarele de curent continuu, senzorii cu infraroșu, senzorul cu ultrasunete și
servomotorul care susține și orientează în diferite direcții senzorul cu ultrasunete.
Pentru a controla motoarele de curent continuu se folosește următoarea secvență
de cod:
int in1 = 3;
int in2 = 5;
int in3 = 6;
53
int in4 = 11;
void setup()
{
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
}
void loop()
{
delay(1000);
analogWrite(in1,150);
analogWrite(in2,0);
analogWrite(in3,150);
analogWrite(in4,0);
}
Această secvență de cod corespunde mersului înainte efectuat de către robot.
Pentru început au fost declarate porturile digitale la care vor fi conectate motoarele, și
anume 3, 5, 6 și 11. Apoi porturile au fost setate ca ieșiri. Pentru deplasarea robotului
înainte, înapoi sau pentru a se roti în loc prin rotația celor două motoare în sens invers, se
folosește funcția analogWrite(), care are ca parametri unul din cele patru porturi utilizate
de motoare și o valoare cuprinsă între 0 și 255, ce exprimă curentul transmis pe acel port
motorului. Un motor care este conectat la porturile 3 și 5 se va mișca într-un sens la
viteză maximă daca pe un portul 3 se va aplica valoarea 255 iar pe celălalt valoarea 0, și
în sens invers, dacă pe portul 3 se va aplica valoarea 0 iar pe celălalt valoarea 255.
54
Programarea senzorilor cu infraroșu
Pentru direcționarea robotului astfel încât acesta sa urmărească traseul impus, cei
cinci senzori cu infraroșu vor fi asezați unul lîngă altul, direcția urmată de robot fiind
dictată de datele preluate de rețeaua compusă din cei cinci senzori. Datele furnizate de
cei cinci senzori vor fi numere naturale cuprinse între 0 și 9 in cazul senzorilor digitali, și
0 și 1000 pentru senzorii analogici, unde 0 înseamnă reflectanță maximă, adică senzorul
este situat deasupra unei porțiuni albe, iar 9 (1000 pentru senzorii analogici) înseamnă
reflectanță minimă, adică senzorul este situat deasupra unei zone de culoare neagră. Cei
trei senzori digitali vor fi încadrați de cei doi analogici. Se va folosi următorul algoritm
de direcționare:
- dacă senzorul din mijloc (digital) este deasupra liniei, robotul se va mișca înainte,
cât timp senzorul respectiv se află deasupra liniei;
- dacă senzorul digital din stânga se află deasupra liniei, iar ceilalți doi digitali nu
vor detecta linia, robotul se va mișca spre stânga, până când senzorul din mijloc va
detecta linia;
- dacă senzorul digital din dreapta se află deasupra liniei, iar ceilalți doi digitali nu
vor detecta linia, robotul se va mișca spre dreapta, până când senzorul din mijloc o
va detecta;
- dacă atât senzorul digital din stânga cât și cel digital din mijloc vor detecta linia,
robotul se va mișca ușor spre stânga, până când senzorul digital stâng nu va mai
detecta linia;
- dacă atât senzorul digital din dreapta cât și cel digital din mijloc vor detecta linia,
robotul se va mișca ușor spre dreapta, până când senzorul digital drept nu va mai
detecta linia;
- dacă senzorul analog din stânga va detecta linia, robotul se va mișca puternic spre
stânga, până când senzorul analog din stânga nu va mai detecta linia;
- dacă senzorul analog din dreapta va detecta linia, robotul se va mișca puternic spre
dreapta, până când senzorul analog din dreapta nu va mai detecta linia;
55
- dacă nici unul dintre senzori nu va detecta linia, atunci robotul se va opri.
Citirea datelor obținute de la senzorii digitali se face folosind funcția qtrrc.read( ),
care are ca parametru vectorul sensorValues, care repezintă valorile transmise de fiecare
senzor, în funcție de ce detectează, acestea fiind cuprinse între 0 și 9. Citirea datelor
furnizate de senzorii analogici se face folosind funcția analogRead(), care are ca
parametru variabila atribuită pinului analogic la care este conectat senzorul respectiv.
if(sen[1]>5) //senzor central deasupra liniei negre
{
// robotul va merge înainte
analogWrite(in1,150);
analogWrite(in2,0);
analogWrite(in3,150);
analogWrite(in4,0);
// afișează pe portul serial valorile preluate de la // senzori
Serial.println ("mijloc");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5); //așteaptă 5ms }
Exemplul de mai sus ilustrează condiția de mers înainte, care se aplică în cazul în
care senzorul din mijloc detectează linia ( sen[1] semnifică senzorul din mijloc, iar
valoarea atribuită mai mare decât cinci semnifică faptul că se află deasupra liniei negre).
56
//senzor stanga analog deasupra liniei negre
if(sen[0]<2&&sen[1]<2&&sen[2]<2&&sensA1>150&&sensA2<30)
{
do
{
if(sensA1<30) // senzorul nu mai este deasupra liniei
{
break; //se va termina executia buclei
}
// robotul va vira spre stanga
analogWrite(in1,0);
analogWrite(in2,200);
analogWrite(in3,200);
analogWrite(in4,0);
qtrrc.read(sensorValues); //citirea senzorilor digitali
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
sensA1 = analogRead(analogInPin1); //citirea senzorilor
analogici
sensA2 = analogRead(analogInPin2);
//afisarea pe portul serial a datelor preluate de la
//senzori
Serial.println("puternic stanga");
Serial.print(sensA1);
Serial.print(" ");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
57
Serial.print(" ");
Serial.print(sen[2]);
Serial.print(" ");
Serial.println(sensA2);
delay(5);
}
while(1);
}
Exemplul de mai sus ilsutrează condiția de virare puternică spre stânga, manevră
efectuată în cazul în care senzorul analog din stânga detectează linia.
Programarea sonarului
Pentru îndeplinirea funcției de detecție și evitare a obstacolelor ce ar putea
interveni pe traseul robotului, acesta va utiliza un senzor de proximitate cu ultrasunete,
atașat pe un servo-motor, care va roti senzorul pe un arc de cerc de 180°, astfel încât
acesta să detecteze orice obstacol s-ar afla in fața, stânga respectiv dreapta sa. Pentru
început, senzorul va fi orientat la 90°, adică în fața robotului, detecția pe direcția
celorlaltor unghiuri făcându-se în cazul în care un obstacol este detectat la distanța de 15
cm, pentru a avea alternative de schimbare a cursului. După ce robotul depășește
obstacolul respectiv, va trebui să revină la traseul inițial și să-și reia cursul stabilit.
Detecția se face în felul următor:
- se setează pinul de declanșare a pulsului ca ieșire și pinul de recepționare a
ecoului ca intrare;
- pentru a declanșa pulsul, pinul corespunzător este setet HIGH (1 logic sau pragul
maxim de tensiune) timp de 10 µs și apoi setat LOW (0 logic sau tensiune 0);
58
- în momentul declanșării pulsului, pinul corespunzător ecoului este setat HIGH iar
la întoarcerea ecoului este setat LOW, timpul scurs între activarea celor două stari
diferite fiind contorizat;
- calcularea distanței se face prin înjumătațirea duratei de propagare a undei
înregistrate de senzor și înmulțirii acesteia cu viteza de deplasare a undei sonore.
Timpul scurs dintre declanșarea ecoului și momentul recepției ecoului este
memorat cu ajutorul funcției pulseIn(inPin, HIGH) unde inPin reprezintă pinul setat ca
iesire iar HIGH este pragul de tensiune maximă aplicat portului respectiv.
long duration, cm;
void setup()
{
pinMode(pingPin, OUTPUT); //se setează portul ca ieșire pinMode(inPin, INPUT); //se setează portul ca intrare
Serial.begin(9600);
}
void loop()
{
digitalWrite(pingPin, LOW); //ieșirii i se aplică 0 logic delayMicroseconds(2); //asteaptă 2µs
digitalWrite(pingPin, HIGH); //ieșirii i se aplică 1 logic delayMicroseconds(10);
digitalWrite(pingPin, LOW);
duration = pulseIn(inPin, HIGH); //returnează durata de
//deplasare a pulsului
cm = duration/29/2; //calculează distanța în centimetri // afișează pe portul serial distanța până la obiect Serial.print("Distance: [");
59
Serial.print(cm);
Serial.print("]cm\n");
delay(500);
}
Mai sus este prezentată procedura de detectare a prezenței unui obiect și calculare
a distanței până la acesta. Distanța rezultă din durata de deplasare a pulsului. Este știută
viteza sunetului (343 m/s în aer în condiții de temperatură și presiune standard), acesta
parcurgând 1 cm în 29µs, de aceea distanța este numărul de microsecunde împărțit la 29
apoi împărțit la 2, deoarece timpul respectiv este durata de propagare a undei dus-întors.
3.7 Testarea robotului și a codului sursă
Pentru testarea robotului au fost făcute o serie de experimente, printre care testarea
motoarelor de curent continuu, a senzorilor cu infraroșu, testarea sonarului și a servo-
motorului.
Pentru început am testat comportarea motoarelor de curent continuu. După ce le-
am setat viteza maximă posibilă, am încărcat pe microcontroler o funcție care sa permită
mersul înainte al robotului. Din observațiile făcute, am ajuns la concluzia că există o
60
mică diferență de turație între cele două motoare, astfel că la aplicarea aceleiași tensiuni
ambelor motoare, robotul nu ar fi fost capabil să meargă în linie dreaptă. Așadar am decis
să folosesc tensiuni diferite la cele două motoare, pentru a echilibra turațiile.
În stadiul al doilea am testat programul de urmărire a traseului. Pe o coala de
carton format A1 am trasat cu bandă izolatoare de culoare neagră diverse tipuri de trasee
de diferite forme și mărimi. Rețeaua de senzori cu infraroșu era la început compusă doar
din cei trei senzori digitali. După încărcarea programului ce permite urmărirea traseului
pe microcontroler, robotul urmărea traseul, însă, în cazul unor viraje mai strânse, acesta
nu mai revenea la traseu. Prima măsură luată a fost modificarea algoritmului, însă tot nu
am ajuns la un rezultat satisfăcător în privința comoportării robotului. Astfel, am decis să
mai adaug incă doi senzori analogici cu infraroșu pentru a spori aria de detecție a rețelei
de senzori. Pentru urmărirea liniei cu cât mai puține corecții de curs, am setat motoarele
să funcționeze la 60% din viteza maximă. După implementarea funcțiilor necesare, s-a
constatat o îmbunătațire a comportamentului robotului în sarcina de urmărire a traseului.
O altă etapă în cadrul experimentelor a constat în testarea sonarului. Pentru început
sonarul a fost montat direct pe șasiul robotului. Am schimbat această abordare
structurală, deoarece sonarul putea detecta obiecte situate numai în fața robotului, nu și
pe cele situate în lateral, care însă s-ar fi putut interpune pe traiectoria robotului. De aceea
am decis să montez sonarul pe un servo motor, pentru a spori aria de detecție.
Experimentele au continuat prin punerea unor obiecte de diferite dimensiuni pe traiectoria
robotului. Algoritmul aferent a fost modificat până când robotul ocolea obiectul fără să îl
atingă, într-un spațiu cât mai redus.
Ultima etapă în stadiul de experimentare a fost interconectarea celor două funcții majore ale robotului, cea de urmărire a traseului și cea de detecție și evitare a
obstacolelor. Partea mai dificilă a fost întoarcerea robotului la traseu, după ce acesta
detecta și ocolea obstacolul care îi apărea în cale. După diferite modificări ale codului
sursă, am ajuns la un rezultat satisfăcător în privința comportării robotului.???
61
Capitolul IV. Concluzii
Pe parcurs ce înaintăm în era tehnologizată, tindem tot mai des să folosim roboții pentru efectuarea diferitelor sarcini care, în mod normal, erau efectuate de către om. Fie
că vorbim despre roboți industriali, folosiți în majoritatea industriilor, roboți militari care
elimină factorul uman în diverse medii ostile, roboți folosiți în cercetare și dezvoltare
sau de roboți folosiți în domeniul utilităților publice, ne este imposibil să ne imaginăm
viața fără ajutorul lor.
Utilitatea acestui proiect constă în faptul că, deși robotul realizat în cadrul acestei
lucrări este unul de mici dimensiuni, plecând de la acest proiect se pot dezvolta mai multe
tipuri de roboți si masini care să execute diferite sarcini. O primă direcție ar putea fi
crearea unui automobil dotat cu pilot automat, capabil să urmărească traseul impus fără
intervenția soferului și să reducă viteza de deplasare în cazul apropiirii de un alt
autovehicul folosind radare, care funcționează după principiul sonarului folosit în cadrul
acestui proiect. Un alt domeniu de utilizare ar fi acela agricol, unde există mașini
autonome capabile să execute singure lucrările pe suprafeţele de teren pentru care au fost
programate, asemănatoare din punct de vedere al construcției cu robotul realizat.
Principalele avantaje ale acestui robot sunt consumul redus de energie și faptul că
funcționează folosind baterii, lucru tot mai des cerut în zilele noastre datorită costurilor
tot mai ridicate în furnizarea energiei și al poluării datorate folosirii combustibililor
fosili. Un alt avantaj este usurința deplasării datorită utilizării a doar două roți diferențiale și a unui punct de sprijin format dintr-o bila omni-direcțională, nefiind
nevoie de atâtea corectări de curs ca în cazul roboților pe 4 sau 6 roți. Alt avantaj este
programarea și încărcarea codului sură pe microcontroler deosebit de facile. Costul redus
este un alt aspect demn de luat în seamă.
62
Printre dezavantaje, se numără imposibilitatea utilizării lui pe terenuri accidentate,
datorită gărzii la sol reduse, fapt datorat necesității amplasării senzorilor cu infraroșu cât
mai aproape de nivelul sololui. Chiar dacă mai sus a fost trecut ca un avantaj, faptul că
robotul funcționează pe baterii poate constitui și un dezavantaj, deoarece acestea trebuie
schimbate sau reîncărcate periodic.
Pentru experimentare și testarea performanțelor robotului și a funcțiilor sale a
fost construit un traseu, pe care robotul trebuie să-l urmărească. Pe acest traseu s-au
plasat o serie de obiecte, pe care robotul trebuie să le detecteze și apoi să le ocolească,
folosind sonarul. După mai multe modificări are structurii robotului și ale codului sursă
folosit, robotul a îndeplinit cu succes sarcinile atribuite.
O posibilă cale de îmbunătațire a robotului și a performanțelor sale o constituie
adăugarea unor celule foto-voltaice, care se vor încărca cu energie solară atat timp cât
robotul este folosit în spatiu deschis, fapt ce ar crește considerabil autonomia robotului.
Un alt aspect ar fi adăugarea unei camere video și a unei interfețe wireless, pentru
comunicarea cu operatorul și comanda robotului de la distanță, operatorul având și
pozibilitatea urmăririi robotului și a mediului înconjurător, lucru ce înlesnește luarea
deciziilor în privința direcției sau vitezei de deplasare a robotului.
63
Bibliografie
1. Frank KREITH , ”Mechanical Engineering Handbook”, Editura “CRC Press”, 1999
2. Robin R. MURPHY, “Introduction to AI Robotics”, Editura “MIT Press”, 2000
3. Mircea NIȚULESCU, “Roboți mobili”, Editura “SITECH Craiova”, 1998
4. Bruno SICILIANO, Oussama KHATIB, “Handbook of Robotics”, Editura “Springer”,
2008
5. Fred MARTIN, Pankaj OBEROI, Randy SARGENT, “Robot Builder’s Guide”,
Editura “MIT Press”, 1992
6. www.wikipedia.org
7. www.arduino.cc
8. www.alibaba.com
9. www.lulusoso.com
64
Anexă
Codul sursă al programului de navigare.
#include <PololuQTRSensors.h>
#include <Servo.h>
Servo myservo;
#define NUM_SENSORS 3 // numarul de senzori IR digitali
#define TIMEOUT 2500 // asteapta 2500 us pentru
descarcarea iesirilor
#define EMITTER_PIN QTR_NO_EMITTER_PIN // emitatorul nu
este controlat de nici un pin
// senzorii 0, 1 si 2 sunt conectati la pinii digitali 12, 8 si 2
PololuQTRSensorsRC qtrrc((unsigned char[]) {12, 8, 2},
NUM_SENSORS, TIMEOUT, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
// atribuirea pinilor pentru valorile PWM
int in1 = 6;
int in2 = 11;
int in3 = 3;
int in4 = 5;
65
// atribuirea pinilor pentru iesirea si intrarea senzorului cu
ultrasunete
int pingPin = 9;
int inPin = 10;
int contor=0;
long duration, cm;
// atribuirea pinilor pentru iesirile senzorilor analogici
const int analogInPin1 = A0;
const int analogInPin2 = A1;
int sensA1 = 0;
int sensA2 = 0;
int sen[3];
void setup()
{
myservo.attach(7);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
pinMode(pingPin, OUTPUT);
pinMode(inPin, INPUT);
Serial.begin(9600);
66
delay(500);
int i;
pinMode(13, OUTPUT);
digitalWrite(13, HIGH); // se aprinde ledul pentru a indica
faptul ca suntem inca in timpul calibrarii
for (i = 0; i < 400; i++) // face calibrarea sa dureze in jur
de 10 sec
{
qtrrc.calibrate(); // citeste toti senzorii de 10 ori
la 2500 us per citire (i.e. ~25 ms per call)
}
digitalWrite(13, LOW); // stinge ledul pentru a indica
faptul ca s-a sfarsit calibrarea
// printeaza valorile minime ale calibrarii obtinute cand
emitatoarele au fost pornite
Serial.begin(9600);
for (i = 0; i < NUM_SENSORS; i++)
{
Serial.print(qtrrc.calibratedMinimumOn[i]);
Serial.print(' ');
}
Serial.println();
// printeaza valorile maxime ale calibrarii obtinute cand
emitatoarele au fost pornite
for (i = 0; i < NUM_SENSORS; i++)
{
Serial.print(qtrrc.calibratedMaximumOn[i]);
Serial.print(' ');
}
67
Serial.println();
Serial.println();
delay(1000);
}
void loop() // bucla programului principal
{
myservo.write(90);
//cm=ultrasonicRead(cm);
delay(5);
qtrrc.read(sensorValues);
sensA1 = analogRead(analogInPin1);
sensA2 = analogRead(analogInPin2);
// scaleaza datele primite de la senzori ca numere de la 0 la
9, unde 0 inseamna reflectanta
// maxima, iar 9 inseamna reflectanta minima
unsigned char i;
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i]*10/1001;
}
delay(5);
unsigned int sensors[3];
if(sen[1]>5) //senzor central deasupra liniei negre
{
//mers inainte
68
analogWrite(in1,160);
analogWrite(in2,0);
analogWrite(in3,150);
analogWrite(in4,0);
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
Serial.println ("mijloc");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5);
}
if(sen[0]>5) //senzor stanga deasupra liniei negre
{
do
{
// virare stanga
analogWrite(in1,0);
analogWrite(in2,150);
analogWrite(in3,150);
analogWrite(in4,0);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
cm=ultrasonicRead(cm);
69
delay(5);
if(cm<7) //daca obiect in raza senzorului cu ultrasunete
evitare(); // incep manevrele de evitare
Serial.println("stanga");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5);
}
while(sen[1]<2);
}
if(sen[2]>5) //senzor dreapta deasupra liniei negre
{
do
{
analogWrite(in1,150);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,150);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
70
evitare();
Serial.println("dreapta");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5);
}
while(sen[1]<2);
}
if(sen[0]>5 && sen[1]>5) //senzor stanga si central deasupra
liniei negre
{
do
{
if(sen[0]<2)
{
break;
}
// virare usoara spre stanga
analogWrite(in1,50);
analogWrite(in2,0);
analogWrite(in3,150);
analogWrite(in4,0);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
71
}
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
Serial.println("usor stanga");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5);
}
while(1);
}
if(sen[2]>5 && sen[1]>5) //senzor dreapta si central deasupra
liniei negre
{
do{
if(sen[2]<2)
{
break;
}
analogWrite(in1,150);
analogWrite(in2,0);
analogWrite(in3,50);
analogWrite(in4,0);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
72
}
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
Serial.println("usor dreapta");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.println(sen[2]);
delay(5);
}
while(1);
}
if(sen[0]<2 && sen[1]<2 && sen[2]<2 && sensA1>400 && sensA2<30)
//senzor stanga analog deasupra liniei negre
{
do
{
if(sensA1<30)
{
break;
}
// virare brusca spre stanga
analogWrite(in1,0);
analogWrite(in2,200);
analogWrite(in3,200);
73
analogWrite(in4,0);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
sensA1 = analogRead(analogInPin1);
sensA2 = analogRead(analogInPin2);
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
Serial.println("puternic stanga");
Serial.print(sensA1);
Serial.print(" ");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.print(sen[2]);
Serial.print(" ");
Serial.println(sensA2);
delay(5);
}
while(1);
}
if(sen[0]<2 && sen[1]<2 && sen[2]<2 && sensA1<30 && sensA2>400)
//senzor dreapta analog deasupra liniei negre
74
{
do{
if(sensA2<30)
{
break;
}
analogWrite(in1,200);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,200);
qtrrc.read(sensorValues);
for (i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
sensA1 = analogRead(analogInPin1);
sensA2 = analogRead(analogInPin2);
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
Serial.println("puternic dreapta");
Serial.print(sensA1);
Serial.print(" ");
Serial.print(sen[0]);
Serial.print(" ");
Serial.print(sen[1]);
Serial.print(" ");
Serial.print(sen[2]);
Serial.print(" ");
Serial.println(sensA2);
delay(5);
75
}
while(1);
}
cm=ultrasonicRead(cm);
delay(5);
if(cm<7)
evitare();
delay(5);
}
//Functii predefinite folosite in bucla LOOP
long ultrasonicRead(long cm) //detectia si returnarea distantei
de catre senzorul cu ultrasunete
{
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(10);
digitalWrite(pingPin, LOW);
duration = pulseIn(inPin, HIGH);
cm = microsecondsToCentimeters(duration);
76
Serial.println(cm);
return cm;
delay(15);
}
void straight() //mers inainte
{
analogWrite(in1,162);
analogWrite(in2,0);
analogWrite(in3,150);
analogWrite(in4,0);
}
void turnLeft() //virare stanga
{
analogWrite(in1,0);
analogWrite(in2,150);
analogWrite(in3,150);
analogWrite(in4,0);
}
void turnRight() //virare dreapta
{
analogWrite(in1,150);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,150);
}
77
void Stop() //oprire
{
analogWrite(in1,0);
analogWrite(in2,0);
analogWrite(in3,0);
analogWrite(in4,0);
}
long microsecondsToCentimeters(long microseconds)
{
// trasnformare din microsecunde in centimetri
return microseconds / 29 / 2;
}
void evitare() //functia de evitare a obstacolelor
{
do
{
do
{
turnRight();
cm=ultrasonicRead(cm);
delay(10);
}
while(cm<50);
78
Stop();
delay(1000);
turnRight();
delay(750);
Stop();
delay(200);
myservo.write(180);
delay(1000);
cm=ultrasonicRead(cm);
delay(10);
cm=ultrasonicRead(cm);
delay(10);
if(ir()==1)
break;
do
{
straight();
if(ir()==1)
break;
cm=ultrasonicRead(cm);
delay(10);
}
while(cm<50);
contor=0;
do
{
straight();
contor++;
79
delay(20);
if(ir()==1)
break;
}
while(contor<=30);
contor=0;
do
{
turnLeft();
contor++;
delay(20);
if(ir()==1)
break;
}
while(contor<=25);
do
{
straight();
if(ir()==1)
break;
cm=ultrasonicRead(cm);
delay(10);
}
while(cm>15);
do
{
straight();
if(ir()==1)
break;
80
cm=ultrasonicRead(cm);
delay(10);
}
while(cm<50);
contor=0;
do
{
straight();
contor++;
delay(20);
if(ir()==1)
{
straight();
delay(150);
turnRight();
delay(250);
break;
}
}
while(contor<=40);
contor=0;
do
{
turnLeft();
contor++;
delay(20);
if(ir()==1)
{
straight();
delay(150);
81
turnRight();
delay(250);
break;
}
}
while(contor<=25);
do
{
straight();
if(ir()==1)
{
straight();
delay(150);
turnRight();
delay(250);
break;
}
cm=ultrasonicRead(cm);
delay(10);
}
while(cm>15);
contor=0;
do
{
straight();
contor++;
delay(20);
if(ir()==1)
{
straight();
82
delay(150);
turnRight();
delay(250);
break;
}
}
while(contor<=100);
}
while(sensA1<30 && sen[0]<2 && sen[1]<2 && sen[2]<2 &&
sensA2<30);
}
int ir() // functia de verificare a detectiei traseului de catre
orice senzor IR
{
qtrrc.read(sensorValues);
for (int i = 0; i < NUM_SENSORS; i++)
{
sen[i]=sensorValues[i] * 10 / 1001;
}
sensA1 = analogRead(analogInPin1);
sensA2 = analogRead(analogInPin2);
delay(5);
if(sensA1>400 || sen[0]>5 || sen[1]>5 || sen[2]>5 ||
sensA2>400)
return 1;
else
return 0;
83
}
84