User Tools

Site Tools


Sidebar

Introducere

Proiectul ales de noi consta in realizarea unui robot care este capabil sa urmareasca o linie trasata pe suportul pe care se deplaseaza. Linia trebuie sa fie in contrast cu culoarea suportului. Este necesar ca linia sa nu aiba curbe prea bruste.

Scopul proiectului este de a ne familiariza cu realizarea de scheme electronice folosind microcontroller-ul ATMega16. Deasemenea acest proiect necesita si o parte practica de realizare a placutei electronice. Aceasta etapa implica si folosirea unor programe de dezvoltare folosite in industrie cum ar fi Eagle CAD. Un alt plus este si experienta de a programa sisteme bazate pe microcontrollere precum si capacitatea de a dezvolta un proiect hardware.

Robotica este un domeniu interesant si in plina ascensiune, de aceea am hotarat sa facem un proiect care necesita inteligenta artificiala. Astfel robotul este dotat cu niste senzori iar pe baza acestora ia niste decizii.

Proiectul nostru poate servi ca un punct de plecare pentru alti studenti in ideea unor imbunatatiri ulterioare.

Descriere generală

Schema bloc :

Urmarirea liniei se face cu ajutorul a patru senzori situati in partea din fata a robotului.

Semnalul analogic ce vine de la senzori este transmis comparatorului pentru a obtine valori de 0 sau 1. Aceste valori sunt apoi transmise microcontrolerului care va decide cum vor actiona motoarele.

Atunci cand un senzor va fi pozitionat deasupra liniei se va transmite valorea 0 microcontrolerului. Cand senzorul se afla deasupra suprafetei negre valoarea transmisa va fi 1. Astfel in functie de valorile celor patru senzori vom stii starea in care se afla robotul si se va decide modul de actionare a motoarelor. Astfel daca un senzor de pe margine va receptiona valoarea 0, motorul se va opri sau chiar va merge inapoi. Diferenta intre vitezele de rotatie face posibila luarea de viraje la stanga sau dreapta.

Pentru deplasarea robotului am folosit 4 roti, 2 roti pe partea dreapta, controlate de motorul drept si 2 roti pe partea stanga, controlate de motorul stang.

Hardware Design

Lista de piese necesare (in plus fata de placuta de programare):

  • un circuit integrat L293D sau L293B
  • 2 circuite integrate 4011 (fiecare contine 4 porti NAND)
  • 2 motoare de 5 V
  • 4 fotodiode
  • 4 leduri tip spot
  • 4 potentiometre 100K
  • 4 rezistente 500 ohm
  • 8 diode 1N4001 (pentru circuit L293B)
  • conectori

Comanda motoarelor se realizeaza cu ajutorul unei punti H care permite atat controlarea vitezei cat si a sensului de rotatie. Schema unei punti H este:

Circuitul integrat L293 este o punte H folosita pentru a controla viteza de rotatie precum si sensul de rotatie pentru cele 2 motoare. Acest circuit este controlat de catre softul aflat pe microcontroller.

Schema de control a motoarelor cu circuitul L293D este urmatoarea :

In cazul circuitului L293B se vor folosi 8 diode pentru protectie. Circuitul L293D are integrate aceste diode. A se vedea in datasheet si in schema puntii H de mai sus (diodele D1, D2, D3, D4).

Un senzor pentru detectia liniei este realizat astfel:

Sunt necesari 4 astfel de senzori. Amplasarea celor 4 senzori pentru detectarea liniei este:

Amplasarea senzorilor depinde de multi factori cum ar fi grosimea liniei, viteza masinii, viteza ce citire a senzorilor, luminozitatea externa. Se observa asezarea ledurilor spot aproape de fotodiode pentru a crea luminozitatea necesara detectarii liniei. Deasemenea fotodiodele vor fi invelite lateral pentru a nu fi influentate de lumina ambianta.

Software Design

Aplicatia a fost realizata in limbajul de programare C, folosind mediul de dezvoltare AVRStudio. O descriere a aplicatie este :

Se citesc indicatiile senzorilor. In functiile de valorile citite sa iau urmatoarele decizii:

Pentru senzorii din partea dreapta:
- daca senzorul R1 a detectat linia, motorul de pe partea dreapta se opreste
- daca senzorul R2 a detectat linia, motorul drept merge inapoi
- altfel, motorul drept merge drept inainte
Pentru senzorii din partea stanga:
- daca senzorul L1 a detectat linia, motorul de pe partea stanga se opreste
- daca senzorul L2 a detectat linia, motorul stang merge inapoi
- altfel, motorul stang merge drept inainte

Se repeta acesti pasi intr-o bucla infinita.

Programul este urmatorul :

#include <avr/io.h>

void ports_init(){
	DDRD = 255;
	DDRA = 0;
}
int main(){
ports_init();
PORTD=0b00000000;
go=0;
while(go == 0){
		if (((PINA&_BV(PA5))==0)&&((PINA&_BV(PA4))!=0)){// dreapta interior (R1)
			PORTD&=~(_BV(PD6));
			PORTD&=~(_BV(PD4));
		}else if((PINA&_BV(PA4))==0){ // dreapta exterior (R2)
			PORTD|=_BV(PD4);
			PORTD&=~(_BV(PD6));			
		}else{//motorul drept merge inainte
			PORTD|=_BV(PD6);
			PORTD&=~(_BV(PD4));			
		}
		if (((PINA&_BV(PA7))==0)&&((PINA&_BV(PA6))!=0)){ //stanga interior (L1)
			PORTD&=~(_BV(PD7));
			PORTD&=~(_BV(PD5));
		}else if((PINA&_BV(PA6))==0){ //stanga exterior (L2)
			PORTD|=_BV(PD5);
			PORTD&=~(_BV(PD7));
		}else{
			PORTD|=_BV(PD7);
			PORTD&=~(_BV(PD5));	
		}
	}
}	
Este important ca robotelul sa fie amplasat initial astfel incat linia neagra sa treaca printre senzorii L1 si R1.

In momentul cand este pornit, robotul se deplaseaza drept inainte pana cand unul din senzori va detecta linia si se va actiona corespunzator pentru a se pozitiona din nou pe linie. In cazul in care se tremina linia si senzorii vor detecta numai alb, robotul va continua sa se deplaseze drept in fata.

Surse:

simionliviumihai-robot.zip

Rezultate Obţinute

Am testat robotelul pe mai multe trasee. Probleme au aparut la curbele bruste si inguste, pe care nu le ia bine si iese de pe traseu daca nu este suficienta lumina.

Totodata daca un traseu are o portiune destul de mare ca linie dreapta, robotul va prinde viteza si va iesi de pe linie, nemaiavand timp sa detecteze linia si sa vireze corespunzator.

Pentru rezolvarea unora dintre aceste neajunsuri se poate monta o placuta in fata pentru a impiedica intrarea luminii ambientale. In acest caz trebuie marit numarul de leduri pentru comensarea luminii ambientale.

Imagini:

Concluzii

Ca viitoare imbunatatiri putem enumera:

  • Folosirea convertorului ADC al ATMega16. Acest convertor analog-digital isi poate lua datele de pe 8 pini multiplexati. Astfel putem inlatura din circuitul de detectie portile NAND care au rolul de a transforma semnalul analogic de la senzori in semnal digital. Ca urmare putem modifica programul pentru a detecta exact unde se afla de fapt linia ce trebuie urmarita(ex. intre senzorii 2 si 3 la distanta 2/3 de senzorul 2).
  • Folosirea PWM pentru controlul motoarelor. In acest caz imbunatatirea ar fi ca robotul se va deplasa mai lin in curbe. Montajul de control al motoarelor a fost construit deja in ideea in care ar fi nevoie de PWM, deci nu ar fi necesar decat un upgrade de firmware.
  • Cresterea numarului de senzori si amplasarea lor in mai multe randuri pentru a detecta forma locala a liniei ceea ce ar ajuta la o estimare a traiectoriei viitoare.

Bibliografie/Resurse

pm/prj2009/cb/robot_line_follower.txt · Last modified: 2012/04/29 10:56 (external edit)