Obstacle Avoider

Introducere

Proiectul consta intr-un robot autonom care urmeaza o traiectorie aleatoare evitand obstacole. Cand un obiect blocheaza traiectoria curenta robotul se roteste pana gaseste o noua traiectorie libera si continua deplasarea.

Descriere generală

Pentru detectia obiectelor este folosit un senzor de distanta cu infrarosu. Acesta genereaza un semnal analogic cu o valoare dependenta de distanta pana la obiectul din fata sa (legea de depententa prezentata in datasheet). Semnalul este apoi preluat de microcontroller si analizat cu ADC-ul acestuia. Valoarea este analizata de program si in functie de ea se decide directia de deplasare a robotului. Aceasta decizie se traduce prin semnale specifice date driverului de motor care va controla directia de deplasare prin ajustarea turatiilor celor 2 motoare.

Mai jos este prezentata schema bloc a proiectului.

Hardware Design

Pentru partea electronica am ales implementarea unei noi placute care sa contina si driverul de motor. Lista de piese:

  • ATMega16 - microcontroller
  • L293D - driver motor
  • SHARP GP2Y0A21YK0F - senzor distanta cu infrarosu
  • cristal quartz 16 MHz
  • condensatori 22pF x2 pentru cristal
  • condensatori 2.2uF x2 (circuit RC la reset si pentru AREF)
  • rezitenta 10k (circuit RC la reset)
  • 2 motoare de curent continuu
  • cutie de viteze

Schema electrica:

Pentru realizarea schemei electrice am folosit Proteus.

Software Design

Dezvoltarea firmware-ului a fost facuta cu AVR Studio. Data fiind natura simpla a comportamentului robotului, nu exista algoritmi sau structuri de date complexe. La pornirea robotului se fac initializarile convertorului analog-digital si se seteaza directiile porturilor (intrare pentru senzor si iesire catre driverul de motor). Programul intra apoi intr-o bucla infinita in care determina valoarea citita de la senzor si o compara cu un prag. Daca aceasta reprezinta valoarea corespunzatoare unui obstacol in fata robotului, se transmite pe portul catre driverul de motor comanda “stanga” si se asteapta un anumit numar de milisecunde (intoarcerea robotului), altfel se continua deplasarea inainte.

Valoarea de prag este calculata conform datasheetului: 10cm ⇒ 2.5v ⇒ 5v/2 ⇔ 1024/2 = 512

Comenzile catre driverul de motor sunt definite ca valori pentru portul de iesire (ce determina directiile de rotatie ale motoarelor) :

#define MOTOR_LEFT 0b10000001
#define MOTOR_RIGHT 0b01000010
#define MOTOR_FORWARD 0b01000001
#define MOTOR_BACKWARD 0b10000010

Rezultate Obţinute

Legarea microcontrolerului la driverul de motor este corecta, in urma testelor putand da diverse comenzi pentru deplasarea in diverse directii. Spre finalul realizarii proiectului am remarcat ca senzorul folosit nu mai da rezultate. Am incercat si folosirea unui alt senzor de backup (LV-MaxSonar-EZ1), dar si acesta furnizeaza valori aleatoare. Prin urmare functionarea efectiva a robotului nu este cea asteptata.

17052011589.jpg

17052011587.jpg

Concluzii

Realizarea efectiva a unui proiect aparent simplu poate duce la multe complicatii neasteptate, iar rezolvarea lor tine mult de experienta de lucru cu dispozitive embedded.

Download

Arhiva proiectului cu schema electrica si firmware - mirceatraichioiu332cb-obstacle-avoider.zip

Bibliografie/Resurse

Datasheet-uri:

pm/prj2011/dtudose/obstacle-avoider.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0