Autorul poate fi contactat la adresa: Login pentru adresa
Acest proiect își propune, așa cum sugerează și numele său, să implementeze celebrul joc Tetris pe o matrice de LED-uri verzi și roșii de dimensiune 8×8. M-am gândit la acest proiect deoarece îmi place jocul și mi se pare că se potrivește cu o implementare pe matrice de LED-uri. De asemenea, nu este un proiect foarte dificil din punct de vedere hardware (sau așa pare deocamdată :P) și cred că este un început bun pentru lucrul cu microprocesoare.
În centrul proiectului se află microcontroller-ul ATMEGA324. Pinii din zonele PORT B și PORT D vor comanda coloanele matricii. 3 pini din zona PORT A vor comanda un demultiplexor 3:8 care va comanda liniile matricii. Pe lângă acestea, mai există și 6 butoane (4 pentru controlul pieselor, unul pentru reset, unul pentru selectarea nivelului).
Nume componentă | Loc cumpărare | Cost bucată | Număr bucăți | Cost total | Observații |
---|---|---|---|---|---|
Matrice bicoloră | TME | 37.71 | 1 | 37.71 | http://www.tme.eu/ro/details/tba23-12egwa/afisaje-led-matrice/kingbright-electronic/# |
Demultiplexor 3:8 | TME | 0.5 | 5 | 2.5 | http://www.tme.eu/ro/details/74hc138/circuite-logice-ttl/# |
Buton | Conectica | ~0.7 | 6 | ~4.2 | |
Placuță test | Conectica | 12 | 1 | 12 | |
Rezistențe 150 ohmi | Conectica | ~0.03 | 16 | ~0.4 |
Total: ~56 RON
Matricea bicoloră:
Demultiplexor:
Pentru dezvoltare am folosit WinAVR împreună cu Programmer's Notepad.
Fiecare piesă de Tetris are pattern-ul reținut într-o matrice 4×4. Alături de aceasta, se rețin coordonatele colțului din dreapta sus pentru a putea localiza piesa. Aceste elemente sunt incluse într-o structură. Jocul se desfășoară astfel:
- se inițializează harta
- se generează o piesă nouă
- într-o buclă, se desenează harta și se mută piesa curentă în jos, după care se așteaptă o secundă
Funcții implementate:
- turn_on_column(column), turn_on_row(row), turn_off_row(row) - așa cum sugerează și numele, acestea controlează aprinderea și stingerea unei coloane sau a unui rând
- generate_piece() - generează o piesă nouă și o pune pe hartă
- draw() - desenează harta folosind efectul Persistance of Vision - se desenează câte un rând și apoi se stinge, foarte des
- collision() - detectează eventuale coliziuni
- rotate_block() - rotește blocul curent
- move_block() - mută blocul curent
- init() - pornește jocul
Nu este implementată intracțiunea cu butoanele. De asemenea, desenarea ar trebui să se facă continuu, iar mutarea la o întrerupere de ceas.
Proiectul nu a fost finalizat. Am întâmpinat următoarele probleme:
- număr foarte mare de cabluri de lipit ⇒ mișcam puțin plăcuța, mai sărea un cablu
- am reușit să comand 3 LED-uri ale matricii (prin demultiplexor) dar, brusc, nu mi-a mai fost recunoscută plăcuța; alți colegi au întâmpinat aceeași problemă și au schimbat diodele Zener - eu nu am mai avut timp să cumpăr
După aprinderea unui LED verde:
După aprinderea a două LED-uri (verde și roșu):
- proiectul necesita o planificare mult mai atentă, ar fi trebuit să imprim un circuit prin care să pot scoate pinii matricii prin pini exteriori, apoi să conectez așa la microprocesor
- din punct de vedere software, proiectul este foarte ușor dar din cauza problemelor hardware amintite, nu am mai ajuns la partea software
Cod: tetris-cod.zip
Proiect Proteus: tetris.zip