Introducere

Ne-am propus sa realizam ca proiect, un robot line follower. Acesta are ca scop detectarea si urmarirea unei linii de o culoare pe un fond de o alta culoare. Este preferabil sa alegem culori constrastante pentru linie si fond. Pentru testare vom folosi o linie neagra pe un fond alb.

Descriere generală

Schema bloc:

Robotul va urmari linia neagra cu ajutorul a 4 senzori reflectori. Un senzor este format dintr-un led IR(emitor) si un fototranzistor(receptor). Ledul va emite raze ce vor fi reflectate catre fototranzistor sau absorbite de suprafata intalnita, astfel se va decide care este urmatoarea miscare a robotului.
Senzorii vor transmite semnale analogice catre un comparator LM324,care le va transforma in semnale digitale. Aceste semnale vor fi transmise mai apoi catre microcontrollerul ATMEGA16, in scopul ghidarii celor 2 motoare. Motoarele sunt controlate de mocrocontroller prin intermediul driverullui L293B.

Hardware Design

Pentru construirea robotului am utilizat o masina teleghidata cu 2 motoare, unul pentru deplasare inainte-inapoi si altul pentru directie stanga-dreapta. Motoarele se alimenteaza la 6V iar placa ce contine ATMEGA16 la 5V, de aceea am construit un stabilizator care transforma 6V in 5V.

Schema ATMEGA16:



Circuitul stabilizator are la baza 3 componente: un stabilizator, 2 condensatoare la iesire, 2 condensatore la intrare
Pentru implementare se va folosi stabilizatorul LM7805 ce primeste la input o tensiune de 6V si ofera la output o tensiune de 5V.

Schema stabilizatorului:




Pentru puntea H am folosit circuitul L293B. Acesta este construita sa controleze 2 motoare in acelasi timp. Are 16 pini: 2 pini de input, 2 pini de output pentru fiecare motor. Pentru ca un motor sa mearga, pinul cu enable trebuie sa fie pe high(conectat la Vcc), iar pentru ca motorul sa fie oprit, pinul enable trebuie sa fie pe low(conectat la GND). Pinii de output vor fi conectati la pinii 3, 4, 5, 6 de pe portul D al microcontreller-ului ATMEGA16. Conectarea motoarelor la L293B se face prin Out1 si Out2 sau la Out3 si Out4:



Pentru ca nu am gasit in comert, am hotarat sa implementam senzorii QTR-1RC folosind urmatoarea schema:

Pentru a realiza aceasta schema am avut nevoie de urmatoarele componente: led IR folosit pe post de emitor, fotranzistor folosit pe post de receptor, rezistenta de 220 ohmi, rezistenta de 150 ohmi, condensator de 10 nF.


Functionarea senzorilor este descrisa in urmatoarea imagine:


Cand raza emisa de ledul IR intalneste o suprafata alba, aceasta va fi reflectata si interceptata de fototranzistor. Pe de alta parte cand aceasta raza intalneste o suprafata neagra, ea va fi absorbita si fototranzitorul nu o va mai intercepta. Astfel se transmit anumite valori de tensiune care daca vor depasi un anumit prag vor fi interpretate ca 1 logic sau daca sunt sub acel prag vor fi interpretate ca 0 logic(transformare facuta de conectorul LM324).
Semnalele primite de la senzori vor fi trecute printr-un conector pentru a fi transformate din semnale analogice in semnale digitale. Conectorul folosit este LM324. Schema acestuia este:



La pinii Input1-, Input2-, Input3-, Input4- se vor conecta senzorii, la Input1+, Input2+, Input3+, Input4+ se va conecta un potentiometru pentru a oferi o tensiune de referinta, la Outpu1, Outpu2, Outpu3, Outpu4 vom avea iesirile pentru senzorii 1, 2, 3 sau 4, iar pinul de Vcc va fi conectat la 5V.

Software Design


Daca un senzor se afla pe linia neagra citeste valoarea 0, iar daca este in afara liniei citeste valoarea 1.
Pentru implementare am folosit 4 senzori care functioneaza astfel:

- daca L2 si L3 sunt 0, masina merge inainte
- daca L2 este 0 si L3 este 1, face dreapta
- daca L2 este 1 si L3 este 0, face stanga
- daca L2 si L1 sunt 0, sau doar L1 este 0 si L2 e 1, face stanga
- daca L3 si L4 sunt 0, sau doar L4 este 0 si L3 e 1, face dreapta

Cod C:

#include <stdio.h>
#include <avr\io.h>
#include <avr\interrupt.h> 

#define S1 PA0 
#define S2 PA1 
#define S3 PA2 
#define S4 PA3 
#define SENZ_PORT PORTA
#define MOTOR_PORT PORTD
#define SENZ_DDR DDRA
#define MOTOR_DDR DDRD
#define DREAPTA PD3
#define STANGA PD4
#define INAINTE PD5
#define INAPOI PD6

void initializare_porturi (){
	SENZ_DDR = 0; 
	MOTOR_DDR = 255; 
}

void inainte (){
	MOTOR_PORT &= ~(1<<DREAPTA);
	MOTOR_PORT &= ~(1<<STANGA);
	MOTOR_PORT &= ~(1<<INAPOI);
	MOTOR_PORT |= ~(1<<INAINTE);
}

void la_dreapta (){
	MOTOR_PORT &= ~(1<<STANGA);
	MOTOR_PORT &= ~(1<<INAPOI);
	MOTOR_PORT |= (1<<DREAPTA);
	MOTOR_PORT |= (1<<INAINTE);
		
}

void la_stanga (){
	MOTOR_PORT &= ~(1<<DREAPTA);
	MOTOR_PORT &= ~(1<<INAPOI);
	MOTOR_PORT |= (1<<STANGA);
	MOTOR_PORT |= (1<<INAINTE);

}

void stop (){
	MOTOR_PORT &= ~(1<<INAINTE);
	MOTOR_PORT &= ~(1<<DREAPTA);
	MOTOR_PORT &= ~(1<<STANGA);
	MOTOR_PORT &= ~(1<<INAPOI);
}


int main (){
	
	initializare_porturi ();
	
	while (1) {
		if (((PINA && (1<<S2)) == 0) && ((PINA && (1<<S3)) == 0))
			inainte ();
			
		if (((PINA && (1<<S2)) == 0) && ((PINA && (1<<S3)) == 0) &&
			((PINA && (1<<S1)) == 0) && ((PINA && (1<<S4)) == 0))
			stop ();
			
		if (((PINA && (1<<S2)) == 0) && ((PINA && (1<<S3)) == 1))
			la_stanga ();
		
		if (((PINA && (1<<S2)) == 1) && ((PINA && (1<<S3)) == 0))
			la_dreapta ();
		
		if (((PINA && (1<<S1)) == 0) && ((PINA && (1<<S3)) == 0))
			la_stanga ();
			
		if (((PINA && (1<<S3)) == 0) && ((PINA && (1<<S4)) == 0))
			la_dreapta ();	
		
		if (((PINA && (1<<S3)) == 1) && (PINA && (1<<S1)) == 0)
			la_stanga ();
			
		if (((PINA && (1<<S3)) == 1) && (PINA && (1<<S4)) == 0)
			la_dreapta ();				
	
	}
	
}

Rezultate Obţinute





Concluzii


Proiectul necesita multa atentie in special la conectarea pinilor, dar chiar si asa am reusit sa nu ardem nimic :-D.
Cumpararea unei masinute teleghidate din comert nu este cea mai buna solutie pentru construirea unui robot line follower. Masina noastra este destul de mare si nu se incadreaza prea bine intr-un circuit cu diametrul de 2 cm.
Daca am fi folosit mufe pentru conectarea cablurilor masinuta ar fi aratat mai bine, iar erorile ar fi fost mai usor de depistat.
Senzorii ar fi trebuit comandati din timp nu construiti de noi.
Alimentarea a fost facuta cu baterii care scoteau aproximativ 5V, deci nu a mai fost necesara folosirea stabilizatorului.

Bibliografie/Resurse

pm/prj2010/rtataroiu/itema701.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