Robot autonom de parcurgere și mapare a unui labirint [303890]
Universitatea “Politehnica ” [anonimizat] a unui labirint
Proiect de diplomă
Prezentat ca cerință parțială pentru obținerea titlului de
Inginer în domeniul Electronică si Telecomunicații
programul de studii de licență Tehnologii și Sisteme de Telecomunicații
Conducători științifici Absolvent: [anonimizat].Dr.Ing. Octavian FRATU Liviu Constantin TURICĂ
As.Ing. Răzvan CRĂCIUNESCU
Anul 2016
Copyright © 2016 , Liviu Constantin TURICĂ
Toate drepturile rezervate
Autorul acordă UPB dreptul de a reproduce și de a [anonimizat] 11
Listă de tabele 13
Listă de acronime 15
Introducere 17
Capitol 1 Noțiuni teoretice necesare dezvoltării practice 19
1.1 Descrierea microcontrolerului Atmega328 19
1.1.1 Descrierea succintă a pinilor microcontrolerului 19
1.1.2 Caracteristici generale ale microcontrolerului 20
1.1.3 Schema bloc generală a microcontrolerului 21
1.1.4 Unitatea centrală de procesare 21
1.1.4.1 [anonimizat] 22
1.1.4.2 Regiștrii de stare 22
1.1.4.3 Regiștrii de uz general 23
1.1.4.4 Pointerul de stivă 23
1.1.5 Segmente de memorie 23
1.1.5.1 Memoria de program “FLASH” 24
1.1.5.2 Memoria de date “SRAM” 24
1.1.5.3 Memoria EEPROM 24
1.1.6 Circuitul de oscilație al microcontrolerului 25
1.1.7 Sistemul de resetare si control 25
1.1.7.1 Sursele de reset 25
1.1.8 Sistemul de intreruperi 25
1.1.9 Module periferice de tip numărător/timer 26
1.1.10 Modulul USART 28
1.1.11 [anonimizat] 28
1.2 Descrierea senzorilor analogici cu infraroșu 29
1.2.1 Caracteristi generale ale senzorului Sharp GP2Y0A41SK0F 30
1.2.2 Principiul de funcționare 31
1.3 Comunicația Bluetooth 32
1.3.1 Interfața radio 32
1.3.2 Modulația Bluetooth 33
1.3.3 Nivel de putere 33
1.3.4 Transferul de date 34
1.3.5 Profiluri Bluetooth 34
1.3.5.1 Profilul SPP 35
1.4 Locomoția vehiculului autonom 35
1.4.1 Motorul de curent continuu Pololu 35
1.4.2 Principiul locomoției diferențiale 36
1.4.3 Controlul motoarelor 37
1.4.3.1 Principiul de funcționare al unei punți H obișnuite 37
1.4.3.2 Circuitul integrat “Toshiba TB6612FNG” 38
1.4.4 Modulația impulsurilor în durată 39
1.4.5 Encodere optice 40
Capitol 2 Implementarea hardware a vehicului autonom 43
2.1 Configurația circuitului electronic 44
2.2 Realizarea plăcii circuitului imprimat 44
2.3 Configurația fizică a vehicului 45
Capitol 3 Implementarea software a vehicului autonom 47
3.1 [anonimizat]232 47
3.2 Incărcarea programelor pe microcontroler folosind modulul bluetooth HC-05 48
3.3 Mediul integrat de dezvoltare Atmel Studio 7 49
3.4 Interpretarea informaților oferite de senzorul analogic 50
3.5 Determinarea distanței parcurse de vehiculul autonom 50
3.6 Algoritmi de rezolvare ai labirintului 51
3.6.1 Algoritmul “Wall Following” 51
3.6.2 [anonimizat] 51
3.6.3 Algoritmul “Flood Fill” 52
Capitol 4 Testarea vehicului autonom 55
4.1 Modul de evitare al obstacolelor 55
4.2 Modul de rezolvare labirint 57
4.3 Modul de control de la distanță 57
Concluzii 58
Bibliografie 59
Anexa 1 Imagini cu realizarea practică 61
Anexa 2 [anonimizat] a obstacolelor 63
Anexa 3 [anonimizat] „Rezolvare Labirint” 65
Anexa 4 Scenariu Vehicul telecomandat 69
Listă de figuri
Figura 1.1 Configurația pinilor microcontrolerului 19
Figura 1.2 Schema bloc generală a microcontrolerului 21
Figura 1.3 Unitatea centrală de prelucrare – Schema bloc funcțională 22
Figura 1.4 Harta regiștrilor de uz general 23
Figura 1.5 Harta memoriei de date 24
Figura 1.6 Schema bloc a unui modul numărător/timer general 27
Figura 1.7 Convertor analogic digital 28
Figura 1.8 Poziționarea senzorilor pe platforma hardware 29
Figura 1.9 Convertirea tensiunii analogice in distanță 30
Figura 1.10 Schema generală a senzorului Sharp 31
Figura 1.11Metoda triunghiului 31
Figura 1.12 Motor de curent continuu Pololu HP 36
Figura 1.13 Locomoția diferențială 36
Figura 1.14 Circuit de tip punte H 37
Figura 1.15 Circuitul integrat Toshiba 38
Figura 1.16 Forma de undă a unui semnal PWM 40
Figura 1.17 Traductor optic 40
Figura 1.18 Codarea sectoarelor pe disc 41
Figura 1.19 Determinarea sensului de rotație 41
Figura 1.20 Determinarea numărului de impulsuri 42
Figura 2.1 Diagrama bloc a vehicului autonom 43
Figura 2.2 Circuitul electronic al vehicului autonom 44
Figura 2.3 Circuitul imprimat al suportului hardware 45
Figura 2.4 Platforma hardware a vehicului autonom 45
Figura 3.1 Harta memoriei Flash 47
Figura 3.2 Conexiune Convertor USB-UART cu Arduino ProMini 48
Figura 3.3 Conexiune modul Bluetooth HC-05 cu Arduinno ProMini 48
Figura 3.4 Interfață Atmel Studio 7 49
Figura 3.5 Algoritm Wall Following 51
Figura 3.6 Algoritmul Flood Fill 52
Figura 4.1Configurație simplă a unui labirint de testare 55
Figura 4.2 Schemă logică algoritm de evitare a obstacolelor 56
Figura 4.3Schemă logică algoritm "Wall Following" 57
Listă de tabele
Tabel 1.1 Instrucțiuni utilizate de stiva microcontrolerului 23
Tabel 1.2Vectorii de intrerupere 26
Tabel 1.3 Clase de putere in comunicația Bluetooth 34
Tabel 1.4 Moduri de funcționare a unui circuit de tip punte H 38
Tabel 1.5 Tabel de adevăr pentru circuitul integrat TB6612FNG 39
Tabel 1.6 Semnificația simbolurilor L, H 39
Listă de acronime
ACL: Asynchronous Connectionless communications Link(Legătură de comunicație asincronă fără conexiune)
ADC :Analog to Digital Convertor (Convertor Analogic Digital)
CCD:Charged Coupled Device (Dispozitiv cu cuplaj de sarcină)
GFSK: Gaussian Frequency Shift Keying (Modulare cu schimbare in frecvență)
ISM: Industrial, Scientific, Medical (bandă radio alocată dezvoltărilor din domeniul Industrial, Științific, Medical
LD MOS : Laterally Diffused Metal Oxide Semiconductor(Semiconductor cu oxid de metal difuzat lateral)
MIPS:Milion Instructions Per Second (Milioane de instrucțiuni pe secundă)
PSD: Position Sensitive Detector (Detector senzitiv de poziție)
PWM:Pulse Width Modulation (Modulație in timp a impulsului)
QoS:Quality of Service (Calitatea serviciului)
RAM: Random Acces Memory (Memorie cu acces aleatoriu)
RISC: Reduced instruction set computing (Arhitectură de calcul cu set redus de instrucțiuni )
RSSI: Received Signal Strength Iindicator (Indicator de putere al semnalului recepționat)
SCO: Synchronous Connection Orientated communications link (Legătură de comunicație sincronă cu conexiune)
SPI: Serial Peripheral Interface ( Interfață serială cu dispozitive periferice)
SPP:Serial Port Profile (Profil port serial)
SRAM:Static Random Acces Memory(Memorie statică cu acces aleator)
TWI: Two Wire Interface (Interfată de comunicatie pe 2 fire )
UART: Universal Asynchronous Receiver/Rransmitter (Receptor/Transmițător universal asincron
Introducere
În zilele noastre dezvoltarea tehnologiei este mai rapidă pe zi ce trece. Din ce în ce mai multe dispozitive robotizate autonome s-au infiltrat în viețile oamenilor pentru a o face mai usoară. În foarte multe cazuri, dispozitivele robotizate autonome pot fi cea mai bună opțiune pentru rezolvarea unei probleme. Un exemplu considerat este reprezentatat de metodele de salvare în cazul unui incendiu sau cutremur. De cele mai multe ori, acestea pot fi letale pentru salvatori sau sunt imposibil de realizat în timpul necesar salvării celor răniți. Utilizarea unui vehicul autonom, ce poate intra într-o clădire devastată, poate fi o soluție mai rapidă pentru găsirea supraviețuitorilor și sigură pentru salvatori. Echipat cu dispozitive senzoriale speciale, vehiculul autonom va scana mediul și va trimite informații prețioase echipelor de salvare cu privire la locul unde se află persoanele rănite.
De asemenea, pot exista și locuri în care utilizarea unui robot este singura modalitate viabilă de acces. De exemplu, centralele nucleare, fabricile de produse chimice toxice sau orice mediu ce ar putea fi dăunător omului, pot fi explorate de vehiculele autonome pentru realizarea diferitelor operațiuni. Pentru rezolvarea unor cazuri ca cele prezentate mai sus, vehiculul autonom va trebui să fie capabil să se deplaseze fără ajutor din partea factorului uman și să cartografieze independent mediul parcurs pentru a își planifica singur calea de deplasare.
Problema dezvoltării unui vehicul autonom de acest gen se poate împarți în 3 subcapitole:
Localizare
Cartografiere
Planificarea căii de deplasare
Localizarea robotului este principala problemă în găsirea unei căi pentru deplasarea acestuia. Robotul autonom va trebui să cunoască întotdeauna răspunsul întrebării “Unde mă aflu?”, pentru ca de acolo să poată găsi calea spre noua poziție dorită. Dezvoltarea algoritmilor de localizarea se realizează atât pe baza caracteristicilor mediului cât și pe cele ale platformei hardware a robotului. Se utilizează algoritmi diferiți pentru mediul exterior față de cei utilizați în mediul interior. Există diferiți algoritmi ce pot fi folosiți pentru localizarea robotului, precum “Dead Reckoning” , “Least mean squares” sau utilizând sisteme GPS.
Maparea unui mediu în timpul deplasării este o problema complexă, cu o mulțime de soluții, fiecare cu diferite avantaje și dezavantaje. Principal compromis pentru rezolvarea acestei probleme trebuie făcut între precizia hărții și puterea de calcul disponibilă pe robot. Mai precis, această problemă se poate împarți în două componente:
Salvarea hărții în memoria microcontrolerului
Interpretarea mediului în funcție de rezultatele senzorilor
Cartografierea este dependentă de localizare, astfel încât fiecare greseală realizată in algoritmul de localizare, va afecta cartografierea și mărimea erorilor va crește proporțional cu dimensiunea suprafeței cartografiate.
Planificarea căii de deplasare reprezintă procesul de navigare a vehicului autonom într-o zonă cu numeroase obstacole existente. Poziția acestor obstacole nu va influența deplasarea vehicului autonom, robotul fiind nevoit să evite ciocnirea acestora. În cazul prezentei lucrări, vehiculul autonom va avea ca drept spațiu de deplasare un labirint cu o configurație aleatoare a pereților. Robotul va analiza poziția acestora și va căuta ieșirea din interiorul labirintului într-un timp cât mai scurt.
Obiectivele propuse si realizate ale acestui proiect sunt urmatoarele:
Dezvoltarea unui vehicul autonom cu locomoție diferențială
Implementarea si testarea unui algoritm de evitare a obstacolelor
Implementarea si testarea unui algoritm de rezolvare a unui labirint
Proiectul este structurat in 4 capitole, fiecare prezentând detalii cu privire la diferite aspect teoretice sau practice. Capitolul 1 prezintă o introducere in temă a proiectului si noțiunile teoretice necesare dezvoltării acestuia. In capitolele 2 si 3 sunt prezentate metodele software si hardware folosite pentru implementarea vehicului autonom, iar in ultimul capitol sunt discutate rezultatele obtinute in urma testării si eventualele căi de dezvoltare ale proiectului.
Noțiuni teoretice necesare dezvoltării practice
Descrierea microcontrolerului Atmega328
Vehicul autonom utilizează microcontrolerul ATmega328, creat de către compania Atmel, făcând parte din seria denumită “megaAVR”. Acesta este structurat pe 8 biți într-o arhitectură tip “RISC”, cu putere de calcul mare,fiind disponibil atât în varianta capsulei de tip THT cât și în varianta SMD.
Descrierea succintă a pinilor microcontrolerului
Vcc:Tensiune de alimentare digitală
Gnd : Masa
Port B (PB7:0):Este un port de intrare/iesire pe 8 biți cu rezistor de pull-up pentru fiecare pin in parte. Biți PB6 si PB7 au capabilițati speciale fiind utilizați pentru crearea circuitului de ceas extern.
Port C (PC5:0,PC7):Este un port de intrare/iesire pe 7 biți cu rezistor de pull-up pentru fiecare pin in parte.
PC6/Reset:Este folosit ca pin de resetare al microcontrolerului. Un nivel de 0V pe acest pin, pentru mai mult de o lungime minimă a unui impuls de ceas va genera o resetare. Are caracteristici electrice diferite fata de ceilalți pini ai portului C.
Port D (PD7:0) :Este un port de intrare/iesire pe 8 biți cu rezistor de “pull-up” pentru fiecare pin in parte.
AVcc: Este pinul de alimentare pentru convertorul analogic – digital. Trebuie realizata o conexiune externa intre acest pin si pinul Vcc, indiferent daca este folosit sau nu convertorul.
AREF: Este pinul folosit pentru tensiunea de referintă utilizată de convertorul analogic digital.
Caracteristici generale ale microcontrolerului
Arhitectură avansată de tip RISC :
Set de 131 de instrucțiuni
32 de registri generali a cate 8 biți fiecare
Viteza de execuție de pana 20MIPS la frecvența de 200MHz
Tipuri de segmente de memorie:
32 KB de memorie programabilă tip Flash
1KB de memorie de tip EEPROM
2KB de memorie de tip SRAM
Lista de periferice disponibile :
2 numaratoare pe 8 biți cu capabilitate de comparare
1 numarator pe 16 biți
1 numarator pentru circuitul de oscilație separat
6 canale de PWM
8 convertoare analog numerice pe 10 biți
Interfața seriala de tip USART
Interfața serială de tip SPI
Interfața seriala de tip TWI
Capabilitați speciale:
Resetare automată la alimentarea microcontrolerului
Oscilator intern calibrat
Surse de intreruperi interne și externe
6 moduri de economisire energie
Gama tensiunii de alimentare acceptate : 1.8 – 5.5 V
Gama de functionare normala in temperatura : -40 ̊ C – 85 ̊ C
Puterea consumata la 1MHz ,1.8V,25 ̊C :
Modul activ : 0.2 mA
Modul Power down : 0.1µA
Modul Power save :0.75µA
Schema bloc generală a microcontrolerului
In figura urmatoare este ilustrată schema bloc generală a microcontrolerului si se vor prezenta sumar cele mai importante blocuri funcționale :
Unitatea centrală de procesare
Funcția principală a unității centrale de prelucrare este de a asigura executarea corectă a instrucțiunilor programului. Aceasta trebuie să poată avea acces la memorii, să efectueze calcule, să controleze unitățile periferice și să manipuleze întreruperile. Atmega328 utilizează o arhitectură de tip Harvard, cu segmentele de memorie, magistrale de date și de program separate, lucru ce maximizează performanța și paralelismul microcontrolerului. Accesul la cei 32 de regiștrii de uz general se realizează rapid. Acest lucru permite unității aritmetice logice să efectueze operațiile într-un singur ciclu de ceas. Unitatea aritmetică și logică poate efectua operații între regiștrii, între un registru și o constanta, sau asupra unui singur registru. După fiecare operație aritmetică, registrul de stare este actualizat, pentru a reflecta informațiile referitoare la rezultatul operației.
Unitatea aritmetică– logică
Unitatea aritmetică-logică funcționează în legătură directă cu toți cei 32 de regiștri de uz general. Operațiile realizate sunt efectuate într-un singur ciclu de ceas, fiind divizate în 3 mari categorii: operații aritmetice, operații logice și operații cu biți.
Regiștrii de stare
Registrul de stare conține informațiile ultimei operații aritmetice executate. Aceste informații pot fi folosite pentru schimbarea fluxului programului obișnuit și pentru efectuarea unor operațiuni condiționale.
Regiștrii de uz general
Fișierul de regiștri este optimizat pentru setul de instrucțiuni de tip RISC al unității centrale de prelucrare. Majoritatea instrucțiunilor ce lucrează cu regiștrii de uz general, au acces direct la aceștia, și sunt executate într-un singur ciclu de ceas.
Fiecărui registru îi este atribuită o adresă în memoria de date. În spațiul de date, primele 32 de locații de memorie sunt ocupate de regiștrii de uz general, oferind flexibilitate accesării acestora.
Pointerul de stivă
Stiva este utilizată pentru stocarea temporară a datelor, pentru stocarea variabilelor locale și pentru stocarea adreselor de returnare după întreruperi sau apelări ale unor subrutine ale programului. Stiva este implementată să crească de la locațiile de memorie superioare spre locațiile de memorie inferioare. Registrul “Pointer de stivă” va indica mereu vârful stivei.
In tabelul de mai jos sunt sintetizate principalele instrucțiuni ale stivei:
Tabel 1.1 Instrucțiuni utilizate de stiva microcontrolerului
Segmente de memorie
Arhitectura AVR ( de tip Harvard) dispune de doua spații de memorie principale:
Spațiul memoriei de date
Spațiul memoriei de program
Adițional acestor doua spații, arhitectura dispune si de o memorie EEPROM pentru stocarea de date. Toate cele 3 tipuri de memorie sunt organizate crescător liniar.
Memoria de program “FLASH”
Este o memorie non-volatilă, cu o capaAccesate de 32KB, utilizată pentru stocarea programului de instrucțiuni. Din motive de securitate software,ea este divizată in doua compartimente:
Secțiunea pentru “bootloader”
Secțiunea aplicației de program
Acest tip de memorie are o anduranța de cel puțin 10000 de cicluri de scriere/re-scriere.
Memoria de date “SRAM”
Este memoria de date ce stochează variabilele programului în timpul execuției instrucțiunilor acestuia.Acest tip de memorie este implementată sub forma unei memorii RAM statice,ce nu necesită un ciclu periodic de reîmprospătare. Memoria de date poate fi adresată cu oricare dintre următoarele cele 5 moduri:
Adresare directă
Adresare indirectă cu deplasament
Adresare indirectă
Adresare indirectă cu pre-drecrementare
Adresare indirectă cu post – incrementare
Organizarea harții memoriei de date este ilustrată in figura următoare:
Memoria EEPROM
Este organizată sub forma unui spațiu de date separat, în care fiecare octet poate fi citit și scris. Are o capacitate de 1KB și o andurața de cel puțin 100000 de cicluri de scriere/rescriere. Această memorie este non-volatilă, datele rămân stocate și după întreruperea alimentării.
Circuitul de oscilație al microcontrolerului
Microcontrolerul are la dispoziție mai multe surse selectabile pentru generarea semnalului de ceas,în funcție de tipul aplicației în care este folosit și de consumul de energie necesar. Semnalul de ceas de la sursa selectată este introdus în generatorul de ceas AVR și dirijat către modulele corespunzătoare. Optiunile de selecție ale sursei de ceas sunt urmatoarele:
Oscilator cu cristal de quarț extern
Oscilator calibrat intern de 8MHz
Oscilator intern de 128KHz
Rezonator ceramic
Circuit RC
Sursa de ceas implicită a microcontrolerului este oscilatorul calibrat intern de 8MHz, cu un factor de divizare pre-programat, rezultând un semnal de ceas cu frecvența de 1MHz .
Sistemul de resetare si control
În timpul resetării microcontrolerului, toți regiștri I/O sunt setați la valori predefinite, iar programul pornește execuția din vectorul de resetare. De asemenea, porturile de intrare/ieșire sunt resetate la o valoare inițială predefinită atunci când o sursă de resetare devine activă. Resetarea porturilor nu necesită un semnal de ceas pentru a rula. După ce toate sursele de resetare devin inactive, se declanșează un contor de întârziere, lucru ce prelungește perioada de resetare internă. Acest lucru permite stabilizarea tensiunii de alimentare, Vcc, înaintea începerii funcționării normale a microcontrolerului.
Sursele de reset
Arhitectura microcontrolerului Atmega328 pune la dispoziția utilizatorului 4 surse de resetare:
Resetarea la pornire: microcontrolerul se afla in starea de reset atunci cand tensiunea de alimentare Vcc se afla sub un anumit prag Vpot.
Resetarea externă: microcontrolerul se afla in starea de reset atunci cand nivelul de tensiune pe pinul de reset este de 0 V mai mult de un impuls de ceas.
Resetarea prin sistemul Watchdog : microcontrolerul este resetat la sfarșitul perioadei timerului “Watchdog” si cand este activat modul de reset prin sistem watchdog.
Resetare prin sistemul Brown-out : microcontrolerul se reseteaza cand tensiunea de alimentare scade sub un anumit prag Vbot ,modul de detecție al scăderii tensiunii fiind activat.
Sistemul de intreruperi
Unitatea centrală de prelucrare poate fi avertizată de către un periferic de apariția unui eveniment ce necesită atenție imediată. Această avertizare este transmisă sub forma unui semnal sincron sau asincron și reprezintă o întrerupere. Tratarea acesteia are ca efect suspendarea fluxului normal de execuție al instrucțiunilor programului și lansarea în execuție a unei rutine de tratare a întreruperii. Fiecărei surse de întrerupere a microcontrolerului Atmega 328 îi este atribuit un bit propriu de activare. Acesta împreună cu bitul global de activare al întreruperilor din registru de stare,trebuie să fie activi,pentru lansarea rutinei de tratare a întreruperii. Vectorii de resetare și întrerupere alcătuiesc tabela de vectorilor de întrerupere. Organizarea în spațiul de adrese determină și nivelul de prioritate al diferitelor surse de întrerupere. Nivelul de prioritatea al execuției întreruperii este mai mare cu cât întreruperea se află la o adresă inferioară. Nivelul de prioritate cel mai ridicat este oferit vectorului de resetare, fiind urmat de sursa de întrerupere externă 1.Tabela vectorilor de intrerupere a microcontrolerului Atmega 328 este detaliată in tabelul de mai jos:
Tabel 1.2Vectorii de intrerupere
Module periferice de tip numărător/timer
Modul de tip numărător/timer oferă posibilitatea de a măsură intervale fixe de timp. Acest lucru permite generarea de întreruperi la expirarea intervalului de timp măsurat. Utilizarea acestor module ajută la eliminarea buclelor de întârziere din programul principal, deoarece odată inițializat un modul timer, acesta va funcționa independent de unitatea centrală a microcontrolerului. Schița de funcționare a unui modul timer este prezentată mai jos:
Funcționarea unui modul de tip numărător/timer este realizată de cele 3 unități principale prezentate în schița de funcționare de mai sus urmărind următoare secvența de pași :
Registrul numărător măsoară efectiv intervalele de timp și este incrementat automat cu o frecventă dată.
Prescalerul este folosit pentru a obține diferite intervale de timp folosind ceasul inter sau un alt ceas conectat. Acesta oferă posibilitatea de a diviza frecvența de ceas în funcție de necesitățile aplicației.
Registrul de compare are o valoare încărcată software de utilizator. La fiecare incrementare a registrului numărător, cele două valori ale acestor două registre sunt comparate, iar în caz de egalitate este generată o întrerupere .
Microcontrolerul Atmega328 dispune de 3 module de tip numărător-timer: Timer 0, Timer 1 și Timer 2. Timerul 0 și Timerul 2 sunt de 8 biți, în timp ce Timerul 1 este de 16 biți. Aceste 3 module pot fi setate să funcționeze într-unul din cele 4 moduri enumerate mai jos:
Modul normal: Direcția de numărare este întotdeauna crescătoare, de la valoarea 0 până la valoarea maximă dată de numărul de biți ai numărătorului. La depășirea acestei valori, valoarea registrului TCNT este resetată la valoarea 0.
Modul de resetare a timerului la compare (CTC): Valoarea registrului TCNT este resetată atunci când aceasta atinge valoarea registrului OCR, definită de către utilizator.
Modul PWM rapid: Valoarea registrului TCNT este incrementată de la valoarea 0 până la valoarea maximă a numărătorului, obținută în funcție de numărul de biți. Această valoare este resetată la 0 când se atinge valoarea maximă a numărătorului.
Modul PWM cu faza: Valoarea registrului TCNT este incrementată de la valoarea 0 până la valoarea maximă, apoi urmează decrementarea acestuia de valoarea maximă spre valoarea minimă .
Modulul USART
Modulul UART al microcontrolerului Atmega328 este utilizat pentru recepția/transmisia datelor de la un dispozitiv periferic cu acces serial. Caracteristicile principale ale modulului UART sunt următoarele:
Comunicație full – duplex
Mod de operare: sincron sau asincron
Generator intern de baudrate cu rezoluție mare
Detecție automată a erorilor de transmisie
Execută comunicații de tip multiprocesor
Modulul realizează conversia serie – paralel a datelor la recepție, respectiv conversia paralel – serie la transmisie. Transmiterea datelor este inițializată prin scrierea datelor care trebuie transmise în registrul UDR .
Convertorul analogic-digital
Un convertor analogic digital este un modul electronic compus din două intrări analogice și o ieșire digitală. Cele două intrări ale convertorului corespund tensiunii analogice de intrare Vin și tensiunii de referință Vref.
Rolul ADC-ului este de a converti semnalul de intrare analogic într-o valoare de ieșire digitală corespunzătoare amplitudinii semnalului de intrare în comparație cu semnalul de referință. Diagrama bloc generală a unui convertor analogic-digital este prezentată în figura următoare:
Microcontrolerul Atmega328 dispune de un convertor analogic – digital cu aproximații succesive. Acest convertor oferă o rezoluție de până la 10 biți și este conectat la un multiplexor analogic cu 8 intrări, corespunzător portului A a microcontrolerului .
Caracteristice generale ale convertorului integrat al microcontrolerului:
Domeniul tensiunii de intrare cuprins intre 0 si Vcc.
Timpul de conversie necesar cuprins între 13 si 260 µs.
Selecție software a tensiunii de referintă.
Generarea unei intreruperi la sfârșitul conversiei.
Descrierea senzorilor analogici cu infraroșu
Vehiculul autonom este construit sub forma unui robot mobil, ce se deplasează în interiorul labirintului fără a lovi zidurile acestuia. Pentru a evita orice tip de coliziune cu diverse obiecte aflate pe traseul labirintului, se utilizează 5 senzori analogici infraroșu pentru măsurarea distanțelor dintre robot și orice alt obiect din proximitatea acestuia.
Poziționarea celor 5 senzori analogici a fost elaborată astfel încât să permită utilizarea unui algoritm de corecție a poziției robotului.Parcurgerea traseului labirintului se va efectua întotdeauna pe axul central dintre ziduri. În acest mod, se obțin rezultate mult mai bune, în ceea ce privește timpul de parcurgere și distanța totală parcursă în labirint este mai mică.
Pentru măsurarea distanțelor dintre robot și zidurile labirintului s-au folosit senzori analogici cu infraroșu “Sharp GP2Y0A41SK0F”. Principiul de funcționare al acestui model de senzor este descris în paragrafele următoare.
Caracteristi generale ale senzorului Sharp GP2Y0A41SK0F
Senzorul analogic “Sharp GP2Y0A41SK0F” pentru măsurarea distanței oferă o gamă de detecție situată în intervalul 4–30 cm. Această gamă de detecție relativ mică oferă măsurători de rezoluție mare, iar distanța de detecție minimă de 4 cm face ca acest senzor să ofere rezultate precise pentru distanțe mici. Distanța este indicată printr-o tensiune analogică, ceea ce face acest senzor foarte ușor de utilizat. Interfațarea cu majoritatea microcontrolerelor este foarte simplă: ieșirea analogică unică poate fi conectată la un convertor analog-digital (ADC) pentru efectuarea măsurătorilor de distantă, sau ieșirea poate fi conectată la un comparator pentru detectarea unui prag de detecție. Relația dintre tensiunea de ieșire a senzorului și inversul distanței măsurate este aproximativ liniară pentru intervalul utilizabil al senzorului. Foaia de catalog conține o reprezentare grafică a tensiunii de ieșire analogică în funcție de inversul distanței la un obiect reflectorizant. Se poate folosi această reprezentare pentru a converti tensiunea analogică obținută la ieșirea senzorului într-o distanța aproximativă.
Parametrii generali ai senzorului :
Tensiune de alimentare: 4.5 – 5.5 V
Curentul mediu consumat: 12mA
Gama de detecție: 4 – 30 cm
Tipul iesirii: tensiune analogica
Perioada de actualizare: 16,5 ± 4 ms
Principiul de funcționare
Modulul “Sharp GP2Y0A41SK0F” efectuează măsurători continue analogice ce nu necesită un semnal declanșator pentru a iniția o măsurătoare. Distanța față de un obiect este returnată sub forma unui nivel de tensiune analogică. Modulul este alcătuit dintr-un sistem de detecție cu infraroșu ce incorporează urmatoarele unitați:
Emițător Infraroșu
Receptor Infraroșu
Filtru de detecție
Circuit de amplificare
Senzorul folosește un șir de fotodiode denumit PSD și sisteme optice simple pentru a detecta prezenta unui obiect. Determinarea distanței față de obiect este realizată folosind “metoda triungiului”. Un puls de lumină infraroșie este emis de către emitător, lumina călătoreste în câmpul vizual și fie lovește un obiect fie își continuă drumul pur și simplu. În cazul în care nici un obiect nu se află în față senzorului, lumina nu este reflectată, iar citirea nu prezintă niciun obiect. Dacă lumina se reflectă de un obiect, aceasta revine la detector și creează un triunghi între punctul de reflecție, emitător și detector .
Unghiul de incidentă al luminii reflectate variază în funcție de distanța față de obiect. Detectorul de pozitie (PSD) este alcatuit dintr-o lentilă si un sir de diode CCD. Acest sir de diode poate determina apoi unghiul de incidenta, și astfel se calculează distanța până la obiect. Această metodă este imuna la interferența cu lumina ambientală și oferă indiferență față de culoarea obiectului detectat. Precizia de distanță depinde de rezoluția sirului de diode CCD. Cu cat obiectul de măsurat este mai indepartat, cu atat rezoluția sirului de diode CCD trebuie sa fie mai mica.
Comunicația Bluetooth
Tehnologia Bluetooth este un standard de comunicație fără fir ce permite schimbul de date pe distanțe scurte. Prima versiune a standardului, putea transporta date la viteze de până la 721Kb/s, cu adăugarea de până la 3 canale de voce. Tehnologia a fost destinată să fie plasată într- un modul care ar putea fi ușor încorporat în dispozitive electronice de tot felul.Semnalele radio sunt asignate din banda ISM destinată dezvoltării în domeniile industriale, științifice și medicale. Tehnologia permite stabilirea de comunicații între dispozitive de pană la o distantă maximă de aproximativ 100 de metri .
Interfața radio
Interfața radio a acestui standard, a fost proiectată pentru a permite comunicației să se facă în mod fiabil pe distanțe scurte. Standardul radio suportă un număr mare de canale,cu diferite niveluri de putere, folosind metode fiabile de modulație. Semnalul radio purtător este modulat folosind schema GFSK, utilizând tehnica saltului în frecvență. Cu mulți alți utilizatori, folosind aceeași banda ISM, tehnica saltului în frecvență permite utilizatorilor Bluetooth să evite interferențele cu alte dispozitive.O transmisiune Bluetooth este activă pe o anumită frecvență doar pentru o perioadă scurtă de timp. În cazul în care, apar interferențe cu alte semnale, datele vor fi retransmise mai târziu, atunci când semnal este transmis pe un alt canal liber neafectat de interferențe. Standardul poate realizează un număr maxim de 1600 de salturi/s, iar pe baza adresei Bluetooth, a nodului principal din rețea, se determină o secvența aleatoare pentru determinarea lungimii saltului în domeniul frecvență. Sistemul cu salt în frecvență este capabil să funcționeze într-un interval dinamic mai mare și nu este blocat în cazul în care alte transmițătoare ar fi mai apropiate receptorul Bluetooth. Frecvențele radio sunt alocate din banda ISM de 2.4 GHz. Banda ISM se extinde în intervalul de frecvență pornind de la 2400MHz până la 2483.5MHz. Fiecare canal Bluetooth are o bandă alocată de 1MHz, primului canal fiindui alocată frecvență de 2402 Mhz, iar ultimului canal cea de 2480MHz. Frecvențele canalelor radio se pot calcula cu următoare formulă:
unde n poate varia in intervalul [1,79]
Acest aranjament al frecvențelor, oferă posibilitatea unui interval de gardă de 2MHz la capătul inferior al benzii și un interval de gardă de 3.5MHz la capătul superior. Există însă unele cerințe de acuratețe a frecvenței pentru standardul Bluetooth. Frecvența inițială centrală a emițătorului trebuie să fie acordată pe frecvență centrală a receptorului cu o deplasare în frecvență de maxim ±75kHz.Pentru ca o comunicație eficientă să aibă loc într-un mediu cu un număr mare de dispozitive ce pot recepționa semnalul,fiecare dispozitiv trebuie să aibă propriul identificator. Acest lucru este rezolvat prin unitatea de adrese hardware de 48 biți oferind un număr total maxim de adrese de 2.815 x 1014 identificatori unici .
Modulația Bluetooth
Pentru prima versiune a standardului,ca metodă de modulare a semnalului purtător a fost aleasă tehnica GFSK (Gaussian Frequency Shift Keying). Cerințele pentru rate de transmisie mai mari au condus la dezvoltarea a două forme de modulație bazate pe schimbarea fazei semnalului (PSK),pentru standardul Bluetooth 2.
Modulația GFSK se caracterizează prin deplasarea frecvenței purtătoarei. ”1” binar este reprezentat de o deviație de frecvență pozitivă și “0” binar de o deviație de frecvență negativă. Semnalul modulat este apoi filtrat cu ajutorul unui filtru cu o curbă cu răspuns de tip Gaussian pentru a asigura că benzile laterale nu se extind mai mult fata de suportul principal al purtătoarei. Prin acesta metodă se obține o bandă a semnalului radio de 1MHz,cu cerințe stricte de filtrare pentru a evita interferențele pe alte canale. Pentru o funcționare corectă, nivelul de BT este setat la valoarea 0.5, iar indicele de modulație să fie între 0.28 și 0.35.
Pentru obținerea unei rate de transfer mai mare, versiunea a doua a standardului, Bluetooth 2 EDR, folosește tehnici de modulație cu schimbare de fază.Au fost utilizate 2 forme: π/4 DQPSK si 8DPSK .
Nivel de putere
Nivelul de putere al unui emițător Bluetooth este relativ scăzut.În funcție de cerințele necesare stabilirii unei comunicații Bluetooth, există 3 clase de niveluri de putere:
Clasa de putere 1 a fost proiectată pentru comunicații cu rază lungă între dispozitive (de până la 100 m), asigurând o putere maximă de ieșire de 20dBm.
Clasa de putere 2 a fost proiectată pentru comunicații cu rază de până în 10 m între utilizatori, oferind o putere maximă de ieșire de 6dBm.
Clasa de putere 3 este destinată comunicațiilor cu o rază mică între dispozitive ( de până în 10 cm), asigurând o putere maximă de ieșire de 0 dBm.
Controlul puterii este obligatoriu pentru clasa 1 și opțional pentru celelalte două clase.Utilizarea sa este recomandată pentru a conserva energia bateriei.Clasa de putere adecvată poate fi aleasă în funcție de indicatorul RSSI
.
Tabel 1.3 Clase de putere in comunicația Bluetooth
Transferul de date
Transferul de date Bluetooth poate fi realizat folosind o varietate de tipuri diferite de pachete de date și folosind două forme de transmisie: asincronă și sincronă. Aceste formate de transfer de date asigură o flexibilitate bună, fiind invizibile pentru utilizator. Există două tipuri principale de legături Bluetooth, ce sunt disponibile și pot fi setate:
ACL- Asynchronous Connectionless communications Link
SCO- Synchronous Connection Orientated communications link
Conexiunile de tip ACL sunt dedicate comunicării de date. Acest tip de legătura retransmite pachetele în cazul pierderii sau eronării lor de-alungul transmisiei. Nici o formă de QoS nu este garantată în acest caz. Rata maximă de transfer la nivelul aplicație este în jur de 650kbps. Un dispozitiv Master poate avea mai multe conexiuni cu mai mulți clienți, dar între două dispozitive nu poate exista decât o singură conexiune ACL .
Tipul de conexiune SCO se folosește în cazul transmisiilor audio. Când setăm o conexiune de tip SCO, cuantele de timp sunt rezervate pentru trasmiterea datelor, în felul acesta se poate garanta Calitatea Serviciului (QoS-Quality of Service). Pachetele pierdute sau eronate nu vor fi retransmise ca în cazul transmisiei de voce. Toate legăturile SCO lucrează la viteza de 64kbps. Un dispozitiv Master poate avea până la trei legături de tip SCO simultan, toate cu același Slave sau cu Slave-uri diferite. Dispozitivele Slave pot avea și ele trei conexiuni de tip SCO cu dispozitivul Master
Profiluri Bluetooth
Pentru a permite dispozitivelor Bluetooth să comunice în mod adecvat unele cu altele, s-au stabilit diferite profiluri Bluetooth in funcție de necesitățile legăturii. Un profil Bluetooth este efectiv o specificație de interfață fără fir pentru comunicarea între dispozitivele Bluetooth. Pentru a fi în măsură să funcționeze, un dispozitiv Bluetooth trebuie să fie compatibil cu un subset al profilelor disponibile, pentru a putea utiliza serviciul Bluetooth dorit. Modul în care un anumit dispozitiv Bluetooth utilizează tehnologia
Bluetooth depinde de capacitățile sale de profil Bluetooth. Profilurile Bluetooth furnizează standarde pe care producătorii le urmeze pentru a permite dispozitivelor să utilizeze standardul în modul dorit.
La un nivel minim, fiecare specificație prin profil Bluetooth conține detalii cu privire la următoarele subiecte:
Dependente cu alte formate
Formate sugerate pentru interfața cu utilizatorul
Partile specifice utilizate de protocol
Sunt peste douăzeci de profiluri Bluetooth diferite, fiecare având propria lor funcție. Unele dintre aceste profiluri Bluetooth sunt utilizate mai des decât altele, dar fiecare dintre ele poate fi utilizat într -o varietate de situatii diferite și de aplicații. Comunicatia necesara cu robotul autonom a fost realizata folosind un modul bluetooth cu profilul SPP ( Serial Port Profile).
Profilul SPP
Acest profil detaliaza modul in care se pot configura porturi seriale virtuale si modul in care doua dispozitive Bluetooth se pot conecta intre ele si pot comunica. Pentru acest profil Bluetooth se pot defini doua roluri ale dispozitivelor Bluetooth:
“Dispozitivul A” este cel care initiaza formarea unei conexiuni cu dispozitiv Bluetooth.Acesta poarta numele de “Initiator”.
“Dispozitivul B” este dispozitivul “Acceptor”, cel ce raspunde la cererea de formare a unei conexiuni primite de la “Initiator”
Folosirea unui modul bluetooth cu profil SPP elimină nevoia folosirii unui cablu serial folosind standardul RS – 232 .
Locomoția vehiculului autonom
Vehiculul autonom a fost realizat sub forma unui robot mobil cu locomoție diferențială concepută pe baza unui șasiu cu 2 roți laterale și a unui “ball-caster” pentru echilibrarea întregului sistem. Deplasarea sistemului diferențial a fost realizată cu ajutorul celor două motoare de curent continuu,tip “Pololu Micro Metal HP 50:1”.
Motorul de curent continuu Pololu
“Pololu Micro Metal HP 50:1” este un motor cu perii conceput pentru a rula pe curent continuu, schimbarea vitezei fiind realizată prin modificarea tensiunii de funcționare. Acest motor miniatural constă dintr-un reductor cu un raport de 50:1. Axul principal are diametrul de 3mm și este în formă de “D”. Este prevazut și cu un ax secundar avand diametrul de 1 mm, ce asigură fixarea encoderului optic. Caracterisici electrice ale motorului :
Viteza = 625 rotații pe minut (fara sarcina,6V)
Curentul consumat = 120mA (fara sarcina)
Curentul de blocaj = 1.6A
Cuplu de blocare = 0.1 Nm
Principiul locomoției diferențiale
Un vehicul cu locomoție diferentială este caracterizat printr-un ansamblu alcătuit din două roți motoare, amplasate pe o parte și de altă a șasiului și de un suport cu bilă ce asigură echilibrarea părtii frontale a robotului. Cele două motoare atașate roților vor fi responsabile pentru deplasarea robotului și pentru mecanismul de direcție. Acest sistem permite robotului să efectueze rotiri de 90 ̊ spre stânga/dreapta,cât și rotire de 180 ̊ în jurul punctului central dintre roți. În funcție de construcția șasiului și a centrului de greutate a robotului se poate adaugă o bilă cu mișcare liberă și frecare cât mai mică.
Diagrama de mai jos ilustrează principiul de funcționare al unității diferențiale :
Cazul S = D
Când cele două roți se rotesc în aceeași direcție și cu aceeași viteză, robotul se va deplasa înainte sub forma unei linii dreapte.
Cazul S < D
Când cele două roți se rotesc în aceeași direcție, dar cu viteze diferite, robotul se va roti spre direcția motorului cu viteza mai mică.De exemplu, în cazul în care roata din dreapta se rotește cu o viteză mai mare față de cea din stânga, robotul va vira spre stânga.
Cazul S = ─ D
Când cele două roți se rotesc cu aceeași viteză, dar în direcții opuse, robotul se va roti în loc, în jurul punctului central dintre cele două roți.
Numele de sistem diferențial provine din modul în care robotul este dirijat prin schimbarea vitezei și a direcției prin diferența dintre cele două roți .
Controlul motoarelor
Controlul celor două motoare de curent continuu a fost realizat cu ajutorul driverului de motoare, “Toshiba TB6612FNG Dual Motor Driver”. Acesta constă din 2 punți H realizate în structură “LDMOS”. Punțile H realizate în acesta tehnologie sunt mai eficiente decât cele realizate cu tranzistoare bipolare, deoarece permit să fie livrat motorului un curent mai mare.
Principiul de funcționare al unei punți H obișnuite
O punte H este un circuit electronic ce permite alimentarea unei sarcini în orice direcție dorită. Aceste circuite sunt adesea folosite în domeniul roboticii, dar și în alte domenii, pentru a permite motoarelor de curent continuu pentru a rula înainte și înapoi. Denumirea de “punte H” provine de la reprezentare grafică a circuitului electronic, construit din 4 tranzistori sub forma literei “H” .Mai jos, este ilustrată structura generală a unei punți H.
Conform structurii de mai sus, când comutatoarele S1 și S4 sunt închise, o tensiune pozitivă va fi aplicată la terminalele motorului. Prin deschiderea comutatoarelor S1 și S4 și închiderea comutatoarelor S2 și S3, această tensiune este inversată, permițând operarea inversă a motorului. Comutatoarele S1 și S2 nu trebuie să fie închise în același timp, deoarece acest lucru ar provoca un scurt circuit pe sursa de alimentare. Aceași condiție trebuie să fie îndeplinită de asemenea și de comutatoarele S3 și S4. Functia de baza realizata de o punte H este de a inversa directia de deplasarea a motorului, insa ea poate efectua si operatiuni precum franarea sau mersul in gol al acestuia. Următorul tabel sumarizează modurile de funcționare a punții H în funcție de configurația celor 4 comutatoare :
Tabel 1.4 Moduri de funcționare a unui circuit de tip punte H
Circuitul integrat “Toshiba TB6612FNG”
Toshiba TB6612FNG este un circuit integrat de tip punte H ce permite controlul a două motoare de curent continuu. Etajele de ieșire ale acestui circuit sunt realizate în structură LD MOS cu rezistentă internă de valoare mică. În figura de mai jos este prezentată diagrama bloc a acestui integrat.
În funcție de configurația aleasă pentru cele 2 semnale de intrare,”IN1” și “IN2”, se pot obține 4 moduri de control:
Sens de rotatie orar
Sens de rotatie anti-orar
Frana scurta
Mod de oprire
Tabel 1.5 Tabel de adevăr pentru circuitul integrat TB6612FNG (
Tabel 1.6 Semnificația simbolurilor L ,H
Circuitul integrat “Toshiba TB6612FNG” este caracterizat de urmatorii parametri :
Tensiunea de alimentare a motoarelor (Vmot) : 4.5 – 13.5 V
Tensiunea de alimentare a circuitului logic (Vcc) : 4.5 – 5.5 V
Curentul de ieșire maximă : 3A per canal
Curentul continuu de ieșire maxim: 1A per canal
Frecvență maximă de PWM : 100kHz
Circuit de protecție in temperatură
Sistem de economisire energie
Modulația impulsurilor în durată
Variația vitezei celor două motoare a fost realizată de microcontroler, comandând circuitul integrat Toshiba TB6612FNG prin intermediul modulației inpulsurilor în durată. Modulația impulsurilor în perioadă este o metodă simplă de a controla dispozitive analogice prin intermediu unui semnal digital. Această tehnică constă în controlul lățimii impulsurilor, pe baza semnalului modulator, prin modificarea factorului de umplere. Perioada de timp corespunzătoare valorii ON dintr-un ciclu ON-OFF se numește factor de umplere și reprezintă, ce tensiune medie va primi dispozitivul electronic Factorul de umplere se exprimă în procente și reprezintă cât la sută din perioada unui semnal acesta va fi pe nivelul ON.
In fgura de mai jos sunt prezentate semnale PWM cu diferiți factori de umplere:
Formula folosită pentru a obtine valoarea factorului de umplere (D) este urmatoarea:
unde :
TON este perioada de timp corespunzatoare valorii ON,tensiune de 5V
TOFF este perioda de timp corespunzatoare valorii OFF,tensiune de 0V
Encodere optice
Encoderul sau traductorul este un dispozitiv electro-mecanic ce transformă deplasarea rotativ-liniară a unui motor într-un semnal digital.Encoderul optic este cel mai popular tip de traductor, care constă dintr-un disc rotativ, o sursă de lumină și un fotodetector (senzor de lumină). Discul rotativ, care este montat pe axul rotativ al motorului, are modele de sectoare opace și transparente, ce permit trecerea fluxului luminos .
Pe măsură ce se rotește discul, aceste sectoare decupate în interiorul discului vor permite trecerea fluxului luminos spre fotodector, generând astfel un semnal de ieșire digital. Un encoder incremental simplu, construit dintr-un singur detector nu ne poate oferi informația necesară obținerii unei poziții absolute a axului motorului.
Pentru a determina atât direcția cât și viteza de rotație a motorului se folosesc traductoare cu 2 canale, numite encodere în cuadratură. Acest tip de traductor utilizează doi senzori pentru detecția luminii și 2 rânduri de sectoare opace decupate pe disc. Cel mai frecvent tip de traductor incremental în cuadratură folosește două canale de ieșire ( A și B), pentru a determina poziția. Utilizând două sectoare de cod, defazate cu 90 ̊ unul față de altul, vom determina atât poziția cât și direcția motorului, din ieșirile celor două canale.
Dacă canalul A precede canalul B, discul se va roti în sensul acelor de ceasornic, iar în cazul în care canalul B precede canalul A, deplasarea se va realiza în sens trigonometric(invers acelor de ceasornic). Monitorizarea atât a numărului de impulsuri cât și a fazei relative a canalelor A și B,va permite determinarea poziției și direcției de mișcare a discului rotativ.
În plus, unele encodere incrementale, includ și un al treilea canal de ieșire numit canal de referință sau “semnal de zero”. Acest canal de referință determină doar un singur impuls digital pe rotație, și poate fi utilizat pentru determinarea precisă a unei poziții de referință.
Atunci când este necesară o rezoluție mai mare, se va implementa un numărător ce va contoriza atât fronturile pozitive cât și cele negative ale trenului de impulsuri generat de un singur canal, ceea ce va dubla numărul de impulsuri pe rotație (x2). Numărarea ambelor fronturi ale trenului de impulsuri, ale ambelor canale va conduce la un număr de 4 ori mai mare de impulsuri (x4).
Implementarea hardware a vehicului autonom
Prezentul capitol oferă o descriere amănunțită a designului funcțional al vehicului autonom. Pentru alimentarea întregului sistem este folosit un acumulator reîncărcabil în tehnologia litiu-ion. Tensiunea nominală oferită de acest acumulator este de 7.4 volți fiind alcătuit din două celule înseriate cu o capacitate de 3.7 volți fiecare, și un curent maxim de descărcare de 250mAh. Alimentarea modulului Arduino ProMini a fost realizat direct de la terminalele acumulatorului pe pinii “Raw” și “GND” ai modulului. Stabilizatorul de tensiune integrat de pe placă Arduino va regla tensiunea la valoarea de 5V utilă pentru alimentarea senzorilor analogici cu infraroșu și a controlerului motoarelor. Cei 5 senzori sunt utilizați pentru detectarea pereților labirintului, în procesul de cartografiere al acestuia, dar și pentru determinarea poziției robotului.
Plăcuța folosită pentru controlul motoarelor are la bază un circuit integrat de tip punte H. Tensiunea logică de control a circuitului integrat este furnizată de pinul Vcc al plăcuței Arduino, iar tensiunea de control a celor două motoare este furnizată de ieșirea stabilizatorului de tensiune extern de 5V. S-a abordat această metodă pentru echilibrarea curentului consumat și pentru o funcționare uniformă a celor două motoare, indiferent de nivelul de tensiune al acumulatorului.Rolul punții H este de a controla viteza și direcția celor două motoare.
Comunicația dintre robot și laptop a fost realizată folosind un modul Bluetooth SPP. Acest modul a fost folosit atât pentru programarea microcontrolerului, cât și pentru interfațarea între robot și utilizator oferind informații referitoare la poziția robotului în interiorul labirintului. Comunicația realizată este tip master/slave cu schimbarea alternativă a celor două roluri între modulul bluetooth integrat pe vehicul și cel al laptopului.
În funcție de valorile primite de la senzori, microcontrolerul va comanda circuitul de tip punte H și va transmite modulului Bluetooth informații referitoare la poziția vehicului.Circuitul de tip punte H are rolul de a controla cele două motoare de curent continuu conectate.
Configurația circuitului electronic
Pornind de la diagrama bloc prezentată anterior, am dezvoltat schema circuitului electronic utilizând programul software „ISIS” al suitei Proteus.
Realizarea plăcii circuitului imprimat
Cablajul imprimat a fost realizat folosind programul “Ares” din suita Proteus. Din punct de vedere fizic, plăcută circuitului imprimat a fost realizată folosind tehnica transferului termic. Această tehnică este realizată urmărind pași de mai jos :
Printarea pe hârtie specială “Press n Peel” a circuitului
Suprapunerea hârtiei printate peste placa cu depunere de cupru
Realizarea transferului termic a circuitului pe placă
Îndepărtarea porțiunilor de cupru nedorite folosind un agent coroziv
Plăcuța a fost realizată in dublu strat,folosind circuitele imprimate prezentate in Figura 2.3
Configurația fizică a vehicului
Configurația fizică a vehicului autonom a fost realizată cu scopul de a se încadra în standardele impuse de organizatorii concursurilor de robotică pentru proba de “Labirint”. Pentru participarea la un asemenea concurs, vehiculul autonom va trebui să respecte următoarele prevederi constructive:
Masa totală : nelimitată
Lungimea maximă : 10 cm
Lățimea maximă : 10 cm
Șasiul vehicului autonom a fost realizat din plăcuța de circuit imprimat, acesta fiind și placa de bază a robotului. Plăcuța Arduino ProMini și plăcuța controlerului de motoare au fost poziționate central pe șasiul robotului, pentru a oferi echilibru întregului sistem. Poziționarea celor 5 senzori cu infraroșu a fost efectuată strategic pentru a acoperi o suprafața extinsă de cercetare. Configurația aleasă pentru aranjarea componentelor utilizate este descrisă in imaginea următoare.
Cei 3 senzori frontali sunt folosiți pentru detectarea și evitarea obstacolelor ce apar în fața vehicului, în același timp cei doi senzori laterali sunt folosiți pentru alinierea și deplasarea centrală între zidurile labirintului. Senzori cu infraroșu au fost montați vertical pe suprafața șasiului cu ajutorul unor suporți de aluminiu realizați manual.
Pentru a oferi echilibru și un centru de greutate cât mai jos, cele două motoare împreună cu roțile aferente au fost montate în zona inferioară a șasiului, iar în zona frontală s-a montat o roată de tip “ball caster” cu frecare cât mai mică și mișcare liberă. Roțile folosite sunt confecționate dintr-un cauciuc special cu aderență crescută, pentru a nu permite “efectul de patinare” pe suprafața netedă a labirintului.
Caracteristicile fizice ale roților utilizate:
Diametrul roții de 28 mm
Lățimea roții de 12.7 mm
Diametrul axului de prindere 3mm
Implementarea software a vehicului autonom
Programarea microcontrolerului Atmega328 a fost realizată utilizând opțiunea „SPM ”. SPM este o caracteristică a microcontrolerelor AVR ce permite „auto-programarea” propriei memorii Flash. Acesta metodă constă în rularea codului preincărcat din secțiunea de „boot” a memoriei Flash, ce permite programarea serială a microcontrolerului. Microcontrolerul este setat să pornească executarea instrucțiunilor din secțiunea alocată bootloaderului. Din această secțiune, codul poate accesa zona de aplicație a memoriei Flash și poate efectua operații de citire sau scriere a întregii memorii Flash.
În figura de mai jos este descrisă împărțirea memoriei Flash în cele două secțiuni și operațiunile efectuate din zona memoriei de boot:
Folosind această metodă, nu mai este necesară folosirea unui programator hardware specializat, ci doar de un convertor USB – TTL pentru a realiza conexiunea dintre portul serial al PC-ului și blocul UART al microcontrolerului.
Incărcarea programelor pe microcontroler folosind un convertor USB – RS232
Folosind metoda de programare prezentată mai sus, locul programatorului hardware va fi luat de un simplu convertor USB – Serial. Acest convertor asigură conectivitatea dintre portul USB al PC și interfața serială UART a microcontrolerului. Microcontrolerul va fi capabil să se auto-programeze folosind codul preincarcat din secțiunea de boot. Conexiunea dintre bootloader și PC va fi realizată prin intermediul interfeței UART a microcontrolerului prin pinul de transmisie Tx, respectiv cel de recepție, Rx. În figura de mai jos, este prezentat circuitul electronic folosit pentru programarea microcontrolerului de pe placa Arduino ProMini folosind un convertor USB – Serial:
Incărcarea programelor pe microcontroler folosind modulul bluetooth HC-05
Încărcarea programelor pe microcontroler poate fi realizată utilizând modul bluetooth HC-05. Acesta utilizează protocul SPP (Serial Port Protocol) pentru comunicația wireless între PC și vehiculul autonom, iar conexiunea cu microcontrolerul este realizată prin intermediul interfeței UART. Astfel modul bluetooth HC-05 este un înlocuitor mult mai comod în utilizare, al convertorului USB – Serial prezentat în subcapitolul precedent.
Schema electronică utilizată pentru încărcarea programelor pe microcontroler este prezentată mai jos :
Alimentarea plăcuței Arduino ProMini poate fi realizată în două moduri. Primul mod constă în conectarea unei surse de tensiune nestabilizatate între 5 și 12 V pe pinul Raw al plăcuței Arduino. Al doilea mod constă în conectarea unei surse de tensiune stabilă de 5V pe pinul Vcc. Problema întâmpinată în cazul utilizării acestui circuit a fost cea a amplitudinilor semnalelor TTL. În timp ce semnalul de tip TTL transmis de interfață UART a microcontrolerului are o amplitudine de 5V, modulul bluetooth poate recepția doar semnale cu o amplitudine maximă de 3.3V. Soluția aleasă pentru acest impediment a fost utilizarea unui divizor de tensiune pentru a regla nivelul semnalului de 5V la tensiune acceptată de modulul bluetooth.
Mediul integrat de dezvoltare Atmel Studio 7
Atmel Studio 7 este un mediu integrat de dezvoltare pentru scrierea si depanarea aplicatiilor AVR. Acesta ofera un instrument de management de proiect, un editor de fisiere sursa, un simulator și un ansamblor de fisiere C/C++. Atmel Studio oferă un set mare de caracteristici pentru dezvoltarea de noi proiecte sau depanarea celor existente. Caracteristicile cele mai notabile sunt enumerate mai jos :
Editor de cod pentru limbajele de programare C/C++ si Assembler
Simulator ciclic cu functionalitate de depanare
Extensie ASF ce permite crearea de aplicatii modulare si furnizarea de blocuri de construcție pentru proiecte prototip pe orice platforma AVR
Compatibilitate cu multe extensii ale mediul de dezvoltare Microsoft Visual Studio
Interpretarea informaților oferite de senzorul analogic
Implementarea algoritmului de evitare a obstacolelor a fost realizat cu ajutorul informaților oferite de cei 5 senzori analogici. Interpretarea informaților primite de către microcontroler a fost realizată cu ajutorul convertorului analogic digital, ce transformă tensiunea de ieșire a senzorului intr-o valoarea digitală. Fiind un convertor pe 10 biți, valoarea citită de microcontroler va putea varia intre valoarea 0 și 1023, corespunzătoare intervalului de tensiune analogică 0 – 5V. Insă valorea tensiunii analogice ale ieșirii senzorului variză in intervalul 0 – 3.1 V. Consecința acestui fapt a constat într-o rezoluție mai prostă a convertorului analogic. Acest lucru a fost observat din repetatele citiri instabile ale ieșirii convertorului.
Pentru rezolvarea acestei probleme, a fost aleasă abordarea software. Aceasta constă in realizarea unei funcții de mediere a citirilor senzorului analogic pentru un număr variabil de citiri. Acest lucru a condus la stabilizarea citirilor senzorului analogic.
Funcția de mediere utilizată a fost implementată in librăria SharpIR.h. Aceasta mai cuprinde și funcția de transformare directă a tensiunii analogice a senzorului in valoarea corespunzătoare distanței față de un obiect. Implementarea software a acestei librării o puteți găsi in Anexa 3.
Determinarea distanței parcurse de vehiculul autonom
Determinarea distanței parcurse de robot in interiorul labirintului a fost obținută cu ajutorul celor două traductoare optice montate pe fiecare ax al motorului in parte. Informația oferită de traductorul optic face referire la numărul de rotații ale axului motorului efectuate. Convertirea acestei informații in valoarea corespunzătoare distanței parcurse este realizată prin inmulțirea acesteia cu diametrul roții.
Pentru obținerea unei performanțe ridicate cu privire la determinarea numărului de rotații efectuate, este recomandată conectarea celor două canale ale traductorului la pini de semnal cu capabilități speciale. Mai precis, acești pini trebuie să aibă atașați module de intrerupere externă, ce declanșează o rutină de tratare a acelei intreruperi. Din păcate, platforma Arduino ProMini dispune doar de 2 pini cu astfel de capabilităti, iar prezenta situație solicită 4 astfel de pini. Rezolvarea acestei probleme a fost realizată prin împărțirea echitabilă a celor 2 pini cu capabilități de întrerupere externă pentru cele două traductoare si utilizarea a unor întreruperi generate software pentru ceilalți 2 pini necesari.
Pentru obținerea numărului de rotații efectuate am utilizat funcția read a librăriei Encoder.h. Această funcție utilizează ca parametrii de intrare pinii celor două canale ale traductorului și va returna numărul de incrementări ale axului motorului efectuate.
Librăria utilizată pentru interfațarea microcontrolerului cu cele două traductoare optice se găsește in Anexa 3 alături de intregul cod utilizat pentru dezvoltarea intregului proiect.
Algoritmi de rezolvare ai labirintului
Principalul scop al vehiculului autonom este de a rezolva labirintul și de a găsi ieșirea acestuia într-un interval de timp cât mai scurt. Pentru a realiza această sarcină, este necesară abordarea unui algoritm matematic de căutare al ieșirii. Cei mai importanti algoritmi de cautare dezvoltati pentru rezolvarea unui labirint sunt urmatorii:
“Wall following”
“Depth-First Search”
“Flood-fill”
Algoritmul “Wall Following”
Este cel mai simplu algoritm de rezolvare al unui labirint, în care roboțelul își alege un perete, fie cel din stânga fie cel din dreapta, perete pe care îl va urmări pe tot parcursul labirintului și față de care va menține o distanță aproximativ fixă. Prin luarea zidului ca punct de ghidare,robotul este capabil să găsească ieșirea din labirint,însă fără să îl rezolve. Dezvoltarea software a acestui algoritm este ușor de realizat, însă nu este foarte eficient. Rutinele de parcurgere a labirintului în funcție de ce perete este ales ca și ghid sunt prezentate în Figura 3.5
Algoritmul Depth-First Search
Este un algoritm intuitiv de rezolvarea a unui labirint în care vehiculul autonom începe prin a se mișca drept înainte și de a alege aleator în ce direcție își va continua deplasarea la întâlnirea unei intersecții în labirint. În cazul în care această cale conduce la blocarea robotului , acesta revine la intersecția anterioară și alege o altă cale. Acest algoritm forțează vehiculul autonom să exploreze fiecare cale posibilă în labirint, și prin explorarea fiecărei celule, în cele din urmă găseste ieșirea labirintului. Denumirea algoritmului de “Depth-First Search” este intuitivă deoarece în cazul în care am considera labirintul ca fiind un arbore de căutare,acesta ar fi parcurs în adâncime pentru fiecare “ramură” în parte .
Avantajul acestui algoritm este acela că vehiculul autonom va găsi întotdeauna o cale de ieșire din labirint indiferent de tipul acestuia. Dezavantajul major al acestui algoritm este acela că vehiculul nu va găsi neapărat cel mai scurt sau rapid traseu, fiind irosit mult timp pentru explorarea întregului labirint.
Algoritmul “Flood Fill”
Este o tehnică de căutare eficientă, în care vehiculul autonom “invata” despre împrejurimile sale în timp ce navighează prin labirint și în mod constant actualizează harta de memorie a acestuia pentru a ține evidența pereților și calea cea mai scurtă de rezolvare.
Acest algoritm implică atribuirea de valori fiecărei celule din labirint, fiecare valoarea reprezentând o distanță echivalentă de la orice celulă din labirint la celula destinație. Celulei destinație i se va atribui implicit valoarea 0. De exemplu, în cazul în care vehiculul autonom se regăsește într-o celulă cu o valoare de 1 atribuită, atunci robotul se va afla la o celulă distanță de celula destinație, iar dacă se află într-o celulă cu valoarea 3 atribuită, acesta va trebui să mai parcurgă 3 celule până la destinație .
Presupunând că robotul nu se va deplasa pe diagonala unei celule, ci va avea doar o mișcare paralelă cu unul dintre zidurile labirintului, atribuirea valorilor pentru un labirint de 5 x 5 celule va arată ca în Figura 3.6
În momentul în care vehiculul autonom ajunge într-o intersecție a labirintului, acesta va trebui să examineze toate celulele adiacente care nu sunt separate de pereți și va alege să se deplaseze spre celula cu cea mai mică valoare a distanței față de celula destinație. Pentru exemplul de mai sus, robotul va ignora celula spre “vest” deoarece există un zid despărțitor și se va uita la valorile distanțelor celulelor dinspre nord, est și sud deoarece acestea nu sunt despărțite de ziduri. Celula nordică are o valoare a distanței de 2, cea dinspre est o valoare de 2 și cea sudică o valoare de 4. Aceste valori ale distanțelor se vor sorta pentru a determina care celulă are cea mai mică valoare de distanță. În cazul de mai sus atât celulă nordică cât și cea estică au o valoare a distanței egală cu 2. În acest caz, vehiculul se poate deplasa spre nord sau est traversând același număr de celule până la celula destinație. Din moment ce o rotire ar avea nevoie de mai mult timp, robotul va alege să meargă în față înspre celula nordică.
Pentru a determina care din celule sa fie ignorate se vor efectua urmatorii pasi:
Există perete desparțitor între robot si celula nordică?
DA : Ignoră aceea celulă.
NU : Introdu aceea celulă intr-un vector pentru a putea fi examinată
Există perete desparțitor între robot si celula estică?
DA : Ignoră aceea celulă.
NU : Introdu aceea celulă intr-un vector pentru a putea fi examinată
Există perete desparțitor între robot si celula sudică?
DA : Ignoră aceea celulă.
NU : Introdu aceea celulă într-un vector pentru a putea fi examinată
Există perete despărțitor între robot si celula vestică?
DA : Ignoră aceea celulă.
NU : Introdu aceea celulă într-un vector pentru a putea fi examinată
La sfârșitul acestei rutine se vor extrage valorile din vector și se vor sorta crescător pentru a determina care din celule adiacente este cea mai apropiată de celula destinație .
Testarea vehicului autonom
Pentru verificarea funcționalității implementării hardware si software a fost necesară crearea unui mediu propice de testare. Acest lucru a condus la construirea unui labirint, realizat din următoarele materiale :
Placă de PFL cu dimensiunea de 1250 x 1250 x 2.5 mm
5 plăci de polistiren cu dimensiunea de 500 x 500 x 5 mm
Bandă dublu adezivă
Baza labirintului a fost realizată din placa de PFL, iar zidurile necesare din bucăti de polistiren cu înăltimea de 15 cm. Aceste ziduri miniaturale au fost lipite pe placa din PFL cu banda dublu adezivă. Această metodă a permis schimbarea usoară a confgurației zidurilor labirintului, o caracteristică importantă din punctul de vedere al testării.
Imaginea de mai jos ilustrează o configurație posibilă de labirint:
Testarea completă a vehicului a fost realizată urmărind cele 3 scenarii prezentate mai jos :
„Modul de evitare a obstacolelor”
„Modul de rezolvare labirint”
„Modul de control de la distantă folosind un telefon mobil cu capabilitate de comunicație Bluetooth”
Modul de evitare al obstacolelor
Acest mod de testare a constat in setarea unei distanțe minime intre senzorul frontal și orice obstacol din proximitatea acestuia. Robotul se va deplasa sub forma unei linii drepte până la intalnirea unui obstacol. Depăsirea distanței minime va comanda imediat deplasarea înapoi in linie dreaptă a vehicului, urmată de o rotire cu 90 ̊ spre stânga.
Un alt test asemănător cu cel de evitare a obstacolelor este cel de menținere a unei distanțe fixe a vehicului autonom față de un zid. Vehiculul autonom va păstra o distanță constantă față de un zid cu ajutorul celor doi senzori frontali. Viteza celor două motoare va fi modificată in funcție de valorile celor doi senzori, interpretate cu ajutorul convertorului analogic digital. Desfășurarea testului constă prin mișcarea unei plăci albe de polistiren prin fața vehiculului, iar acesta va încerca să păstreze o distanță fixă față de aceasta. Codul funcției implementate pentru realizarea acestui test este cel descris în următoarele rânduri :
void adjuster()
{
sensor s1,s2,s3,s4,s5;
s1.val = analogRead(A6);//citire valori senzori
s2.val = analogRead(A0);
s3.val = analogRead(A1);
s4.val = analogRead(A2);
s5.val = analogRead(A3);
s2.val=map(s2.val,0,1023,0,255); // convertire valore interval 0-255
s4.val=map(s4.val,0,1023,0,255);
set_motors(70-s2.val,70 -s4.val); // factor de umplere pentru motoare
}
Modul de rezolvare labirint
Cel de al doilea scenariu de testare a constant în implementarea algoritmului „Wall Following” prezentat in capitolul 3.6.1. Acest algoritm constă in alegerea unui zid lateral, fie cel din stânga, fie cel din dreapta, pe care robotul va incerca să il urmărească pe tot parcursul deplasării în interiorul labirintului. Schema logică software de mai jos prezintă implementarea acestui algoritm, utilizând zidul din stânga ca zid urmăritor.
Modul de control de la distanță
Cu ajutorul modulului Bluetooth HC-05, vehiculul este capabil să comunice cu alte dispozitive electronice ce dețin, de asemenea, un modul bluetooth integrat. În acest mod, vehiculul poate fi ușor controlat de pe un telefon mobil. Dezvoltarea acestui scenariu de testare a fost realizat urmărind pașii de mai jos:
Sincronizarea celor două dispozitive bluetooth
Transmiterea caracterelor de pe telefon mobil cu ajutorul unei aplicatii de tip terminal
Recepționarea caracterelor transmise de pe telefon
Decodarea caracterelor primite
Efectuare de comenzi de parcurgere în funcție de caracterul receptionat
Golirea bufferului de recepție al modulului Bluetooth de pe vehicul
Concluzii
Această lucrare prezintă dezvoltarea unui vehicul autonom capabil să găsească ieșirea din interiorul unui mediu complex, precum cel al unui labirint. Au fost accentuate diversele probleme tehnice apărute pe tot parcursul implementării și prezentate soluțiile de rezolvare găsite. Imagini ale dezvoltării practice le puteți găsi in Anexa 1.
Testarea și calibrarea vehicului a fost realizată urmărind mai multe direcții de dezvoltare și utilizare. Rezultatele testelor realizate sunt satisfăcătoare și în concordanță cu obiectivele propuse la începutul proiectului. Conform acestora, vehiculul poate fi utilizat ca robot de recunoaștere in timpul operațiunilor de salvare și transmiterea de informații către o bază de control aflată la distanță.
Proiectarea și implementarea vehicului autonom a ținut cont de reglementările impuse de organizatorii concursurilor de robotică pentru proba de labirint. Rezultatele obținute in urma testării robotului insuflă increderea și convingerea obținerii unui robot competitiv la viitoarele participări la concursuri tematice.
Vehiculul este capabil să mențină o comunicație activă cu un dispozitiv electronic echipat cu un modul Bluetooth. Acesta poate funcționa atât ca vehicul autonom, apt să decidă singur direcția de deplasare, cât și ca vehicul telecomandat. Utilizarea sa ,ca vehicul telecomandat, poate fi realizată cu ajutorul unui telefon mobil, prin trimiterea de comenzi de control al motoarelor. Distanța maximă testată pentru menținerea unei conexiuni active intre vehicul și telefon mobil este de 10m, utilizând modelul Nokia Lumia 635.
Eventuale îmbunătățiri ale sistemului :
Utilizarea unor senzori analogici de măsurare a distanței cu un interval mai mare de detecție
Utilizarea unui modul bluetooth cu viteză de transmitere a datelor mai mare
Echiparea vehicului cu o cameră de filmat pentru transmiterea in timp real de imagini
Utilizarea unui șasiu cu sistem de suspensie cu amortizoare pentru deplasarea indiferent de caracteristicile mediului
Bibliografie
[1. Foaie de catalog Atmel Atmega328.[Citat: 10 Mai 2016.]
http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf.
2. Lucrul cu întreruperile [Citat: 15 Mai 2016.]
http://andrei.clubcisco.ro/cursuri/3pm/lab2.pdf.
3. Laborator 2 Întreruperi,Timere.[Citat: 21 Mai 2016.]
http://cs.curs.pub.ro/wiki/pm/lab/lab2.
4. AVR127:Understanding ADC Parameters.[Citat: 23 Mai 2016.]
http://www.atmel.com/images/atmel-8456-8-and-32-bit-avr-microcontrollers-avr127-understanding-adc-parameters_application-note.pdf.
5. Foaie de catalog senzor analogic Sharp GP2Y0A41SK0F [Citat: 24 Mai 2016.]
http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a41sk_e.pdf.
6. Pololu Carrier With Sharp GP2Y0A60SZLF Analog Distance Sensor.[Citat: 25 Mai 2016.] https://www.pololu.com/file/0J86/TB6612FNG.pdf.
7. How Bluetooth works. [Interactiv] [Citat: 29 Mai 2016.] http://electronics.howstuffworks.com/bluetooth.htm.
8. Bluetooth radio interface, modulation, & channels.[Citat: 29 Mai 2016.]
http://www.radio-electronics.com/info/wireless/bluetooth/radio-interface-modulation.php.
9. Stallings,William. Wireless communications & networks (2005)
10. Comunicația Bluetooh.[Citat: 30 Mai 2016.] http://www.engineering.upm.ro/masterie/sacpi/mat_did/elen065/docum/lucrari_dipl/Bluetooth.pdf.
11. Motor miniatural Pololu.[Citat: 02 Iunie 2016.]
https://www.pololu.com/product/1093.
12. Differential drive with continuous rotation servos and Arduino.[Citat: 02 Iunie 2016.]
13. Circuit electronic de tip punte H.[Citat: 03 Iunie 2016.]
https://en.wikipedia.org/wiki/H_bridge.
14. Driver IC for Dual DC motor.[Citat: 05 Iunie 2016.] https://www.pololu.com/file/0J86/TB6612FNG.pdf.
15. Introduction to PWM.[Citat: 10 Iunie 2016.] https://hekilledmywire.wordpress.com/2011/08/03/introduction-to-pwm-part-7/.
16. Incremental Encoder.[Citat: 10 Iunie 2016.]
17. Karan, Thakkar J. An intelligent solve mazing robot.
18. Alsubaie, Mohamed. Algorithms for maze solving robot. s.l. : Manchester Metropolitan University, 2013.
Anexa 1 Imagini cu realizarea practică
Anexa 2 Cod sursă –Scenariul de evitare a obstacolelor
int PWMA = 6; //Control viteză mootor 1
int AIN1 = 4; //Directie motor 1
int AIN2 = 7;
int PWMB = 5; //Control viteză motor 2
int BIN1 = 10; //Directie motor 2
int BIN2 = 9;
int stdby =8;
struct sensor {
int pin;
int val;
};
void init_sensor(){
sensor s1,s2,s3,s4,s5;
s1.pin=A6;
s2.pin=A0;
s3.pin=A1;
s4.pin=A2;
s5.pin=A3;
return;
}
void setup() {
Serial.begin(57600); //Porneste comunicatia seriala
init_sensor();
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(stdby,OUTPUT);
digitalWrite(stdby,HIGH);
}
void loop() {
sensor s2,s4;
s2.val = analogRead(A0); // citire valoare senzor
s4.val = analogRead(A2);
s2.val=map(s2.val,0,1023,0,255);
s4.val=map(s4.val,0,1023,0,255);
Serial.print(s2.val);
Serial.print(" ");
Serial.println(s4.val);
set_motors(70-s2.val,70 -s4.val);
delay(100);
}
void set_motors(int a, int b)
{
if(a < 0){
digitalWrite(AIN1,0);
digitalWrite(AIN2,1);
a = -a;
}else{
digitalWrite(AIN1,1);
digitalWrite(AIN2,0);
}
if(b < 0){
digitalWrite(BIN1,1);
digitalWrite(BIN2,0);
b = -b;
}else{
digitalWrite(BIN1,0);
digitalWrite(BIN2,1);
}
analogWrite(PWMA, a);
analogWrite(PWMB, b);
}
Anexa 3 Cod sursă – Scenariul „Rezolvare Labirint”
int PWMA = 6; //Control viteza motor 1
int AIN1 = 4; //Directie motor 1
int AIN2 = 7;
int PWMB = 5; //Control viteza motor 2
int BIN1 = 10; //Direction motor 2
int BIN2 = 9;
int dreapta=A6; //Pin senzor dreapta
int fata=A1; //Pin senzor fata
int stanga=A3; //Pin senzor stanga
int vdreapta=0; //Valoare citita senzor dreapta
int vfata=0; //Valoare citita senzor fata
int vstanga=0; //Valoare citita senzor stanga
float Kp=0.3; //Parametru K pt control PD
float Kd=0.1; //Parametru D pt control PD
int vMax=45; //Valoare maxima PWM
float pd;
float last_proportional;
int p_s;
int p_f;
int p_d;
void setup(){
Serial.begin(57600);
pinMode(PWMA, OUTPUT);
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(BIN1, OUTPUT);
pinMode(BIN2, OUTPUT);
pinMode(8,OUTPUT);
digitalWrite(8,HIGH);
}
void loop (){
sensor();
maze();
}
void set_motors(int a, int b)
{
if(a < 0){
digitalWrite(AIN1,0);
digitalWrite(AIN2,1);
a = -a;
}else{
digitalWrite(AIN1,1);
digitalWrite(AIN2,0);
}
if(b < 0){
digitalWrite(BIN1,1);
digitalWrite(BIN2,0);
b = -b;
}else{
digitalWrite(BIN1,0);
digitalWrite(BIN2,1);
}
analogWrite(PWMA, a);
analogWrite(PWMB, b);
}
int pid()
{
int d = analogRead(dreapta);
int s = analogRead(stanga);
int proportional = d – s;
int derivative = proportional – last_proportional;
last_proportional = proportional;
int pd = proportional * Kp + derivative * Kd;
if(pd > vMax)
return vMax;
if(pd < -vMax)
return -vMax;
return pd;
}
void stop(){
set_motors(0,0);}
void forward(){
pd = pid();
set_motors(vMax,vMax);
if(pd < 0)
set_motors(vMax,vMax-pd);
if(pd >0)
set_motors(vMax+pd,vMax);
}
void back(){
set_motors(-35,-35);
delay(25);
}
void right(){
set_motors(20,60);
delay(200);
Serial.println("Dreapta");
}
void left(){
set_motors(60,20);
delay(200);
Serial.println("Stanga!!!!");
}
void intoarcere() {
set_motors(-120,120);
delay(300);
Serial.println("Intoarcere");
}
void maze() {
if(p_s==0){
left();
} else if(p_f==0){
forward();
}else if(p_d==0){
right();
}else
intoarcere();
}
void sensor() {
p_s=0; /1 ai perete
p_f=0; /0 nu ai perete
p_d=0;
vdreapta=analogRead(dreapta);
vfata=analogRead(fata);
vstanga=analogRead(stanga);
Serial.print(vstanga);
Serial.print("….");
Serial.print(vfata);
Serial.print("….");
Serial.println(vdreapta);
if(vfata > 250)
p_f=1;
if(vstanga > 150)
p_s=1;
if(vdreapta > 150)
p_d=1;
}
Anexa 4 Scenariu Vehicul telecomandat
#include <Arduino.h>
#include "TB6612FNG.h"
#include "Encoder.h"
Motor Md(6,4,7);
Motor Ms(5,9,10);
Encoder Ed(2,11);
Encoder Es(3,12);
void setup() {
Serial.begin(57600);
pinMode(8,OUTPUT);
digitalWrite(8,HIGH);
}
long pozitieS = -999;
long pozitieD = -999;
void loop()
{
control_laptop();
}
void control_laptop()
{
int s;
if (Serial.available())
{
Serial.begin(57600);
s = Serial.read();
Serial.println(char(s));
if (s == '1' ) //deplasare in linie dreapta in fata
{
Md.ChangeDirection(true);
Ms.ChangeDirection(true);
Md.ChangeSpeed(50);
Ms.ChangeSpeed(50);
Ms.Rotate();
Md.Rotate();
Serial.println("Cazul mers in fata");
}
if (s == '3') //rotire 90 de grade spre stanga
{
Md.ChangeDirection(true);
Ms.ChangeDirection(true);
Md.ChangeSpeed(50);
Ms.ChangeSpeed(10);
Serial.println("Cazul rotire stanga");
Ms.Rotate();
Md.Rotate();
delay(500);
Ms.Stop();
Md.Stop();
}
if (s == '4') //rotire 90 de grade spre dreapta
{
Md.ChangeDirection(true);
Ms.ChangeDirection(true);
Md.ChangeSpeed(10);
Ms.ChangeSpeed(50);
Serial.println("Cazul rotire dreapta");
Ms.Rotate();
Md.Rotate();
delay(500);
Ms.Stop();
Md.Stop();
}
if (s == '5') //oprire motoare
{
Ms.Stop();
Md.Stop();
Serial.println("Cazul oprire");
}
if (s == '2') //mers cu spatele
{
Md.ChangeDirection(false); //Schimba sensul de rotatie inapoi
Ms.ChangeDirection(false);
Md.ChangeSpeed(25);
Ms.ChangeSpeed(25);
Ms.Rotate();
Md.Rotate();
Serial.println("Cazul mers cu spatele");
}
}
}
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: Robot autonom de parcurgere și mapare a unui labirint [303890] (ID: 303890)
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.
