Scopul proiectului este realizarea unui placute care conectata la calculator si primind comenzi de la tastatura va reusi sa manevreze o masinuta. Pe langa acest lucru, masinuta va putea sa memoreze si sa refaca traseul. Am vazut diferite proiecte care comandau masinute dar care stiau sa faca doar asta. M-am gandit ca ar fi interesat daca, dupa ce ne-am jucat cu masina, la apasarea unei singure taste, ar fi capabila sa refaca traseul.
Nu pot sa zic ca are o utilitate prea mare din moment ce poti sa cumperi o masina cu telecomada direct din magazin. Cred ca mai degraba este placerea de a implica calculatorul in comandarea unei masinute.
Masinuta va putea fi comandata wireless de la tastatura. Din program am facut ca masina sa retina traseul atunci cand e apasata o anumita tasta(R) si va il poata reproduca singura ulterior, la apasarea unei alte taste ('P').
Functionare:
Din punct de vedere hardware am folosit:
Interactiunea microcontroller-releu
Interfata dintre relee si microcontroller este realizata de un circuit de amplificare ca cel din imagine. Pentru o mai mare siguranta am conectat in paralele cu bobina releului, pinii 2 si 6, o dioda de protectie. Am folosit 4 relee, cate unul pentru fiecare directie. Cand utilizatorul tasteaza un carcater, microcontroller-ul da un impuls pe pinul respectiv si activeaza releul ce se ocupa de acea directie. Pinii microcontroller-ului alesi pentru directii: A0-stanga, A1-dreapta, A4-fata, A5-spate.
Interactiunea releu-telecomada
Initial, telecomanda avea pentru stanga-dreapta si fata-spate 2 contacte ce se faceau mecanic atunci cand utilizatorul manevra masina, acum releul este conectat la cele doua puncte ale contactului din telecomanda, actionand practic ca un intrerupator. Pentru releul ales de mine puteam sa conectez cele doua fire, care pleca de la contactul cu masina, fie la pinii 1-7, fie la 8-14, am ales sa lucrez cu pinii 8-14.
Implementarea software a fost facuta utilizand limbajul C si WinAVR cu compilatorul avr-gcc pentru Windows. In functie de tasta apasata, microcontroller-ul da un impuls pe pinul ce se ocupa de caracterul tastat.
Pentru directii, folosesc urmatoarele taste:
Pentru memorarea traseului:
Initial, pentru a merge in una din directiile: stanga-fata, stanga-spate, dreapta-fata, dreapta-spate, puteam sa apasam pe doua butoane ale telecomenzii in acelasi timp, acum e destul de dificil sa apasam doua taste, sa transmit pe cablu serial in acelasi timp cele doua mutari. Solutia pe care am adoptat-o pentru a rezolva aceasta problema: tin minte directia anterioara, daca e fata sau spate si atunci cand apas tasta pentru stanga sau dreapta, masina va merge in stanga(sau dreapta)-directia_salvata, astfel se obtin toate combinatiile de directii.
Pseudocod :
Define-uri:
#define fata 'w' #define spate 's' #define stanga 'a' #define dreapta 'd' #define start 'r' #define stop 't' #define play 'p' #define PIN_DREAPTA PA1 #define PIN_STANGA PA0 #define PIN_FATA PA4 #define PIN_SPATE PA5
Pentru redirectare stdin, stdout pentru receptie, transmisie seriala am folosit 2 functii:
// Functie ce trateaza trimiterea unui caracter pe seriala int uart_putchar(char c, FILE *unused) { if (c == '\n') uart_putchar('\r', 0); loop_until_bit_is_set(UCSRA, UDRE); UDR = c; return 0; }
// Functie ce trateaza primirea unui caracter pe seriala int uart_getchar(FILE* f) { char c; loop_until_bit_is_set(UCSRA, RXC); c = UDR; if(c=='\r') c='\n'; uart_putchar(c,NULL); return c; }
Miscarile masinutei sunt salvate in memorie(comunicare cu EEPROM):
//EEPROM_write: void EEPROM_write(unsigned int uiAddress, unsigned char ucData) { /* Wait for completion of previous write */ while(EECR & (1<<EEWE)); /* Set up address and data registers */ EEAR = uiAddress; EEDR = ucData; /* Write logical one to EEMWE */ EECR |= (1<<EEMWE); /* Start eeprom write by setting EEWE */ EECR |= (1<<EEWE); }
//reading from EEPROM unsigned char EEPROM_read(unsigned int uiAddress) { /* Wait for completion of previous write */ while(EECR & (1<<EEWE)); /* Set up address register */ EEAR = uiAddress; /* Start eeprom read by writing EERE */ EECR |= (1<<EERE); /* Return data from data register */ return EEDR; }
Pentru mai multe detalii privid implementarea a se vedea Download.
Proiectul si-a atins scopul: masina poate fi condusa de la tastatura si reuseste sa memoreze si sa refaca singura traseul.
Comandarea masinutei functioneaza destul de bine…uneori merge usor sacadat, poate din cauza serialei.
Memorarea traseului este, de asemenea buna, masina reusind sa refaca singura traseul.
Resurse Software:
http://instruct1.cit.cornell.edu/courses/ee476/FinalProjects/s2003/kw84/Report/documentation.htm
http://www.scienceprog.com/atmega-eeprom-memory-writing/
Resurse Hardware:
http://courses.cit.cornell.edu/ee476/FinalProjects/s2004/cml45/webpage/index.html
http://datasheet.octopart.com/PRMA2A05-SRC-Devices-datasheet-9227.pdf