Robot mobil care evită obstacole Cimpoaca Elena-Denisa COORDONATOR ȘTIINȚIFIC S.l.dr.ing. Resceanu Ionut Iulie 2018 CRAIOVA „Învățătura este o… [310790]

[anonimizat]

S.L.dr.ing. Resceanu Ionut

Iulie 2018

[anonimizat]

S.l.dr.ing. Resceanu Ionut

Iulie 2018

CRAIOVA

„Învățătura este o comoară care își urmează stăpânul pretutindeni.”

[anonimizat], [anonimizat] a [anonimizat], [anonimizat]:

[anonimizat] S.l.dr.ing. Resceanu Ionut

prezentată în sesiunea Iulie 2018.

[anonimizat]:

reproducerea exactă a [anonimizat]-o [anonimizat]-o [anonimizat],

[anonimizat], [anonimizat] a unor aplicații realizate de alți autori fără menționarea corectă a [anonimizat] a [anonimizat].

Pentru evitarea acestor situații neplăcute se recomandă:

plasarea între ghilimele a citatelor directe și indicarea referinței într-o [anonimizat] a [anonimizat] a sursei originale de la care s-a [anonimizat] s-[anonimizat], figuri, imagini, statistici, [anonimizat], a căror paternitate este unanim cunoscută și acceptată.

Data, Semnătura candidat: [anonimizat],

PROIECTUL DE DIPLOMĂ

REFERATUL CONDUCĂTORULUI ȘTIINȚIFIC

În urma analizei lucrării candidat: [anonimizat]:

[anonimizat]:

Data, [anonimizat] a crea un robot mobil autonom care are capacitatea de a evita obstacolele. Acest robot este gandit pentru a fi utilizat în aplicații precum: [anonimizat]; jucării inteligente; sisteme de deplasare pentru persoanele cu handicap locomotor. [anonimizat], cât și mediul exterior.

Ei sunt dotați cu: motoare, care le permit deplasarea în spațiu; senzori, care preiau informația și o [anonimizat] a [anonimizat] o mișcare de evitare a obstacolului.

Motivația

Motivul alegerii acestei teme a fost sa ofer o [anonimizat] a crește siguranța mediului de lucru și de a ușura munca lucrătorilor.

[anonimizat]ate și să fie destul de inteligent pentru a explora și negocia obstacolele în modul cel mai eficient.

Evitarea obstacolelor reprezinta detecția obstacolelor și oprirea sau schimbarea direcției de deplasare a roboților mobili, cu scopul de a evita accidente.

Rezumatul

În lucrarea ,,Robot mobil autonom care evită obstacolele” care vă este prezentată, am creat un robot mobil, care cu ajutorul motoarelor și a informației provenite de la senzor, acesta fiind miscat si cu ajutorul servomotorului,se poate deplasa și evita diverse obstacole pe care le întalnește pe parcursul deplasării.

Lucrarea este structurată astfel:

Capitolul 1. Scopul și motivația lucrării pe care am ales-o.

Capitolul 2. Istoria roboticii, clasificarea robotilor, descrierea roboților mobili, clasificarea roboților mobili.

Capitolul 3. Prezentarea componentelor folosite la realizarea robotului descris în proiectul de diplomă

Capitolul 4. Prezentarea aplicației, detalierea schemelelor electrice, funcționarea programului

Capitolul 5. Concluzii

Istoric în domeniul roboticii

Termenul de Robot și „Legile Roboticii” scrise de Isaac Asimov

Scriitorul rus evreu american Isaac Asimov definește în literatura științifico-fantastică (SF) prin anii 1950 cele trei legi aplicabile roboților și mașinilor „inteligente”, un concept revoluționar la acea vreme. O mare parte din creația literară a lui Asimov este construită în jurul acestor trei legi, pe care autorul le-a creat pentru a recomanda parametri clari ai funcționării roboților, în scopul de a preveni scăparea acestora de sub controlul omului.

Cele 3 legi aplicabile roboților sunt

Legea 1 Un robot nu are voie să pricinuiască vreun rău unei ființe umane, sau, prin neintervenție, să permită ca unei ființe omenești să i se facă un rău.

Legea 2 Un robot trebuie să se supună ordinelor date de către o ființă umană, atât timp cât ele nu intră în contradicție cu Legea 1.

Legea 3 Un robot trebuie să-și protejeze propria existență, atât timp cât acest lucru nu intră în contradicție cu Legea 1 sau Legea 2.[1]

Ce înseamnă Robotica

Robotica este știința care se ocupă cu tehnologia, proiectarea și fabricarea roboților. Robotica necesită cunoștințe de electronică, mecanică și programare, iar persoana care lucrează în acest domeniu a ajuns să fie cunoscută ca robotician. Denumirea de robot a fost introdusa pentru prima oara de către Karel Čapek în anul 1921 în lucrarea sa "Roboții universali ai lui Rossum", în 1921 plecând de la cuvântul ROBOTA, munca, activitate de rutina, preluat de către Isaac Asimov, în povestirea științifico-fantastică "Fuga în cerc" (1941). Robotii sunt mecanisme care merg singure.[2]

Un robot este un operator mecanic sau virtual, artificial. Robotul este un sistem compus din mai multe elemente: mecanică, senzori și actuatori precum și un mecanism de direcționare. Mecanica stabilește înfățișarea robotului și mișcările posibile pe timp de funcționare. Senzorii și actorii sunt întrebuințați la interacția cu mediul sistemului. Mecanismul de direcționare are grijă ca robotul să-și îndeplinească obiectivul cu succes, evaluând de exemplu informațiile senzorilor. Acest mecanism reglează motoarele și planifică mișcările care trebuiesc efectuate. Roboții cu formă umană sunt numiți androizi. Tot „robot”, prescurtat „bot”, pot fi numite programe (software) de calculator care îndeplinesc automat anumite funcții sau operațiuni. Astfel de roboți sunt virtuali, și nu mecanici.[3]

Câteva invenții care au revoluționat Robotica

În 1495, Leonardo Da Vinci a creat un robot umanoid care era îmbrăcat in armură și putea face diverse mișcări.

În 1533, Johannes Müller von Königsberg a creat un vultur și o muscă din fier care puteau zbura.

În 1880, japonezul Hisashige Tanaka a creat o serie de jucării mecanice, care puteau servii ceaiul, trage cu arcul scoțând sagețile din tolba cu săgeți.

În 1950, Alan Turing a creat o mașinărie computerizată și inteligentă, a propus un test să vadă dacă mașinăria este capabilă sau nu să gândească singură.

În anii 1960, John McCarthz a creat robotul mobil Shakey, care era capabil să cunoască și să reacționeze singur.

În 1969, Victor Sheinman a creat Brațul Stanford, care influnețează și în zilele noastre brațele robotice folosite în industrie.

În 1970, Universitatea Stanford a creat Mașina Stanford, care era line follower (urmărea linii) dar putea fi manipula de un calculator prin unde radio.

În 1974, Victor Sheinman și-a creat propia companie unde a creat Brațul Argintiu care putea asambla piese mici cu ajutorul senzorilor de atingere.

În 1978 a apărut robotul cu 4 axe mumit SCARA și era cel mai ales deoarece putea muta diverse obiecte.

În 1989, MIT a creat un robot mobil hexapod, care era compus din 4 microprocesoare, 22 de senzori și 12 servo motoare.

În 1997, misiunea PATHFINDER a ataerizat pe Marte, trimițând un robot mobil pe nume Sojourner care studia suprafața planetei.

În 1999, Sonz au creat câinele AIBO care putea interacționa cu oamenii, dupa care au creat Roboți visători umanoizi care aveau ca scop sa amuze oamenii.

În 2005, Honda au prezentat un robot pe nume ASIMO (o versiune mai nouă decât cel din 2000) care putea vorbii cu oamenii, merge, alerga, interacționa cu obiectele din jur.[4]

Clasificarea roboților

Federația Internațională de Robotică (IFR), în conformitate cu ISO 8373 [WIR 98], a stabilit în anul 1997 clasificarea după structura constructivă a roboților pe următoarele 6 categorii de roboți:

1.      Roboți cartezieni și roboți portali (figura 1.a), sunt roboții al căror mecanism generator de traiectorie are 3 cuple motoare de translație, având direcția de mișcare paralelă cu cea a axelor sistemului cartezian de referință;

2.      Roboți cilindrici, (figura 1.b), sunt roboții al căror mecanism generator de traiectorie are două cuple motoare de translație și una de rotație și a căror axe formează un sistem de coordonate cilindric.

3.      Roboți sferici (figura 1.c), sunt roboții al căror mecanism generator de traiectorie are două cuple motoare de rotație și una de translație și a căror axe formează un sistem de coordonate sferic.

4.      Roboți tip SCARA (Selector Complains Arm for Robotics Assemble) (figura 1.d), sunt roboții al căror mecanism generator de traiectorie are 2 cuple motoare de rotație cu axele paralele în plan vertical, iar a treia cuplă motoare este de translație pe o direcție paralelă cu cea a axele cuplelor motoare de rotație.

5.      Roboți articulați (antropomorfi) (figura 1.e), sunt roboții al căror mecanism generator de traiectorie este compus din 3 cuple motoare de rotație, două având axele paralele în plan orizontal, iar a treia axă fiind perpendiculară pe direcția primelor două.

6.      Roboți paraleli (figura 1.f), sunt roboții care au dispozitivul de ghidare format din 3-6 cuple motoare de translație sau de rotație a căror axe sunt concurente într-un punct.[5]

Fig. 1

Funcțiile robotului sunt:

– creșterea productivității muncii în procesele de fabricație;

– adecvarea omului la mediul în care el operează.

Creșterea productivității muncii rezultă din creșterea vitezei și preciziei de execuție a robotului față de performanțele omului. De asemenea robotul va executa în același ritm pe durata întregii perioade de lucru activități repetitive, monotone și plictisitoare.

Adecvarea omului la mediul de lucru conduce la creșterea eficienței interacțiunii sale cu mediul. Influența nocivă sau ostilitatea mediului asupra omului se datorează:

–    solicitărilor de ordin fizic la care este supus omul în realizarea interacțiunii cu mediul;

–    solicitărilor de ordin psihic ale omul în realizarea unor activităti repetitive;

–    perturbațiilor la care este supus omul din partea mediului (căldura /frig, zgomot /vibrații, lumina /întuneric etc.).

–    desfășurării activității în medii inaccesibile omului (radioactiv, extraterestru, subacvatic, agresiv chimic etc.).

Sub denumirea de robot se reunesc mai multe echipamente cum ar fii: manipulatore, instalații de teleoperare, proteze /orteze, manipulatoare medicale, exoschelete amplificatoare, robocare, mașini pășitoare, mașini târâtoare etc.

În cadrul proceselor de fabricație există operații continue și operații discontinue.

Operațiile de prelucrare prin așchiere se încadrează în categoria operațiilor continue, deoarece se desfășoară în anumite condiții impuse. Automatizarea acestora a fost adoptată prioritar întru-cât prin reducerea timpilor de mașină aveau un impact direct asupra creșterii productivității muncii.

Operațiile de sudare și vopsire au întârziat în cadrul procesului de automatizare deoarece aceste operații se desfășoară prin acțiunea directă a unui operator uman.

Operațiile de manipulare (transfer scurt) se încadrează în categoria operațiilor discontinue. Astfel operatorul uman prinde obiectul de manipulat cu mana, îl deplasează în situarea dorită prin acțiunea brațului său, sub supravegherea ochilor săi și prin coordonarea întregii acțiuni de către creierul său.[5]

Roboții mobili

Prin comparație cu roboții convenționali, roboții mobili propriu-ziși ocupă în prezent un loc relativ modest, ceea ce se explică în primul rând prin faptul că mediul industrial a folosit cu precădere până acum soluțiile tradiționale pentru rezolvarea sarcinilor specific transferului de materiale. Interesul pentru roboții mobili a fost însă recent și foarte intens stimulat, atât de noile cerințe ale industriei în privința flexibilității, cât și de o gamă nouă de aplicații solicitate în domeniul serviciilor, al divertismentului și al educației. De altfel , serviciile reprezintă cea mai recentă clasă de aplicații pentru robotică introdusă în

Nomenclatoru IFR (International Federation of Robotics).[6]

Cronologic, primele cercetări temeinice și avansate asupra roboților mobili

cu sustentație prin roți s-au realizat în SUA înca din anul 1975. Dintre cele mai semnificative proiecte amintite în literatura de specialitate pot fi citate: SHAKEY – Stanford Research Institute, JASON- Berkeley University, ROVER- Jet Propulsion Laboratory. Ulterior, proiecte similare au fost abordate in Japonia (YAMABIKO) și în Franța (HILARE, VESA, MITHRA). Marea majoritate a acestor proiecte au vizat în primul rând testarea unor soluții constructive idei de proiectare, strategii de navigație sau componente electronice și electromecanice specifice, iar aspectul comercial imediat a fost urmărit numai în subsidiar.[6]

Robotul mobil este în general un dispozitiv mecatronic complex, care asigură un anumit grad de autonomie ce permite navigația în scenele de operare naturale sau preparate aprioric, fiind capabil să execute o clasă de sarcini utile pe parcursul dcplasării sale. Din acest punct de vedere există o gamă foarte largă de configurații mecatronice ce pot fi incadrate în această clasă:

– Un vehicul cu roți este considerat robot mobil numai dacă dispune de unanumit grad de autonomic în navigație.Roboții manipulatori convenționali, specifici aplicațiilor industriale, pot

dobândi mobilitate prin instalarea lor pe o platformă mobilă.

Roboții mobili special proiectați pentru anumite aplicații, al căror sistem de

locomoție utilizează: șenile, structuri pășitoare, structuri șerpuitoare sau

alte soluții constructive neconvenționale.[6]

Fig. 2 Robotul Shakey

Construcția și exploatarea roboților mobili menține practic în actualitate toate problemele generale ale roboților convenționali: mecanica versatilă și fiabilă, sisteme de acționare performante, sisteme senzoriale capabile să controleze cu precizie și rapiditate o gamă foarte largă de parametrii, sisteme de conducere cu funcționare adaptivă în timp real, precizie și repetabilitate în realizarea secvențelor de mișcare, etc.[6]

În același timp, se cer rezolvate o serie de probleme noi, a căror complexitate este direct proporțională cu gradul de autonomie ce se dorește obținut: cunoașterea scenei de operare și reactualizarea sa dinamică pe parcursul navigației, determinarea unei traiectorii optime din punct de vedere al sarcinii curente și al interacțiunii cu scena de operare, localizarea permanentă a robotului în scena sa de operare, tratarea în timp real a unui volum mare de informații diverse de natură interoceptivă și exteroceptivă, asigurarea independenței energetice pe durata funcționării, coordonarea în timp real cu celelalte sisteme conexe în scopul realizării funcției propuse, etc.[6]

Navigația unui robot mobil în scena sa de operare nu poate fi realizată fără

cunoașterea cu precizie a localizării sale momentane în raport cu aceasta. După caz, localizarea robotului mobil pe parcursul navigației permite fie derularea strategiei inițiale, prin verificarea îndeplinirii unor condiții, fie adoptarea unor strategii noi.[6]

În funcție de rezultatele acestei proceduri. În subsidiar, localizarea este și calea uzuală prin care un robot mobil își coordonează strategia de navigație cu structura scenei de operare, cunoscută sau nu aprioric printr-un model geometric, precum și cu evenimentele ce pot apare în aceasta.

Până în prezent, complexitatea și prețul de cost relativ mare al roboților mobili au limitat răspândirea lor. Cercetările inițiate au vizat adesea numai testarea unor algoritrni de inteligență artificială.[6]

În cazul general, prin localizarea momentană (sau instantanee) a unui robot mobil într-o scenă de operare se înțelege raportarea acestuia la un sistem de referintă fix, cel mai adesea atașat unui punct din scena de operare, în scopul determinării cu exactitate a două categorii de informații:

Poziția robotului mobil, poziție reflectată prin ansamblul coordonatelor punctului caracteristic al robotului în sistemul de referință universal.

Orientarea robotului mobil, mărime reflectată prin valoarea unghiului dintre axa longitudinală a robotului și direcția unei axe din cadru· sistemului de

referință considerat, axa predefinită în acest scop.

Cu timpul a aparut din ce în ce mai evident, că numeroase operații repetitive, obositoare, periculoase sau chiar irealizabile de către operatorii umani pot fi preluate de roboții mobili. Se pot cita ca exemple sarcinile din mediile ostile, cu aer viciat, din centralele nucleare (supraveghere functională, manipularea combustibilului nuclear), din spațiul cosmic (explorarea planetelor), din oceane (montarea conductelor petroliere și a cablurilor telefonice, explorări geologice, recuperarea navelor scufundate), sau cele din mediul industrial și sfera serviciilor (transport, curățenie ambientală, tunderea gazonului).[6]

Localizarea unui robot mobil imbracă cel mai adesea două aspecte particulare:

Localizarea relativă, soluție prin care se identifică de obicei localizarea unui robot mobil "prin estimare pe termen scurt''. Sunt folosite dispositive ieftine și metode relativ simple, ce se bazează pe integrarea unor informații elementare de deplasare.

Localizarea absolută, procedeu care face apel la dispozitive mai costisitoare, ce materializează metode de triangulație, în diverse variante tehnologice și spectrale: ultrasonor, infraroșu, vizibil, laser, vedere artificială, GPS, etc. Sunt necesare în mod obișnuit și modificări ale scenei de operare, în care trebuie introduse diverse dispozitive auxiliare, passive sau active, cu funcție de tip baliză (reflectori, marcaje grafice, emițători sau receptori, etc.).

Fig. 3 Robot mobil ce verifică scurgeri de gaze

Domenii de utilizare a roboților mobili

Industria prelucrătoare (transportul componentelor și produselor finite, supravegherea procesului de fabricație).

Industria nucleară (supravegherea incintelor, manipularea matricialelor radioactive, întreținerea instalațiilor din centralele nucleare).

Jndustria chimică (supravegherea tehnologică, manipularea substanțelor toxice).

Industria militară (supraveghere și patrulare, Minării și deminării de terenuri sau obiective, manipularea munitiei).

Securitatea civilă (neutralizarea activităților teroriste, deminări sau montarea explozivilor, supravegherea depozitelor de explozibili).

Submarin (montarea cablurilor sau conductelor , prospecțiuni geologice , recuperarea navelor scufundate).

Industria minieră (asistență de urgență, abataje complect automate și autonome funcțional).

Lupta contra incendiilor (localizarea sursei, patrulare pentru detecția emanațiilor periculoase, stingerea incendiilor).

Agricultură (tunderea gazonului, operații asupra solului, culegerea fructelor sau legumelor).

Construcții (realizarea autonomă a lucrărilor specifice, transport de materiale).

Curățenie (Curățarea suprafețelor în mediul civil sau industrial).

Educație și divertisment (dezvoltarea aptitudinilor tehnice, jucării inteligente).

Sănătate (supraveghere în spitale, transportul medicamentelor către bolnavi).

Birotica (distribuirea corespondenței în birouri, deservirea locurilor de muncă).

Umanitar (ajutor handicapaților locomotori sau orbilor, companie copiilor sau persoanelor în etate).[6]

Fig. 4 TALON – robot mobil de detectare a minelor

Fig. 5 Robot mobil care ajută la prelucrearea vinului

Clasificarea roboților mobili

Din punct de vedere al nivelului de autonomic al unui robot mobil, se pot distinge urmatoarele soluții:

Robot mobil telecomandat permanent de un operator uman, la care operatorul comandă și controlează într-o manieră continuă toate sarcinile elementare ce urrnează a fi realizate de către robot.

Robot mobil telecornandat periodic de un operator uman, la care operatorul intervine numai pentru a asigura nivelul decizional global, robotul controlând acțiunile sale între comenzile primite de la operator.

Robot mobil autonom, ce realizează obiectivele predefinite cu ajutorul capacității decizionale proprii (sistem de ghidare, de navigație, bază de cunoștințe dinamice, etc.) într-un mediu parțial cunoscut și structural. Această clasă prezintă cel mai mare interes științific din punct de vedere al autonomiei și inteligenței artificiale îmbarcate.[6]

Autonomia și mobilitatea

Mobilitalea și autonomia în robotică sunt două noțiuni ce evoluează rapid odată cu progresul tehnic și reducerea prețului de cost al echipamentelor electronice complexe. Pentru roboții mobili, funcția de mobilitate reprezintă în cazul general capacitatea de deplasare fără ajutor extern între două poziții, sau mai precis:

Capacitatea de evoluție într-un mediu ostil (periculos, gen labirint, etc.) și pe diverse tipuri de soluri, inclusiv cele nepregătite aprioric (nisip, pietriș).

Posibilitățile existente în evitarea sau depășirea obstacolelor (obstacole naturale, scări, șanțuri, plane înclinate, etc.).

Performanțele rcalizate: viteze, accelerații, raza de acțiune, capacitate de transport, durata independenței energetice, etc.[6]

Autonomia unui robot mobil trebuie asigurată din cel puțin două puncte de vedere, după cum urmează:

Autonomia energetică. Sursa energetică, cel mai adesea un accumulator electric, este îmbarcată. Robotul poate reîncărca acumulatorul cu ajutorul uneia sau a mai multor instalații fixe prevăzute în spațiul său de operare.

Autonomia de decizie sau inteligență a robotului mobil. Variantele industriale uzuale pot fi filoghidate, optoghidate, radioghidate sau cu traiectorii memorate, și evoluează într-un mediu definit și aprioric cunoscut. Autonomia de decizie apare dacă robotul trebuie să rezolve evenimente neașteptate pe parcursul deplăsării sale. Nivelul superior de inteligență presupune capacitatea robotului de a se orienta singur într-o scenă a carei topografie este sumar cunoscută. Trebuie atunci modelat mediul, reactualizată permanent baza de cunoștințe în timpul deplasării și elaborate deciziile corespunzătoare.[6]

Bazei electromecanice a unui robot mobil ii revine deci sarcina asigurării mobilității și motricității întregii structuri în vederea exercitării sarcinilor specifice. Soluțiile globale avute în vedere la realizarea acesteia influențează esențial performanțele finale ale robotului mobil.

Deși există o multitudine de soluții concrete pentru realizarea propulsiei unui robot mobil, calea energetică asociată fiecărei acționări este în principial aceeași. Ansamblul Controler – Convertizor de putere – Element de execuție – Senzori constituie ceea ce denumim acționare inteligentă.

Pentru asigurarea locomoției unui robot mobil sunt posibile mai multe soluții ce pot fi grupate în două clase principale:

Contact direct cu solul. Această clasă include cele trei soluții constructive tradiționale: cu roți, cu șenile și cu structuri antropomorfe pășitoare sau șerpuitoare.

Fără contact direct cu solul. Această clasă include soluțiile neconvenționale:

cu pernă de aer, sustentație magnetică sau de navigație propriu-zisă, ca în cazul vehiculelor spațiale sau submersibile.[6]

Multe dintre aplicațiile industriale ale roboților mobili (și nu numai) s-au concentrat până în prezent asupra soluției cu roți, fiind de prevăzut și în viitor aceeași direcție datorită prețului de cost incomparabil mai mic raportat la specificul și funcționalitatea caracteristicii.

De altfel, prin prisma funcției de navigație, problematica este cvasi identică pentru toate structurile de roboți mobili, diferențe semnificative fiind mai ales la nivelul soluțiilor mecanice constructive.[6]

Construcția și dimensionarea roboților mobili

Arhitectura generală a unui robot mobil perrnite evidențierea a patru componente fundamentale.

Fiecare dintre acestea asigură pentru robotul mobil o clasă de sarcini curente și specifice, din a căror integrare rezultă funcționarea globală dorită precum și integrarea în aplicația curentă:

Structura mecanică: cu roți, cu șenile, pășitoare, șerpuitoare.

Sursă energetică: acumulatori sau sursă de current electric

Sistemul sensorial: senzor de lumină, sensor de proximitate, sensor de presiune, sensor de mișcare etc.

Unitatea de control și gestiunea sarcinilor.[6]

Fig. 6 ADAM, robot mobil pentru transportul materialelor

Planificarea traiectoriilor roboților mobili are în vedere un caz elementar pentru fundamentarea teoretică a planificării traiectoriilor roboților mobili, respectiv considerarea unui singur robot mobil, plasat într-o scenă de operare ce conține mai multe obstacole fixe cu poziții și orientări invariabile în timp față de scenă.

Se acceptă ipoteza că obstacolele fixe nu pot fi escaladate, ci numai ocolite. Se vor neglija în totalitate aspectele dinamice ale deplăsării robotului și parțial cele cinematice.[6]

Descrierea componentelor

Descrierea aplicației ARDUINO IDE

Arduino este o companie open-source care produce atât plăcuțe de dezvoltare bazate pe microcontrolere, cât și partea de software destinată funcționării și programării acestora.

Pe lângă acestea include și o comunitate uriașă care se ocupă cu creația și distribuirea de proiecte care au ca scop crearea de dispozitive care pot sesiza și controla diverse activități sau procese în lumea reală.

Proiectul este bazat pe designul plăcilor cu microcontroler produse de câțiva furnizori, folosind diverse tipuri de microcontrolere.

Aceste plăci pun la dispoziția utilizatorului pini I/O, digitali și analogici, care pot fi interfațați cu o gamă largă de plăcuțe numite scuturi (shield-uri) și/sau cu alte circuite.

Plăcile au interfețe de comunicații seriale, inclusiv USB pe unele modele, pentru a încărca programe din calculatorele personale. Pentru programarea microcontrolerelor, Arduino vine cu un mediu de dezvoltare integrat (IDE) bazat pe proiectul Processing, care include suport pentru limbaje de programare ca C și C++.

Primul Arduino a fost lansat în 2005, având ca țintă asigurarea unei soluții ieftine și simple pentru începători și profesioniști spre a crea dispozitive capabile să interacționeze cu mediul, folosind senzori și sisteme de acționare. Cele mai comune exemple sunt dispozitivele pentru utilizatorii începători precum: roboții simpli, termostatele și/sau detectoarele de mișcare.

Plăcuțele Arduino sunt disponibile comercial sub formă preasamblată sau sub forma unor kituri de asamblat acasă (do-it-yourself). Specificațiile schemelor sunt disponibile pentru orice utilizator, permițând oricui să fabrice plăcuțe Arduino. Adafruit Industries estimase la mijlocul anului 2011 că peste 300.000 de plăcuțe oficiale Arduino au fost produse, iar în 2013 700.000 de plăcuțe oficiale erau în posesia utilizatorilor.

Arduino a început în 2005 ca un proiect al unui student al Institutului de Interacțiune a Designului din Ivrea, Italia. La acea vreme studenții foloseau o plăcuță de dezvoltare BASIC Stamp care costau 100 de dolari, ceea ce era considerat foarte scump pentru studenți.[7]

Massimo Banzi, unul dintre fondatori, era student la Ivrea. Numele "Arduino" provine de la un bar din Ivrea, locul unde o parte din fondatori obișnuiau să se întâlnească.

Studentul columbian Hernando Barragán a creat platforma de dezvoltare Wiring care a servit ca bază pentru Arduino. După finalizarea platformei Wiring, mai multe versiuni, mai light și mai ieftine, au fost create și puse la dispoziția comunităților open-source. Din echipa inițială Arduino au făcut parte Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino și David Mellis.

Programele Arduino pot fi scrise în orice limbaj de programare cu un compilator capabil să producă un cod mașină binar. Atmel oferă un mediu de dezvoltare pentru microcontrolerele sale, AVR Studio și mai nou, Atmel Studio.

Proiectul Arduino oferă un mediu integrat de dezvoltare (IDE), care este o aplicație cross-platform, scrisă în Java.

Acesta își are originile în mediul de dezvoltare pentru limbajul de programare Processing și în proiectul Wiring. Este proiectat pentru a introduce programarea în lumea artiștilor și a celor nefamiliarizați cu dezvoltarea software.

Include un editor de cod cu funcții ca evidențierea sintaxelor, potrivirea acoladelor și spațierea automată și oferă mecanisme simple cu un singur click, pentru a compila și a încărca programele în plăcuța Arduino. Un program scris în IDE pentru Arduino se numește sketch.[7]

Arduino IDE suportă limbajele de programare C și C++ folosind reguli speciale de organizare a codului. Arduino IDE oferă o librărie software numită Wiring, din proiectul Wiring, care oferă multe proceduri comune de intrare și ieșire. Un sketch tipic Arduino scris în C/C++ este compus din două funcții care sunt compilate și legate cu un ciot de program main(), într-un program executabil cu o execuție ciclică:

setup(): o funcție care este rulată o singură dată la începutul programului, când se inițializează setările.

loop(): o funcție apelată în mod repetat până la oprirea alimentării cu energie a plăcuței.

După compilarea și legarea cu GNU toolchain inclus, de asemenea, în IDE, mediul de dezvoltare Arduino trimite comandă către programul avrdude pentru a converti codul executabil într-un fișier text codat hexazecimal, care poate fi încărcat în placa Arduino de un program de încărcare.[7]

Fig.7 Interfață Software

Componentele electronice

Arduino UNO

Arduino Uno este o placă cu microcontroler seria ATmega pe 8 biți bazată pe ATmega328 cu o frecvență de ceas tipică între 8 și 16MHz.

Platforma conține tot ceea ce este necesar pentru start-up-ul unui microcontroler; pentru start trebuie realizată conectarea la un computer cu un cablu USB si alimentarea plăcii de la un adaptor sau de la o baterie.

Arduino este furnizat cu un IDE care folosește limbajul de programare C++ și niște biblioteci ce au fost proiectate pentru ușurința în utilizare și pentru a asigura suportul celor care nu sunt programatori avansați.

În felul acesta, în câteva minute de la instalare pot fi realizate aplicații cu LED-uri care clipesc, se pot citi senzori de temperatură, se pot afișa date cu usurință pe ecrane LCD sau se pot transmite date către PC utilizând consola pentru portul serial.

Începând cu partea de sus, plăcuța are 14 pini digitali de intrare / ieșire (I/O sau input/output).

Aceștia operează la o tensiune de 5 volți și pot fi controlați cu una din funcțiile pinMode(), digitalWrite() și digitalRead().

Fiecare pin poate primii sau trimite o intensitate de maxim 40 mA și au o rezistență internă între 20-50 kOhmi (default deconectată). În afară de semnalul standard I/O, unii dintre pini mai au și alte funcții specializate:

0 (serial) RX – pin serial, utilizat în special pentru recepția (intrare – Rx) datelor seriale asincrone (asynchronous serial communication) Protocolul serial asincron este o metodă foarte răspândită în electronică pentru a trimite și recepționa date între dispozitive. Acest protocol este implementat în dispozitiv numit UART (Universal Asynchronous Receiver/Transmitter)[8]

1 (serial) TX – pin serial, utilizat pentru trimiterea datelor asincrone (ieșire – Tx). TTL vine de la transistor-transistor logic.

2 (External Interrupts) întrerupere externă. Acest pin poate fi configurat pentru a declanșa o întrerupere la o valoare mică, un front crescător sau descrescător, sau o schimbare în valoare. Vezi detalii despre posibile comenzi la attachInterrupt()

3 (External Interrupts + PWM) întrerupere externă. Identic cu pinul 2. Suplimentar, toți pinii marcați cu semnul ~ pot fi folosiți și pentru PWM (pulse with modulation)

4 (I/O) pin standard intrare/iesire

5 (PWM) poate furniza control de ieșire pe 8-bit pentru controlul PWM. Vezi detalii despre posibile comenzi la analogWrite()

6 (PWM)[8]

7 (I/O) pin standard intrare/ieșire

8 (I/O) pin standard intrare/ieșire

9 (PWM)

10 (PWM + SPI) – suportă comunicare prin interfața serială (Serial Peripheral Interface). SPI-ul are patru semnale logice specifice iar acest pin se foloseste pentru SS – Slave Select (active low; output din master). Pinii SPI pot fi controlați folosind libraria SPI.

11 (PWM + SPI) – suportă SPI, iar acest pin se folosește pentru MOSI/SIMO – Master Output, Slave Input (output din master)

12 (SPI) – suportă SPI, iar acest pin se folosește pentru MISO/SOMI – Master Input, Slave Output (output din slave)

13 (LED + SPI) – suportă SPI, iar acest pin se folosește pentru SCK/SCLK – Ceas serial (output din master). De asemenea, pe placă este încorporat un LED care este conectat la acest pin. Când pinul este setat pe valoarea HIGH este pornit, când are valoarea LOW este oprit.

14 (GND) – împământare. Aici se pune negativul.

15 (AREF) – Analog REFference pin – este utilizat pentru tensiunea de referință pentru intrările analogice. Se poate controla folosind funcția analogReference().

16 (SDA) – comunicare I2S

17 (SCL) – comunicare I2S[8]

În partea de jos, există o serie de 6 pini pentru semnal analogic, numerotați de la A0 la A5.

Fiecare din ei poate furniza o rezoluție de 10 biți (adică maxim 1024 de valori diferite). În mod implicit se măsoară de la 0 la 5 volți, deși este posibil să se schimbe limita superioară a intervalului lor folosind pinul 15 AREF și funcția analogReference(). De asemenea, și aici anumiți pini au funcții suplimentare descrise mai jos:

A0 standard analog pin

A1 standard analog pin

A2 standard analog pin

A3 standard analog pin

A4 (SDA) suportă comunicarea prin 2 fire (I2C (I-two-C) sau TWI (Two wire interface)). Acest pin este folosit pentru SDA (Serial Data) la TWI.

A5 (SCL) identic cu pinul 4, doar că acest pin este folosit pentru SCL (Serial Clock) la TWI. Pentru controlul TWI se poate folosi librăria Wire.[8]

Lângă pinii analogici arătați mai există o secțiune de pini notată POWER.

Acestia sunt ( începând de lângă pinul analog A0) :

1 Vin – intrarea pentru tensiune din sursă externă (input Voltage)

2 GND – negativul pentru tensiune din sursă externă (ground Voltage)

3 GND – negativ. Se folosește pentru piesele și componentele montate la arduino ca și masă/împământare/negativ.

4 5V – ieșire pentru piesele și componentele montate la arduino. Scoate fix 5V dacă placa este alimentată cu tensiune corectă (între 7 și 12 v)

5 3,3V – ieșire pentru piesele și senzorii care se alimentează la această tensiune. Tensiunea de ieșire este 3.3 volți și maxim 50 mA.

6 RESET – se poate seta acest pin pe LOW pentru a reseta controlerul de la Arduino. Este de obicei folosit de shield-urile care au un buton de reset și care anulează de obicei butonul de reset de pe placa Arduino.

7 5VREF – este folosit de unele shield-uri ca referință pentru a se comuta automat la tensiunea furnizată de placa arduino (5 volți sau 3.3 volți) (Input/Output Refference Voltage)

8 pin neconectat, este rezervat pentru utilizări ulterioare (la reviziile următoare ale plăcii probabil).[8]

Comunicarea cu calculatorul, altă placă arduino sau alte microcontrolere se poate realiza fie prin portul USB (și este văzut ca un port standard serial COMx), fie prin pinii 0 și 1 (RX și TX) care facilitează comunicarea serială UART TTL (5V), folosind biblioteca de funcții SoftwareSerial.[8]

Se pot face comunicații seriale folosind oricare din pinii digitali.

Pentru comunicarea I2C (TWI) este inclusă o librărie Wire. Pentru comunicarea SPI se poate folosi librăria SPI.[8]

Placa mai are o serie de pini marcați ICSP (In-Circuit Serial Programming). Acești pini pot fi folosiți pentru reprogramarea microcontrolerului, sau ca pini de expansiune cu alte microcontrolere compatibile.

Sunt conectați standard și se poate folosi un cablu de 6 fire (MOSI, MISO, SCK, VCC, GND, și pinul RESET).[8]

Fig. 8 Plăcuța de dezvoltare Arduino UNO

Arduino este un instrument prin care se pot realiza sisteme informatice capabile să ‘perceapă’ și să ‘controleze’ lumea înconjurătoare . Acest instrument este open-source și este compus dintr-un mediu de dezvoltare (o varianta de Wiring – platforma folosită pentru procesare multimedia) și o placă de dezvoltare cu microcontroler AVR.

Arduino poate fi folosit pentru dezvoltarea de obiecte interactive. Informația este preluată de la o gamă variată de senzori și comutatoare, se procesează în interiorul microcontrolerului AVR, și este transmisă către o gamă la fel de variată de lumini, motoare, actuatoare etc.

Pe piață există o gamă foarte variată de sisteme de dezvoltare bazate pe microcontroler, avantajele pe ncare le are Arduino față de aceste sisteme sunt:
-Costuri de achiziție reduse

-Poate fi folosit pe orice sistem de operare (Linux,Windows sau MacOS). Majoritatea plăcilor de dezvoltare fiind limitate la sistemul de operare Windows.

-Un mediu de programare simplu și usor de învățat.

-Este open source, atât placa de dezvoltare cât și mediul de programare. Microcontrolerul ATmega328 are 32 KB de memorie din care 0.5 KB sunt utilizați pentru bootloader. Conține de asemena 2 KB de SRAM și 1 KB de memorie EEPROM. Fiecare din cei 14 pini digitali al lui Arduino Uno pot fi utilizați ca input sau output, utilizând funcțiunile pinMode(), digitalWrite() si digitalRead(). Pinii funcționează la 5 volți și pot furniza sau absorbi un curent de maximum 40 mA și datorită unui pull-up rezistor, care sunt deconectate by default având valoarea de 20-50 khms.

Shield controlor motoare L293D

Shieldul include două drivere de motoare de tip L293D, si este capabil sa controleze 4 motoare clasice, de dimensiuni mici, sau 2 motoare de tip servo. Acest shield are rolul de a controla 2 sau 4 motoare primind informația de la microcontroller pentru a executa mișcarea.De asemenea, shield-ul conține un shift register de tip 74HC595 pentru a fi mai ușor de controlat. Shift-ul register este un circuit integrat ce conține un registru de deplasare cu ajutorul căruia poți transforma informația transferată prin interfață serială în informație pe interfața paralelă.

Specificații:

Tensiune de alimentare circuite logice: 5V;

Tensiune de alimentare motoare: 4.5V – 36V;

Curent motoare in mod continuu: 0.6A;

Curent motoare pe peak: 1.2A;

Protectie la supracurent și la supratemperatură. Fig. 9 Shield controlor motoare L293D

L293D este un dispozitiv monolitic integrat de tensiuni înalte, are un driver de 4 canale de curenți înalți concepute să accepte standardele nivelelor logice DTL sau TTL și încărcările inductive ale ale driver-ului (cum ar fi releele solanoide, motoare de current continuu sau motoare pas cu pas).

Are un conector de intrare logică pentru alimentare separat, permițând operațiuni de tensiuni mici și în interior sunt incluse diode cleme.

Acest dispozitiv este bun la schimbarea frecvenței de până la 5kHz la aplicațiile folosite.

L293D se prezinta sub forma unei capsule de plastic cu 16 pini, din care4 pini centrali sunt conectați împreună și sunt folosiți ca și radiator, pentru a răci circuitul.

Circuitul L293D

Fig. 10 Motor cu reductor și roată

Motoare cu reductor și roți

Caracteristici tehnice:

Diametru roată: 65mm;

Reducție motor: 1:48;

Tensiune de alimentare motor: 3V – 6V DC;

Cuplu: 0.8 kg * cm;

RPM: 3V:125rpm, 5V:200rpm, 6V:230rpm;

Curent: 3V:60mA, 5V:100mA, 6V:120mA.

Aceste tipuri de motoare pot fi folosite la diferite tipuri de roboți, cum ar fi rezolvarea labirintului, urmăritor de linie sau evitarea obstacolelor.

Am ales acest tip de motor deoarece se potriveste foarte bine când doresti să creezi un robot mobil și este ideal pentru aplicația pe care am facut-o.

Aceste motoare sunt de curent continuu. Curentul continuu este o mișcare de sarcini electrice într-un singur sens printr-un mediu oarecare.

Modul senzor ultrasonic – detector distanță HC-SR04

Specificații:

Tensiune de alimentare: 5V;

Curent consumat: 15mA;

Distanță de funcționare: 2cm – 4m;

Unghiu de măsurare: 15o;

Eroare de doar 3mm;

Durată semnal input: 10us.

Dimensiuni: 45mm x 20mm x 15mm.

Senzorul ultrasonic HC-SR04 este unul dintre cei mai populari și ușor de utilizat senzori de distanță.

Este compatibil cu Arduino și prezintă câteva avantaje față de senzorii de distanță analogici: necesită doar pini I/O digitali, are imunitate mai mare la zgomot.

Acesta are o precizie de 3mm și măsoară la un unghi de 15˚. Este ușor de folosit și consumă puțină energie, principalul dezavantaj fiind distanța relativ mică de măsurare: 2-4 cm.

Senzorul este foarte ușor de folosit, având doar 4 pini: VCC și GND, care sunt folosiți pentru alimentare și doi pini digitali, utilizați pentru unda emisă (trigger) și unda recepționată (echo).

Măsurarea distanței se bazează pe diferența dintre momentul de timp la care s-a transmis trigger-ul și momentul la care acesta se detectează înapoi.

Fig. 11 Modul senzor ultrasonic – detector distanță HC-SR04

Fig.12. Baterie de 9V

Pentru sursa de alimentare, am folosit o baterie de 9V care este conectată la shield-ul motor pentru a alimenta întreg robot

mobil.

Desigur, se poate alimenta si cu ajutorul cablului cu care se transfera programul scris in plăcuța Arduino când este introdus în PC.

Fig. 13 Cablu de date

Componentele fizice

Șasiul robotului mobil este făcut din placa de cablaj, material în formă de plăci, constituit din straturi de țesături impregnate cu rășini sintetice, un material ușor, rezistent și fiabil. Mai este atașat un pexiglass pentru susținere a senzorului când este montat.

Șasiul l-am primit de la un coleg gata tăiat, pentru că nu mai avea nevoie de el și asta m-a scutit de cumpărarea sau crearea unui șasiu nou.

Textolitul este un material în formă de plăci, constituit din straturi de țesături impregnate cu rășini sintetice de tipul bachelitei, prelucrabil prin așchiere, utilizat ca material electroizolant în electrotehnică și radiotehnică, în construcția de mașini.

Fig. 14 Șasiu robot mobil

Suport polulu cu bilă din plastic

Acest suport are inclusă o carcasă ABS neagră, o bilă din plastic cu diametrul de 9.5 mm, 2 distanțiere din plastic (în care s-a folosit decât una singură), și 2 seturi de șuruburi (de care nu am avut nevoie, deoarece am folosit bandă dublă adezivă).

Rolul suportului este de a susține partea frontală a robotului mobil și pentru deplasare, atunci când apare un obstacol în cale, să-i fie ușor robotului să întoarcă.

Fig. 15 Suport Polulu cu bilă din plastic

Ustensilele pe care le-am folosit au fost : o șurubelniță pentru fixarea firelor de la motoare și acumulator pe shield, și o bandă dublă adezivă cu ajutorul căreia am fixat pe șasiu plăcuța arduino, motoarele, senzorul și bateria.

Am mai folosit pistol cu silicon pentru lipirea pe placuta a componentelor,pistol cu fludor pentru lipirea firelor.

Fig.17 Ustensilele folosite

PREZENTAREA APLICȚIEI

Schema bloc a robotului mobil

Fig. 17 Schema bloc

Arduino UNO este microcontroller-ul robotului mobil, ori blocul decizional sau pe scurt, „creierul”. Senzorul HC-SR04 este cel pe baza căruia se vor lua deciziile importante pentru ca sistemul să funcționeze cum trebuie.

Rolul motoarelor este de a pune robotul mobil în mișcare cu ajutorul shield-ului de motoare L293D, în funcție de semnalele de intrare primite de la microcontroller, acestea pot realiza înaintarea, oprirea și reluarea mișcării.

Microcontroller-ul transimte aceste operații shield-ului de motoare.

În partea din față a robotului, se află senzorul de distanță HC-SR04, care are rolul de a detecta obstacolele..

Pornirea robotului mobil se face conectând bateria la shield pentru a alimenta robotul. Pentru a nu mai funcționa, se deconectează bateria de la shield.

Protocolul de funcționare

Când conectăm bateria de 9 V la shield, robotul mobil își începe procesul de mișcare, deplasându-se oriunde in jur, dar când apare un obstacol în cale, el se ferește, schimbându-și orientarea și apoi continuându-și mișcarea dar pe o altă rută. Cu ajutorul servomotorului ,senzorul ultrasonic este miscat pentru a detecta obstacole.

Este bine dacă își face procesul pe o suprafață netedă pentru a nu perturba senzorul, deoarece pe suprafețele văluroase îl mai saltă în sus și împiedică senzorul de a detecta mai bine obstacolele pe care le întâlnește în cale.

Conectarea componentelor

Fig. 18 Conectarea senzorului HC-SR04 la Arduino(microcontroller)

Am conectat senzorul HC-SR04 la microcontroller cu ajutorul unor fire la pinii analogici de pe Arduino.

Pentru alimentare, am conectat pinul VCC al său la pinul de 5 V de pe plăcuță , iar ca circuitul să fie realizat, s-a făcut conectarea prin pinii GND(GROUND) al ambelor componente.

Pentru a primii și transmite semnalul, s-a realizat legarea pinului Trigger(TRIG) de la senzor la pinul 12 digital de pe microcontroller, iar Echo la pinul 13 digital de pe microcontroller.

Pentru că este o aplicație simplă, am folosit decât 4 pini de pe Arduino.

Fig. 19 Conectarea Shield-ului cu Arduino UNO

Shield-ul de motoare este alimentat prin pinul VCC care este conectat prin pinul de 5 V al microcontroller-ului și închiderea circuitului se face prin pinii GND ale celor 2 componente.

Rolul shield-ului , cum s-a precizat mai devreme,este de a pune în mișcare motoroașele primind informația direct de la microcontroller.

Fig.20 Motoarele si bateria conectate la shield-ul motor

Cele 2 motoare cu reductor sunt conectate la shield.

Motoarele sunt notate cu M1, respectiv M2 și sunt conectați la pinii corespunzători lor. Motorul 1 este conectat la pinii M1 iar motorul 2 la pinii M2.

Bateria de 9V, este sursa de alimentare, care se conectează la pinii M+ si GND pentru alimentarea shield-ui si a microcontroller-ului.

Fig. 21 Schema completă a robotului mobil care evită obstacolele

Când robotul mobil începe să fie alimentat, cu ajutorul shield-ului, motoarele pornesc si înaintează.

Când un obstacol apre în cale, senzorul preia informația pe care o trimite mai intâi microcontroller-ului, care începe să proceseze informația repede, și apoi o transmite shield-ului pentru a executa manevra de evitare.

Acest proces se repetă ori de câte ori robotul mobil dă peste un obstacol.

Programul de control a Robotului Mobil

C este un limbaj de programare standardizat. Este implementat pe majoritatea platformelor de calcul existente azi, și este cel mai popular limbaj de programare pentru scrierea de software de sistem.

Este apreciat pentru eficiența codului obiect generat de compilatoarele C, și pentru portabilitatea sa.

A fost dezvoltat la începutul anilor 1970 de Ken Thompson și Dennis Ritchie, care aveau nevoie de un limbaj simplu și portabil pentru scrierea nucleului sistemului de operare UNIX.

Sintaxa limbajului C a stat la baza multor limbaje create ulterior și încă populare azi: C++, Java, JavaScript, C#, D.

C este un limbaj de programare relativ minimalist ce operează în strânsă legătură cu hardware-ul, fiind cel mai apropiat de limbajul de asamblare față de majoritatea celorlalte limbaje de programare.

Cu ajutorul acesui limbaj de programare, am scris liniile de cod în Arduino IDE, cu ajutorul căruia am reușit să compilez codul și apoi transferat in microcontroller-ul Arduino UNO.

Funcționarea programului

#include <AFMotor.h>// Am apelat această funcție pentru a accesa bibliotecile care includ funcțiile de control a vitezei și sensului de rotație a motoarelo

#include <Servo.h>

#include <NewPing.h>

#define TRIG_PIN A4// Pinul A4 de pe driveul de motoare se conecteaza cu senzorul ultrasonic

#define ECHO_PIN A5// Pinul A5 de pe driveul de motoare se conecteaza cu senzorul ultrasonic

#define MAX_DISTANCE_POSSIBLE 1000// Stabileste distanta de masurare maxima utilizabila a senzorului

#define MAX_SPEED 150 // Stabileste viteza motoarelor de tractiune DC la 150/256 sau aproximativ 48% din viteza maxima pentru a reduce scurgerea energiei

#define MOTORS_CALIBRATION_OFFSET 3 //Aceasta seteaza offset pentru a permite diferentele intre cele doua motoare de current continuu

#define COLL_DIST 20// Stabileste distanta la care obstacolul pe care il evita robotul,se opreste si se inverseaza la 10 cm

#define TURN_DIST COLL_DIST+10 NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE); //Stabileste distanta la care obstacolul care evita robotul se indeparteaza de obiect(nu invers) pana la 20 cm (10 + 10)

AF_DCMotor leftMotor(4, MOTOR12_8KHZ); //Se creaza motorul din stanga,legat la pinul 4 al shield-ului,cu frecventa PWM de 8 kHz

AF_DCMotor rightMotor(3, MOTOR12_8KHZ);// Se creaza motorul din dreapta,legat la pinul 3 al shield-ului,cu frecventa PWM de 8 kHz

Servo neckControllerServoMotor;// Cream un obiect servo pemtru a putea controla servomotorul

int pos = 0;// Stabileste variabilele pentru a fi utilizate in cod

int maxDist = 0;

int maxAngle = 0;

int maxRight = 0;

int maxLeft = 0;

int maxFront = 0;

int course = 0;

int curDist = 0;

String motorSet = "";

int speedSet = 0;

//BUCLA DE CONFIGURARE

void setup()

{ neckControllerServoMotor.attach(10); Atasam servo pe pinul 10

neckControllerServoMotor.write(90); Spune servomotorului sa se pozitioneze la 90 de grade privind inainte

delay(2000); O intarziere de 2 s

checkPath(); Executa o rutina pentru a gasi cea mai buna cale pentru a incepe calatoria

motorSet = "FORWARD"; Se seteaza variabila indicator la FORWARD

neckControllerServoMotor.write(90);Ne asiguram ca servo este inca in fata

moveForward(); Rulam functia pentru a face robotul sa evite obstacolele si sa inainteze

} //–––––––––––––––––––––––––––––––––––––––––

//––––––––––––––––––––BUCLA PRINCIPALA–––––––––––––

void loop() {

checkForward(); Verificam daca in cazul in care obstacolul de evitare al robotului ar trebui sa se deplaseze inainte ,motoarele sunt setate sa avanseze ,acest lucru este necesar pentru a depasi unele probleme

checkPath(); Se seteaza senzorul ultrasonic sa scaneze pentru orice posibile obstacole

}

//––––––––––––––––––-

void checkPath() {

int curLeft = 0;

int curFront = 0;

int curRight = 0;

int curDist = 0;

neckControllerServoMotor.write(144); Se seteaza servo sa se confrunte cu partea stanga la 54 de grade fata de inainte

delay(120); Asteptam 120 de milisecunde pentru ca servo sa atinga pozitia

for(pos = 144; pos >= 36; pos-=18) Pentru a misca servomotorul (si senzorul) de la 144 de grade pana la 36 de grade la dreapta,la intervale de 18 grade.

{

neckControllerServoMotor.write(pos); //Ii spunem servomotorului sa mearga in pozitia variabilei pos

delay(90);//Asteapta 90ms pentru ca servo sa ajunga pe pozitie

checkForward();//Verifica evitarea obstacolelor,Robotul se misca in continuare

curDist = readPing();//Obtine distanta curenta la orice obiect din fata senzorului

if (curDist < COLL_DIST) { //Daca distanta curenta fata de obiect este mai mica decat distanta de coliziune

checkCourse(); // Se executa functia checkCourse

break; //Se iese din aceasta bucla

}

if (curDist < TURN_DIST) {// Daca distanta curenta este mai mica decat distanta de viraj

changePath();// Se executa functia changePath (schimba directia)

}

if (curDist > curDist) {maxAngle = pos;}

if (pos > 90 && curDist > curLeft) { curLeft = curDist;}

if (pos == 90 && curDist > curFront) {curFront = curDist;}

if (pos < 90 && curDist > curRight) {curRight = curDist;}

}

maxLeft = curLeft;

maxRight = curRight;

maxFront = curFront;

}

void setCourse() { // Se seteaza directia de deplasare pe baza unei harti de distanta foarte simple,pe ce directive are cea mi mare distanta si obiect de intoarcere spre dreapta sau spre stanga

if (maxAngle < 90)// {turnRight();} Daca unghiul maxim este mai mic decat 90 de grade masina o ia la dreapta

if (maxAngle > 90)// {turnLeft();} Daca unghiul maxim este mai mare decat 90 de grade masina o ia la stanga

maxLeft = 0;

maxRight = 0;

maxFront = 0;

}

void checkCourse() { // Este pe punctul de a lovi ceva asa ca se misca inapoi ,opreste si afla unde este ruta goala

moveBackward();

delay(500);

moveStop();

setCourse();

}

void changePath() {

if (pos < 90) {

lookLeft(); //Cand pozitia actuala a senzorului este mai mica de 90 de grade inseamna ca obiectul este pe partea dreapta,asa ca aratati pe partea stanga

}

if (pos > 90) {

lookRight();//Cand pozitia actuala a senzorului este mai mare de 90 de grade inseamna ca obiectul este pe partea stanga,asa ca aratati bine

}

}

int readPing() { //Se citeste distanta senzorului ultrasonic

delay(70);

unsigned int uS = sonar.ping();

int cm = uS/US_ROUNDTRIP_CM;

return cm;

}

void checkForward() {

if (motorSet=="FORWARD") {

leftMotor.run(FORWARD); // Ne asiguram ca motoarele merg inainte

rightMotor.run(FORWARD); }

}

void checkBackward() {

if (motorSet=="BACKWARD") { // Ne asiguram ca motoarele merg inapoi

leftMotor.run(BACKWARD);

rightMotor.run(BACKWARD);

}

}

void moveStop() {

leftMotor.run(RELEASE); //Se opresc motoarele

rightMotor.run(RELEASE);

}

void moveForward()

{ motorSet = "FORWARD";

leftMotor.run(FORWARD); //Se porneste inainte

rightMotor.run(FORWARD); //Se porneste inainte

for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) //Se reduce viteza pentru a evita descarcarea rapida a bateriilor

{ leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);

rightMotor.setSpeed(speedSet);

delay(5); }

}

void moveBackward()

{ motorSet = "BACKWARD";

leftMotor.run(BACKWARD);// Se porneste inapoi

rightMotor.run(BACKWARD); //Se porneste inapoi

for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2) // Se reduce viteza pentru a evita descarcarea rapida a bateriilor

{

leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);

rightMotor.setSpeed(speedSet);

delay(5); }

}

void turnRight(){

motorSet = "RIGHT";

leftMotor.run(FORWARD); //Se roteste motorul 1 inainte

rightMotor.run(BACKWARD);// Se roteste motorul 2 inapoi

delay(400);

motorSet = "FORWARD";

leftMotor.run(FORWARD); //Se seteaza ambele motoare inapoi spre inainte

rightMotor.run(FORWARD);

}

void turnLeft()

{ motorSet = "LEFT";

leftMotor.run(BACKWARD); //Se roteste motorul 1 inapoi

rightMotor.run(FORWARD); //Se roteste motorul 2 inainte

delay(400);

motorSet = "FORWARD";

leftMotor.run(FORWARD); //Porniti-o inainte

rightMotor.run(FORWARD); //Porniti-o inainte

}

void lookRight()

{rightMotor.run(BACKWARD);// Se seteaza motorul din dreapta ,inapoi pentru 400 ms

delay(400);

rightMotor.run(FORWARD);}

void lookLeft()

{leftMotor.run(BACKWARD); //Se seteaza motorul din stanga ,inapoi pentru 400 ms

delay(400);

leftMotor.run(FORWARD);}

Fig. 22 Proiectul final – Robot mobil care evită obstacolele

O problemă pe care am întâmpinat-o la montarea robotului, a fost conectarea inversa motoarelor, determinand învârtirea în loc a robotului, creând fără să vreau un titirez.

O altă problemă a fost cu cablul de transfer a codului care mi s-a intrerupt, fiind nevoit să schimb cu unul nou,deoarece aveam un cablu vechi de imprimanta.

Concluzii

În Capitolul 1 mi-am prezentat scopul, motivația de a realiza acest proiect de diplomă, adică ce m-a determinat să duc la bun sfârșit.

În Capitolul 2 am prezentat u nscurt istoric despre apariția roboților mobili și clasificări.

În Capitolul 3 sunt prezentate componentele pe care le-am folosit pentru crearea robotului mobil care evită obstacolele : Microcontroller Arduino UNO, Shiled de motoare L293D, Motoare cu reductor si roți, Senzorul de distanță HC-SR04 și Bateria de 9V.

În Capitolul 4 am prezentat principiul de funcționare, schema bloc al robotului, schemele electrice și apoi prezentarea programului.

Capitolul 5 este încheiat cu descrierea proiectului meu de diplomă, descris în câteva cuvinte.

BIBLIOGRAFIE

[1] https://ro.wikipedia.org/wiki/Cele_trei_legi_ale_roboticii

[2] https://ro.wikipedia.org/wiki/Robotic%C4%83

[3] https://ro.wikipedia.org/wiki/Robot

[4] http://www.robotiksistem.com/robotics_history.html

[5] http://www.scrigroup.com/tehnologie/tehnica-mecanica/Robotul-Clasificarea-robotilor12177.php

[6] Roboți mobili, Mircea Nițulescu, Sintech, 1998

[7] https://ro.wikipedia.org/wiki/Arduino

[8] http://roboromania.ro/2016/11/15/descrierea-pinilor-la-placa-arduino-uno-r3/

[9] https://microcontrolere.wordpress.com/2016/08/10/arduino-uno/

[10] http://roboromania.ro/2016/11/15/descrierea-pinilor-la-placa-arduino-uno-r3/

[11] http://www.roroid.ro/prima-lectie/

[12] https://ro.wikipedia.org/wiki/C_(limbaj_de_programare)

[13] http://www.yourduino.com/sunshop/index.php?l=product_detail&p=292(L293D)

Referințe WEB

https://ardushop.ro/ro/

https://ardushop.ro/ro/electronice/133-shield-controlor-motoare-l293d.html

https://ardushop.ro/ro/home/64-motor-dc-3v-6v-cu-reductor-148.html?search_query=Motor+cu+reductor+si+roata&results=26

https://ardushop.ro/ro/home/63-riata-roboti-cauciuc-65mm-diametru.html?search_query=Motor+cu+reductor+si+roata&results=26

https://ardushop.ro/ro/home/47-modul-senzor-ultrasonic-detector-distanta.html?search_query=Senzor+ultrasonic+HC-SR04&results=39

https://www.arduino.cc/en/Main/Software

http://fritzing.org/home/

CODUL SURSĂ

#include <AFMotor.h>

#include <Servo.h>

#include <NewPing.h>

#define TRIG_PIN A4

#define ECHO_PIN A5

#define MAX_DISTANCE_POSSIBLE 1000

#define MAX_SPEED 150 //

#define MOTORS_CALIBRATION_OFFSET 3

#define COLL_DIST 20

#define TURN_DIST COLL_DIST+10 NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE_POSSIBLE);

AF_DCMotor leftMotor(4, MOTOR12_8KHZ);

AF_DCMotor rightMotor(3, MOTOR12_8KHZ);

Servo neckControllerServoMotor;

int pos = 0;

int maxDist = 0;

int maxAngle = 0;

int maxRight = 0;

int maxLeft = 0;

int maxFront = 0;

int course = 0;

int curDist = 0;

String motorSet = "";

int speedSet = 0;

void setup()

{ neckControllerServoMotor.attach(10);

neckControllerServoMotor.write(90);

delay(2000);

checkPath();

motorSet = "FORWARD";

neckControllerServoMotor.write(90);

moveForward();

}

void loop() {

checkForward();

checkPath();

}

void checkPath() {

int curLeft = 0;

int curFront = 0;

int curRight = 0;

int curDist = 0;

neckControllerServoMotor.write(144);

delay(120);

for(pos = 144; pos >= 36; pos-=18)

{

neckControllerServoMotor.write(pos);

delay(90);

checkForward();

curDist = readPing();

if (curDist < COLL_DIST) {

checkCourse();

break;

}

if (curDist < TURN_DIST) {

changePath();

}

if (curDist > curDist) {maxAngle = pos;}

if (pos > 90 && curDist > curLeft) { curLeft = curDist;}

if (pos == 90 && curDist > curFront) {curFront = curDist;}

if (pos < 90 && curDist > curRight) {curRight = curDist;}

}

maxLeft = curLeft;

maxRight = curRight;

maxFront = curFront;

}

void setCourse() {

if (maxAngle < 90) {turnRight();}

if (maxAngle > 90) {turnLeft();}

maxLeft = 0;

maxRight = 0;

maxFront = 0;

}

void checkCourse() {

moveBackward();

delay(500);

moveStop();

setCourse();

}

void changePath() {

if (pos < 90) {lookLeft();}

if (pos > 90) {lookRight();}

}

int readPing() {

delay(70);

unsigned int uS = sonar.ping();

int cm = uS/US_ROUNDTRIP_CM;

return cm;

}

void checkForward() {

if (motorSet=="FORWARD")

{leftMotor.run(FORWARD);

rightMotor.run(FORWARD); }

}

void checkBackward() {

if (motorSet=="BACKWARD")

{leftMotor.run(BACKWARD);

rightMotor.run(BACKWARD); }

}

void moveStop()

{leftMotor.run(RELEASE);

rightMotor.run(RELEASE);}

void moveForward()

{ motorSet = "FORWARD";

leftMotor.run(FORWARD);

rightMotor.run(FORWARD);

for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)

{ leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);

rightMotor.setSpeed(speedSet);

delay(5); }

}

void moveBackward()

{ motorSet = "BACKWARD";

leftMotor.run(BACKWARD);

rightMotor.run(BACKWARD);

for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)

{ leftMotor.setSpeed(speedSet+MOTORS_CALIBRATION_OFFSET);

rightMotor.setSpeed(speedSet);

delay(5); }

}

void turnRight()

{ motorSet = "RIGHT";

leftMotor.run(FORWARD);

rightMotor.run(BACKWARD);

delay(400);

motorSet = "FORWARD";

leftMotor.run(FORWARD);

rightMotor.run(FORWARD); }

void turnLeft()

{ motorSet = "LEFT";

leftMotor.run(BACKWARD);

rightMotor.run(FORWARD);

delay(400);

motorSet = "FORWARD";

leftMotor.run(FORWARD);

rightMotor.run(FORWARD);

}

void lookRight()

{rightMotor.run(BACKWARD);

delay(400);

rightMotor.run(FORWARD);}

void lookLeft()

{leftMotor.run(BACKWARD);

delay(400);

leftMotor.run(FORWARD);}

CD / DVD

Autorul atașează în această anexă obligatorie, versiunea electronică a aplicației, a acestei lucrări, precum și prezentarea finală a tezei.

Similar Posts