Proiect Final

116
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 1

Transcript of Proiect Final

Page 1: 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

Page 2: Proiect Final

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

Page 3: Proiect Final

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

Page 4: Proiect Final

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

Page 5: Proiect Final

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

Page 6: Proiect Final

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

Page 7: Proiect Final

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

Page 8: Proiect Final

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

Page 9: Proiect Final

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

Page 10: Proiect Final

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

Page 11: Proiect Final

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

Page 12: Proiect Final

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

Page 13: Proiect Final

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

Page 14: Proiect Final

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

Page 15: Proiect Final

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

Page 16: Proiect Final

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

Page 17: Proiect Final

, (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

Page 18: Proiect Final

(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

Page 19: Proiect Final

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

Page 20: Proiect Final

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

Page 21: Proiect Final

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

Page 22: Proiect Final

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

Page 23: Proiect Final

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

Page 24: Proiect Final

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

Page 25: Proiect Final

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

Page 26: Proiect Final

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

Page 27: Proiect Final

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

Page 28: Proiect Final

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

Page 29: Proiect Final

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

Page 30: Proiect Final

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

Page 31: Proiect Final

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

Page 32: Proiect Final

- 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

Page 33: Proiect Final

- 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

Page 34: Proiect Final

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

Page 35: Proiect Final

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

Page 36: Proiect Final

Fig. 3.2: Vedere laterală a robotului

36

Page 37: Proiect Final

3.3 Realizarea structurii electrice și de control a robotului

Fig. 3.3: Schema electrică și de control a robotului

37

Page 38: Proiect Final

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

Page 39: Proiect Final

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

Page 40: Proiect Final

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

Page 41: Proiect Final

- 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

Page 42: Proiect Final

- 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

Page 43: Proiect Final

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

Page 44: Proiect Final

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

Page 45: Proiect Final

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

Page 46: Proiect Final

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

Page 47: Proiect Final

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

Page 48: Proiect Final

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

Page 49: Proiect Final

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

Page 50: Proiect Final

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

Page 51: Proiect Final

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

Page 52: Proiect Final

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

Page 53: Proiect Final

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

Page 54: Proiect Final

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

Page 55: Proiect Final

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

Page 56: Proiect Final

- 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

Page 57: Proiect Final

//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

Page 58: Proiect Final

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

Page 59: Proiect Final

- î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

Page 60: Proiect Final

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

Page 61: Proiect Final

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

Page 62: Proiect Final

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

Page 63: Proiect Final

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

Page 64: Proiect Final

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

Page 65: Proiect Final

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

Page 66: Proiect Final

// 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

Page 67: Proiect Final

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

Page 68: Proiect Final

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

Page 69: Proiect Final

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

Page 70: Proiect Final

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

Page 71: Proiect Final

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

Page 72: Proiect Final

}

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

Page 73: Proiect Final

}

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

Page 74: Proiect Final

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

Page 75: Proiect Final

{

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

Page 76: Proiect Final

}

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

Page 77: Proiect Final

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

Page 78: Proiect Final

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

Page 79: Proiect Final

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

Page 80: Proiect Final

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

Page 81: Proiect Final

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

Page 82: Proiect Final

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

Page 83: Proiect Final

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

Page 84: Proiect Final

}

84