Scopul proiectului este realizarea unei masinute comandate prin joystick. Initial, am dorit ca masina sa fie telecomandata. Deoarece pentru transmisie as fi avut nevoie de inca o placuta de baza, am renuntat la telecomanda (legatura dintre joystick si masina se face folosind un cablu).
Pentru a controla motorul de tractiune, simpla alimentare de la porturile placutei nu este suficienta pentru ca microcontroller-ul nu poate furniza un curent atat de mare. Pentru a avea un curent mare prin motor se poate folosi un tranzistor, baza tranzistorului fiind conectata la un pin al microcontroller-ului, ca in schema:
Totusi, pentru a selecta si sensul de rotatie al motorului se foloseste o punte H.
Schema punte H:
Functionare punte H:
S1 | S2 | S3 | S4 | |
---|---|---|---|---|
1 | 0 | 0 | 1 | Motor moves right |
0 | 1 | 1 | 0 | Motor moves left |
0 | 0 | 0 | 0 | Motor free runs |
0 | 1 | 0 | 1 | Motor brakes |
1 | 0 | 1 | 0 | Motor brakes |
Pentru puntea H am folosit circuitul integrat L298N. Acest circuit are integrate 2 punti H.
Schema L298N:
Deoarece intrarea switch-ului S2 este intrarea switch-ului S1 negata si intrarea switch-ului 4 este intrarea Switch-ului 3 negata, pentru a selecta sensul de rotatie folosim 2 pini ai microcontroller-ului (PD3 si PD4). Mai folosim inca o iesire a uC pentru a activa o punte H. Deoarece trebuie sa controlez si turatia motorului, pinul EnB de la L298N il conectez la pinul OC1B (PD4) (pentru a utiliza iesirea PWM).
Functionare L298N:
Pentru a proteja partea logica de tensiunea indusa de motor se folosesc 4 diode de protectie.
Un servomotor este un motor DC cu feedback. Nemodificat, se poate roti aproximativ 180 grade. Servomotorul are 3 pini: faza, masa, si comanda. Pentru a controla unghiul, pe pinul de comanda se trimit impulsuri de lungime variabila:
cu o frecventa de 50 Hz.
Pentru a avea o rezolutie cat mai buna, folosesc un numarator pe 16 biti (Timer1 - Canal A) configurat pentru iesire PWM.
Initial, masina folosea pentru directie un motor DC obisnuit, avand 3 directii posibile: stanga, dreapta si in fata. Pentru a avea un control mult mai fin am inlocuit motorul cu un servomotor. Acum sunt posibile aproximativ 16 directii diferite.
Masina a fost echipa si cu leduri:
Deoarece am cuplat cate 2 leduri in paralel, pentru calculului rezistentei de limitare a curentului prin leduri (diode) am folosit urmatoarea formula: R = ( Vin - Vled) / ( 2 * Intensitate led)
Am renuntat la circuitul care transmitea datele de la joystick prin USB. Joystick-ul este conectat la placuta de baza printr-un cablu cu 9 fire:
Programul este scris folosind limbajul de programare C cu ajutorul mediului de dezvoltare AVR Studio si WinAVR.
Initial, masina se afla in repaus. La apasarea butonului PORNIRE masina se deplaseaza cu viteza minima. Daca Y joystick > 0, atunci viteza masinii este v = Vmin + y * (V max - V min)
Daca Y joystick < 0, atunci viteza masina scade (v = v - | Y joystick | ) si se aprind stopurile.
Butonul semnalizare stanga / dreapta de pe joystick incrementeaza/decrementeaza variabila semnalizare. Semnificatia variabilei semnalizare:
semnalizare = 0 sau 4 -> avaria 1 -> semnalizare stanga 2 -> semnalizarile sunt oprite 3 -> semnalizare dreapta
Functii folosite:
Cod sursa + simulare Proteus: 332CB_Serbu_Victor.zip
Placa Baza:
Teste placa extensie:
Montare Servomotor:
Montare leduri si rezistente limitare curent:
Montare placa extensie pe masina:
Masina 1:
Masina 2:
Masina:
Filmulete:
Lucrand la acest proiect am intampinat destule probleme, dar in final am obtinut o masinuta functionala.
O problema a fost faptul ca nu puteam controla servomotorul cand foloseam prescaler 1024 pentru Timer1, desi in simulatorul Proteus functiona corect. Am verificat daca servomotorul functioneaza folosind functia _delay_. Dupa ce am vazut ca servomotorul este functional, am incercat si cu prescaler de 256 si acum PWM-ul functiona.
Cea mai dificila problema a fost inlocuirea motorului pentru directie cu un servomotor.