Introducere

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).

Descriere Generala

  • Masina este comandata prin joystick pentru a avea un control mai bun asupra vitezei si asupra directiei.
  • Pentru controlul directiei folosesc un servomotor.
  • Prin butoanele de pe joystick se comanda: Semnalizare stanga/dreapta si farurile
  • Cand masina franeaza, se aprind stopurile.

Hardware Design

Lista piese

  1. Masina - am folosit sasiul + motor tractiune
  2. 4 leduri galbene
  3. 2 leduri albe
  4. 2 leduri rosii
  5. 4 rezistente 120 Ohm
  6. 1 rezistenta 1 Ohm
  7. 4 diode BA159
  8. 1 Condensator 100nF
  9. Placa dezvoltare

Puntea H

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.

Servomotor

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:

  • 1 ms pentru 0 grade
  • 1.5 ms pentru 45 grade
  • 2 ms pentru 90 grade

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.

Masina

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:

  • 4 leduri pentru semnalizare
  • 2 leduri pentru faruri
  • 2 leduri pentru stopuri

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)

Joystick

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:

  1. Potentiometru OX
  2. Potentiometru Oy
  3. Potentiometru Sens
  4. Buton semnalizare stanga
  5. Buton semnalizare dreapta
  6. Buton modificare faruri
  7. Buton pornire
  8. Vcc
  9. GND

Schematic

Joystick:

mcjimg10.jpg

Leduri:

mcjimg11.jpg

Placa extensie:

mcjimg12.jpg

Simulare Proteus

mcjimg14.jpeg

Software Design

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:

  1. void initializarePorturi() - setarea directia pinilor microcontrollerul-ului.
  2. void USART_init(void) - Initializare modul USART pt comunicatie la 9600bps, 8 biti de date, la 16MHz
  3. void Timer1_init(void) - initializare Timer1 - canalele A si B, PWM, prescaler 256, frecventa 50 Hz ( TOP=ICR1=1250)
  4. void ADC_init(void) - activeaza ADC si il pune in modul single conversion.
  5. void modificaStopuri(uint8_t mod) - mod = 0 → stinge stopurile, mod = 1 → aprinde stopurile
  6. void modificaHL(uint8_t b2), void modificaSemnalizare(uint8_t b2) - modifica farurile / semnalizarea in functie de comanda primita in byte2
  7. void modificaTractiune(uint8_t b1, uint8_t b2) → determin sens, setez puntea H, actualizez viteza (OCR1B) si eventual modific stopurile.
  8. void modificaDirectie(uint8_t b1) - setare unghi servomotor
  9. int verificare() - daca am schimbat sensul de mers cand masina se afla in miscare → opresc brusc masina, aprind avaria si astept apasarea butonului reset pentru a continua
  10. void citire() - citesc datele de la joystick (potentiometre, butoane).

Cod sursa + simulare Proteus: 332CB_Serbu_Victor.zip

Rezultate obtinute

Placa Baza:

mcjimg2.jpg

Teste placa extensie:

mcjimg3.jpg

Montare Servomotor:

mcjimg4.jpg

Montare leduri si rezistente limitare curent:

mcjimg5.jpg

Montare placa extensie pe masina:

mcjimg6.jpg

Masina 1:

mcjimg7.jpg

Masina 2:

mcjimg8.jpg

Masina:

mcjimg9.jpg

Filmulete:

Concluzii

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.

Bibiliografie

pm/prj2010/dtudose/mcj.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