Introducere

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.

Descriere generală

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:

  1. Utilizatorul trimite comenzi(caractere) pe o interfata seriala catre microcontroller.
  2. Microcontroller-ul primeste comenzile si le decodifica, decodificarea se refera la codul ASCII al respectivei taste.
  3. In functie de caracterul ce a fost tastat, microcontroller-ul va activa pinul care se ocupa de directia respectiva.
  4. Mai departe, comanda ajunge la releul ce se ocupa cu tratarea comenzilor pentru directia aleasa.
  5. Releul trimite comanda catre telecomada masinutei.
  6. Masina se va misca conform tastei apasate.

Hardware Design

Din punct de vedere hardware am folosit:

  1. 4 relee, am luat PRMA 2A;
  2. Telecomanda masinutei;
  3. Placuta de baza, imprimata, de la prima etapa;

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.

Software Design

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:

  • fata tasta 'w';
  • spate tasta 's';
  • dreapta tasta 'd';
  • stanga tasta 'a';

Pentru memorarea traseului:

  • start memorare 'r'(inregistreaza);
  • stop memorare 't';
  • reproduce traseul invatat 'p';

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.

Rezultate Obţinute

Proiectul si-a atins scopul: masina poate fi condusa de la tastatura si reuseste sa memoreze si sa refaca singura traseul.

Concluzii

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.

Bibliografie/Resurse

pm/prj2010/rtataroiu/masinuta.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