Aparitia Robotilor In Epoca Actuala
Capitolul 1. Introducere
Memoriu justificativ
Interacțiunea om-unelte-mediu, conducerea și controlul uneltelor și a surselor de energie artificiale se realizează cu ajutorul dispozitivelor automate. Apariția roboților în epoca actuală poate fi justificată și prin necesitatea adecvării omului la mediu. Adecvarea la mediu a omului intră în categoria procesului de creștere a productivități interacțiunii, prin diminuarea efortului necesar și prin creșterea cantității și calității a celor obținute de la mediu.
Dezvoltarea exponențială a sistemelor informatice cât și a microelectronicii în ultima perioada, precum și creșterea continuă a gradului de integrare a sistemelor bazate pe roboți mobili, a dus la o dezvoltare importantă a domeniului roboticii în activitătile umane, ca rezultat a dorinței omului de a progresa , de a crea lucruri noi care să-i ofere precizie, rapiditate, siguranță și randament ridicat în activitate.Astfel calitatea muncii este mult îmbunătățită, cu un numar de greșeli semnificativ mai mic, decât în cazul executării aceleiași munci de om.
Utilizarea roboților s-a impus sau este eficientă în multe domenii precum : domeniul militar (explorarea spatiilor greu accesibile si periculoase), domeniul medical (in chirurgie, diagnoza, interventii neurochirurgicale ), in agricultura, in domenii de cercetare dezvoltare sau scopuri educationale, domeniul explorarii spatiului cosmic, domeniul industrial (domeniu in care robotii au cea mai mare raspandire), domeniul serviciilor (roboții umanoizi, roboți asistenți în mediu casnic, roboți pentru divertisment și petrecerea timpului liber) si multe alte domenii.
Un robot este un sistem inteligent care interactioneaza cu mediul fizic inconjurator, el poate fi 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 actuaorii 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.
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.
Interacțiunea dintre om și robot în scopul manipulării eficiente și a evidenței anumitor informații necesare în luarea deciziilor operaționale se realizează la nivelul interfaței om-mașină.
În aceasta lucrare de licentă este propusă studierea și proiectarea unei platforme robotice care poate funcționa atât în mod manual(comenzile de directie sunt date manual) cât și mod autonom(fara comenzi de directie date manual), controlul realizandu-se de la distanță, îmbinând două domenii: interfațare om-mașină și robotică.
Platforma robotica prezentata in lucrarea de licenta este alcatuita din urmatoarele componente:
sasiu
doua motoarede curent continuu cu perii carora li s-au atasat cate un reductor astfel obtinandu-se un cuplu ridicat;
driver-ul de motoare L298 ce se utilizeaza pentru controlul motoarelor de curent continuu;
o placuta de dezvoltare arduino cu microcontroller atmel Atmega 328 ,el fiind creierul platformei robotice;
interfața grafică pentru a dispune operatorului toate informațiile necesare și pentru a-i oferi un control eficient al platformei de la distanță.
Platforma poate fi incadrata in randul robotilor exploratori,deasemenea poate fi folosita si in scopuri educationale si in cercetare dezvoltare punand in evidenta functionalitatea sitemelor inteligente si datorita formei constructiei se permite dezvoltarea ulterioara a platformei robotice.
Capitolul 2. Fundamentare teoretică
2.1 Robotul
Cuvantul robot provine din limba ceha (robota) si inseamna muncitor,sau rob.Prima data acest cuvant a aparut in anul 1921 intr-una din scenetele scriitorului Karel Capek.Tema acestei scenete era despre dezumanizarea persoanei intr-o civilizatie bazata din ce in ce mai mult pe tehnologie ,sceneta avand un enorm succes la acea vreme.
Termenul de robotica se refera la stiinta care se ocupa de studiul si utilizarea robotilor.Acest termen a fost prima data folosit de scriitorul si omul de stiinta american de origine rusa ,Isaac Asimov, intr-o surt povestioara numita “Runaround” in anul 1942, povestea fiind ulterior inclusa intr-o colectie numita “I, Robot”, care a fost publicata in anul 1950.Asimov, a propus trei “legi ale roboticii” sau mai bine zis ale existentei unui robot .Mai tarziu acesta a mai adaugat inca o lege, numita legea zero.Cu toate ca aceste legi au fost privite la inceput ca o pura fictiune, ele au fost preluate mai tarziu atat de alti scriitori de SF cat si de oameni de stiinta, ca si principii de baza pentru existent unui robot.Legile existentei unui robot sunt:
Legea 0.Un robot nu are voie sa provoace vreun rau umanitatii, sau prin inactivitate, sa permita permita vreun rau umanitatii.
Legea 1.Un robot nu are voie sa raneasca o persoana umana, sau sa permita ranirea unei persoane umane prin inactivitatea acestuia, cu e xceptia cazului cand aceasta legea contravine cu vreo lege anterioara.
Legea 2.Un robot trebuie sa respecte toate ordinele date de o persoana umana, cu exceptia aceler reguli care intra in conflict cu vreo lege anterioara.
Legea 3.Un robot trebuie sa-si protejeze propria existenta atat timp cat aceasta activitate nu intra in conflict cu legile anterioare.
Primii roboti s-au numit Unimates si au aparut in anii ’50, fiind dezvoltati de George Devol si Joe Engelberger.Acesta din urma a format Unimation si a fost primul care a vandut roboti, fiind considerat de unii ca “parintele roboticii”.
În literatura de specialitate se întâlnesc diferite definiții date roboților, începând cu cele formulate de pionierii științei roboticii, pânã la cele enunțate de diverse foruri internaționale sau naționale autorizate în domeniu.
Se prezintă câteva din aceste definiții:
Robot Institute of America, dă o definiție mai puțin restrictivă, deoarece înlocuiește noțiunea de adaptare automată cu cea de reprogramare.
– “Robotul este un manipulator reprogramabil multifuncțional destinat să deplaseze materiale, piese, scule sau aparate prin mișcări programate variabil în scopul îndeplinirii a diferite sarcini.”
British Robot Asociation , definește robotul ca un dispozitiv reprogramabil realizat pentru manipularea și transportul pieselor, sculelor sau a altor mijloace de producție, prin mișcări variabile programate pentru a îndeplini sarcini specifice de fabricație. O definiție mai scurtă și larg acceptată la ora actuală este următoarea: un robot este un sistem inteligent care interacționează cu mediul fizic înconjurător, prin intermediul unor senzori efectori.
Pentru a modela lumea încojurătoare este necesar ca un robot să adune date prin intermediul senzorilor de-a lungul unei perioade de timp. Orice tip de senzor este bineînțeles predispus la erori. Există aprecierea că și omul este un robot. Omul "interacționează" cu lumea înconjurătoare prin intermediul unor senzori și a unor efectori, reprezentate în lumea biologică de terminații nervoase respectiv mușchi. Bineînțeles, diferența cea mai semnificativă între robot și om, este că robotul a fost creat de om și nu invers.
Asa cum corpul uman are nevoie de anumite organe pentru a putea interactiona cu mediul inconjurator , precum si pentru a sustine organismul in viata, asa si orice model de robot generalizat ar trebui sa contina mai multe elemente de natura mecanica sau electrica, care sa execute diverse functii pentru ca acesta sa poata opera. O prezentare sumara a unor asemanari intre „caracteristicile ” unei persoane umane sia ale unui model de robot poate fi facuta astfel:
om- robot;
creier- microprocesor,microcontroller;
ochi- camere video,senzori de lumina, sonare;
urechi- senzori pentru sunet, senzori cu ultrasunete
gura- receptoare si transmitatoare pentru video/date/sunet;
schelet- structura mecanica;
echilibru- senzori orientare;
muschi- actuatori hidraulici/electrici/pneumatici;
mancare-sursa de curent,baterii;
membre- roti,picioare,senile;
Modul de interactiune clasic al unui robot consta din trei pasi,lineari,repetitivi:
Pasul 1. Robotul „simte” mediul inconjurator, adica primeste informatii despre mediu prin intermediul senzorilor.
Pasul 2. Robotul planifica ce sa faca in continuare , construind un model al lumii inconjuratoare, luand in considerare atat obiectivele pe termen scurt (exemplu detectare unui obstacol) cat si obiectivele pe termen lung (spre exemplu sa ajunga intr-un anumit punct stabilit din mediu).
Pasul 3. Robotul isi pune in aplicare planul prin intermediul efectorilor.
Exista atat de multe tipuri de roboti incat o enumerare a tuturor acestora ar fi aproape imposibila, astfel o clasificare oarecum rudimentara a celor mai intalnite tipuri de roboti ar putea fi :
androizi, roboti construiti ca sa imite comportamentul si infatisarea umana;
roboti statici, roboti ce sunt folositi in diverse fabrici si laboratoare ca de exemplu brate robot ;
roboti mobili, roboti care se deplaseaza intr-un anumit mediu fara interventia umana si realizeaza anumite obiective;
roboti autonomi, roboti care isi indeplinesc sarcinile fara interventia unui operator uman si isi obtin energia necesara functionarii din mediul inconjurator;
tele-roboti, roboti care sunt ghidati prin dispozitive gen telecomanda de un operator uman;
linii automate de productie in fabrici, desi nu sunt mobili sunt tot roboti deoarece se incadreaza in definitia data robotului
Un robot mobil trebuie sa se deplaseze intr-un anumit mediu, fara ajutorul unui operator uman , si sa execute anumite sarcinidate de acesta, asadar principala lui caracteristica este mobilitatea.
Robotii mobili au intrebuintari multiple, exista roboti mobili cu functii multiple, de la aspirator pentru casa la explorator spatial, de la vehicol ghidat automat folosit in industrie la robot didactic folosit doar pentru scopuri stiintifice.
Pentru a se putea deplasa in mediul ambiant, robotii mobili au nevoie de anumite componente mecanice care sa le permita o miscare precisa.Astfel exista mai multe variante de astfel de componente, printre care :
roti – probabil cele mai ieftine, simple si flexibile componente;
senile – dau aderenta marita, greutatea robotului fiind distribuita pe o suprafata mai mare;
„picioare” – robotul este sustinut de un numar de picioare, minim unul;
perne de aer sau perne magnetice.
2.2 Motoare de curent
Orice robot mobil contine un sistem sau mai multe sisteme de actionare.Prin acționare se înțelege un ansamblu de funcții tehnice prin care se realizează transformarea energiei nemecanice într-una mecanică, în vederea punerii în mișcare relativă a unor elemente. Sursele de energie nemecanică necesare unuii sistem de acționare pot fi: electrică; termică, hidraulică, diverse.
În construcția roboților și microroboților se întâlnesc următoarele tipuri de acționări:
– acționare electrică;
– acționare hidraulică;
– acționare pneumatică;
– acționare mixtă (electro-hidraulică; electro-pneumatică; pneumo-hidraulică).
In lucrarea de fata vom folosi un sistem de acționare cu motoare de curent continuu asadar vom face o scurta prezentare a acestora. Actionarea electrica este cel mai raspandit tip de actionare a robotilor industriali , datorita unor certe avantaje cum ar fi, disponibilitatea energiei electrice,simplitatea racordarii echipamentelor la retea,constructia robusta si fiabilitatea motoarelor electrice,pret accesibil,compatibilitate cu sistemul de comanda si cu senzor. Un motor electric (sau electromotor) este un dispozitiv electromecanic ce transformă energia electrică în energie mecanică. Transformarea în sens invers, a energiei mecanice în energie electrică, este realizată de un generator electric. Nu există diferențe de principiu semnificative între cele două tipuri de mașini electrice, același dispozitiv putând îndeplini ambele roluri în situații diferite.
Majoritatea motoarelor electrice funcționează pe baza forțelor electromagnetice ce acționează asupra unui conductor parcurs de curent electric aflat în câmp magnetic. Există însă și motoare electrostatice construite pe baza forței Coulomb și motoare piezoelectrice.
Motoarele electrice pot fi clasificate după tipul curentului electric ce le parcurge: motoare de curent continuu și motoare de curent alternativ. În funcție de numărul fazelor curentului cu care funcționează, motoarele electrice pot fi motoare monofazate sau motoare polifazate (cu mai multe faze).
Indiferent de tipul motorului, acesta este construit din două părți componente: stator și rotor. Statorul (inductorul) care este destinat, in general, producerii fluxului magnetic necesar functionarii masinii electrice respective este partea fixă a motorului, în general exterioară, ce include carcasa, bornele de alimentare, armătura feromagnetică statorică și înfășurarea statorică. Rotorul este partea mobilă a motorului, plasată de obicei în interior. Este format dintr-un ax și o armătură rotorică ce susține înfășurarea rotorică. Între stator și rotor există o porțiune de aer numită întrefier ce permite mișcarea rotorului față de stator. Grosimea întrefierului este un indicator important al performanțelor motorului.In figura de mai jos (Figura 2.2.1) este prezentat in stanga rotorul si in dreapta rotorul.
Figura 2.2.1 Rotorul si statorul unui motor electric
Motorul de curent continuu a fost inventat în 1873 de Zénobe Gramme prin conectarea unui generator de curent continuu la un generator asemănător. Astfel, a putut observa că mașina se rotește, realizând conversia energiei electrice absorbite de la generator. Astfel el a constatat, că generatorul "inițial" era de fapt o mașină electrică reversibilă, care putea lucra ca un convertizor de energie bidirecțional.
Motorul de curent continuu are pe stator polii magnetici și bobinele polare concentrate care creează câmpul magnetic de excitație. Pe axul motorului este situat un colector ce schimbă sensul curentului prin înfășurarea rotorică astfel încât câmpul magnetic de excitație să exercite în permanență o forță față de rotor.
În funcție de modul de conectare a înfășurării de excitație motoarele de curent continuu pot fi clasificate în:
motor cu excitație independentă – unde înfășurarea statorică și înfășurarea rotorică sunt conectate la două surse separate de tensiune;
motor cu excitație paralelă – unde înfășurarea statorică și înfășurarea rotorică sunt legate în paralel la aceași sursă de tensiune;
motor cu excitație serie – unde înfășurarea statorică și înfășurarea rotorică sunt legate în serie;
motor cu excitație mixtă – unde înfășurarea statorică este divizată în două înfășurări, una conectată în paralel și una conectată în serie.
Înfășurarea rotorică parcursă de curent va avea una sau mai multe perechi de poli magnetici echivalenți. Rotorul se deplasează în câmpul magnetic de excitație până când polii rotorici se aliniază în dreptul polilor statorici opuși. În același moment, colectorul schimbă sensul curenților rotorici astfel încât polaritatea rotorului se inversează și rotorul va continua deplasarea până la următoarea aliniere a polilor magnetici.Pentru acționări electrice de puteri mici și medii, sau pentru acționări ce nu necesită câmp magnetic de excitație variabil, în locul înfășurărilor statorice se folosesc magneți permanenți.
Turația motorului este proporțională cu tensiunea aplicată înfășurării rotorice și invers proporțională cu câmpul magnetic de excitație. Turația se reglează prin varierea tensiunii aplicată motorului până la valoarea nominală a tensiunii, iar turații mai mari se obțin prin slăbirea câmpului de excitație. Ambele metode vizează o tensiune variabilă ce poate fi obținută folosind un generator de curent continuu, prin înserierea unor rezistoare în circuit sau cu ajutorul electronicii de putere (redresoare comandate, choppere).
Cuplul dezvoltat de motor este direct proporțional cu curentul electric prin rotor și cu câmpul magnetic de excitație. Reglarea turației prin slăbire de câmp se face, așadar, cu diminuare a cuplului dezvoltat de motor. La motoarele serie același curent străbate înfășurarea de excitație și înfășurarea rotorică. Din această considerație se pot deduce două caracteristici ale motoarelor serie: pentru încărcări reduse ale motorului, cuplul acestuia depinde de pătratul curentului electric absorbit; motorul nu trebuie lăsat să funcționeze în gol pentru că în acest caz valoarea intensității curentului electric absorbit este foarte redusă și implicit câmpul de excitație este redus, ceea ce duce la ambalarea mașinii până la autodistrugere. Motoarele de curent continuu cu excitație serie se folosesc în tracțiunea electrică urbană și feroviară (tramvaie, locomotive).
Schimbarea sensului de rotație se face fie prin schimbarea polarității tensiunii de alimentare, fie prin schimbarea sensului câmpului magnetic de excitație. La motorul serie, prin schimbarea polarității tensiunii de alimentare se realizează schimbarea sensului ambelor mărimi și sensul de rotație rămâne neschimbat. Așadar, motorul serie poate fi folosit și la tensiune alternativă, unde polaritatea tensiunii se inversează o dată în decursul unei perioade. Un astfel de motor se numește motor universal și se folosește în aplicații casnice de puteri mici și viteze mari de rotație (aspirator, mixer).
În funcție de construcție și sistemul de control, motoarele de curent continuu se împart în
motoare cu perii colectoare și motoare fără perii colectoare.
2.2.1.Motorul de curent continuu cu perii colectoare
Motorul electric de curent continuu (cu perii) este un motor electric cu comutație internă care este alimentat de la o sursă de curent continuu.
Motor de curent continuu bipolar – Reprezentare de principiu a motorului
Figura 2.2.2
Când înfășurarea rotorului este alimentată(Figura 2.2.2), în jurul lui se generează un câmp magnetic (poziție relativă a polilor magnetici, de la stânga spre dreapta: N-NS-S). Polul nord al rotorului e respins de polul nord al statorului spre dreapta și e atras de polul sud al statorului (din dreapta), producând un cuplu mecanic motor care întreține mișcarea de rotație.
Figura 2.2.3 Rotorul continuă rotația.
Figura 2.2.4
Când rotorul este (ajunge) în poziție orizontală (poziție relativă a polilor N-SN-S,Figura 2.2.4), colectorul electric de comutare al sensului curentului continuu inversează sensul curentului prin înfășurarea rotorului, inversând polii cîmpului magnetic produs de rotor, se ajunge astfel la poziția relativă a polilor magnetici "N-NS-S" și procesul continuă conform figurii 2.2.2 (și explicației de sub figură) .
Figura 2.2.5 Procesul se reia.
Colectoarele cu lamelele deformate, sparte sau cu perii de contact necorespunzătoare pot provoca vibrații excesive la motoarele de curent continuu cu comutație internă. Frecvența de defect va fi frecvența naturală a lamelei, care este egală cu numărul de lamele înmulțite cu turația de lucru, RPM.
Dacă vârful de la de 360 Hz din spectrul de vibrație se ridică în mod semnificativ, cauzele cele mai probabile sunt: un circuit deschis la înfășurări, precum și eventuale conexiuni electrice slăbite.
Motoarele de curent continuu cu perii pot varia din punct de vedere al numarului de poli,astfel exista motoare de curent continuu cu trei poli.
Din figura 2.2.6 se poate observa colectorul care este care este format din trei sectiuni,la motorul cu doi poli doi poli avand doua sectiuni.
Figura 2.2.6 Motor de curent continuu cu perii colectoare si trei poli.
2.3 Comanda motoarelor de curent continuu cu perii colectoare
Turatia motorului de curent continuu este influentata de tensiunea aplicata la perii si de fluxul magnetic. Motorul de c.c. se poate comanda si in impulsuri. Impulsurile se pot obtine cu o schema cu tiristoare comandate. Prin variatia factorului de umplere t1/T se obtine o anumita valoare medie a tensiunii V, deci se regleaza in acest fel turatia motorului. in functie de constantele de timp necesare pentru raspunsul motorului, impulsurile de comanda pot fi obtinute si cu tranzistoare, mai ales pentru motoarele de putere mica. Datorita tensiunii si curentului de valori foarte mici furnizate la iesirea microcontrolerelor, este nevoie de circuite de amplificare pentru actionarea motoarelor de curent continuu. O schema simpla si eficienta pentru comanda acestor motoare este reprezentata de “puntea H”.
O punte H este construita din patru intrerupatoare. Cand intrerupatorul S1 si S4 sunt inchise (si intrerupatoarele S2 si S3 sunt deschise), o tensiune pozitiva va fi aplicata motorului. Prin deschiderea intrerupatoarelor S3 si S4 si inchiderea lui S2 si S3, aceasta tensiune este inversata, facand posibila rotirea motorului in sensul opus.
Aranjarea de tip punte H este in general folosita pentru a inversa polaritatea motorului, insa poate fi folosita si pentru franarea motorului (motorul se opreste brusc datorita scurtcircuitarii terminalelor sale) sau pentru a lasa motorul sa se roteasca liber pana la oprire.
Rolul celor patru intrerupatoare il pot lua spre exemplu niste tranzistoare MOSFET, astfel prin comanda deschis/inchis a tranzistoarelor se poate varia tensiunea aplicata la bornele motorului,variinduse astfel viteza de rotatie a motorului,sensul de rotatie al motorului si starea acestuia(pornit/oprit).Cele patru tranzistoare pot fi controlate cu ajutorul a patru semnale PWM.
Comanda cu impulsuri modulate în lățime PWM (Pulse Width Modulation), este cea mai des utilizată metodă de control a turației motoarelor. Variația turației motorului se face prin cresterea sau micsorarea timpului în care semnalul de comandă are valoarea 1 logic (tON). Astfel la un factor de umplere de 100%, motorul are turația maximă, deci tON este maxim tOFF este zero. La un factor de umplere de 50 %, motorul are jumatate din turația nominala deci tON = tOFF. Iar la un factor de umplere de 0%, motorul este oprit deci tOFF este maxim iar tON este 0 (Figura 2.2.7).
Majoritatea microcontrolerelor pot genera semnale PWM. Pentru măsurarea timpului cât semnalul este în 1 logic si al timpului cât stă în 0 logic, se foloseste un Timer.
Pentru a genera un astfel de semnal numărătorul este incrementat periodic si este resetat la sfârsitul fiecărei perioade a PWM-ului. Când valoarea numărătorului este mai mare decat valoarea de referință, iesirea PWM trece din starea 1 logic in starea 0 logic (sau invers).
In figura 2.3.1 valoarea intre 0 si 255 reprezinta rezolutia timerului, acesta fiind in acest caz pe 8 biti poate numara de la 0 pana 255, astfel modificand valoarea de referinta modificam si valoare factorului de umplere.Modificand factorul de umplere se observa cum variaza tensiuna de iesire.
Figura 2.3.1
Avantajele comenzii PWM sunt:
Putere consumată și debitată, mai mică. Puterea disipată pe dispozitivele electronice de putere care lucrează în comutație este mult mai mică decât puterea disipată pe elementele de reglare serie;
Puterea consumată este cu atât mai mică cu cât dispozitivul electronic de putere care lucrează în comutație se apropie de performanțele unui comutator electric ideal;
Ca o consecință a celor de mai sus, avem randament energetic ridicat;
volum redus;
posibilitatea includerii ușoare în scheme de automatizare, care reprezintă o cerință importantă a circuitelor electronice de putere;
prin controlul factorului de umplere, circuitele de comandă PWM pot furniza tensiuni de iesire dintr-o gama mare;
tensiunile stabilizate de la ieșire sunt izolate galvanic față de tensiunea de la intrare.
În funcție de puterea cerută pe sarcină, punțile H pot fi construite din componente electronice sau se găsesc într-un singur circuit integrat. Dacă puterea cerută pe sarcină este mare, peste ordinal Amperilor, se vor folosi dispozitive semiconductoare de execuție: tranzistoare, GTO, eventual tiristoare. De cele mai multe ori aceste dispozitive nu se pot lega direct la ieșirile microcontrollerului, prin rezistențe, ci au nevoie de amplificatoare de putere.
Dacă puterea cerută pe sarcină este mică, se pot folosi circuite integrate specializate, ale căror ieșiri vor fi legate direct sau prin diverse interfețe la motor.
2.3.1Driver-ul de motoare L298N
Driver-ul de motoare L298 se utilizeaza pentru controlul motoarelor de curent continuu.Microcontrolerul este capabil sa scoata pe porturile lui o putere foarte mica, total insuficienta pentru a invarti un motor. Daca vom conecta un motor electric direct la un port al microcontrolerului, cel mai probabil vom obtine arderea procesorului din interiorul acestuia.
Ca sa nu se intample acest lucru, avem nevoie de un amplificator de putere, care sa ia putere din sursa de alimentare (baterie, de exemplu), si sa o transmita motoarelor asa cum ii spune microcontrolerul. Acest amplificator poarta numele generic de "driver de motoare". Exista o multitudine de drivere de motoare, diferenta majora intre ele fiind cat de multa putere pot conduce (cat de puternice pot fi motoarele pe care le pot controla).
Driver-ul de motoare L298 este bazat pe integratul L298, fiind un driver de nivel mediu din punct de vedere al puterii conduse. Poate controla motoare care necesita cel mult 2 amperi. Integratul L298 este format din foarte multe tranzistoare conectate in cascada. Pentru simplificare, vom considera doar patru tranzistoare, conectate ca mai jos. In schema de mai jos(Figura 2.3.2) este o punte H alcatuita din tranzistoare bipolare. Motorul este simbolizat cu M si diodele au rol de protectie. Daca aplici tensiune pe punctele A,B,C,D conform tabelului de adevar(Figura2.3.3), vei obtine cele 4 situatii. Daca nu aplici nici o tensiune pe bazele tranzistoarelor atunci motorul ramane in starea in care era inainte, adica nu se va roti. Punctele A,B,C,D se conecteaza la porturile microcontrolerului.
Figura 2.3.2
Figura 2.3.3
Figura 2.3.4 Integratul L298N
Integratul L298N din Figura 2.3.4 este o punte H completa pentru controlul a doua motoare conceputa sa accepte nivele logice TTL standard.
Figura 2.3.5 Schema interna a integratului L298N
In figura 2.3.5 este prezentata schema interna a integratului L298N, intrarile de comanda(In1,In2,In3,In4,EnA,EnB) suporta nivele logice TTL de pana la maxim 7V,pinul 4 de alimentare suporta tensiuni de pana la 46V,OUT1 si OUT2 sunt iesirile pentru un motor iar OUT3,Out4 sunt iesirile pentru al doilea motor.
2.5 Microcontrolerul
La modul general un controler este, actualmente, o structură electronică destinată controlului unui proces sau, mai general, unei interacțiuni caracteristice cu mediul exterior, fără să fie necesară intervenția operatorului uman. Initial controlerele au fost realizate în tehnologii pur analogice, folosind componente electronice discrete și/sau componente electromecanice (de exemplu relee). Cele care fac apel la tehnica numerică modernă au fost realizate inițial pe baza logicii cablate și a unei electronici analogice uneori complexe, motiv pentru care aveau dimensiuni mari, consum energetic pe măsură și, nu de puține ori, o
fiabilitate care lăsa de dorit.Apariția și utilizarea microprocesoarelor de uz general a dus la o reducere consistentă a costurilor, dimensiunilor, consumului și o îmbunătățire a fiabilității. Pe măsură ce procesul de miniaturizare a continuat, a fost posibil ca majoritatea componentelor necesare realizării unei astfel de structuri să fie integrate la nivelul unui singur microcircuit .
Figura 2.5.1 Microcontrolere
O definiție, cu un sens foarte larg de cuprindere, ar fi aceea că un microcontroler este un microcircuit care incorporează o unitate centrală (CPU) și o memorie împreună cu resurse integrate(Figura 2.5.2) care-i permit interacțiunea cu mediul exterior. Resursele integrate la nivelul microcontrolerului ar trebui să includă, cel puțin, următoarele componente:
unitate centrală (microprocesor), cu un oscilator intern pentru ceasul de sistem(un generator de tact);
o memorie locala nevolatila tip ROM/PROM/EPROM/FLASH și una volatila RAM;
o memorie de date nevolatilă de tip EEPROM;
un sistem de întreruperi;
I/O intrări/ieșiri atât seriale cât și paralele;
un port serial de tip asincron și/sau sincron, programabil;
un sistem de timere-temporizatoare/numărătoare programabile;
un sistem de conversie analog numerică(una sau mai multe intrari analogice);
un sistem de conversie numeric analogic și/sau ieșiri PWM (cu modulare în durată);
un comparator analogic;
un ceas de gardă (timer de tip watchdog);
facilități pentru optimizarea consumului propriu.
Figura 2.5.2 Arhitectura unui microcontroler
Utilizarea unui microcontroler constituie o soluție prin care se poate reduce dramatic numărul componentelor electronice precum și costul proiectării și al dezvoltării unui produs, insa oricât de evoluat ar fi microcontrolerul, nu elimină unele componente ale interfeței cu mediul exterior (atunci când ele sunt chiar necesare): subsisteme de prelucrare analogică (amplificare, redresare, filtrare, protecție-limitare), elemente pentru realizarea izolării galvanice (optocuploare, transformatoare), elemente de comutație de putere (tranzistoare de putere, relee electromecanice sau statice).
Toate aplicațiile în care se utilizează microcontrolere fac parte din categoria așa
ziselor sisteme încapsulate-integrate (“embedded systems”), printre multele domenii unde utilizarea lor este practic un standard industrial se pot menționa: în robotică și mecatronică, în industria de automobile (controlul aprinderii/motorului, climatizare, diagnoză, sisteme de alarmă, etc.)s-a ajuns sa se foloseasca in medie in jur de 100 de microcontrolere integrate într-un sistem unic prin intermediul uneia sau mai multor magistrale, în așa zisa electronică de consum (sisteme audio, televizoare, camere video și videocasetofoane, telefonie mobilă, GPS-uri, jocuri electronice, etc.), în aparatura electrocasnică (mașini de spălat, frigidere, cuptoare cu microunde, aspiratoare), în controlul mediului și climatizare (sere, locuințe, hale industriale), în industria aerospațială, în mijloacele moderne de măsurare – instrumentație (aparate de măsură, senzori și traductoare inteligente), la realizarea de periferice pentru calculatoare, în medicină.
Un prim criteriu de clasificare care se poate aplica întotdeauna este lungimea cuvântului de date. Funcție de puterea de calcul dorită și de alte caracteristici se pot alege variante având dimensiunea cuvântului de date de 4, 8,16,32 sau 64 de biți. Nu este obligatoriu ca dimensiunea cuvântului de date să fie egală cu dimensiunea unui cuvânt mașină (cuvânt program). Există și multe variante zise dedicate, neprogramabile de utilizator la nivel de cod mașină, strict specializate pe o anumită aplicație, prin intermediul codului preprogramat și al resurselor hardware, utilizate pentru comunicații, controlul tastaturilor, controlul aparaturii audio/video, prelucrarea numerică a semnalului, etc.
La ora actuala microcontrolerele se realizeaza in tehnologie CMOS, se pot realiza astfel structuri cu o mare densitate de integrare, cu un consum redus (care va depinde de frecvența de lucru), permițând eventual alimentarea de la baterie. Tehnologia este caracterizată și de o imunitate mai mare la perturbații.
Unul din elementele cele mai importante care trebuie avut în vedere în analiza oricărui sistem de calcul este arhitectura unității centrale de calcul, astfel in prima faza se deosebesc doua arhitecturi, arhitectura de tip " von Neumann " si arhitectura de tip " Harvard "’.
Arhitectura Von Neumann conține o singură zonă de memorie care cuprinde memoria de date și memoria program și o singură magistrală pentru transferul datelor din și dinspre unitatea centrală de procesare (CPU).
Figura 2.5.3
Acest lucru înseamnă că este necesară extragerea instrucțiunilor și datelor din aceeași zonă de memorie, limitând lățimea de bandă pentru că magistrala poate fi folosită la un moment dat doar pentru transmiterea datelor sau a instrucțiunilor.
În primul ciclu de clock procesorul extrage din memorie instrucțiunea care urmează a fi executată și o decodează. În următorul ciclu de clock, data este preluată din memorie. Această succesiune se repetă pentru execuția fiecărei instrucțiuni, de aici rezultă doi cicli de clock necesari pentru a finaliza execuția unei instrucțiuni. Tehnica paralelă de suprapunere în timp a execuției ciclurilor mașină (pipeline) nu se poate aplica în cazul acestei arhitecturi.
Arhitectura Harvard definește două zone de memorie diferite, una pentru instrucțiuni și cealaltă pentru date, cu magistrale separate pentru fiecare. Deoarece aceste magistrale lucrează independent, instrucțiunile și datele pot fi aduse în același timp îmbunătățind viteza față de arhitectura cu o singură magistrală.
În cazul arhitecturii Harvard, procesorul poate finaliza execuția unei instrucțiuni într-un singur ciclu de clock prin implementarea unor strategii adecvate pentru tehnica pipeline. În primul segment pipeline, instrucțiunea care urmează a fi executată este extrasă din memoria program. În al doilea segment pipeline, data este preluată din memoria de date utilizând instrucțiunea sau adresa decodată, iar în al treilea segment pipeline, se finalizează execuția unei instrucțiuni. Este important de reținut faptul că în tehnică pipeline, mai multe instrucțiuni se execută simultan, dar decalat, după cum se poate observa în următoarea figura:
Figura 2.5.4 Tehnica paralelă de suprapunere în timp a execuției ciclurilor mașină (pipeline)
Un alt aspect legat de unitatea centrala de calcul este numarul de instuctiuni cu care aceasta opereaza astfel apar arhitecturi CISC(Complex Instruction Set Computer),cu un set uzual de 80 de instructiuni diferite intre ele, pentru programatorul în limbaj de asamblare există unele avantaje prin utilizarea unei singure instrucțiuni complexe în locul mai multor instrucțiuni simple, iar al doilea tip sunt arhitecturile de tip RISC (Reduced Instruction Set Computer) la care setul de instructiuni este redus astfel acestea se pot executa foarte rapid și eficient prin implementarea unui pipeline pentru instrucțiuni.
În afară de memoria locală de tip RAM, de dimensiuni relativ, destinată memorării variabilelor,exista si memoria de program ROM care poate fi de mai multe tipuri.
Bootloader-ul apare la multe din microcontrolerele recente la care memoria de program este de tip FLASH au și facilitatea de a putea și scrie în această memorie de program fără a utiliza un circuit de programare extern, astfel în memoria microcontrolerului poate exista permanent un cod de mici dimensiuni (denumit și bootloader) care pur și simplu va încărca codul utilizator,tot el va lansa în execuție programul utilizator după încărcarea
acestuia.
Majoritatea microcontrolerelor pot fi trecute sub control soft în stări speciale cum ar
fi: în așteptare, inactiv sau oprit,in aceste moduri starea CPU, conținutul RAM-ului intern, starea I/O-urilor poate fi conservată în condițiile unei tensiuni de alimentare reduse (față de cea nominală) și deci al unui consum mult redus. De exemplu, într-un mod de tip inactiv toate activitățile sunt oprite cu excepția circuitului oscilatorului local de ceas, circuitul "watchdog", astfel puterea consumată este redusă la cca. 30%, iar ieșirea din acest mod se face prin reset sau printr-un stimul exterior (de regulă o întrerupere). Temporizatorul dedicat poate scoate periodic microcontrolerul din această stare, pentru îndeplinirea anumitor sarcini, după care se reintră în starea respectivă.
Uneori poate aparea ca o facilitate, o protecție la scăderea accidentală (în anumite limite)a tensiunii de alimentare,astfel microcontrolerul este resetat și ținut în această stare atâta timp cât condiția respectivă persistă.
Implementarea oscilatocrului care genereaza ceasul de sistem poate fi facuta prin adăugarea, în exterior, a unui rezonator extern (cuarț sau piezoceramica) pentru stabilizarea frecventei si eventual a unor capacitori. Dacă stabilitatea si precizia frecvenței nu este o cerință importantă, la anumite microcontrolere se poate utiliza doar un circuit RC extern sau există un circuit RC intern, care determină frecvența de oscilație.
Microcontrolerele au un anumit numar de intrari/iesiri organizat sub forma unor porturi I/O, conexiunile exterioare sunt bidirecționale sau unidirecționale, unele sunt multifuncționale (se oferă funcții alternative pe același pin), unele pot avea o capacitate sporită de a absorbi curent.
Convertoarele analog numerice fac parte de regulă dintr-un sistem de achiziție de date, existând și un multiplexor analogic cu mai multe canale de intrare, rezoluția disponibilă
este tipic de 8, 10 sau 12 biți. Sursa de referință utilizată este internă sau externă.
Convertoarele numeric analogice se bazeaza in special pe tehnica modulatiei in factor de umplere,astfel există unul sau mai multe canale pe care se poate genera un tren de impulsuri cu factor de umplere programabil (de la 0 la 100%). Factorul de umplere este controlat cu o rezoluție de la 8 biți sau 16 biți. Frecvența trenului de impulsuri este și ea programabilă, în limite largi.
Limbajul mașină și de cel de asamblare. Limbajul mașină (instrucțiunile mașină) este singura formă de reprezentare a informației pe care un microcontroler o "înțelege", din păcate această formă de reprezentare a informației este total nepractică pentru un programator, care va utiliza cel puțin un limbaj de asamblare, în care o instrucțiune are drept corespondent una sau mai multe instrucțiuni în limbaj mașină. Un program în limbaj de asamblare este rapid și compact, aceasta nu înseamnă că un astfel de program, prost scris, nu poate fi lent și de mari dimensiuni, programatorul având controlul total pentru execuția programului și gestiunea resurselor. Limbajul de asamblare este primul care trebuie învățat, chiar sumar, atunci când dorim să proiectăm o aplicație hard/soft cu un anume microcontroler, el permițând înțelegerea arhitecturii acestuia și utilizarea ei eficientă. Utilizarea numai a limbajului de asamblare pentru dezvoltarea unei aplicații complexe este neproductivă de multe ori, deoarece necesita un timp mai lung pentru dezvoltarea unui program, astfel se folosesc limbaje de nivel inalt datorita pretului scazut al memoriei si vitezei mare de procesare.
Un compilator combină ușurința în programare oferită de un limbaj de nivel înalt, cu o viteză mare de execuție a codului. Pentru aceasta programul,în limbaj de nivel înalt, este tradus direct în limbaj mașină sau în limbaj de asamblare (urmând a fi apoi asamblat). Codul mașină rezultat are dimensiuni relativ mari si este executat direct, ca un tot, de microcontroler.
Cel mai popular compilator este pentru limbajul C, este un limbaj puternic și flexibil, care deși este de nivel înalt, poate permite și accesul direct la resursele sistemului de calcul. Un program bine scris generează un cod rapid și compact. Totuși, de multe ori, porțiuni critice din punct de vedere al vitezei de execuție, trebuie încă scrise în limbaj de asamblare.
Pentru unele familii noi și foarte puternice de microcontrolere, datorită complexității
setului de instrucțiuni și al numeroaselor moduri de adresare, este descurajată în mod explicit
utilizarea limbajului de asamblare în momentul în care se programează aplicații performante.
Unitatea centrală a acestor noi microcontrolere a fost proiectată și optimizată pentru
utilizarea unor limbaje de nivel înalt.
Limbajul masina este obtinut din limbajul de asamblare si din limbajul de nivel inalt cu ajutorul unui mediu integrat de dezvoltare a programelor care conține în mod tipic
următoarele componente software: un editor specializat (orientat pe codul sursă), un asamblor/compilator, un editor de legături/locator ("link-editor/locator"), programe de gestiune a unor biblioteci de cod , programe de conversie a formatelor de
reprezentare a codului și un simulator și/sau depanator ("debugger").Codul astfel obținut trebuie încărcat în memoria de program a mașinii țintă unde va rula, fiind de fapt programat într-o memorie de tip (EP)ROM/FLASH sau încărcat direct într-o memorie de tip RAM.
2.5.1 Placuta de dezvoltare Arduino Uno si microcontrolerul Atmega328
Arduino Uno este o placa de dezvoltare bazata pe microcontrolerul ATmega328,ce apartine familiei de microcontrolere Atmel, asadar constructia placutei de dezvoltare este strans legata de acest microcontroler.
Figura 2.5.5 Microcontrolerul Atmega328
Microcontrolerul Atmega328 este un microcontroler ce opereaza pe 8 biti cu o viteza de pana la 20 MHz, are 28 de pini si o arhitectura RISC cu 131 de instructiuni, majoritatea executandu-se intr-un singur ciclu de ceas, tensiunea de operare este intre 1,8 si 5,5V, memoria flash este de 32 Kbytes(din care 0,5 Kbytes sunt utilizati pentru bootloader) cu un numar posibil de scrieri/stergeri de 10000, memoria EEPROM este de 1 Kbytes cu un numar de 100000 de scrieri/citiri iar memoria SRAM este de 2 Kbytes, durata de pastrare a datelor in memorie este de pana la 20 de ani la o temperatura de 85°C sau 100 de ani la o temperatura de 25°C, microcontrolerul contine doua timere/numaratoare de 8 biti si unul de 16 biti cu prescalare separata si mod de comparare, timerul de 16 biti mai contine si un mod de captura, apare si un numarator in timp real cu oscilator separat, 6 canale de PWM, 6 canale ale ADC pe 10 biti(deci ADC-ul are o rezolutie de 1024), un timer watchdog programabil, surse de intrerupere externa si interna, pin de reset, oscilator intern.
Pinii de intrare/iesire, curentii si tensiunile acestor pini, voltajul de operare, memoria sunt caracteristice ale microcontrolerului Atmega32.Astfel placuta are 14 pini digitali de intrare/iesire din care 6 pot fi folositi ca pini de iesire cu semnale PWM, 6 pini analogici de intrare, un oscilator de cuart de 16 MHz, o mufa de alimentare, o mufa ICSP si un buton de resetare.Placuta are incorporata microcontrolerul Atmega8U2 programat ca un convertor USB-serial.
Figura 2.5.6 Placuta de dezvoltare Arduino Uno
Placuta de dezvoltare poate fi alimentata prin intermediul conexiunii USB sau cu o sursa de alimentare externa, sursa de alimentare este selectata automat.Alimentarea externa (non-USB) poate veni fie de la un adaptor AC-DC sau baterie. Adaptorul poate fi conectat printr-un conector de 2.1mm cu centru-pozitiv. Conectare de la o baterie poate fi realizata legand la GND si Vin capetele de la conectorii de alimentare. Placa de dezvoltare poate opera pe o sursa externa de 6-20 volti. Daca este alimentata la mai putin de 7V, exista posibilitatea, ca pinul de 5V sa furnizeze mai putin de cinci volti si placa sa devina instabila. Daca se alementeaza cu mai mult de 12V, regulatorul de tensiune se poate supra-incalzi acest lucru ducand la deteriorarea placii. Intervalul de tensiune recomandat de catre producator este de 7-12 volti. Pinii de tensiune si alimentarea sunt dupa cum urmeaza:
pinul Vin, tensiune de intrare pe placa de dezvoltare atunci cand este utilizata o sursa de alimentare externa (spre deosebire de 5 volti de la conexiunea USB sau alte surse de energie stabilizata),se pot introduce tensiuni de alimentare prin intermediul acestui pin, sau, in cazul in care tensiunea de alimentare se face prin intermediul conectorului de alimentare externa(mufa jack de alimentare), se poate accesa prin acest pin;
Pinul 5V, regulator de tensiune utilizat pentru alimentarea microcontrolerului si a altor componente de pe placa de dezvoltare. Aceasta poate fi alimenta fie de la VIN printr-un regulator de pe placa de dezvoltare, fie furnizat de catre USB sau de o alta sursa de tensiune de 5V;
Pinul 3V3, alimentare de 3.3 volti generata de catre regulatorul de tensiune de pe placa,cu un curent maxim ce il furnizeaza, de 50 mA;
2.6 Senzori
Originea cuvantului senzor provine din cuvântul latin „sensus”, care însemnă simț și înainte de a fi adoptat pentru sisteme tehnice, a fost și este utilizat pentru a desemna capacitățile organelor de simț ale oamenilor și ale organismelor vii, de a culege și prelucra informații din mediul înconjurător și a le transmite creierului. În acest proces mărimile fizice, neelectrice, sunt convertite în semnale electrice, pe care creierul le poate prelua și interpreta, astfel modelul este preluat si implementat cu ajutorul electronicii.
Senzorul este elementul sensibil cu rol de a sesiza marimea aplicata la intrarea sa, si de a o converti (cu ajutorul unui traductor) intr-o alta marime fizica de aceiasi natura sau de natura diferita, care poate fi usor masurata, cel mai frecvent pe cale electrica. Traductorul este un dispozitiv elementar ce converteste cu o anumita precizie o marime fizica de intrare intr-o marime electrica de iesire. Traductorul in sine nu contine elemente de procesare, scopul lui este doar de a realiza conversia.
Intr-un sistem robotic, senzorii permit modulului de procesare obtinerea de informatii despre proces si mediu, altfel, sistemul nu poate functiona. De cele mai multe ori, calitatea sistemului este in cea mai mare parte dependenta de calitatea sistemului de senzori.
Varietatea sensorilor este foarte mare deoarece exista un numar considerabil de marimi de masurat, iar, pe de alta parte, pentru fiecare marime de masurat pot exista diferite metode de masura, in functie de fenomenul care sta la baza conversiei, cei mai utilizati sunt senzorii electrici.
Senzori pot fi clasificati in raport cu caracteristicile lor de intrare/iesire, astfel corespunzator marimii fizice de intrare, senzorii pot fi :
absolute: cand pentru o origine fixata, semnalul electric de iesire poate reprezenta toate valorile posibile ale semnalului de intrare;
incrementale: cand o origine nu poate fi fixata, oricare ar fi valoarea semnalului fizic de intrare, fiecare punct de masura fiind luat drept origine pentru urmatorul punct de masura.
Corespunzator semnalului de iesire senzorii pot fi:
analogici: cand semnalul de iesire este continuu si depinde liniar sau neliniar de marimea fizica de intrare;
digitali: cand, pentru o marime fizica de intrare continua semnalul de iesire poate lua un numar discret de valori.
Din punct de vedere energetic putem avea dispozitive:
active: realizarea conversiei marimii fizice de intrare in semnal electric se face fara aport de energie auxiliara (termocupluri, dispozitive fotoelectrice etc.);
pasive: realizarea conversiei marimii fizice de intrare in semnal electric se face cu aport de energie auxiliara (termorezistente, traductoare tensometrice etc.).
Principalele caracteristici statice sunt:
liniaritatea: se defineste ca “masura” in care legatura intre marimea fizica de intrare si semnalul electric de iesire poate fi exprimata printr-o functie liniara;
precizia: se defineste ca toleranta cu care o marime poate fi repetata (adica “abilitatea” dispozitivului de a da aceeasi valoare de iesire pentru aceeasi valoare de intrare);
rezolutia: se defineste ca minimul variatiei semnalului de iesire, produs ca urmare a variatiei continue a unui semnal fizic de intrare.
2.6.1 Senzor de reflexie QTR-1A
In primul rand senzorul QTR-1A este un senzor cu semnal de iesire analog, de dimensiuni mici, ce poate fi montat aproape oriunde si este foarte eficient in a detecta lumina reflectata de pe o anumita suprafata, sub forma unei tensiuni analogice.
Figura 2.6.1 Senzor de reflexie QTR-1A
Senzorul este alcatuit dintr-un led cu infrarosu si un fototranzistor conectat la o rezistenta de pull-up de 47Kohmi pentru a forma un divizor de tensiune se produce o tensiune analogica de iesire cuprinsa intre 0V si Vin(care este tipic 5V), in functie de reflexia luminii infrarosii. O tensiune de iesire mai mica indica o reflexie mai mare a luminii, acest lucru este justificat prin faptul ca rezistenta tranzistorului creste la sute de Kohmi, deoarece tranzistorul este iluminat intre baza si emitorul sau, astfel comanda blocarea tranzistorului.Acesta se deschide si implicit ii scade rezistenta atunci cand nu mai este iluminat(reflexia luminii este slaba), astfel la iesire apare o tensiune ce se apropie de Vin . In serie cu ledul este conectata o rezistenta de 220 ohmi pentru a limita curentul la circa 20 mA cand Vin este 5V.
Distanta optima de sesizare este de 3mm cu o limita de pana la 6mm.
Figura 2.6.2 Schema interna senzor de reflexie QTR-1A
2.6.2 Senzor de distanta cu ultrasunete HC-SR04
Senzorul HC-SR04 este un senzor cu ultrasunete destinat măsurării distanțelor.Acesta functioneaza pe principiul sonarului pentru a aprecia distanta pana la obiect, oferind o mare precizie a distanței măsurate: de la 2 cm până la 400 cm, cu precizie de până la 3 mm. Performantele lui nu sunt afectate de razele solare sau materialele de culoare neagra deoarece functioneaza pe principiul propagarii sunetului si receptionarii acestuia insa performanta ii poate fi afectata de absortia undelor sonore de catre materiale mai usoare( spre exemplu o perna) sau reflexia acestora de anumite suprafete.
Senzorul are patru pini dintre care 2 pentru alimentare(VCC si GND), unu pin pentru a trimite semnal (Trigger) și unul pentru a recepționa ecoul (Echo). Alimentarea senzorului se va face de la o sursa de 5 V, acesta avand un consum destul de redus de curent de circa 15mA. Unghiul de măsurare al senzorului este de 30 °.
Figura 2.6.3 Senzorul HC-SR04
Senzorul genereaza ultrasunete cu o frecvență ridicată, aproximativ 40kHz. Un ciclu de functionare este descris astfel, la început este trimis un semnal de 10μs (microsecunde), apoi senzorul va genera intern o serie de 8 impulsuri de 40 kHz. Receptorul așteaptă ecoul de 60 ms (milisecunde),dacă răspunsul este între 150μs-25ms se detectează un obstacol, dacă timpul receptionat depaseste 38ms nu se detectează nici un obstacol.
Figura 2.6.3
Distanța este calculată folosind formula L= C * T/2, unde L este distanta de masurat pana la obstacol, C este viteza sunetului în aer de 344 m/s la o temperatura ambiantă de 20 grade C, iar T este diferența de timp de la trasmiterea impulsului trigger până la recepționarea ecoului. Timpul este înjumătățit deoarece distanța este parcursă în ambele sensuri. Trebuie ținut cont că viteza sunetului este afectată de densitatea aerului, iar, densitatea este afectată în principal de temperatură și altitudine.
2.7 Comunicare serială
Transmisia digitală de date a evoluat de la conexiunea între un calculator cu echipamentele periferice, la calculatoare care comunică în rețele internaționale complexe. Cu toate că transferul paralel este mai rapid, majoritatea transmisiilor de date între calculatoare sunt făcute pe cale serială pentru a reduce costul cablului si conectorilor. Există și limitări fizice de distanță, care nu pot fi depășite de magistralele paralele. In comunicația serială, datele sunt transmise bit cu bit. Toate comunicațiile sunt caracterizate de trei elemente principale:
Date – înțelegerea lor, scheme de codificare, cantitate ;
Temporizări – sincronizarea între receptor si emițător, frecvență si fază ;
Semnale – tratarea erorilor, controlul fluxului și rutare.
Pentru ca transferul să poata avea loc este necesar un protocol de comunicație. Echipamentele care comunică prin intermediul magistralei seriale trebuie să respecte același protocol și aceiași parametri de transmisie (mod de sincronizare, lungimea setului de date, viteza de transfer).
Viteza de comunicație este măsurată în biți/s (bps) si reprezinta numarul de biti transmisi sau receptionati intr-o secunda.
Din punctul de vedere al direcției de transfer, se pot distinge următoarele tipuri de comunicație serială: simplex, semiduplex, duplex. În cazul comunicației simplex, datele sunt transferate întotdeauna în aceeași direcție, de la echipamentul transmițător la cel receptor. La comunicația semiduplex, fiecare echipament terminal de date funcționează alternativ ca transmițător, iar apoi ca receptor. Pentru acest tip de conexiune, este suficientă o singură linie de transmisie (două fire de legătură). Într-o comunicație duplex, datele se transferă simultan în ambele direcții.
Din punctul de vedere al sincronizării dintre transmițător și receptor, există două tipuri de comunicație serială: asincronă si sincronă.
La comunicatia asincrona pentru a asigura sincronizarea dintre transmițător și receptor, fiecare caracter transmis este precedat de un bit de START, cu valoarea logică 0, și este urmat de cel puțin un bit de STOP, cu valoarea logică 1. Biții de START și de STOP încadrează deci fiecare caracter transmis; caracterul transmis între acești doi biți reprezintă un cadru de date. Un asemenea cadru reprezintă informația digitală de bază într-un sistem de comunicație serială. În cazul comunicației asincrone, intervalul de timp între transmisia a două caractere succesive este variabil, pe durata acestui interval linia de comunicație fiind în starea 1 logic. Acest mod de comunicație este numit și start-stop. Sincronizarea la nivel de bit se realizează cu ajutorul semnalelor de ceas locale cu aceeași frecvență. Atunci când receptorul detectează începutul unui caracter indicat prin bitul de START, pornește un oscilator de ceas local, care permite eșantionarea corectă a biților individuali ai caracterului. Eșantionarea biților se realizează aproximativ la mijlocul intervalului corespunzător fiecărui bit. După bitul de START, având durata T corespunzătoare unui bit, transmisia caracterului începe cu bitul cel mai puțin semnificativ b0. După transmisia bitului cel mai semnificativ b7, se transmite un bit de paritate p. Bitul de paritate este opțional, iar în cazul în care se adaugă la caracterul transmis, paritatea poate fi selectată pentru a fi pară sau impară. Există și posibilitatea ca bitul de paritate să fie setat la 0 sau 1, indiferent de paritatea efectivă a caracterului. În cazul comunicației asincrone, sincronizarea la nivel de bit este asigurată numai pe durata transmisiei efective a fiecărui caracter, o asemenea comunicație este orientată pe caractere individuale.
În cazul microcontrolerelor cel mai comun standard de comunicare serială cu dispozitivele periferice utilizat este modulul USART.
Figura 2.7.1 Schema de comunicare serială
UART este o comunicare serială asinconă pentru că nu se transmite semnal de ceas prin linia de date serială. Receptorul recunoaște valorile binare individuale fără o linie comună de ceas. Interfața UART constă din două părți: un receptor (receiver – Rx) care convertește un flux serial de biți în date paralele (cuvinte) pentru microprocesor, si un transmițător (transmitter – Tx) care convertește datele paralele de la microprocesor într-un flux serial de biți, pentru transmisie. UART furnizezază și informație de stare, cum ar fi “receptorul este plin (datele au ajuns) sau transmițătorul este gol (o transmisie în curs s-a terminat).
2.7.1 Modulul bluetooth HC-06
Modulul HC-06 este un modul bluetooth de comunicare serială la distanță. Bluetooth este un set de specificații (un standard) pentru o rețea personală fără fir (wireless), bazată pe
unde radio. Tehnologia Bluetooth a aparut in anul 1994. Modul are integrat protocolul standard bluetooth V2.0 aceasta versiune este caracterizată de viteze mari de transmisie (3.2mbps ,Enhanced Data Rate), consum de energie mai mic și o rată a erorilor de transmisie mai scăzută. Lățimea benzii modulului HC-06 este de 2.4MHz, puterea de emisie fiind de 3 dBm. Acest modul poate emite la o distanță de aproximativ 10 metri. Rata de transfer poate fi setată la o valoare de 1200, 2400, 4800, 9600, 19200, 38400 bps. Inițial modulul este setat la o rată de transfer de 9600 bps. Este recomandat ca alimentarea să fie între 3.3 și 5 V, modulul necesitând un curent de lucru cuprins între 8 și 40 mA.
Figura 2.7.2 Modulul bluetooth HC-06
Modulul bluetooth HC-06 are patru pini de conexiune pinul RXD(receptorul), pinul TXD(transmitatorul), pinul VCC de alimentare si pinul GND de masa.
2.8 Interfața grafică cu utilizatorul
Interfața grafică cu utilizatorul (GUI) este o interfață cu utilizatorul bazată pe un sistem de afișaj ce utilizează elemente grafice. Interfața grafică este numit sistemul de afișaj grafic-vizual pe un ecran, situat funcțional între utilizator și un dispozitiv electronic cum ar fi computerul,telefonul. Pentru a prezenta toate informațile și acțiunile disponibile, un GUI oferă pictograme și indicatori vizuali.
Un program ce utilizeaza o interfata grafica utilizeaza de obicei un sistem de operare bazat pe ferestre. Acest program afiseaza in ferestrele de pe ecran meniuri, simboluri, suprafete de lucru si ferestre pentru aplicatii, dispozitive grafice folosite in interactiunea cu un computer, pictograme, butoane, casete de dialog etc, iar utilizatorul controleaza aceste ferestre cu ajutorul mouse-ului sau tastaturii.
Mediul LabWindows/CVI este o platformă integrată pentru dezvoltare de software, bazat pe o interfață grafică, fiind orientat spre aplicațiile de instrumentație. A fost creat în sprijinul programatorilor specializați în C. LabWindows/CVI ne pune la dispoziție un mediu interactiv de dezvoltare a unor aplicații care au toate elementele clasice Windows, îmbinând deci avantajele programării de tip vizual cu avantajele simplității și flexibilității limbajului C. Deși a fost creat special pentru aplicații de instrumentație și control, multiplele lui facilități îl fac capabil să suporte și dezvoltarea unor aplicații care să fie de altă factură. Limbajul acceptat este ANSI C cu extensii specifice.
Capitolul 3. Realizarea practica a proiectului
3.1 Partea mecanica
Pentru a se putea deplasa platforma robotica este construita intr-o configuratie cu senile care dau aderenta marita, si un echilibru mai bun greutatea robotului fiind distribuita pe o suprafata mai mare. Sasiul include o placuta de plastic cu un grilaj de 60×160 mm format din gauri de 3 mm cu spatii de 5 mm intre ele, spatiu pentru multe conexiuni mecanice. Cele doua brate unghiulare cu opt gauri pot conecta placuta la alte placute universale sau pot deservi ca punct de montare pentru un ax. Placuta include si doi suporti de arbore pentru a sustine un ax si zece suruburi si zece piulite pentru conectarea bratelor unghiulare si suportilor de arbore pe placuta. S-a ales aceasta varianta de sasiu deoarece sasiul robotului poate fi reconfigurat oricand fara nici un fel de problema si piesele mecanice pot fi puse intr-o varietate de pozitii.
Figura 3.1 Placuta suport de plastic
Astfel la aceasta placuta s-au atasat doua senile care sunt antrenate de doua roti,pe langa aceste roti motoare sau atasat senilelor doua roti mai mari si doua roti mai mici pentru ghidaj, toate aceste roti fiind prinse cu ax de placuta din plastic.
Pentru antrenarea rotilor motoare s-au montat pe partea superioara a placutei doua motoare brushed. Aceste motoare avand un cuplu scazut si o viteza mare de rotatie a fost necesara montarea unor reductoare care sunt configurate ca o singura componenta. Rotile sunt rotite independent una de alta, atat in fata cat si in spate. Angrenajele din interiorul reductoarelor pot fi configurate astfel incat reductoarele sa aiba doua rapoarte de compresie a vitezei motoraselor, un raport de compresie de 58 : 1 si altul de 203 : 1. Pentru proiectul de fata sau aranjat angrenajele astfel incat raportul de compresie a vitezei motoraselor este 203 : 1 , astfel platforma desi are o viteza mai mica are un cuplu mai bun.
Motorasele ating rotatia maxima pe minut de 12300, cu o eficienta maxima la 9710 RPM, tensiunea la bornele acestora este intre 1,5V si 3V cu un curent in sarcina de pana la 2,1A .
Figura 3.1.1 Platforma cu cele doua motoare cu reductoare
Pe aceasta placuta de plastic datorita constructiei s-a putut prinde foarte usor cu suruburi placuta de dezvoltare Arduino Uno si placuta de alimentare astfel incat sa se obtina o buna stabilitate si rezistenta la bruscari protejand placutele de o eventuala avarie sau scurt-circuit.
Figura 3.1.2 Plarforma robotica, vedere de ansamblu
3.2 Implementare hardware
3.2.1 Realizrea cablajelor
Cablajul imprimat ( PCB Printed Circuit Board) este o placă cu rolul de a susține
mecanic și de a conecta componente electrice și electronice între ele. Placa este formată dintr-un strat non-conductiv electric și un strat conductiv din cupru.
Componentele sunt conectate prin intermediul unor trasee realizate în substratul
conductiv. Traseele pot fi obținute prin mai multe metode, prin frezare mecanică, prin depunere sau prin corodare.
In proiectul de fata placa de alimentare este realizata prin metoda corodarii, aceasta metoda ofera rezultate destul de bune la un pret mic.
Primul pas facut in realizarea cablajului este schema electrica a circuitului.
Figura 3.2.1 Schema electrica a placutei de alimentare
In schema electrica de mai sus este prezentata schema electrica a placutei de alimentare, aceasta este prevazuta cu doua borne de intrare la care se vor conecta acumulatorul, si doua borne de iesire. Pe intrare pozitiva a placutei de alimentare este montata o dioda cu rol de protectie in caz de alimentare inversa a circuitului.Condesatorii C1 si C2 de 2200uF si 10nF au rolul de a mentine o valoare a tensiunii de iesire cat mai constanta si de a elimina pulsatiile. Circitul este prevazut cu doua sigurante fuzibile de 2A si un buton de conectare/deconectare a circuitului de alimentare.
Rezistentele R1 si R2 formeaza un divizor rezistiv, astfel in punctul dintre cele doua rezistente se poate implementa un pin ce scoate maxim 5V daca acumulatorul este de maxim 8V, in acest fel se poate masura tensiunea de pe baterie.
Figura 3.2.2 Layout placă de alimentare
Dupa realizarea shemei electrice se poate trece la realizarea layout-ului circuitului.Acesta se poate proiecta utilizand un program de specialitate cum ar fi Proteus, Eagle sau Cadence. După proiectarea layout-ului următorul pas este imprimarea acestuia pe placa de cablaj, aceasta se poate realiza și ea prin mai multe metode: prin metoda press and peel (transferul termic) și prin metoda fotografică.
Placuta de alimentare sa relizat prin metoda transferului termic. Layout-ul placutei de alimentare a fost scos la imprimanta pe carton lucios la scara 1:1, dupa ce sa taiat hartia imprimata cu schema de cablaj la dimensiunile cablajului imprimat, sa luat placa de cablaj imprimat care a fost taiata la dimensiunile necesare si spalata pentru indepartarea urmelor de grasime si praf, peste care se suprapune hartia cu partea imprimata catre partea acoperita de cupru si se centreaza, dupa care cu fierul de calcat incins la maxim se apasa pe hartie pentru a se lipi de cablaj , se apasa bine pentru a incalzi tusul depus pe hartie pentru a se lipi de partea cuprata a cablajului imprimat si se freaca bine cu fierul de calcat pe toata suprafata hartiei pentru a se asigura un transfer complet al tusului pe cablaj.Urmatorul pas a fost de a pune cablajul la inmuiat in apa pentru a indeparta hartia, sa observat ca tusul s-a transferat de pe hartie pe suprafata cablajului imprimat, dupa care s-a pus intr-un recipient de plastic si s-a turnat clorura ferica peste cablaj, timpul de corodare este proporțional cu suprafața de cupru necesară a fi corodată, în cazul plăcii din proiectul de față procesul de corodare necesitând aproximativ 10 minute, dupa corodare s-a curatat cablajul imprimat de tus cu ajutorul unui detergent de vase.
Placa astfel obținută poate fi utilizată drept suport pentru componentele electronice. În funcție de tehnologia folosită, Trough Hole sau Surface Mounted Device, componentele vor fi montate prin implantare sau lipire. În proiectul de față tehnologia folosită este Trough-Hole.Această tehnologie presupune inserarea componentelor în găurile de pe placa cu circuit imprimat (PCB) și lipirea acestora pe partea opusă, partea cu stratul cu stratul de cupru, pentru lipirea componentelor utilizându-se fludor și pastă decapantă sau sacâz.
Figura 3.2.3 Cablaj imprimat( dupa corodare si dupa stergere)
3.2.2 Shieldul pentru placuta de dezvoltare Arduino Uno
Shieldul pentru placuta de dezvoltare Arduino Uno este o placa de cablaj imprimat cu doua straturi conductivec, construit special pentru placuta de dezvoltare Arduino Uno, astfel acesta se infinge in placa de dezvoltare si pinii au aceiasi aranjare(ordine), cat si aceleasi functionalitati ca pe placuta de dezvoltare.
Arduino este capabil sa scoata pe porturile lui o putere foarte mica, total insuficienta pentru a invarti un motor. Daca vom conecta un motor electric direct la un port Arduino, cel mai probabil vom obtine arderea procesorului din placa Arduino. Ca sa nu se intample acest lucru, avem nevoie de un amplificator de putere, care sa ia putere din sursa de alimentare (baterie, de exemplu), si sa o transmita motoarelor asa cum ii comanda Arduino. Acest amplificator poarta numele generic de "driver de motoare".
Pe acest shield este montat un driver L298N care impreuna cu cele 8 diode de protectie montate in tehnologie SMD, alcatuiesc o punte H dubla cu ajutorul careia se pot controla viteza si sensul de rotatie al motoarelor.
Pe integratul L298N am montat un radiator pentru o disipare mai buna a caldurii
emise de integrat. Radiatorul este din aluminiu si l-am taiat din alt radiator care era proiectat pentru trei tranzistoare de la o sursa in comutatie. Intre radiator si integrat am pus o bucata de material din mica pentru izolatie si o disipare mai buna a caldurii.
Figura 3.2.4 Shieldul pentru placuta de dezvoltare Arduino Uno
Când o fază a motorului este deconectată, curentul prin fază nu scade instantaneu din
cauza inductivității înfășurării. Când următoarea fază a motorului este comutată, scăderea curentului în faza deconectată anterior are un efect de frânare asupra motorului.
Daca se consideră circuitul, cu faza alimentată, neglijând căderea de
tensiune pe tranzistor, valoarea staționară a curentului în înfăsurare este U/Rm. Când tranzistorul este deconectat, energia înmagazinată în înfășurare va tinde să păstreze scurgerea
curentului în acelasi sens. Pentru că impedanța circuitului crește substanțial (teoretic
infinit) în timpul acțiunii de deconectare, tensiunea pe tranzistor va creste proporțional
cu -Lm×di/dt. Mărimea tensiunii tranzitorii va depăși valoarea limită Vce a oricărui
tranzistor, determinându-i străpungerea, astfel pentru protecția tranzistoarelor împotriva
tensiunilor inductive tranzitorii se folosesc cele 8 diode de descarcare, care sunt legate cate doua la fiecare intrare a motoarelor(o dioda este conectata cu catodul catre tensiunea de alimentare a integratului si anodul catre intrarea in motor iar cealalta dioda este conectata cu catodul la intrarea in motor si anodul la masa, la fel se procedeaza si pentru celalata intrare a motorului).
Pe shield sunt conectati 6 conectori, alimentarea VIN si GND de la iesirea placutei de alimentare, si cele 4 iesiri de la integratul L298N ce controleaza motoarele. Tot pe shield exista un jumper care atunci cand este conectat VIN de pe shield se conecteaza la Vin de pe placuta de dezvoltare Arduino Uno, astfel se poate folosi o singura alimentare externa, daca jumperul este scos placuta de dezvoltare nu mai este alimentata si pentru a functiona trebuie alimentata din exterior.
Senzorii pot fi alimentati direct din shield prin 6 pini care ofera conexiune directa la cei 5V stabilizati de pe placuta de dezvoltare si cei 6 pini care ofera conexiune directa la GND-ul placutei de dezvoltare.
Acumulatorul placutei de alimentare este o baterie reincarcabila de tip LiPo(lithium-ion polymer) de dimensiuni mici, cu doua celule si o tensiune de iesire de 7,4V cu o capacitate de 1000mAh. Bateria are o rata de descarcare continua mare de pana la 25C.
3.2.3 Pozitionarea senzorilor
Figura 3.2.5 Pozitinarea senzorilor pe platforma
Senzorii de reflexie sunt in numar de trei au fost montati in fata platformei cu partea sensibila indreptata in jos cu scopul de sesiza o dunga neagra din banda izolatoare spre exemplu, si de a controla miscarea platformei astfel incat aceasta sa circule deasupra benzii negre.
Senzorilor li s-au montat pini si au fost prinsi intr-o bereta de pini mama la o distanta intre ei de 3 mm acoperind impreuna o suprafata de circa 3 cm. Din bereta de pini mama pleaca cablurile cu tensiunea de iesire a senzorilor si alimentarea acestora, aceste cabluri fiind introduse cu ajutorul unor pini in shield.
Senzorii de distanta cu ultrasunete sunt tot in numar de trei si au fost montati in partea frontala cu partea sensibila indreptata in fata, senzorii de pe laterala au o inclinatie spre lateral de 30 de grade. Pinii senzorilor au fost prinsi cu fire, fludor, sacaz dupa care portiunile dezizolate au fost izolate cu un manson de cauciuc.
3.3 Implementare software
Software-ul pentru microcontroler a fost dezvoltat cu ajutorul mdiului de dezvoltare integrat Arduino iar interfata grafica cat si software-ul pentru interfata au fost realizate in mediul de dezvoltare LabWindows CVI de la National Instruments.
Conectorul USB este necesar pentru programarea inițială a microcontrollerului. Prin intermediul acestuia, platforma se conectează la un computer pe care se scrie, se compilează și se încarcă programul dorit. Pentru a programa microcontroller-ul trebuie conectata placa Arduino la un computer pe care este instalat mediul de dezvoltare și driverele necesare.
Mediul de dezvoltare integrat Arduino (IDE ) este disponibil în mod gratuit pe site-ul producătorului pentru diverse sisteme de operare si este o aplicație cross-platform scrisă în Java. Mediul de dezvoltare include un editor de cod cu o serie de caracteristici, cum ar fi evidențierea sintaxei , indentarea automata , și este , de asemenea, capabil de compilarea și încărcarea programelor in microcontroler. Programele Arduino sunt scrise în C sau C + + . Pentru executia ciclica a unui program, utilizatorul trebuie sa defineasca doua functii,
functia setup ( ) ce ruleaza o singură dată, la începutul unui program, care are rolul de a initializa setările programului si functia loop ( ) ce ruleaza în mod repetat până la intreruperea alimentarii placii de dezvoltare.
Fereastra aplicației arată ca în imaginea de mai jos.
Figura 3.3.1 Fereastra aplicației
Zona de meniu :
-verifica programul pentru erori;
– incarcă programul în microcontroler;
– crează un nou proiect;
– deschide un proiect;
– salvează proiectul curent;
– monitorizare serială – acest buton este folosit pentru comunicarea prin portul serial cu calculatorul.
Zona de program:
Această parte din aplicație este folosită pentru scrierea și editatrea programelor. Cu ajutorul iconiței din dreapta sus (sub forma de sageata orientata în jos) poți redenumi/crea fisiere noi.
Zona de compilator:
În această zonă vor aparea eventualele erori de compilare.
3.3.1 Software pentru citirea senzorilor
Asa cum s-a explicat in capitolul 2.6.1 Senzor de reflexie QTR-1A, senzorul scoate la iesire o tensiune mai mare daca reflexia luminii este mai mica adica senzorul are in fata un material de culoare inchisa si o tensiune mai mica daca reflexia luminii este puternica(daca are in fata un material de culoare mai deschisa. Asadar pentru sesiza ce material este in fata senzorului nu trebuie decat sa citim tensiunea analogica de la iesirea senzorului.
Citirea tensiunii de iesire a senzorului se face cu ADC-ul microcontrolerului, ADC-ul este pe 10 biti si poate masura tensiuni doar pana in 5V, deci valoarea minima sesizabila este 5V impartiti la 1024( aproximativ 4,9 mV) acesta fiind si eroarea limita admisibila. Asadar daca spre exemplu tensiunea masurata ar fi de 490 mV, ADC-ul ar trebui sa intoarca valoarea 100.
O citire a tensiunii dureaza aproximativ 100 de us. Sintaxa functiei de citire este analogRead(pin de pe care doresti sa citesti tensiunea). Un exemplu de cod pentru citirea unui senzor de reflexie este atasat mai jos.
#define SENZOR_LINIE0 A0
void setup() { // functia de configurare ce ruleaza o singura data
Serial.begin(9600);
}
void loop() { // functia principala de program ce ruleaza repetat int sensorRightValue = analogRead(SENZOR_LINIE0);
Serial.println(sensorRightValue);
delay(200);
}
Senzorii de distanta cu ultrasunete detecteaza un obstacol astfel, microcontrolerul trimite un puls de 10 microsecunde pe pinul Trig al senzorului, in acel moment senzorul genereaza un semnal de 8 pulsuri cu frecventa de 40 KHz. Dupa ce micrrocontrolerul a trimis pulsul de 10 us pe pinul Trig, un numarator incepe sa numere pana cand pe pinul Echo al senzorului microcontrolerul detecteaza un puls, in acel moment numaratorul se opreste si returneaza o valoare ce reprezinta timpul trecut masurat in milisecunde. Pana acum prin puls m-am referit la o trecere din Low in High. Timpul intors de numarator se imparte la doi, deoarece este timpul in care sunetul a parcurs distanta pana la obstacol dupa care s-a reflectat inapoi la senzor. Acest timp(masurat in microsecunde) trebuie sa se inmulteasca cu viteza sunetului in aer care este de 343m/s obtinandu-se astfel distanta pana la obstacol, transformand 343m/s in 0,0343cm/us se returneaza o valoare in cm.
Codul de mai jos arata o citire a senzorului de distanta.
#define trigPin 12
#define echoPin 13
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration/2) * 0.0343 ;
Serial.print(distance);
Serial.println(" cm");
}
delay(200);
}
3.3.2 Software pentru controlul motoarelor
Motoarele se controleaza cu ajutorul driverului L298N, in mod normal pentru controlul celor doua motorase este nevoie de 6 pini care sa fie legati la microcontroler, doi pini(enable) pentru a controla starea motoraselor activ/inactiv(cate unul pentru fiecare motor) si 4 pini pentru controlul sensului de rotatie(cate doi pentru fiecare motor). Pe pinul de enable se aplica semnal PWM, astfel controland tensiunea de la bornele motorului si implicit turatia acestuia, iar pe ceilalti doi se aplica un nivel de LOW pe un pin si HIGH pe celalalt sau invers(se inverseaza sensul de rotatie al motorului).
Figura 3.3.2.1 Controlul unui motor cu driverul L298N
Insa pentru a face economie de pini utilizati pe placuta de dezvoltare in acest proiect s-a adaptat o alta configurare a pinilor, astfel pinii de enable s-au unit si sau pus la Vss(pin de nivel logic de 5V). In acest caz singura solutie pentru a controla motorasele este aplicarea a 4 semnale PWM pe cele 4 intrari de control ale integratului(INPUT 1, INPUT 2, INPUT 3, INPUT 4). In acest fel se face economie de doi pini se folosesc 4 pini in loc de 6, dar cei 4 pini trebuie sa fie pini care sa scoata la iesire semnal PWM, cealalta configuratie necesitand doar doi pini de PWM.
Figura 3.3.2.2 Pinii integratului L298N
Astfel tabelul de control al motorului se schimba sub forma :
Pentru genera un semnal PWM pe un pin, se foloseste functia analogWrite(nr. Pinului, valoarea factorului de umplere). Pentru a controla motorasele s-a creat o functie de control a PWM-urilor pe pinii 3, 5, 6, 9 ai placutei de dezvoltare, pinii 3, 5, 6, 9 sunt conectati la pinii IPUT 1, IPUT 2, IPUT 3, IPUT 4 ai integratului L298N.
Codul de control al motoarelor este ilustrat mai jos :
int MOTOR2_PIN1 = 3;
int MOTOR2_PIN2 = 5;
int MOTOR1_PIN1 = 6;
int MOTOR1_PIN2 = 9;
void setup() {
pinMode(MOTOR1_PIN1, OUTPUT);
pinMode(MOTOR1_PIN2, OUTPUT);
pinMode(MOTOR2_PIN1, OUTPUT);
pinMode(MOTOR2_PIN2, OUTPUT);
}
void loop() {
stare(200,-200); //motor stanga se invarte inainte,cel din dreapta inapoi
delay(1000); //intarziere de 1 secunda
stare (-200,-200); //ambele motoare se invart inapoi
delay(1000);
stare (-200,200);// motor dreapta inapoi, cel din stanga inainte
delay(1000);
stare (200,200); //ambele se invart inainte
}
void stare(int vitezaStanga, int vitezaDreapta) {
if (vitezaStanga > 0) {
analogWrite(MOTOR1_PIN1, vitezaStanga);// semnal PWM cu factor de umplere de
analogWrite(MOTOR1_PIN2, 0); // 200/255 pe pinul 6
}
else {
analogWrite(MOTOR1_PIN1, 0);
analogWrite(MOTOR1_PIN2, -vitezaStanga);
}
if (vitezaDreapta > 0) {
analogWrite(MOTOR2_PIN1, vitezaDreapta);
analogWrite(MOTOR2_PIN2, 0);
}else {
analogWrite(MOTOR2_PIN1, 0);
analogWrite(MOTOR2_PIN2, -vitezaDreapta);
}
}
La apelul functiei stare se executa functia si conditiile din interiorul acesteia sunt puse.
In interiorul functiei analogWrite() nu se aplica valoare pentru factorul de umplere negativa, ea devine intotdeauna pozitiva deoarece se inlocuiesc variabilele vitezaStanga sau vitezaDreapta cu numerele date, astfel spre exemplu in functia stare() cand numarul dat este negativ variabila vitezaStanga este inlocuita cu -200 si – cu -200 devine 200.
PWM-urile sunt generate cu o frecventa de 490 Hz si in functie de factorul de umplere la bornele motorasului se regaseste tensiunea VIN de la iesirea placutei de alimentare, (impartita la doi deoarece sunt doua motoare).
3.3.3 Software pentru algoritmul de explorare a spatiului
Platforma robotica cand functioneaza in control autonom daca are un traseu cu linie neagra, platforma va urmari linia, in schimb daca nu are traseul din linie neagra atunci masinuta va explora spatiul evitand obstacolele.
Pentru a urmari linia, microcontrolerul citeste senzorii de linie, astfel conditia principala ca plarforma robotica sa urmareasca linia este ca senzorul din centru sa aiba o valoare mai mare decat un prag, daca senzorii de pe lateral au aceleasi valori, mai mari sau mai mici decat valoarea de prag atunci platforma se va deplasa inainte, daca un senzor de pe lateral are o valoare sub valoarea de prag atunci platforma se va deplasa numai cu acea parte laterala. Optional senzorul cu ultrasunete este citit si daca acesta intoarce o valoare echivalenta cu distanta fata de un obstacol mai mica de 6 cm atunci platforma robotica se va opri pe linie si isi va continua deplasarea dupa ce aceasta distanta se mareste.
int sensorRightValue = analogRead(SENZOR_LINIE0);
int sensorCenterValue = analogRead(SENZOR_LINIE1);
int sensorLeftValue = analogRead(SENZOR_LINIE2);
if((distancec <= 6 )&&( distancec > 0)){ go(0, 0)
if (sensorLeftValue <= PRAG && sensorCenterValue >= PRAG && sensorRightValue >= PRAG) {
go(200, 0);
}
if (sensorLeftValue >= PRAG && sensorCenterValue >= PRAG && sensorRightValue <= PRAG) {
go(0, 200);
}
if (sensorLeftValue <= PRAG && sensorCenterValue >= PRAG && sensorRightValue <= PRAG) {
go(150, 150);
}
if (sensorLeftValue >= PRAG && sensorCenterValue >= PRAG && sensorRightValue >= PRAG) {
go(150, 150);
}
Pentru modul de explora spatiul evitand obstacolele, sunt cititi cei 3 senzori de ultrasunete si in functie de valorile primite platforma se va deplasa inainte, inapoi, va vira la stanga sau la dreapta.
if((distances >dist)&&(distanced>dist)&&(distancec >15))
go(150, 150);
else
{
if((distances <dist)&&(distances>7)&&(distanced >dist))
go(150, 0);
if((distances <=7)&&(distances >0)&&(distanced >dist))
go(-150, -150);
if((distanced <dist)&&(distanced>7)&&(distances >dist))
go(0, 150);
if((distanced <=7)&&(distanced >0)&&(distances >dist))
go(-150, -150);
if((distancec < 15)&&(distancec >0))
go(-150, -150);
}
3.3.4 Software comunicare
Microcontrolerul trebuie sa citeasca comenzile trimise de la interfata grafica si sa trimita un buffer de date la interfata. Pentru a citi de la microcontroler se foloseste functia Serial.read() iar pentru a trimite date la microcontroller se foloseste functia Serial.print(). Codul care realizeaza acest lucru este prezentat mai jos :
if(Serial.available()>0)
{
val=Serial.read();
val1=val;
}
if(val1!=stare && val1==0x44)
{
count++;
if(count==2)
{ count=0;
val1=stare;}
}
In secventa de mai sus este citita valoarea trimisa de interfata si se verifica daca este apasat un buton anume, buton ce la apasare in interfata trimite valoarea 0x44 in hexazecimal adica 68.
Serial.print('p');
nr_sent(Vacu);
Serial.print('l');
nr_sent(distances);
Serial.print('f');
nr_sent(distancec);
Serial.print('r');
nr_sent(distanced);
Serial.print('\r');
Codul functiei nr_sent() este :
void nr_sent(int nr)
{
int a,b,c,d;
a=nr/1000;
get(a);
nr=nr-(a*1000);
b=nr/100;
get(b);
nr=nr-(b*100);
c=nr/10;
get(c);
d=nr-(c*10);
get(d);
}
In codul de mai sus numarul intreg este impartit pentru a putea fi trimis pe 4 octeti, acesti octeti vor ajunge intr-un buffer citit de interfata. Functia get este prezenata mai jos :
void get (int x)
{
switch(x)
{
case 1: Serial.print('1'); break;
case 2: Serial.print('2'); break;
case 3: Serial.print('3'); break;
case 4: Serial.print('4'); break;
case 5: Serial.print('5'); break;
case 6: Serial.print('6'); break;
case 7: Serial.print('7'); break;
case 8: Serial.print('8'); break;
case 9: Serial.print('9'); break;
case 0: Serial.print('0'); break;
}
}
In functie de numarul x, microcontrolerul trimite la interfata valoarea acestuia, fiecare octet va ajunge in bufferul citit de interfata grafica.
3.3.5 Software pentru interfata grafica
Intefata grafica comunica de la distanta in mod continuu cu platforma prin intermediul a doua bluetooth-uri unul conectat pe platforma(HC-06) si unu de la laptop.
Figura 3.3.3.1 Interfata grafica
Prima operatie facuta in scopul realizarii interfetei în mediul Lab Windows CVI a fost lansarea în execuție a editorul pentru interfețe grafice cu utilizatorul (User Interface) care are deja în mod implicit un panou creat (File-New- User Interface), în acest panou au fost adăugate diverse controale ( butoane,numeric,ring) ,indicatori(text, string,meter)și doua timere. Platforma robotica poate fi controlata prin intermediul interfetei grafice si cu ajutorul tastaturii nu numai cu mouse-ul.
Următoarea operatie facuta a fost generarea automata a scheletului de cod (Code-Generate-All Code), acesta corespunde descrierii grafice ce s-a facut prin adaugare de diverse controale si timere carora li s-au alocat niste functii. Pe acest schelet a fost apoi dezvoltat software-ul pentru interfață.
Pentru a putea interactiona cu platforma prin intermediul interfetei grafice trebuie sa conectam bluetooth-ul HC-06 de pe platforma la bluetooth-ul laptopului, acest lucru este posibil prin selectarea portului si apasarea butonului de conectare. Codul care va prelua starea butonului ce realiza conectarea și a portul selectat din ring este:
int CVICALLBACK f_conectare (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int b=0;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal (panelHandle, PANEL_LED_3, &b);
GetCtrlVal (panelHandle, PANEL_RING, &com);
if(b==0)
{
SetCtrlVal (panelHandle, PANEL_LED_3, 1);
OpenComConfig (com, 0, 9600, 1, 8, 1, 512, 512);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 1);
}
else
{
SetCtrlVal (panelHandle, PANEL_LED_3, 0);
SetCtrlAttribute (panelHandle, PANEL_TIMER, ATTR_ENABLED, 0);
CloseCom (com);
}
break;
}
return 0;
}
Funcția GetCtrlVal este folosită pentru a interoga starea obiectelor ( LED, buton,ring) iar funcția SetCtrlVal este folosită pentru modificarea valorilor numerice ale obiectelor. După interogarea panoului ring urmează deschiderea și configurarea portului de
comunicare serială dacă butonul returnează valoarea 0 sau contrar închiderea portului de
comunicare daca returneaza 1.
Functia OpenComConfig realizeaza activarea si setarea comunicarii de tip asincron, cu o transmisie de 8 biti de date,un bit de start, un bit de stop, fara bit de paritate si o viteză de transfer a datelor de 9600 biți/secundă. Pentru accesarea functiei se utilizeaza libraria <rs232.h>.
Dupa ce se realizeaza conectarea, se activeaza doua timere, un timer va fi folosit pentru a verifica starea butoanelor de la tastatura(verificarea se face la 10 ms) si a trimite comenzi la microcontroler.
Cu cel de-al doilea timer se va scana din 50 in 50 milisecunde portul serial astfel se actualizeaza datele primite de la microcontrolerul de pe platforma. O secventa de cod a acestei functii timer este prezentata mai jos :
int CVICALLBACK fTIMER3 (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char ax[20]="";
int dist1,dist2,dist3;
double Vacu;
char buffer[21] ="";
switch (event)
{
case EVENT_TIMER_TICK:
ComWrtByte (5, 100);
ComRdTerm (com, buffer, 21, '\r') ;
SetCtrlVal (panelHandle, PANEL_STRING, buffer);
if(buffer[0]=='p')
{
ax[0]= buffer[1];
ax[1]= buffer[2];
ax[2]= buffer[3];
ax[3]= buffer[4];
Vacu=(int)((ax[0]-'0')*1000+(ax[1]-'0')*100+(ax[2]-'0')*10+(ax[3]-'0'));
Vacu=((Vacu*32*432*16)/10000000);
SetCtrlVal (panelHandle, PANEL_NUMERICTANK, Vacu);
if(Vacu<7)
SetCtrlVal (panelHandle, PANEL_LED_22,1);
else
SetCtrlVal (panelHandle, PANEL_LED_22,0);
Vacu=0;
}
if(buffer[5]=='l')
………………….
Funcția ComRdTerm(com,buffer,21, '\r') este responsabilă de scanarea portului serial și
salvarea fiecărui octet al pachetul de date în buffer până când va sesiza rând nou '\r', pachetul de date are o mărime de 21 octeți fiind de forma :
p xxxx lxxxx f xxxx rxxxx
p –caracter identificator pentru tensiunea acumulatorului;
s –caracter identificator pentru distanța citită de senzorul din stânga;
f –caracter identificator pentru distanța citită de senzorul din față;
l–caracter identificator pentru distanța citită de senzorul din dreapta;
Bufferul este afișat într-un panou string dupa care se extrag și partajeaza informațiile
conținute, in funcția timer se cauta caracterele identificatoare.
Capitolul 4. Rezumat si concluzii
4.1 Rezumat
Proiectul din aceasta lucrare este o platforma robotica de tip senilata care poate fi controlata de la distanata de un operator uman, in raza de actiune a unui bluetooth, cu ajutorul interfetei grafice.
Scopul acestei lucrari este studierea si utilizarea conceptului de interfatare om calculator si respectiv a sistemelor integrate.
Atat la nivel de parte hardware cat si la nivel de parte software majoritatea functiile necesare pentru realizarea platformei robotice sunt module de sine statatoare astfel fiecare functie poate fi testata si utilizata in mod independent. Spre exemplu la nivel de parte software, programul este imprtit in mai multe functii. Si la nivel de parte harware platforma robotica este impartita in mai multe parti care pot fi testate separat. Acest concept de realizare a proiectului are avantajul ca subprogramele si partile hardware ale platformei robotice pot fi testate separat, astfel se poate detecta mai rapid un eventual defect, un alt avantaj ar fi ca majoritatea componentelor pot fi utilizate si in alte aplicatii.
Pentru realizarea proiectului s-a folosit un microcontroler, o placuta de dezvoltare, un shield pentru aceasta placuta de dezvoltare, un acumulator, o placuta de alimentare, senzorii care au fost prinsi separat si un bluetooth.
In aceasta lucrare sunt prezentate aproximativ toate informatiile necesare pentru proiectarea acestei platforme, astfel in prima parte (Capitolul 2) sunt prezentate notiunile teoretice necesare implementarii proiectului, iar, in cea de-a doua parte(Capitolul 3) este modul in care s-a relizat partea practica a proiectului.
In prima parte sunt prezentate notiuni despre roboti, despre motoare de curent continuu cu perii si controlul acestora, despre microcontroler si senzori, precum si despre comunicarea seriala si interfata grafica.
In a doua parte este prezentata partea hardware a platformei robotice precum si implementarea software cu soft-ul pentru citirea senzorilor, controlul motoarelor, algoritnul de explorare a spatiului, precum si programul pentru interfata grafica.
Imbinand notiunile teoretice cu abilitatile practice s-a putut implementa aceasta platforma robotica.
4.2 Concluzii
La prima vedere platforma robotica nu pare sa ridice un grad inalt de dificultate insa pe parcursul implementarii pot aparea diferite probleme ceprivesc atat partea hardware cat si partea software.
Din punct de vedere mecanic trebuie avut grija ca toate componentele sa fie bine izolate si sa aiba o prindere buna pe platforma robotica pentru a se evita eventuale scurtcircuite ce ar putea sa apara. Axurile rotilor ajutatoare nu trebuie obturate pentru ca motorasele vor trage din greu, aceste axuri trebuie sa aiba o miscare cat mai libera. Deasemenea trebuie avut grija ca greutatea platformei sa nu aiba o greutate prea mare deoarece motorasele sunt de putere mica.
O alta problema ar fi pozitionarea senzorilor, senzorii de reflexie trebuie pozitionati la o distanta mica de suprafata de rulare a platformei astfel pentru a merge pe linie este nevoie de un traseu drept. Deasemenea senzorii de ultrasunete trebuie sa fi fixati pe platforma la o simetrie destul de buna astfel controlul in mod autonom este mai bun.
Din punct de vedere al partii software pot aparea dificultati la preluarea si prelucrarea datelor transmise intre platforma robotica si interfata grafica, acest lucru se poate rezolva in mod mai usor daca se folosesc doua timere in interfata grafica unul pentru trimiterea datelor la microcontroler si unul pentru citirea datelor de la microcontroler. Deasemena trebuie urmarit cu atentie modul in care este rulat programul altfel se pot evita eventuale erori ce pot aparea la introducerea unor date neprevazute.
Un atu in plus pe care l-am avut in relizarea acestui proiect a fost ca in anul 2015 am participat la concursul ElectroMobility organizat de firma Continental astfel am acumulat o experienta in plus ce ma ajutat la relizarea acestui proiect.
Prin relizarea acestui proiect am reusit sa consolidez o buna parte din notiunile teoretice invatate in cei patru ani de facultate si sa imi dezvolt aptitudinile practice in domeniul electronic.
Capitolul 5. Anexe
Anexa 1. Cod microcontroler Atmega328
#define echoPind 12// Echo Pin
#define trigPind 13 // Trigger Pin
#define echoPinc 10
#define trigPinc 11
#define echoPins 7
#define trigPins 8
#define dist 20
int MOTOR2_PIN1 = 3;
int MOTOR2_PIN2 = 5;
int MOTOR1_PIN1 = 6;
int MOTOR1_PIN2 = 9;
#define SENZOR_LINIE0 A0
#define SENZOR_LINIE1 A1
#define SENZOR_LINIE2 A2
#define PRAG 100
int stare =0, stare1 =0;
unsigned char val=0,val1=0, val2 = 0;
unsigned int count=0, count1=0;
long durationd, distanced, durationc, distancec, durations, distances;
int Vacu;
void nr_sent(int nr)
{
int a,b,c,d;
a=nr/1000;
get(a);
nr=nr-(a*1000);
b=nr/100;
get(b);
nr=nr-(b*100);
c=nr/10;
get(c);
d=nr-(c*10);
get(d);
}
void get (int x)
{
switch(x)
{
case 1: Serial.print('1'); break;
case 2: Serial.print('2'); break;
case 3: Serial.print('3'); break;
case 4: Serial.print('4'); break;
case 5: Serial.print('5'); break;
case 6: Serial.print('6'); break;
case 7: Serial.print('7'); break;
case 8: Serial.print('8'); break;
case 9: Serial.print('9'); break;
case 0: Serial.print('0'); break;
}
}
void setup() {
Serial.begin(9600);
pinMode(trigPind, OUTPUT);
pinMode(echoPind, INPUT);
pinMode(trigPinc, OUTPUT);
pinMode(echoPinc, INPUT);
pinMode(trigPins, OUTPUT);
pinMode(echoPins, INPUT);
pinMode(MOTOR1_PIN1, OUTPUT);
pinMode(MOTOR1_PIN2, OUTPUT);
pinMode(MOTOR2_PIN1, OUTPUT);
pinMode(MOTOR2_PIN2, OUTPUT);
void nr_sent();
void get();
}
void loop() {
Vacu = analogRead(A3);
// digitalWrite(trigPinc, LOW);
// delayMicroseconds(2);
// digitalWrite(trigPinc, HIGH);
// delayMicroseconds(10);
// digitalWrite(trigPinc, LOW);
// durationc = pulseIn(echoPinc, HIGH);
// distancec = (durationc/2) / 29.1;
if(Serial.available()>0)
{
val=Serial.read();
val1=val;
val2=val;
}
if(val1!=stare && val1==0x44)
{
count++;
if(count==2)
count=0;
val1=stare;
}
if(count==1)
{ int sensorRightValue = analogRead(SENZOR_LINIE0);
int sensorCenterValue = analogRead(SENZOR_LINIE1);
int sensorLeftValue = analogRead(SENZOR_LINIE2);
//if((distancec <= 6 )&&( distancec > 0)){ go(0, 0); }
if (sensorLeftValue <= PRAG && sensorCenterValue >= PRAG && sensorRightValue >= PRAG) {
go(200, 0);
}
if (sensorLeftValue >= PRAG && sensorCenterValue >= PRAG && sensorRightValue <= PRAG) {
go(0, 200);
}
if (sensorLeftValue <= PRAG && sensorCenterValue >= PRAG && sensorRightValue <= PRAG) {
go(150, 150);
}
if (sensorLeftValue >= PRAG && sensorCenterValue >= PRAG && sensorRightValue >= PRAG) {
go(150, 150);
}
}
if(val2!=stare1 && val2==0x43)
{
count1++;
if(count1==2)
{ count1=0;
val2=stare1;}
}
if(count1==1)
{
digitalWrite(trigPinc, LOW);
delayMicroseconds(2);
digitalWrite(trigPinc, HIGH);
delayMicroseconds(10);
digitalWrite(trigPinc, LOW);
durationc = pulseIn(echoPinc, HIGH);
distancec = (durationc/2) / 29.1;
digitalWrite(trigPind, LOW);
delayMicroseconds(2);
digitalWrite(trigPind, HIGH);
delayMicroseconds(10);
digitalWrite(trigPind, LOW);
durationd = pulseIn(echoPind, HIGH);
distanced = (durationd /2) / 29.1;
digitalWrite(trigPins, LOW);
delayMicroseconds(2);
digitalWrite(trigPins, HIGH);
delayMicroseconds(10);
digitalWrite(trigPins, LOW);
durations = pulseIn(echoPins, HIGH);
distances = (durations /2) / 29.1;
if((distances >dist)&&(distanced>dist)&&(distancec >15))
go(150, 150);
else
{
if((distances <dist)&&(distances>7)&&(distanced >dist))
go(150, 0);
if((distances <=7)&&(distances >0)&&(distanced >dist))
go(-150, -150);
if((distanced <dist)&&(distanced>7)&&(distances >dist))
go(0, 150);
if((distanced <=7)&&(distanced >0)&&(distances >dist))
go(-150, -150);
if((distancec < 15)&&(distancec >0))
go(-150, -150);
}
}
if((count == 0) && (count1 == 0) )
{
if(val==0x38)
go(150, 150);
else if(val==0x32)
go(-150, -150);
else if(val==0x34)
go(0, 150);
else if(val==0x36)
go(150, 0);
}
if(val1==100){
Serial.print('p');
nr_sent(Vacu);
Serial.print('l');
nr_sent(distances);
Serial.print('f');
nr_sent(distancec);
Serial.print('r');
nr_sent(distanced);
Serial.print('\r');
}
}
void go(int speedLeft, int speedRight) {
if (speedLeft > 0) {
analogWrite(MOTOR1_PIN1, speedLeft);
analogWrite(MOTOR1_PIN2, 0);
}
else {
analogWrite(MOTOR1_PIN1, 0);
analogWrite(MOTOR1_PIN2, -speedLeft);
}
if (speedRight > 0) {
analogWrite(MOTOR2_PIN1, speedRight);
analogWrite(MOTOR2_PIN2, 0);
}else {
analogWrite(MOTOR2_PIN1, 0);
analogWrite(MOTOR2_PIN2, -speedRight);
}
}
Anexa 2. Cod interfață grafică
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aparitia Robotilor In Epoca Actuala (ID: 149397)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
