Echipa: 2marmote
Obiectiv: MașinaMarmotă
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.
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:
Cantitate | Componentă |
---|---|
1 | punte H L298N |
2 | motor de curent continuu |
8 | diodă BY 299 |
1 | condensator electrolitic 1mF,35V |
1 | cablu IDE |
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:
Pentru dezvoltare am folosit AVR Studio 4 și AVR Toolchain. Pentru depanare am folosit Realterm.
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
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.
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:
Codul complet se găsește în arhiva de la descărcări.
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.
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ă.
Depanare senzori pe serială: DebugSensors.c
Cod funcțional mașină: MarmotMachine.c
Recomandare: să aveți cumpărate mai multe plăcuțe pentru corodat, deoarece s-ar putea să nu reușească procedeul din prima.
La această etapă, am întâmpinat numeroase probleme.
Mulțumiri coordonatorului Adrian și tuturor celor din echipa de PM care: