Vehicul Inteligent
Vehicul Inteligent
1 INTRODUCERE
Scopul acestei lucrări este de a explica implementarea și funcționarea unui vehicul inteligent cu control la distanța via bluetooth.
Sistemul este proiectat și implementat pentru a putea îndeplini un număr divers de sarcini. Adaptarea la diversele cerințe pe care trebuie să le îndeplinească se face cu modificări minime în ceea ce privește partea de hardware.
Posibile sarcini îndeplinite de vehicul:
– Transportul unei încărcături în zone ostile/periculoase pentru om precum și investigarea condițiilor de mediu înconjurător prin intermediul senzorilor în aceleași condiții de mediu ostil sau periculos (control liber de la distanță).
– Supravegherea unui traseu bine determinat cu ajutorul senzorilor de linie (line follow).
Caracteristicile principale ale vehiculului:
– Dispune de un număr de 4 roți fixe folosite pentru tracțiune dar și pentru controlul direcției prin mișcarea roților în direcții diferite.
– Aplicație Android folosită pentru comanda vehiculului la distanța (GUI).
– Conexiune Bluetooth capabilă de funcționare pe distanțe de până la 10m (clasă 2).
– Senzori de reflectanță, folosiți pentru a implementa sistemul de line follow.
– Modul de alimentare central pentru vehicul, precum și o alimenatare separată pentru Arduino.
1.1 Structura proiectului
Structura proiectului, atât din punct de vedere hardware cât și din punct de vedere software, poate fi definită că fiind alcătuită din două mari componente, și anume:
Interfața cu utilizatorul
Componente hardware:
Telefon/Tabletă
Componente software:
Aplicație Android (MIT App Inventor)
Sistem vehicul:
Componente hardware:
Arduino Uno.
Modul Bluetooth MateSilver RN-42
Driver de motoare bazat pe L298N
4 motoare de curent continuu
2 senzori linie
regulator de tensiune
Componente software:
C++
Fig 1. Structura de ansamblu a proiectului
Legendă conexiuni:
1 – comunicație Arduino UNO – driver de motoare (L298N)
2 – comunicație Driver de motoare – motoare de curent continuu
3 – comunicație Arduino UNO – senzori
4 – comunicație Arduino UNO – Modul Bluetooth MateSilver RN-42
5 – comunicație vehicul (via RN-42) – Interfata mobila Android (Smartphone/Tableta)
1.2 Privire de ansamblu asupra modurilor de funcționare
Aruncând o privire asupra modurilor de funcționare ale vehicului, se evidențiază doua caracteristici. Una dintre acestea se referă la faptul că vehiculul poate rula în regim ne-autonom (controlat la distanță), iar celălalt se referă la faptul că vehiculul poate rula fără comanda (autonom) la distanță prin intermediul senzorilor de linie.
Modul ne-autonom de funcționare se referă la existența unei dependențe între vehicul și utilizator, și anume controlul vehiculului cade în sarcina utilizatorului în întregime. În acest caz se poate vorbi despre modul de funcționare la liber (vehiculul este controlat de la distanță în mod liber).
Modul autonom, pe de altă parte se referă la lipsa dependenței dintre vehicul și utilizator. Un robot complet autonom poartă, de obicei, toate modulele necesare pentru că acesta să evalueze starea spațiului inspectat și, în același timp să se autoghideze în funcție de procesări efectuate în timp real asupra informațiilor recepționate de la senzorii atașați. Deși această dependentă nu are cum să dispară complet, este prezentă într-o proporție foarte mică (de exemplu la pornirea vehiculului și activarea unui mod de funcționare). [1] În cazul vehiclului de fața, modul de funcționare autonom îl reprezintă modul de funcționare în line follow, unde vehiculul se ghidează după o linie aflată pe podea.
Modul de funcționare la liber este caracterizat de faptul că vehiculul este controlat în totalitate de către utilizator de la distanță. Controlul se realizează de pe un Smartphone pe care se rulează o aplicație. Comenzile trimise de către utilizator se pot trimite prin intermediul butoanelor oferite de aplicație.
Comanda vehiculului se realizează prin controlarea direcției de funcționare a parților motoare (stânga și dreapta). Este posibilă întoarcerea vehicului într-un singur punct prin activarea unei părți pentru mers înainte iar partea opusă pentru mers înapoi (asemănător unui tanc). Comenzile care pot fi trimise de către utilizator sunt următoarele: mers înainte, mers înapoi, întoarcere pe loc dreapta/stânga, aprindere/stingere lumini, oprire vehicul, selectarea/deselectarea modului line-follow.
Modul de funcționare line-follow. Line follow-ul este o noțiune foarte importantă în lumea roboticii, deoarece asigura robotului implementarea unei scheme de navigație precisă și fără erori. Deplasarea după un traseu permite vehiculului să se mențină după traseul primit și să își corecteze în mod automat ruta, atunci când deviază în mod accidental de la traseu.[2]
Pentru realizarea funcționalității de line follow s-au folosit doi senzori de linie, senzori care practic sesizează diferența dintre reflexia pe alb și cea pe negru (linia). Acești senzori conțin un LED infraroșu și un fototranzistor. Fototranzistorul folosește un circuit cu un condensator. Când condensatorul se descarcă se măsoară timpul de descărcare. O descărcare mai rapidă înseamnă o suprafață cu reflexie mai mare (alb) .
1.3 Motivarea implmentării folosind Arduino UNO
Arduino Uno este o platformă de procesare open-source, bazată pe software și hardware flexibil și ușor de folosit. Arduino a fost dezvoltată pentru a face mai ușoară și mai puțin costisitoare dezvoltarea proiectelor ce necesită componente electronice. Este o platformă de dimensiuni reduse, construită în jurul unui microcontroller (ATmega328). Folosește un limbaj de programare foarte asemănător cu limbajul C++.
Fig. 1.1 Arduino UNO
Arduino deține 14 porturi digitale care pot fi folosite atât pentru intrare cât și pentru ieșire (6 din ele se pot folosi pentru a emite PWM), 6 porturi analogice, un oscilator de 16MHz, un port USB, un port de alimentare, porturi ICSP, un buton de reset, practic conține tot ce este nevoie pentru a ajuta microcontrollerul.[26]
În paralel cu Arduino, se regăsesc FPGA-urile, care sunt niște circuite integrate care ar putea conține milioane de porți logice care pot fi configurate electric pentru a efectua o anumită sarcină. Acestea fiind spuse, în realizarea proiectului a existat opțiune de a se utiliza fie FPGA-uri fie microcontrolere (Arduino).
Fig. 1.3 FPGA Spartan-3E
În cele din urmă s-a ales folosirea Arduino.
Paralela FPGA vs. Microcontroler
FPFA-urile au o flexibilitate sporită fața de microcontrolere pentru că acesta poate fi reprogramat pentru a îndeplinii orice activitate logică ce poate fi integrată în numărul de porți pe care le are. Pe de altă parte microcontrolerele au o circuitistica și seturi de instrucțiuni pe care programatorul trebuie să le urmeze pentru a scrie cod pentru acel microcontroler, astfel limitând microcontrolerul la anumite sarcini.
În schimb consumul de putere este mai scăzut la microcontrolere și de aceea este indicată folosirea lor în ansamble în care se dorește un consum mai scăzut de energie. FPGA-ul este un consumator mai mare de energie ceea ce le face improprii pentru folosirea lor în situații unde consumul de energie este o problemă (sisteme alimentate cu acumulatori/baterii).
Programarea unui FPGA pentru a îndeplinii o sarcină anume necesita un timp mai mare de dezvoltare din pricina faptului că acest cod trebuie scris de la zero. În cazul microcontrolerelor exista pachete orientate spre o anumită sarcină care se programează conform specificațiilor dorite destul de repede.
Mediul de programare diferă de la FPGA la microcontroler. Pentru programarea FPGA-urilor se folosesc limbaje de descriere hardware (HDL) precum verilog sau VHDL, dar și un limbaj de programare și anume C. Programarea microcontrolerelor se face în general cu ajutorul limbajului de programare C.
Alegerea Arduino în detrimentul FPGA-urilor, s-a datorat și altor factori, diferiți de cei enumerați mai sus. Printre acești factori se numără:
– experiența superioară în operarea cu Microcontrollerele
– diferență foarte mare de cost dintre o platformă Arduino și un FPGA
– asistență superioară în lucrul cu Microcontrollerele (Îndrumar de laborator, Material de curs)
– pentru proiectul curent Arduino este suficient.
1.4 Microcontrollerul ATmega328
ATmega328 este fabricat de Atmel si face parte din seria megaAVR. Este un microcontroller de înaltă performanță, bazat pe arhitectura RISC și conține 32KB de memorie flash ISP (in-system programable), 1KB EEPROM, 2KB SRAM, 23 de linii I/O, 32 de registre de uz general, trei contoare/timere ce includ moduri de comparare, programabil serial USART, o interfata seriala bifilara byte-oriented, un port serial SPI, convertor A/D, oscilator intern și cinci variante de software selectabile pentru rularea in regim de economisire a energiei. Microcontrollerul funcționeaza la tensiuni între 1.8 si 5.5V.
Prin execuția de instrucțiuni puternice în interiorul unui singur ciclu de ceas, dispozitivul reușește să obțina un randament de 1 MIPS per MHz, echilibrând consumul de energie cu viteza de procesare. [27]
2 SISTEME MOBILE
2.1 Definiții, structură și caracteristici
2.1.1 Scurt istoric.Definiții
Bazele roboților de azi stau mult mai departe. Primele modele de mașini pot fi mai degrabă numite automate (provenind din grecescul automatos, care se mișcă singur). Acestea nu puteau executa decât câte un singur obiectiv, fiind constrânse de construcție.
Termenul de ''robotics'' (robotică) se referă la acea știință care se ocupă cu proiectarea, construcția, operarea și utilizarea roboților, cât și cu sistemele computerizate care se ocupa cu controlul lor, cu citirea datelor primite de la senzori și procesarea datelor.
Acest termen a fost introdus și folosit pentru prima dată de către scriitorul și omul de știință american de origine rusă, Issac Asimov, într-o scurtă povestioară care s-a numit ''Runaround'', undeva în anul 1950.
Primii roboți au apărut în anii '50 și s-au numit Unimates, fiind dezvoltați de George Devol și Joe Engelberger. Acesta din urmă a format Unimation și în același timp a fost primul care a vândut roboți, motiv pentru care este considerat ''parintele roboticii''.
Fig. 2 Unimate
Conform enciclopediei Webster, un robot se consideră a fi un dispozitiv automat care, execută funcții complexe, sau o mașină cu asemănare de om. În timp ce această definiție ar putea fi satisfăcătoare pentru unii dintre noi, trebuie spus că nu este neapărat și completă. O altă definiție, puțin diferită, a fost dată de Institutul de Robotică din America, în anul 1979. Conform acestei definiții, un robot este ''o mașină reprogramabilă, multifuncțională creată pentru a muta diverse materiale, bucăți, unelte sau alte dispozitive specializate prin diverse mișcări programate, pentru realizarea unei varietăți mari de sarcini''.[10]
Robotul poate fi definit ca un sistem sau un echipament cu funcționare automată, adaptabilă condițiilor unui mediu complex și variabil în care acționează, înlocuind una sau mai multe dintre funcțiunile umane în acțiunea acestuia asupra mediului în procesul muncii. Adaptabilitatea se poate face prin programare sau reprogramare manuală ori automată. În măsura în care un asemenea sistem are și capacitatea de a reacționa la schimbările condițiilor din mediu înconjurător real în care se desfășoară activitatea și de a-și adapta în consecință strategia de conducere automată în sens de optimizare se asociază și atributul de robot inteligent.[13]
O altă definiție mai scurtă și larg acceptată în momentul de față este următoarea: un robot este un sistem inteligent care interacționează cu mediul fizic înconjurător, prin intermediul unor senzori efectori. Pentru a fi capabil să modeleze lumea înconjratoare este necesar ca un robot să fie capabil să adune date prin intermediul senzorilor de-alungul unei perioade de timp. Orice timp de senzor este bineînțeles pefiniție, puțin diferită, a fost dată de Institutul de Robotică din America, în anul 1979. Conform acestei definiții, un robot este ''o mașină reprogramabilă, multifuncțională creată pentru a muta diverse materiale, bucăți, unelte sau alte dispozitive specializate prin diverse mișcări programate, pentru realizarea unei varietăți mari de sarcini''.[10]
Robotul poate fi definit ca un sistem sau un echipament cu funcționare automată, adaptabilă condițiilor unui mediu complex și variabil în care acționează, înlocuind una sau mai multe dintre funcțiunile umane în acțiunea acestuia asupra mediului în procesul muncii. Adaptabilitatea se poate face prin programare sau reprogramare manuală ori automată. În măsura în care un asemenea sistem are și capacitatea de a reacționa la schimbările condițiilor din mediu înconjurător real în care se desfășoară activitatea și de a-și adapta în consecință strategia de conducere automată în sens de optimizare se asociază și atributul de robot inteligent.[13]
O altă definiție mai scurtă și larg acceptată în momentul de față este următoarea: un robot este un sistem inteligent care interacționează cu mediul fizic înconjurător, prin intermediul unor senzori efectori. Pentru a fi capabil să modeleze lumea înconjratoare este necesar ca un robot să fie capabil să adune date prin intermediul senzorilor de-alungul unei perioade de timp. Orice timp de senzor este bineînțeles predispus la erori. Prin prisma acestei definiții, s-ar putea spune că și omul este un robot. Omul, prin natura sa, ''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. Cu certitudine, cea mai semnificativă diferență între un robot și un om, este dată de faptul că robotul a fost creat de om și nu invers.[10]
2.1.2 Roboți mobili. Elemente de structura
Un robot mobil ar putea fi descris că un robot care trebuie să se deplaseze într-un anumit mediu, fără ajutorul unui operator uman și să execute anumite sarcini date de acesta. Deci principala caracteristică este mobilitatea. Roboții mobili au întrebuințări multiple. De-a lungul timpului au existat și există roboți mobili cu funcții diverse, de la aspirator pentru casă la explorator spațial, de la vehicul ghidat automat (AGV) folosit în industrie la robot didactic folosit doar pentru scopuri științifice. Un robot mobil este alcătuit dintr-o serie de componente, unele de natură fizică (hardware), iar altele de natură logică, computațională (software). Din punct de vedere al componentelor hardware, un robot mobil poate fi considerat ca o colecție de sisteme pentru:
– Locomoție și acțiune – modalitatea prin care robotul se mișcă în mediul său ambiant;
– Sesizare prin sistem senzorial – modalitatea prin care robotul măsoară proprietățile lui și ale mediului înconjurător;
– Procesare – modalitatea prin care robotul procesează și ia decizii în legătură cu informațiile primite de la sistemul senzorial;
– Comunicare – modalitatea prin care robotul comunică cu alți roboți sau cu un operator din mediu. [2]
În ce privește locomoția și acțiunea, pentru a se putea deplasa în mediul ambiant și a executa anumite acțiuni prin intermediul organelor sale mobile, roboții mobili au nevoie de anumite componente electro-mecanice care să le permită o mișcare precisă, bazate pe transformarea energiei electrice în energie mecanică de către motoare și servomotoare specifice.
Printre aceste componente, cele mai reprezentative sunt:
– Motoare, servomotoare, electromagneți;
– Angrenaje, sisteme de transmisie;
– Roți, șenile, picioare, perne de aer sau perne magnetice, elice.[1]
Pentru realizarea funcției de navigare roboții mobili sunt echipați cu subsisteme care asigură deplasarea în spațiul de operare pentru urmărirea traseului, evitarea coliziunilor cu obstacole (fixe sau mobile) sau retragerea la punctul de alimentare (docking). Subsistemele de locomoție ale roboților mobili tereștrii pot fi cu roți, cu șenile/benzi sau cu membre similare deplasării umane. Datorită avantajelor legate de mobilitate, manevrabilitate și simplitate, roboții mobili au în general subsisteme de locomoție bazate pe roți. [3]
2.1.3 Exemple de sisteme implementate
– Sisteme ne-autonome
Un robot care nu este autonom, de obicei, doar acționează ca un mediu pentru operatorul uman pentru a verifica o anumită zonă, în cazul în care operatorul nu poate ajunge la el. Operatorul uman are sarcina de a controla de la distanță robotul și semnalele de control pentru robot sunt de obicei trimis prin cablu (deși această ultimă afirmație nu e este obligatorie).
Fig. 2.1 Sistem ne-autonom de explorare
– Sisteme semi-autonome
Un sistem semi-autonom nu este complet lăsat la latitutdinea operatorului uman. Robotul include adesea module care vor permite robotului să efectueze acțiuni care sunt de obicei pre programate pe module incluse.
De exemplu KaRo folosește un cablu pentru a transmite și primi semnale de la operator. Acesta a fost proiectat în principal pentru inspecția de canalizare și echipamente de testare senzorială. Deci toți acești roboți ar putea fi clasificați ca fiind semi-autonomi pentru că nu au capacitatea de a percepe complet starea curentă fără intervenția nemărginită din partea operatorului uman. [4]
Fig. 2.2 Sisteme semi-autonome
– Sisteme complet autonome
Domeniul sistemelor robotizate complet autonome este un domeniu în care cercetarea și dezvoltarea, în comparație cu alte domenii de sisteme robotizate este în plină dezvoltare și în mare căutare. Un robot complet autonom poartă, de obicei, toate modulele necesare pentru că acesta să evalueze starea spațiului inspectat și, în același timp să se autoghideze în funcție de procesări efectuate real-time asupra informațiilor recepționate de la senzorii atașați. Aceștia sunt, de obicei, roboți neconectați, astfel încât toate semnalele de control și informațiile sunt transmise printr-o legătură radio. [5]
– Groundhog
La data de 27 octombrie 2002, Groundhog a fost trimis în mina Florența lângă Pittsburgh, PA. Acest experiment este primul dintr-o serie în care robotul navighează un mediu înaccesibil pentru oameni, dar încă sub control de la distanță.
Fig. 2.3 Sisteme autonome de explorare
Acest sistem este dotat cu senzori laser cu ajutorul cărora, printr-un software bine pus la punct face o mapare 2D sau 3D a spațiului scanat, metodă prin care își calculează și poziția actuala, sistemul fiind unul cu control de la distanță (semi-autonom). [6]
– Pioneer DX
Robotul Pioneer 3 DX are dimensiunile de 44x38x22cm. Viteza maximă de deplasare poate ajunge la 1.6 m/s pe teren drept și suportă greutăți de pana la 23Kg.
Fig. 2.4 Pioneer DX
În varianta sa de bază acest sistem este echipat cu nu mai puțin de 8 sonare (senzori cu ultrasunete), așezate într-o configurație de 180 grade. Senzorii pot sa citească date în mod corect pentru distanțe între 15 cm și 7 m. De asemenea, exista o gamă largă de accesorii pentru acest robot cum ar fi: acces la rețeaua wireless Ethernet, sistem de localizare și navigare bazat pe senzori laser, senzori pentru coliziune, cameră video stereo, sistem de localizare prin GPS, senzori bazați pe unde în spectrul infraroșu. [7]
– Roomba
Roboții autonomi și-au făcut apariția și în domeniul domestic. Roomba este un robot aspirator autonom. Este echipat cu senzori cu infraroșu pentru evitarea obstacolelor, detectia unei caderi (ex. scări). Modelel mai noi sunt echipate inclusiv cu senzori acustici de detectare a zonelor murdare, robotul concentrându-se pe acele zone.
Fig. 2.5 Roomba 700
Este echipat cu un acumulator (NiMH). Incărcarea acestuia se realizează automat, robotul fiind dotat cu o stație de reîncărcare. În momentul în care bateria este epuizată, robotul se întoarce la stația de reîncărcare.
Roomba a fost introdus pe piață în 2002 iar acum se află la a șasea generație.[8]
2.2 Elemente de achiziție folosite în sisteme mobile
2.2.1 Caracteristici generale și clasificări ale diferitelor tipuri de senzori
Senzorii sunt elemente componente ale roboților mobili, folosiți pentru a măsura diferite proprietați ale mediului din jurul acestora, cum ar fi: distanță, rezistență fizică, temperatură, luminozitate, greutate, mărimea, etc.
Clasificare senzorilor la modul general, se poate face în doua mari categorii:
– Senzori de stare interna – acest gen de senzori ofera înformații despre starea interna a robotului mobil, cum ar fi poziția roților, starea bateriei, temperatura interna, etc
– Senzori de stare externa
Despre senzori se poate spune că aceștia pot fi fie pasivi, fie activi. Senzorii activi sunt acei senzori care emit energie în mediu pentru a putea observa anumite caracteristici ale mediul înconjurator, spre deosebire de senzorii pasivi care doar primesc energie din mediul înconjurător pentru a putea prelua informația – senzori care oferă informații despre mediul ambiant în care își desfașoară activitatea.
Senzorii de stare externă se mai pot clasifica la randul lor în alte doua categorii și anume: senzori cu contact, mai specific acei senzori care culeg înformația din mediu prin atingere (de exemplu: senzor ''bumper'', senzor de impact), respectiv senzori fără contact, care preiau înformația din mediu de la o anumită distanță caracteristică senzorului în cauză (de exemplu: camera video, senzor ultrasonic, senzor infrarosu)
Câteva adevăruri general valabile despre toate categoriile de senzori sunt următoarele:
Orice senzor este afectat de interferențe
Orice senzor oferă o informație incompletă a proprietăților măsurate din mediul în care efectuează măsurătorile
Nici un senzor nu poate fi modelat complet
Toate tipurile de senzori sunt caracterizate printr-o serie de proprietăți, cele mai importante fiind următoarele:
– Sensibilitatea: raportul dintre semnalul de ieșire și semnalul de intrare;
– Intervalul de măsurare: diferența între distanța minimă și maximă măsurabilă;
– Liniaritatea: exprimă dacă raportul dintre intrare și ieșire este constant;
– Timpul de răspuns: timpul necesar pentru că informația de la intrare să fie observabilă la ieșire;
– Acuratețea: diferența între semnalul măsurat și semnalul real;
– Repetabilitatea: diferențele între măsurători succesive ale aceleiași entități;
– Rezoluția: exprimă cea mai mică unitate de încrementare a semnalului măsurat;
– Prețul senzorului;
– Puterea de calcul necesară pentru a interpreta rezultatele;
– Tipul de semnal la ieșire;
– Greutatea, mărimea și cantitatea de energie consumată pentru a face o măsurătoare.
Din punct de vedere tehnologic/functional, robotii mobili pot fi dotati cu diverse tipuri de senzori și anume:
a. Senzori interni
– Senori de poziție (Incrementali/Potențiometre);
– Senzori de forță;
– Senzori de detecție în infrarosu;
– Senzori de acceleratie;
– Senzori cu efect Hall.
b. Senzori externi:
– Senzori cu ultrasunete;
– Senzori de atingere;
– Senzori de forță;
– Senzori de culoare;
– Senzori de lumina;
– Camere video.
Fig.2.6 Senzor de proximitate acustic
Senzorii folosiți în construcția roboților mobili se pot clasifica și în mod independent de gruparea interni-externi, numai pe criteriul funcțional, astfel:
senzori de distanță – sunt senzori care ofera înformatii despre distanța între senzor și obiectul de măsurat din mediul ambiant;
senzori de poziție – sunt senzori care oferă informații despre poziția robotului în termeni absoluți
senzori de mediu – sunt senzori care oferă informații despre diverse proprietăți și caracteristici ale mediului (exemplu: temperatură, culoare)
senzori inerțiali – sunt senzori care masoară proprietați diferențiale ale poziției robotului (exemplu: accelerația) [11]
În ceea ce privește o caracterizare generală a senzorilor se poate face pe baza relației (f) dintre proprietațile fizice de interes ale mediului (e) și informația primită de la un anumit senzor (r) , și ar putea fi modelat prin ecuația:
În principiu, orice tip de senzor ar trebui să includă și un model intern al zgomotului care ar putea afecta senzorul în momentul citirii informației dorite. Problema recuperării informației din mediu din datele primite de la senzor poate fi destul de complexă, însă foarte importantă. Un senzor este considerat instabil dacă pentru variații mici ale intrării, ieșirea se schimbă în mod radical.
În principiu orice tip de senzor poate fi afectat de mai multe tipuri de erori. Dintre acestea, cele mai importante sunt erorile incidentale, erorile sistematice și erorile stohastice. Erorile incidentale apar ocazional și pot avea un efect neprevăzut asupra informației, ele provenind în cea mai mare parte de la măsurători efectuate greșit. Erorile sistematice au o influență predictibilă asupra acurateței informației, acestea provenind de la o interpretare greșită a parametrilor în algoritmii de estimare, sau din cauza unor neconcordanțe (incertitudini) în modelare. În fine, erorile stohastice au un caracter aleator, ele diferînd de fiecare dată când robotul execută aceeași operație. [9]
3 IMPLEMENTARE SISTEM LOCAL
3.1 Sistem local. Arhitectura generală
În implementarea sistemului local se pot identifica două mari componente și anume:
– Interfața cu utilizatorul (GUI) care se ruleaza de pe un dispozitiv ce ruleaza sistemul de operare Android ce poate fi Smartphone sau Tableta. Aplicația este creată în MIT App Inventor.
– Adaptorul de comunicație
Sistemul local reprezintă o parte importantă a proiectului avand în vedere că este partea care se ocupa de controlul datelor care se trimit de la Smartphone spre vehicul, dar și de controlul datelor care vin de la vehicul și trebuie sa ajungă la Smartphone. În această ordine de idei, trebuie precizat că sistemul local prezintă o conexiune Bluetooth care se stabilește cu vehiculul.
3.2 Interfața cu utilizatorul ce rulează pe un Smartphone
GUI sau interfața de lucru cu utilizatorul este un soft realizat cu ajutorul programului de dezvoltare MIT App Inventor, și este folosit la transmisia de comenzi către sistemul mobil (vehicul).
Fig. 3.1 Aplicația Android
3.3 Dezvoltarea Aplicației
Aplicația a fost dezvoltată cu ajutorul platformei MIT App Inventor. Aceasta a fost dezvoltată la rândul ei inițial de către Google, dezvoltatorul sistemului de operare Android, și ulterior a fost preluată și este încă administrat de către MIT (Massachusetts Institute of Technology).
Această platformă permite unei persoane ce este familiarizată cu limbajele de programare să creeze aplicații software pentru sistemul de operare Android.
Folosește o interfață grafică care permite utilizatorilor să plaseze blocuri vizuale pentru a creea p aplicație ce poate rula pe sistemul de operare Android, sistem de operare ce rulează pe o multitudine de dispozitive mobile.
Platforma a fost facută disponibilă la cerere incepand cu 12 Iulie 2010 si lansată publicului larg pe 15 Decembrie 2010. Google a renunțat la această platformă pe 31 Decembrie 2011, și a fost preluată de către MIT Center for Mobile Learning.[12]
Fig. 3.2 Captura din mediul de dezvoltare MIT AppInventor
Fig. 3.3 Captura din mediul de dezvoltare MIT AppInventor
Această parte a programului este pentru afișarea listei de dispozitive descoperite.
Fig. 3.4 Captură din mediul de dezvoltare MIT AppInventor
Această parte de program este destinată definirii butonului de conectare cu dispozitivul. Aceasta verifica dacă adresa MAC a dispozitivului selectat este mai mare de 0 și dacă este încearcă să se conecteze la ea. În cazul în care nu se selectează o adresă MAC a unui dispozitiv din lista cu dispozitive, acesta trimite mesaj de înștiințare „ Nu ați ales un dispozitiv la care să se efectueze conexiunea.” Dacă se întâmplă asta se oprește încercarea de conectare și se afișează mesajul „Dispozitiv Deconectat”.
Fig. 3.5 Captură din mediul de dezvoltare MIT AppInventor
După alegerea dispozitivului din lista, adresa MAC este stocată într-un TinyDB (o mică bază de date).
Fig. 3.6 Captură din mediul de dezvoltare MIT AppInventor
Aici se efectuează practic conectarea la dispozitiv. Dacă aceasta este efectuată cu succes, se va modifica textul din interiorul butonului „Conectare” în „Deconectare” și va apărea pe ecran un mesaj de înștiințare „Dispozitiv Conectat”.
Fig. 3.7 Captură din mediul de dezvoltare MIT AppInventor
În cazul apariției unor erori, această parte de program ne va atenționa de aceasta și va afișa mesaj de eroare pe ecranul telefonului.
Fig. 3.8 Captură din mediul de dezvoltare MIT AppInventor
Butoanele care prin apăsarea lor, trimit via Bluetooth un caracter. Acel caracter reprezintă direcția de deplasare sau acțiunea pe care vehiculul o va efectua.
În cazul de față: W pentru mersul înainte, S pentru mersul înapoi, Q pentru oprirea motoarelor (enable low), E pentru rotația vehicululi la dreapta și Q pentru rotația la stânga.
4 IMPLMENTARE SISTEM MOBIL
4.1 Arhitectura generală
S-a optat pentru o implementare pe platforma oferită de Arduino. Sistemul mobil este alcătuit dintr-o serie de dispozitive, având ca pilon central platforma Arduino UNO.
O vedere de ansamblu asupra sistemului mobil este următoarea:
Fig 4.1 Arhitectura generală a sistemului mobil
Etapele de lucru în realizarea sistemului mobil au fost multe și anevoaioase. Asta și datorită faptului că designul hardware s-a modificat pe parcurs. Vehiculul este echipat cu 4 roți fixe care sunt motoare cât și folosite pentru modificarea direcției. Direcția este de tip tanc.
Una dintre etapele cele mai importante în realizarea proiectului a fost achiziția de piese, realizată din buget propriu, alături de alte piese construite manual.
Fig. 4.2 Sistemul mobil
4.2 Elemente componente. Funcționare
În implementarea structurii hardware a sistemului mobil intră o serie foarte diversificată de componente. Cele mai importante componente sunt:
– placă cu microcontroller Arduino UNO
– 4 motoare de curent continuu cu reductor 1:48 (TGP01S-A130)
– 2 punți H in interiorul L298N
– un senzor de gaze inflamabile HS133
– trei senzori de linie
– buzzer pentru alarmă
– un modul bluetooth Silver Mate RN-42
– șasiu + roti
– regulator de tensiune realizat cu 7805
– bateriile pentru alimentare (6baterii x1.5V pentru motoare, 6baterii x1.5V pentru alimentarea Arduino).
În ceea ce privește alimentarea celor 4 motoare, s-au folosit 2 punți H. Astfel sunt conectate cele doua motoare fixe de pe partea stangă la o punte H, iar celelalte doua motoare fixe de pe partea dreaptă la cealalta punte H.
4.3 Motoarele de curent continuu
Mișcarea vehicului este asigurată de către 4 motoare de curent continuu cu un voltaj nominal de 9V. Motorul electric de curent continuu transformă energia electrică de curent continuu în energie mecanică.[23]
Motoarele de curent continuu sunt alcătuite din 2 parți principale și anume:
– statorul
Fig. 4.3 Statorul motorului de curent continuu
– rotorul
Fig. 4.4 Rotorul motorului de curent continuu
Principiul de funcționare al unui motor de curent continuu:
Statorul cuprinde înfășurarea de excitație, care va produce un câmp magnetic constant produs de niște electromagneți alimentați în curent sau de niște magneți permanenți.
Înfășurarea rotorică este alimentată la o sursă de curent continuu, acest lucru determină debitarea unui curent electric prin spirele rotorice. Asupra laturii spirei aflate sub polul nord va acționa o forță electromangnetică iar asupra laturii spirei de sub polul sud va acționa o forță egală dar de sens contrar.[20]
Din aceasta cauză asupra spirei va acționa un cuplu electromagnetic M care va roti spira.
Fig. 4.5 Principiul de funționare al motoarelor de curent continuu
Înfășurarea rotorică se conecteaza la un colector format din lamele, lamele care intră în contact cu niște perii colectoare. Aceste perii colectoare au rolul de a alimenta înfășurarea rotorică.
Polaritați care iau naștere în stator atrag polaritațile de semne opuse care iau naștere în rotor, până când să se alinieze, moment în care periile colectoare, chiar înainte de aliniere, se mută pe lamelele următoare care au rolul de a alimenta următoarele spire care vor susține mișcarea rotorului.
Fig. 4.6 Principiul de rotire
Caracteristici constructive ale motorului de curent continuu TGP01S-A130:
Fig. 4.7 Elemente constructive al motorului TGP01S-A130
O particularitate foarte importantă a motorului TGP01S-A130 o reprezintă reductorul 1:48, folosit pentru obținerea unor rapoarte de transmisie foarte bune. [19]
4.4 Regulatorul de tensiune
Din cauza faptului că în sistemul mobil este nevoie și de tensiuni de 5V ( de exemplu pentru alimentarea L298N sau alimentarea senzorului de gaz), cu toate că Arduino oferă o ieșire de 5V, din cauza plasării pieselor pe șasiu, și datorită faptului că Arduino alimentează deja sistemul de iluminare dar și modulul bluetooth, s-a optat pentru folosirea unui regulator de tensiune.
Fig. 4.8 Regulatorul de tensiune 7805
A fost ales pentru aceasta integratul 7805. Circuitul Integrat 7805 este un regulator de tensiune ce oferă la ieșire o tensiune de 5V. Valoarea maximă ce poate fi alimentat la pinul de intrare este de 35V, iar cea minimă recomandată este de 7.5V.
Fig. 4.9 Regulatorul de tensiune 7805
Dacă tensiunea de intrare este apropiată de 7.5V, 7805 nu va produce căldură și astfel nu este nevoie de un radiator. Cu cât creștem valoarea de intrare cu atât va produce mai multă căldură și apare necesitatea folosirii unui radiator.[18]
Fig. 4.10 Circuitul electric al 7805
4.5 Sistemul de iluminare
În cazul folosirii vehiculului într-un mediu cu lumina scăzută a fost implementat un sistem de iluminare a liniei format din 8 led-uri albe.
Pentru a regulă fluxul curentului s-au folosit 8 rezistente, câte una pentru fiecare led, a câte 330Ω.
Comanda sistemului de iluminare se face prin interfața GUI oferită de aplicația Android, unde se găsesc două butoane. Unul pentru a aprinde led-urile, iar celălalt pentru a stinge led-urile.
Fig. 4.11 Vedere a sistemului de iluminare
4.6 Codul de control al directiei pentu Arduino
Pentru a înțelege comenzile primite de la telefon, cu ajutorul modulului bluetooth, Arduino trebuie și el programat. Pentru a face acest lucru am folosit mediul de dezvoltare oferit de producător.
int incomingByte; //O variabila folosita pentru citirea datelor primite pe interfata seriala
int motor1 = 9; //Pinul folosit pentru comandarea primelor doua motoare
int motor2 = 10; //Pinul folosit pentru comandarea celorlalte doua motoare
int enablePin = 8; // pinurile de enable pe L298n
void setup() {
Serial.begin(9600); // initializarea comunicatiei seriale la 9600 baud
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(enablePin, OUTPUT);}
void loop() {
if (Serial.available() > 0) // verificam daca se primesc date
{
incomingByte = Serial.read(); //citim cel mai vechi byte din buffer
if (incomingByte == 'W') { // daca primim W vehiculul va merge inainte
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (incomingByte == 'S') { // daca primim S vehiculul va merge inapoi
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, HIGH);
}
if (incomingByte == 'D') { // daca primim D vehiculul se va opri
digitalWrite(enablePin, LOW);
}
if (incomingByte == 'E') { // daca primim E vehiculul se va roti la dreapta
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
if (incomingByte == 'Q') { // daca primim Q vehiculul se va roti la stanga
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
} } }
4.7 Driverul de motoare (L298N)
Pentru a putea controla cele 4 motoare de curent continuu este necesară folosirea unui driver de motoare. Pentru acest driver am optat pentru folosirea a L298N. Intern acesta este compus din două punți H cu ajutorul cărora vom putea modifica sensul de funcționare al motoarelor.
Fig 4.12 Structura interna a L298N
Deoarece intern, L298N nu este dotat cu diode care să combată fluctuațiile de tensiune, este nevoie să le adăugăm noi. Diodele D1-D8 sunt folosite pentru acest motiv. Am optat pentru diode Schottky, mai exact 1N5819 (Schottky Barrier Rectifiers).
Pinii ENA, ENB și IN1, IN2, IN3, IN4 sunt porturi logice TTL standard (5V) ceea ce face ușoară interconectarea cu majoritatea microcontrollerelor. Porturile ENA și ENB sunt folosite pentru a porni motoarele (ON) atunci când primesc un semnal digital HIGH (5V), și să le oprească (OFF) atunci când primesc un semnal digital LOW (0V) sau cu ajutorul PWM se poate controla viteza de deplasare.
Un nivel TTL trimis la porturile IN1, IN2, IN3 sau IN4, va avea ca urmare emiterea unei tensiuni Vm (curentul pentru motoare).
Fig. 4.13 Schema driverului de motoare
Mai sus se poate observa folosirea unu HEX inverter (7404/74LS04) cu ajutorul căruia putem controla motoarele folosind doar 3 pini ai microcontrollerului. [14]
Puntea H are numele derivat de la modul obișnuit de desenare a circuitului. Aceasta este singura cale de tip solid state de a comanda motorul în ambele direcții.
Principiul de funcționare al punții H este următorul:
Dacă tranzistoarele Q1 și Q3 se deschid, curentul va curge prin motor de la terminalul 1 la 2, determinând motorul să se rotească în sensul acelor de ceasornic (de exemplu), și dacă Q2 și Q4 se deschid, curentul va curge de la terminalul 2 la 1 determinând motorul să se rotească în direcția opusă. Motorul poate fi și frânat prin deschiderea tranzistoarelor Q2 și Q3 sau a tranzistoarelor Q1 și Q4. Totuși, dacă tranzistoarele Q1 și Q2 se deschid, în acest caz avem un scurtcircuit între Vcc și masă, ceea ce va duce la defectare tranzistoarelor. Unele punți H, sunt însă mult mai complicate deoarece pot fi prevăzute cu circuite de protecție la scurtcircuit, tranzistori MOSFET de putere sau protecție la supraîncălzire.
Fig. 4.14 Principiul de funcționare al punții H
4.8 Tehnologia Bluetooth
În 1994 un grup de ingineri de la Ericsson, o companie Suedeză, a inventat o tehnologie de comunicație wireless, care mai târziu a fost numită Bluetooth. În 1998 grupul original de companii care vâre promovau tehnologia – Ericsson, Intel, Nokia, Toshiba și IBM – s-au pus de acord să formeze Bluetooth Special Interest Group sau SÂG. Cum nu o singură companie deține legal tehnologia, membrii SÂG lucrează împreună pentru a prezerva, educa și a promova tehnologia Bluetooth ca un mijloc de a aduce diverse dispozitive în lumea conectată.
Numele de Bluetooth vine de la Regele Danez Harald Blatand sau Harold Bluetooth în engleză. Regele Blatand a unit facțiunile care erau în război în ceea ce sunt astăzi Norvegia, Suedia și Danemarca. Similar, Tehnologia Bluetooth a fost creată ca un standard liber pentru a permite conectivitatea și colaborarea dintre diverse produse și industrii.
Tehnologia Bluetooth este o tehnologie de comunicație pe distanțe scurte care este simplă, securizata și se găsește oriunde. Se poate găsi în miliarde de dispozitive care variază de la telefoane mobile și calculatoare, la echipamente medicale și sisteme de divertisment. Este destinat pentru înlocuirea cablurilor de conectare a echipamentelor, menținând în același timp un nivel înalt de siguranță.
Principalele caracteristici ale tehnologiei Bluetooth sunt: rezistență mare, consum scăzut de putere și costul scăzut. Specificațiile Bluetooth definesc o structură uniformă pentru o gamă largă de dispozitive să se conecteze și să comunice între ele.
Când două dispozitive Bluetooth se conectează între ele, procesul se numește “pairing” (împerechere). Structura tehnologiei Bluetooth permite oricărui dispozitiv Bluetooth să se conecteze la orice alt dispozitiv Bluetooth aflat în apropierea lui.
Conexiunile intre dispozitive Bluetooth permit acestora să comunice fără fir prin intermediul rețelelor ad-hoc de rază mică numite și “piconets”.
Rețelele “piconets” se realizează dinamic și automat atunci când dispozitivele Bluetooth intra și ies din raza radio de acțiune, fapt care înseamnă că se poate realiza o conexiune oricând și oriunde este convenient utilizatorului.
Fiecare dispozitiv dintr-o rețea piconet poate să comunice simultan cu până la 7 alte dispozitive care la rândul lor pot fi conectate la alte rețele piconet. Asta înseamnă că modurile în care dispozitivele Bluetooth pot fi interconectate este aproape nelimitat.
Specificația principală a tehnologiei presupune o rază minimă de 10 metrii, dar nu exista o limită specifică, producătorii putând să modifice propriile implementări pentru a oferii raza de acțiune necesară în funcție de cerința.
Tehnologia Bluetooth operează în banda industrială, științifică și medicală (ISM) între 2.4 și 2.485 GHz, folosind spectru distribuit, salt în frecvența (FH), semnal full-duplex la o rata nominală de 1600 hops/sec. Banda ISM de 2.4GHz este disponibilă în majoritatea țărilor fără licență.
Capabilitatea de salt în frecvența adaptiv (AFH) al tehnologiei Bluetooth a fost proiectată să reducă interferentele intre tehnologiile wireless care folosesc spectrul de 2.4GHz. AFH funcționează în spectru pentru a profita de frecvențele disponibile. Aceasta este realizată căutând celelalte dispozitive care funcționează în acest spectru și evitând frecvențele pe care acestea le folosesc. Saltul în frecvența se realizează între 79 de frecvente situate la interval de 1MHz, pentru a spori imunitatea la interferențe și pentru a permite o transmisie mai eficientă.
Raza de acțiune este specifică pe aplicație și cu toate că nu exista o limită, producătorii pot creea propriile implementări pentru a fi folosite după caz.
Raza de acțiune poate varia după clasa radio folosită în implementare:
Clasa 3 – raza de 1m
Clasa 2 – raza de 10m. Cele mai întâlnite. Se găsesc deobicei în telefoanele mobile.
Clasa 1 – raza de 100m. Folosite în general în cazuri industriale.
Cea mai des întâlnită clasă este clasa 2 care consumă 2.5mW. Tehnologia Bluetooth a fost proiectată să aibă un consum redus de putere. De asemenea când dispozitivul este inactiv, acesta nu consuma nimic.
Tehnologia Generic Alternate MAC/PHY din Versiunea 3.0 oferă posibilitatea de descoperire a AMP-urilor pentru dispozitivele de viteză mare și pornește radio doar atunci când este nevoie de transfer de date, oferind astfel o oprimizare a consumului cât și ajutând la securitate.
Modulația datelor este asemănătoare cu cea de la WLAN, adică împărțirea spectrului alocat în mai multe canale și o modulație Gaussian frequency-shift keying (GFSK) a datelor pe fiecare canal. Spectrul alocat este situat în banda de 2,4GHz, ca și WLAN.
Viteza obișnuită de transfer este de 1Mbps.
Conectarea unui dispozitiv Bluetooth la un calculator gazdă se realizează printr-un software de descoperire.[15]
4.8.1 Bluetooth v1.0 and v1.0B
Versiunile 1.0 și 1.0B au avut multe probleme, și producătorii au întâmpinat dificultăți în a-și face produsele să fie interoperabile. Versiunile 1.0 și 1.0B includeau adrese hardware obligatorii (BD_ADDR), transmise în procesul de conectare, ceea ce a fost un dezavantaj major pentru anumite servicii gândite pentru folosirea în mediul Bluetooth.
4.8.2 Bluetooth v1.1
Parte din Standardul IEEE 802.15.1-2002. Multe erori găsite în versiunea 1.0B au fost rezolvate. A fost adăugată posibilitatea de a folosi canale ne-encriptate. De asemenea a primit un indicator pentru puterea semnalului recepționat.(RSSI)
4.8.3 Bluetooth v1.2
Această versiune este compatibilă cu versiunea 1.1 și principalele îmbunătățiri includ:
sporirea vitezei de conectare și descoperire.
AFH-spectru împrăștiat cu salt în frecvența adaptiv, ce îmbunătățește rezistenta la interferențe prin evitarea folosirii frecventelor înghesuite în salt de frecvență.
mărirea vitezei de transmisie, până la 721kbps.
conexiuni sincrone extinse (eSCO), ce îmbunătățesc calitatea vocei în legături audio prin permiterea retransmiterii pachetelor corupte, și opțional creșterea latentei audio pentru a îmbunătății transferul de date.
standardul IEEE 802.15.1 – 2005.
4.8.4 Bluetooth v2.0 + EDR
Această versiune de Bluetooth a fost lansată în 2004 și este compatibil cu versiunea precedenta v1.2. Principala diferența este introducerea de EDR (Enhanced Data Rate) pentru transfer de date mai rapid. Rata nominală a EDR este de aproximativ 3 Mbps, cu toate că practic viteza de transfer nu depășește 2.1 Mbps. EDR folosește o combinație de modulație GFSK și PSK cu două variante π/4-DQPSK și 8DPSK. EDR poate oferii un consum redus printr-un duty cycle redus.
Specificația lansată ca “Bluetooth v2.0 + EDR” specifică că EDR este o specificație opțională. Pe lângă EDR, versiunea 2.0 aduce și alte îmbunătățiri minore.
4.8.5 Bluetooth v2.1 + EDR
Versiunea 2.1 + EDR este complet compatibilă cu 1.2 și a fost adoptată de SIG pe 26 iulie 2007.
Cea mai importantă caracteristică a v2.1 este împerecherea sigură simplă (SSP-secure simple pairing): aceasta îmbunătățește procedura de pairing pentru dispozitivele Bluetooth, dar în același timp crește folosirea și puterea securității.
v2.1 aduce diverse ale îmbunătățiri, incluzând “Extended Inquiry Response” (EIR) care oferă mai multă informație în procedura de interogare pentru a îmbunătății filtrarea dispozitivelor înaintea conexiunii.
4.8.6 Bluetooth v3.0 + HS
Versiunea 3.0 + HS a Bluetooth a fost adoptată de SIG pe 21 Aprilie 2009. Bluetooth 3.0 + HS oferă o viteză teoretică de transfer de date de până la 24Mbps, cu toate că nu pe legătura Bluetooth însuși. În schimb legătura Bluetooth este folosită pentru negociere și stabilire, și traficul de date este efectuat pe o legătură 802.11.
Partea de HS (High-Speed) nu este obligatorie, și din această cauză doar dispozitivele care suporta “+HS” vor fi compatibile cu transferul de date de viteză înaltă.
4.8.7 Bluetooth v4.0
Versiunea 4.0 a fost finalizata de SIG și adoptată începând cu 30 Iunie 2010. Aceasta include protocoalele: Classic Bluetooth, Bluetooth High Speed și Bluetooth Low Energy. Bluetooth High Speed este bazat pe tehnologia Wi-Fi.[16]
4.8.8 Modulul Bluetooth Mate Silver RN-42
Modulul RN-42 a fost proiectat special pentru a fi folosit cu Arduino. Aceste module wireless funcționează în regim serial (RX/TX). Suporta orice rată de transfer între 2400 și 115200bps. Este setat standard la 9600bps.
Fig. 4.15 Modulul Bluetooth Mate Silver RN-42
RN-42 este un modul bluetooth clasa 2, ceea ce înseamnă că raza maximă de acțiune este de 10m. Este ideal pentru a fi folosit în aplicații independente ce sunt alimentate cu baterii. RN-42 folosește doar 26uA în modul “sleep” , dar în același timp rămâne vizibil și accepta conexiuni.
Bluetooth SilverMate este dotat cu regulatoare de tensiune, astfel încât poate fi alimentat cu orice tensiune între 3.3VDC și 6VDC. [17]
Caracteristici:
– Frecvența: 2.4 ~ 2.524 GHz
– Alimentare: 3.3 – 6 V
– Consum: 25mA (în medie)
– Conexiune criptată
– Rata de transfer: 2400 – 115200bps
– Temperatura de operare: -40oC ~ +70oC
– Prevăzut cu antenă încorporată
– Dimensiuni: 1.75×0.65"
4.9 Senzorul de gaz HS133 si alarma
Senzorul de gaz HS 133 este un senzor cu durata lungă de viață și sensibilitate ridicată. Poate fi folosit atât domestic cât și industrial. Este potrivit pentru detectarea scurgerilor de gaz GPL, izobutan, propan și metan.
Fig. 4.16 Structura si configurația senzorului HS133
Senzorul folosește pentru funcționare o rezistență de încălzire împreună cu un senzor electro-chimic. Ieșirea este un semnal analogic ce poate fi citit cu ajutorul unei intrări analogice care se găsește pe Arduino. [21]
Fig. 4.17 Schema montajului senzorului HS133
Montajul senzorului se face conectând cei doi pini `A` împreună și cei doi pini `B` împreună. Cum tensiunea necesară rezistenței de încălzire este de 5V putem conecta un pin `H` împreună cu doi pini `A` sau doi pini `B` la sursă externă de 5V, celălalt pin `H` fiind conectat la masă (GND).
Pentru a controla sensibilitatea senzorului se folosește o rezistență variabilă . Valoarea acestei rezistente poate fi oricare intre 2k și 47k ohmi. Cu cât valoarea este setată mai mică cu atât senzorul este mai puțin sensibil. Însă dacă folosim o valoare ridicată, senzorul nu mai este precis la concentrații mari de gaz.
Producătorul recomanda o perioadă de calibrare a senzorului („burn-in time”) înainte de utilizare, de cel puțin 24 de ore pentru că echipamentul să funcționeze optim.
Pentru a cunoaște când nivelul de gaz este ridicat, am optat pentru integrarea unui buzzer pentru a fi declanșat în cazul în care nivelul gazului depășește un prag ales (în acest caz 60 din 100). Buzzerul a fost conectat la un pin digital dotat cu PWM iar în momentul în care pragul este depășit, alarma va fi activată.
Fig. 4.18 Senzorul HS133 si Buzzer-ul
4.10 Senzorul de reflectanta QTR-1RC
Există două tipuri de senzori de reflectanta: analogic și digital. Am ales folosirea unui senzor digital din mai multe motive, motivul principal însă fiind că se lucrează mai ușor cu el. Senzorul digital de reflectanta QTR-1RC este compus dintr-o pereche formată dintr-un LED infraroșu și un fototranzistor. Fototranzistorul folosește un circuit cu un condensator. Când condensatorul se descarcă se măsoară timpul de descărcare. O descărcare mai rapidă înseamnă o suprafață cu reflexie mai mare (alb).
Fig. 4.19 Senzorul de reflectanta QTR-1RC
Senzorul a fost proiectat pentru a fi folosit la nivel paralel cu suprafața cercetată. Din cauza dimensiunilor reduse, pot fi montate și aranjate ușor mai multe unități pentru diferite aplicații, una din aceste aplicații fiind și „line follow” sau urmăritul unei linii. Curentul folosit este de 17mA iar ieșirea este un semnal digital. Distanța optimă de detectare este de 3mm iar distanța maximă este de 9,5mm. [22]
Cablarea unui senzor se realizează astfel:
Vin al QTR-1RC la un pin digital al Arduino
OUȚ al QTR-1RC la un alt pin digital al Arduino
GND al QTR-1RC la un pin GND al Arduino.
4.11 Realizarea sistemului de urmărire a liniei „line follow”
Din punct de vedere hardware pentru realizarea acestei abilități al vehiculului am folosit 3 senzori QTR-1RC plasați la aproximativ 5mm de suprafața solului împreună cu ansamblul deja format din Arduino, driverul de motoare și sasiu.
Fig. 4.20 Senzorii sistemului de urmarire a liniei
Din punct de vedere software am optat pentru folosirea librăriei pentru Arduino, oferită de producătorul senzorilor, și anume „QTRSensors”. Aceasta librărie a fost dezvoltată pentru a fi folosită atât împreună cu senzori analogici cât și cu cei digitali și poate face diferența între cele două tipuri de senzori oferind astfel o interfață comună.
Singura diferență între cele două tipuri de senzori, cei analogici și cei digitali, este regăsita în timpul de citire a valorilor. Senzorii digitali pot fi citiți toți odată în paralel, dar fiecare necesita un timp de citire care poate fi de până la 3ms. Cei analogici folosesc un convertor analog-digital (ADC) și deci trebuie citiți secvențial.
Înainte de a folosi senzorii aceștia trebuiesc calibrați. Asta înseamnă că trebuiesc setate nivelurile maxime de reflectanta și cele minime (linie/negru și mediu/alb). Acest pas este realizat tot cu ajutorul librăriei „QTRSensors”, prin folosirea funcției „calibrate()” respectiv „calibratedMinimumOn[]” și „calibratedMaximumOn[]”. Am ales ca durata acestei calibrări să fie de 10 secunde.
Finalizarea sistemului se realizează prin programarea Arduino în funcție de poziția liniei în raport cu senzorii. Această poziție este realizată tot de librăria „QTRSensors”, mai exact cu ajutorul funcției „position()” . În momentul în care linia ajunge în zona primului senzor poziția returnată va avea valoarea apropiată de 0, iar când va ajunge în zona ultimului senzor valoarea returnată va fi apropiată de 1000. Astfel când valoarea „position()” va fi mai mare de 750 vehicolul se va roti spre dreapta iar când valoarea va fi mai mică de 350 acesta se va roti spre stânga. Orice valoare situată între 350 și 750 va face vehicolul să se deplaseze înainte.
În paralel cu această funcție va funcționa în continuare și senzorul de gaz, însoțit de alarmă prin buzzer.
Din cauza faptului că vehiculul se deplaseaza cu o viteză prea mare pentru ca senzorii de reflectantă sa realizeze citirea in timp util, am fost nevoiti să micșorăm viteza de deplasare. Pentru a realiza acest lucru am optat pentru utilizarea PWM.
PWM sau modulația impulsurilor în lățime (Pulse Width Modulation) este o tehnică de modulație a impulsurilor în timp (PTM).
Semnalele PWM sunt semnale dreptunghiulare cu frecventă fixă dar cu factorul de umplere modificat dinamic.
Principiul fundamental PWM – factorul de umplere al unui semnal PWM crește, puterea si tensiunea medie furnizate de PWM cresc în mod liniar.[25]
Fig. 4.21 Forma de undă a unui semnal PWM
PWM este o tehnică folosită pentru a obține rezultate analogice prin mijloace digitale. Controlul digital este folosit pentru a crea un semnal dreptunghiular, un semnal ce oscilaza intre 0 si 5v in cazul nostru.
Această caracteristică este realizată prin modificarea timpului petrecut in limita superioară în comparație cu timpul petrecut în limita inferioară, ne poate oferii tensiuni între 0 si 5v (High și Low).
Durata timpului petrecut in limita superioară (5v) se numește lățimea impulsului. Pentru a obține diverse valori analogice se modifică această lățime a impulsului.
În figura de mai jos se poate observa o durată normală de timp, delimitată de liniile verzi. Cum frecvența PWM a Arduino este de aproximativ 500Hz, liniile verzi delimitează un timp de 2 milisecunde fiecare.
Fig. 4.22 Semnale PWM cu diferiți factori de umplere
Pentru a obtine semnalul PWM se foloseste functia “analogWrite()” pe o scala intre 0 si 255, astfel “analogWrite(255)” reprezinta un factor de umplere (duty cycle) de 100% (tot timpul în limita superioară – 5v), iar “analogWrite(127)” reprezintă un factor de umplere de 50% (jumatate din măsura de timp în limita superioară). [24]
Pentru vehicul s-a folosit un factor de umplere de aproximativ 50%, folosind funcția “analogWrite(130)”.
4.12 Codul Arduino pentru sistemul de urmărire a liniei
#include <QTRSensors.h> //includerea librariei QTRSensors
int enablePin = 10; //declararea pinilor folosiți pentru controlul motoarelor
int motor1 = 8;
int motor2 = 9;
#define NUM_SENSORS 3 // Numărul de senzori folosiți
#define TIMEOUT 2500 // timpul asteptat pentru ca ieșirea senzorului să fie LOW
#define EMITTER_PIN 2 // Senzorii sunt controlați de pinul digital 2 (ON / OFF)
QTRSensorsRC qtrrc((unsigned char[]) {4,5,6}, //definirea pinilor folosiți la citirea datelor de la senzori
NUM_SENSORS, TIMEOUT, EMITTER_PIN);
unsigned int sensorValues[NUM_SENSORS];
void setup ()
{
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(enablePin, OUTPUT);
delay(500);
int i;
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
for (i=0; i < 400; i++)
{qtrrc.calibrate(); // calibrarea senzorilor si aprinderea ledului cât timp se face calibrarea
}
digitalWrite(13,LOW);
Serial.begin(9600);
for (i=0; i < NUM_SENSORS; i++)
{Serial.print(qtrrc.calibratedMinimumOn[i]); // valoarea minimă recepționată de la senzori
Serial.print(' ');
}
Serial.println();
for (i=0; i<NUM_SENSORS; i++)
{Serial.print(qtrrc.calibratedMaximumOn[i]); //valoarea maximă recepționată de la senzori
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void loop()
{
unsigned int position = qtrrc.readLine(sensorValues); //citirea valorilor de la senzori
unsigned char i;
for (i=0; i<NUM_SENSORS; i++)
{Serial.print(sensorValues[i]*10/1000);
Serial.print(' ');
}
Serial.print(" ");
Serial.println(position); //afișarea poziției liniei în raport cu senzorii
delay(100);
if (position > 500 && position < 1500) { //condiția pentru mers înainte
analogWrite(enablePin, 130);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (position < 500) { //condiția pentru întoarcerea la stânga
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
if (position > 1500) { //condiția pentru întoarcerea la dreapta
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
}
Bibliografie
[1] *** Radu Bogdan Rusu, Robotux – a multiagent robot security system. Master's Thesis, Faculty of Automation and Computer Science, Technical University of Cluj-Napoca, Romania, 2004.
[2] *** R. Gartshore, "Autonomous Robotics Exploration of Unknown Enviromments" University of Surrey, Center of Vision, Speech and Signal Processing, School of Electronics and Physical Science, september, 2005.
[3] *** Ing. Mihai DUGULEANĂ Coordonator științific: Prof. dr. ing.Gheorghe Mogan “Învățarea roboților mobile pentru deplasare și manipulare în medii îndustrial”, Brașov 2011
[4] Supreeth Achar, C V Jawahar D Santosh, "Autonomous Image-based Exploration for Mobile Robot Navigation".
[5] Jong-Hoon Kim, "Design of a Fully Autonomous Mobile Pipeline Exploration Robot" B.E., Seoul National University of Technology în Seoul, Seoul, South Korea, Master Degree Thesis 2005.
[6] Scott Thayer, William Whittaker, Christopher Baker, Wolfram Burgard, David Ferguson, Dirk Hahnel, Michael Montemerlo, Aaron, Zachary Omohundro, Charlie Reverte, Warren Whittaker Sebastian Thrun, "Autonomous Exploration and Mapping of Abandoned Mines" Robotics Institute, Computer Science Department, Carnegie Mellon University, Pittsburgh, PA, Stanford University, Stanford, CA, University of Freiburg, Freiburg, Germany, 2002.
[7] Radu Bogdan Rusu, "Sistem Multiagent pentru roboti mobili" Universitatea tehnică din Cluj, Facultatea de Automatică și Calculatoare, Cluj-Napocă, Lucrare de licență 2004.
[8] http://www.irobot.com/
[9] Greu-Adrian Victor, "Transmiterea datelor achiziționate de la senzorii robotului NXT la un PC prin conexiune Bluetooth" UNIVERSITATEA POLITEHNICĂ DIN BUCUREȘTI , FACULTATEA DE INGINERIE ELECTRICĂ, BUCUREȘTI, Lucrare de licență.
[10] *** Mina Fawzy Adly Habib, "Line Tracking Robot Using Infrared cells For Lane keeping assistant purposes" , February 1st, 2010
[11] Cretu Marian, "Sistem autonom de explorare pe bază de microcontroler cu transmisie video wireless și prelucrare de imagini în timp real – Achiziția și procesarea de imagini" UNIVERSITATEA TRANSILVANIA BRASOV , FACULTATEA DE ELECTRONICĂ APLICATĂ , BRASOV, Lucrare de diploma.
[12] http://appinventor.mit.edu
[13] *** Ing. Radu Ghelmeci, Coordonator St. Dr. ing. Marian Dima Masterat: “Sisteme mecanice avansate”, lucrarea: “Sistem sensorial de localizare a platformelor mobile robotizate”, Universitatea tehnică de construcții din București, Facultatea de Utilaj Tehnologic 2011
[14] http://www.bristolwatch.com/L298N/index.htm
[15] http://www.bluetooth.com/Pages/Basics.aspx
[16] http://en.wikipedia.org/wiki/Bluetooth#Specifications_and_features
[17] https://www.sparkfun.com/products/10393
[18] Datasheet 7805
[19] Datasheet TGP01S-A130
[20] http://www.scribd.com/doc/50020674/Motorul-de-Curent-Contînuu
[21] https://www.sparkfun.com/products/10393
[22] http://www.pololu.com/product/2459
[23] Marian PEARSICĂ, Mădălina Petrescu "Mașini electrice", Editura Academiei Forțelor Aeriene "Henri Coanda" , Brasov 2007
[24] http://arduino.cc/en/Tutorial/PWM
[25] Dumitru Marian-Bogdan, Prof. Coordonator: Conf. Univ. Dr. Ing. Mihai Bogdan – „Instrumentul Virtual – PWM”, Universitatea „Lucian Blaga” Sibiu, Facultatea de Inginerie „Herman Oberth”.
[26] http://arduino.cc/en/Main/ArduinoBoardUno
[27] http://www.atmel.com/devices/atmega328.aspx
ANEXA
Codul complet pentru Arduino
#include <QTRSensors.h> //includerea librariei QTRSensors.h
int incomingByte; // pentru datele ce vin pe interfața serială
int iSensorValue = 0; // valoarea senzorului citită de la pinul analogic (între 0 si 1023)
byte bySensorVal = 0; // citește valoarea de la senzor ca valori intre 0 și 100
char cMsg[124]; // șirul de caractere ce va fi afișat pe monitorul serial.
int motor1 = 8; //declararea pinilor pentru controlul motoarelor
int motor2 = 9;
int enablePin = 10;
int LED = 13; //declararea pinului pentru controlul sistemului de iluminare
#define NUM_SENSORS 3 // numarul de senzori de linie folositi
#define TIMEOUT 2500 // asteapta 2500 de microsecunde pentru ca iesirea sa fie LOW
#define EMITTER_PIN 2 //pinul de control al senzorilor (Vcc)
QTRSensorsRC qtrrc((unsigned char[]) {4,5,6},
NUM_SENSORS, TIMEOUT, EMITTER_PIN); // desemnarea pinilor pentru citirea senzorilor
unsigned int sensorValues[NUM_SENSORS];
void setup() {
Serial.begin(9600); //setarea ratei de transmisie a conexiunii seriale
pinMode(3, OUTPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(enablePin, OUTPUT);
delay(500); //algoritmul pentru calibrarea senzorilor de reflectanta
int i;
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
for (i=0; i < 400; i++)
{qtrrc.calibrate();
}
digitalWrite(13,LOW);
Serial.begin(9600); // valoarea minimă recepționată de la senzori
for (i=0; i < NUM_SENSORS; i++)
{Serial.print(qtrrc.calibratedMinimumOn[i]);
Serial.print(' ');
}
Serial.println();
for (i=0; i<NUM_SENSORS; i++) // valoarea maximă recepționată de la senzori
{Serial.print(qtrrc.calibratedMaximumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void linie() //codul pentru urmărirea liniei
{
senzor(); //rularea in paralel a senzorului de gaz
unsigned int position = qtrrc.readLine(sensorValues); // citirea datelor de la cei 3 senzori si aflarea pozitiei liniei in raport cu senzorii
unsigned char i;
for (i=0; i<NUM_SENSORS; i++)
{Serial.print(sensorValues[i]/1000);
Serial.print(' ');
}
Serial.print(" ");
Serial.println(position);
delay(100);
if (position > 500 && position < 1500) { { //condiția pentru mers înainte
analogWrite(enablePin, 100);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (position < 500) {{ //condiția pentru întoarcerea la stânga
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
if (position > 1500) {{ //condiția pentru întoarcerea la dreapta
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
}
void comanda() { //codul pentru controlul directiei de mers si a sistemului de iluminat
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'X') {
digitalWrite(LED, HIGH);
}
if (incomingByte == 'C') {
digitalWrite(LED, LOW);
}
if (incomingByte == 'W') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (incomingByte == 'S') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, HIGH);
}
if (incomingByte == 'D') {
digitalWrite(enablePin, LOW);
}
if (incomingByte == 'E') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
if (incomingByte == 'Q') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
}
}
void senzor() { //functia pentru senzorul de gaz
iSensorValue = analogRead(A0);
bySensorVal = map(iSensorValue, 0, 1023, 0, 100);
if (bySensorVal > 60) {
buzz(3, 2500, 200); // activarea buzzer-ului pe pinul 3 la frecventa de 2500 pentru 200 de milisecunde
delay(150); // face pauza între buzz-uri
}
}
void buzz(int targetPin, long frequency, long length) { //functia pentru alarma (buzzer)
long delayValue = 1000000/frequency/2; // calculeaza valoarea delay-ului dintre tranzitii
long numCycles = frequency * length/ 1000; // calculam numarul de cicluri care este cicluri pe secunda impartit la nr de secunde si inmultit cu frecventa.
for (long i=0; i < numCycles; i++){ // pentru timpul calculat mai sus
digitalWrite(targetPin,HIGH); // punem buzzerul in regim HIGH pentru a impinge diafragma
delayMicroseconds(delayValue); // asteptam valoarea calculata de timp
digitalWrite(targetPin,LOW); // punem buzzerul in regim LOW pentru a retrage diafragma
delayMicroseconds(delayValue); // asteptam iar valoarea calculata de timp.
}
}
void loop() { // bucla
senzor();
comanda();
if (incomingByte == 'A') { //daca trimitem de la telefon litera A vehiculul trece in regim de line follow
linie();
}
}
Bibliografie
[1] *** Radu Bogdan Rusu, Robotux – a multiagent robot security system. Master's Thesis, Faculty of Automation and Computer Science, Technical University of Cluj-Napoca, Romania, 2004.
[2] *** R. Gartshore, "Autonomous Robotics Exploration of Unknown Enviromments" University of Surrey, Center of Vision, Speech and Signal Processing, School of Electronics and Physical Science, september, 2005.
[3] *** Ing. Mihai DUGULEANĂ Coordonator științific: Prof. dr. ing.Gheorghe Mogan “Învățarea roboților mobile pentru deplasare și manipulare în medii îndustrial”, Brașov 2011
[4] Supreeth Achar, C V Jawahar D Santosh, "Autonomous Image-based Exploration for Mobile Robot Navigation".
[5] Jong-Hoon Kim, "Design of a Fully Autonomous Mobile Pipeline Exploration Robot" B.E., Seoul National University of Technology în Seoul, Seoul, South Korea, Master Degree Thesis 2005.
[6] Scott Thayer, William Whittaker, Christopher Baker, Wolfram Burgard, David Ferguson, Dirk Hahnel, Michael Montemerlo, Aaron, Zachary Omohundro, Charlie Reverte, Warren Whittaker Sebastian Thrun, "Autonomous Exploration and Mapping of Abandoned Mines" Robotics Institute, Computer Science Department, Carnegie Mellon University, Pittsburgh, PA, Stanford University, Stanford, CA, University of Freiburg, Freiburg, Germany, 2002.
[7] Radu Bogdan Rusu, "Sistem Multiagent pentru roboti mobili" Universitatea tehnică din Cluj, Facultatea de Automatică și Calculatoare, Cluj-Napocă, Lucrare de licență 2004.
[8] http://www.irobot.com/
[9] Greu-Adrian Victor, "Transmiterea datelor achiziționate de la senzorii robotului NXT la un PC prin conexiune Bluetooth" UNIVERSITATEA POLITEHNICĂ DIN BUCUREȘTI , FACULTATEA DE INGINERIE ELECTRICĂ, BUCUREȘTI, Lucrare de licență.
[10] *** Mina Fawzy Adly Habib, "Line Tracking Robot Using Infrared cells For Lane keeping assistant purposes" , February 1st, 2010
[11] Cretu Marian, "Sistem autonom de explorare pe bază de microcontroler cu transmisie video wireless și prelucrare de imagini în timp real – Achiziția și procesarea de imagini" UNIVERSITATEA TRANSILVANIA BRASOV , FACULTATEA DE ELECTRONICĂ APLICATĂ , BRASOV, Lucrare de diploma.
[12] http://appinventor.mit.edu
[13] *** Ing. Radu Ghelmeci, Coordonator St. Dr. ing. Marian Dima Masterat: “Sisteme mecanice avansate”, lucrarea: “Sistem sensorial de localizare a platformelor mobile robotizate”, Universitatea tehnică de construcții din București, Facultatea de Utilaj Tehnologic 2011
[14] http://www.bristolwatch.com/L298N/index.htm
[15] http://www.bluetooth.com/Pages/Basics.aspx
[16] http://en.wikipedia.org/wiki/Bluetooth#Specifications_and_features
[17] https://www.sparkfun.com/products/10393
[18] Datasheet 7805
[19] Datasheet TGP01S-A130
[20] http://www.scribd.com/doc/50020674/Motorul-de-Curent-Contînuu
[21] https://www.sparkfun.com/products/10393
[22] http://www.pololu.com/product/2459
[23] Marian PEARSICĂ, Mădălina Petrescu "Mașini electrice", Editura Academiei Forțelor Aeriene "Henri Coanda" , Brasov 2007
[24] http://arduino.cc/en/Tutorial/PWM
[25] Dumitru Marian-Bogdan, Prof. Coordonator: Conf. Univ. Dr. Ing. Mihai Bogdan – „Instrumentul Virtual – PWM”, Universitatea „Lucian Blaga” Sibiu, Facultatea de Inginerie „Herman Oberth”.
[26] http://arduino.cc/en/Main/ArduinoBoardUno
[27] http://www.atmel.com/devices/atmega328.aspx
ANEXA
Codul complet pentru Arduino
#include <QTRSensors.h> //includerea librariei QTRSensors.h
int incomingByte; // pentru datele ce vin pe interfața serială
int iSensorValue = 0; // valoarea senzorului citită de la pinul analogic (între 0 si 1023)
byte bySensorVal = 0; // citește valoarea de la senzor ca valori intre 0 și 100
char cMsg[124]; // șirul de caractere ce va fi afișat pe monitorul serial.
int motor1 = 8; //declararea pinilor pentru controlul motoarelor
int motor2 = 9;
int enablePin = 10;
int LED = 13; //declararea pinului pentru controlul sistemului de iluminare
#define NUM_SENSORS 3 // numarul de senzori de linie folositi
#define TIMEOUT 2500 // asteapta 2500 de microsecunde pentru ca iesirea sa fie LOW
#define EMITTER_PIN 2 //pinul de control al senzorilor (Vcc)
QTRSensorsRC qtrrc((unsigned char[]) {4,5,6},
NUM_SENSORS, TIMEOUT, EMITTER_PIN); // desemnarea pinilor pentru citirea senzorilor
unsigned int sensorValues[NUM_SENSORS];
void setup() {
Serial.begin(9600); //setarea ratei de transmisie a conexiunii seriale
pinMode(3, OUTPUT);
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(LED, OUTPUT);
pinMode(enablePin, OUTPUT);
delay(500); //algoritmul pentru calibrarea senzorilor de reflectanta
int i;
pinMode(13, OUTPUT);
digitalWrite(13,HIGH);
for (i=0; i < 400; i++)
{qtrrc.calibrate();
}
digitalWrite(13,LOW);
Serial.begin(9600); // valoarea minimă recepționată de la senzori
for (i=0; i < NUM_SENSORS; i++)
{Serial.print(qtrrc.calibratedMinimumOn[i]);
Serial.print(' ');
}
Serial.println();
for (i=0; i<NUM_SENSORS; i++) // valoarea maximă recepționată de la senzori
{Serial.print(qtrrc.calibratedMaximumOn[i]);
Serial.print(' ');
}
Serial.println();
Serial.println();
delay(1000);
}
void linie() //codul pentru urmărirea liniei
{
senzor(); //rularea in paralel a senzorului de gaz
unsigned int position = qtrrc.readLine(sensorValues); // citirea datelor de la cei 3 senzori si aflarea pozitiei liniei in raport cu senzorii
unsigned char i;
for (i=0; i<NUM_SENSORS; i++)
{Serial.print(sensorValues[i]/1000);
Serial.print(' ');
}
Serial.print(" ");
Serial.println(position);
delay(100);
if (position > 500 && position < 1500) { { //condiția pentru mers înainte
analogWrite(enablePin, 100);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (position < 500) {{ //condiția pentru întoarcerea la stânga
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
if (position > 1500) {{ //condiția pentru întoarcerea la dreapta
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
}
void comanda() { //codul pentru controlul directiei de mers si a sistemului de iluminat
if (Serial.available() > 0) {
incomingByte = Serial.read();
if (incomingByte == 'X') {
digitalWrite(LED, HIGH);
}
if (incomingByte == 'C') {
digitalWrite(LED, LOW);
}
if (incomingByte == 'W') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, LOW);
}
if (incomingByte == 'S') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, HIGH);
}
if (incomingByte == 'D') {
digitalWrite(enablePin, LOW);
}
if (incomingByte == 'E') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, LOW);
digitalWrite(motor2, HIGH);
}
if (incomingByte == 'Q') {
digitalWrite(enablePin, HIGH);
digitalWrite(motor1, HIGH);
digitalWrite(motor2, LOW);
}
}
}
void senzor() { //functia pentru senzorul de gaz
iSensorValue = analogRead(A0);
bySensorVal = map(iSensorValue, 0, 1023, 0, 100);
if (bySensorVal > 60) {
buzz(3, 2500, 200); // activarea buzzer-ului pe pinul 3 la frecventa de 2500 pentru 200 de milisecunde
delay(150); // face pauza între buzz-uri
}
}
void buzz(int targetPin, long frequency, long length) { //functia pentru alarma (buzzer)
long delayValue = 1000000/frequency/2; // calculeaza valoarea delay-ului dintre tranzitii
long numCycles = frequency * length/ 1000; // calculam numarul de cicluri care este cicluri pe secunda impartit la nr de secunde si inmultit cu frecventa.
for (long i=0; i < numCycles; i++){ // pentru timpul calculat mai sus
digitalWrite(targetPin,HIGH); // punem buzzerul in regim HIGH pentru a impinge diafragma
delayMicroseconds(delayValue); // asteptam valoarea calculata de timp
digitalWrite(targetPin,LOW); // punem buzzerul in regim LOW pentru a retrage diafragma
delayMicroseconds(delayValue); // asteptam iar valoarea calculata de timp.
}
}
void loop() { // bucla
senzor();
comanda();
if (incomingByte == 'A') { //daca trimitem de la telefon litera A vehiculul trece in regim de line follow
linie();
}
}
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: Vehicul Inteligent (ID: 164076)
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.
