Proiectul meu implica realizarea unei implementari hardware si software a jocului X si 0 pe o placuta ATMega16 , folosind ca mijloc de afisare grafica un display de telefon (Nokia 3310) .
Implementarea va permite jocul in 2 persoane sau versus AI .
In principiu , proiectul ar trebui sa ruleze in felul urmator : un user va folosi butoanele puse la dispozitie pe placuta de extensie pentru a comunica cu LCD-ul . 4 butoane vor fi folosite pentru deplasare pe ecran , iar unul pentru selectare.
Apasarea unui buton va fi observata de ATMega16 , care va procesa si concretiza intr-o afisare corespunzatoare pe LCD.
Componentele hardware necesare sunt :
- placuta de baza cu un ATMega16 drept unitate de procesare principala
- 1 condensator 10uF legat de la pinul VOUT al LCD-ului
- 5 divizori de tensiune realizati cu cate 2 rezistente(1.8K la pinii ATMega16 si 3.3K la ground)
- 2 diode pentru reducerea voltajului ce vine in LCD la aproximativ 3.3 V
- LCD Nokia 3310
- 5 butoane pentru interactiunea cu LCD-ul
Schema in EAGLE arata in felul urmator :
Pentru partea software a proiectului , se va folosi driver-ul pus la dispozitie la [1] pentru LCD-ul de Nokia . Jocul de X si 0 este o aplicatie clasica pentru algoritmul minimax. Mai multe despre algoritm gasiti la [2].
Driverul pus la dispozitie face urmatoarele :
void lcd_init(void);
void lcd_contrast(unsigned char contrast);
void lcd_clear(void);
void lcd_clear_area(unsigned char line, unsigned char startX, unsigned char endX);
void lcd_clear_line(unsigned char line);
void lcd_goto_xy(unsigned char x, unsigned char y);
void lcd_goto_xy_exact(unsigned char x, unsigned char y);
void lcd_chr(char chr);
void lcd_str(char *str);
void lcd_send(unsigned char data, LcdCmdData cd);
Jocul in sine va comunica prin aceste functii rezultatele obtinute in urma evaluarii tablei de catre functia de minimax si va afisa tabla de fiecare data cand se modifica ceva . Un pseudocod pentru negamax(o varianta a minimax) este dat in continuare :
if ( depth == 0 ) return evaluate(); int max = -oo; for ( all moves) { score = -negaMax( depth - 1 ); if( score > max ) max = score; } return max;
[1] 37
[2] Minimax
Am avut o “mica” problema cu LCD-ul . Am vrut sa leg pinii individual prin fire , si dupa cateva ore de aranjat , am reusit sa lipesc si pe placa . Un fir totusi s-a desprins , asa ca incercarea de a-l reatasa a dus la disparitia unui pin de iesire al LCD-ului. Cum timpul nu mi-a mai permis , proiectul s-a oprit aici.
Per total , lucrul la proiect (atat cat a durat) a fost folositor si m-a invatat ce sa nu mai fac pe viitor . Probabil era mai bine daca foloseama o panglica de pini , dar si un pic mai multa indemanare ar fi ajutat .
-
[1] 37
[2] viewtopic.php