Urmăritor de linie

Introducere

2marmote: Epure Andrei & Ioan Liviu

Echipa: 2marmote

  • Epure Andrei, 335 CC
  • Ioan Liviu, 335 CC

Obiectiv: MașinaMarmotă

Descriere generală

Un urmăritor de linie este o mașină care, cu ajutorul unor senzori, urmărește o linie neagră (în 2012 a avut 2 cm) pe un fundal alb.

Schema bloc a circuitului:

Componentele de bază ale proiectului sunt:

microcontrollerul ATMEGA-16
senzori de reflectanță
driver de motor
2 motoare

Programul citește prin ADC date de la senzori și, în funcție de valorile primite, comandă motoarele.

Hardware Design

Mașina este alcătuită din:

Cantitate Componentă
1 plăcuță cu microcontroller-ul ATMEGA-16
1 driver de motor
2 motor de curent continuu
2 roată pentru motor
1 rotiță de sprijin
1 linie de senzori infraroșu QTR 8A
1 cutie 6 baterii R6
1 conector baterie 9V
6 baterii R6 1.5V
fire

Driver-ul de motor este alcătuit din:

Plăcuța de la etapa 1 este alimentată de la bateria de 9V. Driver-ul, motoarele și senzorii sunt alimentați de la ieșirea regulatorului de tensiune 7805. Toate componentele au masa comună.

Schema detaliată a circuitul nostru:

Schema electrică a senzorilor:

Software Design

Pentru dezvoltare am folosit AVR Studio 4 și AVR Toolchain. Pentru depanare am folosit Realterm.

Configurația porturilor

După cum se vede în descrierea hardware, comenzile s-au dat pe portul D. Viteza am transmis-o prin PWM folosind Timerul 1, ca în laboratorul 2.

Configurația pe portul D este:

PD5,PD4 PD3,PD2 PD1,PD0
activarea motoarelor comenzile pentru motorul 1(dreapta) comenzile pentru motorul 2(stânga)

Direcțiile posibile:

Direcție motorul 1(dreapta) motorul 2(stânga)
înainte înainte - 10 înainte - 01
stânga înainte - 10 oprit - 00
dreapta oprit - 00 înainte - 01
înapoi înapoi - 01 înapoi - 10
/* comandarea motoarelor 
 * Motorul 2 - PD1, PD0. FW = 01.
 * Motorul 1 - PD3, PD2. FW = 10.
 * PWM - PD5, PD4. Tot timpul pe 11.
 */
#define FW 0x39 //0011 1001
#define R  0x31 //0011 0001
#define L 0x38  //0011 1000
#define BW 0x36 //0011 0110
#define STOP 0x00 //0000 0000

Comandarea mașinii

Codul pentru a mișca mașina:

void move (unsigned char dir,  int speed)
{
        PORTD = 0x00;
        PORTD = dir;
 
        OCR1A = speed;
        OCR1B = speed;
}

Avem în total 8 senzori. Sunt numerotați astfel:

stânga → dreapta
1 2 3 4 5 6 7 0

Scopul nostru: cei 2 senzori centrali (4 și 5) să se afle pe banda neagră, central sau pe margine.

Senzori pe banda neagră Caz Comportament mașină
4,5 Mașina este centrată Înaintează
1,2,3 Mașina este cu partea central-dreaptă pe alb Virează stânga
6,7,0 Mașina este cu partea central-stânga pe alb Virează dreapta
- Mașina a ieșit de pe bandă Merge înapoi

Pentru marșalier, am adăugat un timp de menținere a comenzii pentru a da în spate o distanță mai mare.De asemenea, dacă mașina a ieșit de pe pistă, următorul viraj de după întoarcere va fi prelungit.
Valoarea de “margine” a fost determinată empiric și reprezintă o valoare acceptabilă pentru a considera că senzorii sunt în apropierea negrului.

	/* dacă ne întoarcem, marcăm acest integer */
	went_back = 0;
 
	while (1) {
 
		for (i = 0; i < 8; i++) {
			sensors[i] = ADC_get(i);
		}
 
		/* senzorii centrali sunt pe negru? */
		if (sensors[4] > margin || sensors[5] > margin)
			move(FW, 800);
		else if (sensors[7] > margin || sensors[6] > margin || sensors[0] > margin ) {
			/* senzorii de dreapta sunt pe negru, facem dreapta */
			move(R, 600);
			if (went_back) {
				_delay_ms(500);
				went_back = 0;
			}
		} else if (sensors[1] > margin || sensors[2] > margin || sensors[3] > margin) {
			/* senzorii de pe stânga sunt pe negru, facem stânga */
			move(L, 600);
			if (went_back) {
				_delay_ms(500);
				went_back = 0;
			}
		} else {
			/* niciun senzor nu e pe negru */
			move(BW, 500);
			_delay_ms(500);
			went_back = 1;
		}
 
		_delay_ms(10);
 
	}
 

Codul complet se găsește în arhiva de la descărcări.

Depanarea senzorilor

Implementarea noastră a pornit de la codul laboratorului 3. În laboratorul 3 se tratează comunicarea pe interfața serială și măsurarea semnalelor analogice prin ADC. Am avut nevoie de comunicarea prin RS232 pentru depanarea rezultatelor senzorilor. Echipamentul necesar (cablu convertor USB-RS232) ne-a fost oferit de echipa PM, cărora le mulțumim. Am utilizat Realterm pentru a vedea rezultatele.

Detalii cod:

  • se introduce o valoare între 0 și 7
  • sunt interogate toate canalele ADC - cei 8 senzori - și se trimite pe serială
  • se întrerupe interogarea cu tasta 'q'
  • se reia procesul

Codul complet se găsește în arhiva de la descărcări.

Rezultate Obţinute

Mașinuța urmărește cu succes o linie neagră pe fundal alb. În momentul în care iese de pe linie, reușește să se redreseze.

Concluzii

La început a fost frustrant, nu ne ieșea nimic. Când mașina a început să miște a devenit interesant. În final, am reușit să lipim cu letconul. Ni s-a confirmat faptul că nu ne pricepem la electronică.

Download

Depanare senzori pe serială: DebugSensors.c
Cod funcțional mașină: MarmotMachine.c

2marmote2012.zip

Jurnal

Plăcuțiada

Recomandare: să aveți cumpărate mai multe plăcuțe pentru corodat, deoarece s-ar putea să nu reușească procedeul din prima.

Plăcuța cu microcontroller

La această etapă, am întâmpinat numeroase probleme.

  • Când am vrut să ne apucăm de lipit, am observat că ne lipsesc piese.
  • Letconul cumpărat a fost de proastă calitate.
  • Am cumpărat încă unul, la fel de prost.
  • Apoi, am dat vina pe fludor. Fludor nou …
  • Surpriză: nici cu noul fludor nu am putut să lipim.
  • Am apelat la asistenți: pilire puternică a vârfului de letcon. Efect: nul.
  • Într-un final, cu ajutorul asistenților, am reușit să avem o plăcuța funcțională.

Etapa finală

  • Cu ocazia etapei finale, ne-am plimbat cu mult drag prin București: am vizitat zona Berceni (Robofun) și am revizitat Str. Maica Domnului (toate magazinele).
  • Pentru a interacționa cu senzorii, am avut nevoie de un cablu USB-la-Serial, pe care l-am obținut de la echipa de PM.
  • După strădanii de câteva ore pentru a obține datele, am scris un cod care a ținut cont foarte vag de valorile primite pe USART.
  • Cu două zile înainte de termen: bucurie nesfârșită, datorată robotului care atacă traseul cu mult curaj și dăruire.

Mulțumiri

Mulțumiri coordonatorului Adrian și tuturor celor din echipa de PM care:

  • ne-au răspuns la întrebări (oricât de puțin inteligente)
  • ne-au ajutat, în timpul laboratoarelor sau în afara lor, cu:
    • sfaturi
    • găuri suplimentare pentru plastic
    • tăiat plastic
    • depanat
    • oferit echipamente de lucru.

Bibliografie/Resurse

pm/prj2012/abostan/13.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