Scopul acestui proiect a fost realizarea unui joc de tetris folosind un display de nokia 3410 (Initial era 3310, insa negasind acest model am folosit 3410. Compatibilitatea din punctul de vedere a pinilor este perfecta, singura diferenta constituind-o rezolutia: 84×48 – 3310 si 96×65- 3410). Initial am vrut sa implementez jocul clasic de tetris, insa datrita constangerilor de memorie (16K pentru Atmega16) a trebuit sa simplific algoritmul.
Tetris face parte din categoria jocurilor puzzle. Scopul jocului este aranjarea unor piese („tetrominoes”) – fiecare alcatuita din 4 patrate- astfel incat sa se obtina cat mai multe randuri fara spatii. Piesele pot fi mutate stanga-dreapta sau rotite, iar in momentul in care se formeaza o linie orizontala fara spatii acesata dispare, jucatorul avand astfel mai mult spatiu de a crea alte linii si de a acumula astfel mai multe puncte.
Asa cum am mentionat anterior, datorita constangerilor de memorie am simplificat algoritmul jocului clasic de tetris. Astfel, scopul variantei mele de tetris este acela de a pune cat mai multe piese pe tabla ( nu se mai elimina liniile complete, ci piesele raman pe tabla pana la sfarsitul jocului). Scorul jucatorului va fi dat chiar de numarul de piese pe care reuseste sa le puna pe tabla. Nu pot afirma ca proiectul are o utilitate foarte mare, ci, la fel ca orice joc, poate fi folosit ca mijloc de relaxare.
Din punct de vedere hardware, exista 3 componente:
Exista 3 butoane prin care se interactioneaza cu Atmega16 (si implicit cu LCD-ul). Pe placuta fizic sunt 5, insa numai 3 sunt conectate la microcontroller: stanga, dreapta si sus(folosit ca buton-centru). Prin intermediul acestora se interactioneaza cu „meniul” jocului si, bineinteles, se controleaza piesele de pe tabla. Acestea pot fi mutate in stanga, in dreapta sau rotite. Microcontrollerul va prelua informatiile primite de la butoane si conform acestora va trimite comenzi LCD-ului.
Pentru partea de software am folosit ca punct de start proiectul de pe http://www.quantumtorque.com/content/view/32/37/. Acesta are implementate o serie de functii de interfatare cu lcd-ul foarte utile, cum ar fi afisarea caraterelor, a string-urilor sau pozitionarea pe ecran intr-un anumit punct (nu chiar orice pixel). A trebuit sa modific fisierul lcd.h pentru a asocia corespunzator pinii LCD-ului cu cei ai microcontrollerului (mai multe detalii in sectiunea de hardware design), am renuntat de asemenea la cateva functii deja implementate (datorita memeoriei destul de limitate de pe Atmega16) si, bineinteles, mi-am adugat propriile functii –descrise in sectiunea de software design.
Pentru alimentarea LCD-ului este necesara o tensiune de 3.3 V. Cum microcontrollerul scoate 5V, aceasta tensiune a trebuit limitata. Pentru aceasta am folosit 2 diode 1N4007 , tensiunea obtinuta fiind de 5V-0.7V-0.7V=3.6V (desi mai mare de 3.3V, nu au fost probleme).
Legarea la porturile microcontrollerului se face prin divizori de tensiune, realizati cu ajutorul unor rezistente de 3k3(legate la masa) si 1k8(legate la portul B).
Cele 3 butoane sunt si ele conectate tot la portul B al microcontrollerului.
Intrucat pentru simulare am folosit un LCD de Nokia3310, afisarea pe ecranul fizic (3410) a fost putin diferita. Pe el am putut afisa si scorul si chenarul de joc.
Asa cum am mentionat mai sus, scheletul aplicatiei software este cel al proiectului de pe http://www.quantumtorque.com/content/view/32/37/. Ceea ce nu era implementat, a fost posibilitate de a accesa absolut orice pixel de pe ecran. Pentru a rezolva aveasta problema mi-am declarat o matrice de unsigned char care sa ocupe intreg chenarul de joc si mi-am creat doua functii de setare/resetare pixel. Generarea pieselor a devenit astfel mult mai usoara – pentru desenarea uneia dintre ele, desenanadu-se fiecare pixel in parte.
Algoritmul jocului este urmatorul:
cat timp nu s-a ajuns la limita de sus a chenarului de joc genereaza o piesa actualizeaza scorul daca s-a apasat buton stanga atunci deplasare piesa stanga daca s-a apasat buton dreapta atunci deplasare piesa dreapta daca s-a apasat butonul din centru atunci rotire piesa deplasare piesa jos
Intrucat am avut ceva probleme cu avr-gcc pe Vista, editarea am facut-o pe Linux, cu text editorul de acolo, iar compilarea in linie de comanda. Proiectul contine si un makefile , ce a usurat foarte mult partea de compilare.
Proiectul final a fost 100% functional, atat din puncte de vedere hardware cat si software.
Placuta cu Atmega16 (fata/verso)
Placuta de interconectare LCD + butoane (fata/verso)
Nokia3310 LCD
Start game
While playing
Game over
A fost un proiect interesant, primul de acest gen pentru mine. Ca si dificultate, partea hardware mi-a ridicat mai multe probleme datorita lipsei de experienta . Am reusit sa ard 2 LCD-uri de Nokia pana sa obtin un proiect functional – pe primul pentru ca am folosit o schema gresita in care 2 pini ai LCD-ului erau legati intre ei si pe al doilea probabil pentru ca am lucrat (mutat pe placuta) cu LCD-ul in timp ce era alimentat si cel mai probabil am facut scurt pe undeva .
In concluzie, daca vreti sa faceti un proiect de acest gen:
Arhiva completa poate fi gasita aici
Monica Dagadita 333CB - monica_dagadita@yahoo.com