This is an old revision of the document!
Grupa: 333CA
Te-ai aflat vreodata in postura nostalgica si ti-ai dorit sa experimentezi jocurile de odinioara? Acest proiect iti poate satisface dorinta de a juca legendarul joc Tetris. Il poti crea chiar tu folosind un microcontroller Arduino UNO impreuna cu cateva componente: un modul format din 4 matrice 8×8 LED si 4 butoane simple pentru controlul formelor geometrice si plasarea acestora pe “scena” de joc. Proiectul este dedicat si pentru pasionatii jocurilor retro cu minime cunostinte in electronica.Tot ce trebuie sa faci este sa cumperi componentele si sa introduci codul atasat in sectiunea “Download” in aplicatia dedicata Arduino!
Jucatorul are la dispozitie 4 butoane pe care le foloseste pentru controlul formelor geometrice generate din partea de sus a ultimei matrice. Primul buton este folosit pentru rotirea formei geometrice la dreapta cu 90 de grade, al doilea si al treilea buton controleaza miscarea stanga dreapta a formei geometrice iar ultimul buton da posibilitatea maririi vitezei formei la deplasarea in jos.
Concepte folosite:
Schema de circuit:
Lista de componente:
Schema electrica:
Mentionez ca este realizata in TinkerCad; pentru a inlocui componenta FC-16 inexistenta in acest mediu de simulare, am inlocuit pinii acesteia cu un Pin Extender de 8 pini (Folosind primii 4 in urmatoarea ordine: CLK, CS, DIN, GND, VCC)
DEMO circuit:
GitHub : Tetris Game
Organizarea claselor:
Explicatia generala a codului:
1. Common.h: are doar bibliotecile din arduino si o posibilitate de a face debug pe cod, decomentand macro-ul DEBUG(pe Arduino UNO nu functioneaza debugger-ul)
2.CommandReader : citeste comanda din serial port(serial_display.py) deoarece programul poate functiona si prin introducerea inputului de la tastatura si mai apoi transpunerea lui pe display.
3. Board : primeste ca input in constructor, numarul de linii si de coloane disponibile (in cazul meu, 32×8) si proceseaza comenzile date ca input: LEFT, RIGHT, ROTATE, DOWN. Trateaza si cazul cand o linie este plina(toate led-urile sunt aprinse) si actualizeaza scorul jucatorului. Adauga o noua forma geometrica(TETRIMINO) compusa din 4 leduri aprinse, iar in momentul cand forma, deplasandu-se pe verticala automat la fiecare secunda, atinge partea de jos a display-ului (ultima matrice), dezactiveaza miscarea formei Tetrimino generate si adauga alta. Pentru a deplasa forma, se apeleaza metoda moveTm care primeste ca parametrii directia pe axele x si y codata prin 0, 1, -1.(ex: deplasare la stanga: moveLeft: moveTm(0, -1)). Recunoasterea tetrimino-ului pe matrice se face prin trecerea de pe 0 pe 1 a pozitiei.
4. KeypadReader : seteaza pinii LEFT, RIGHT,DOWN, ROTATE atribuiti butoanelor.
IMPORTANT: In implementarea schemei electrice am folosit caracteristica pin-ului 2 digital din Arduino deoarece doar doi pini sunt capabili sa genereze intreruperi. M-am folosit de interfatarea celor 4 butoane prin intermediul diodelor pentru a le atasa si multiplexa la un singur pin care genereaza intreruperi. Prin acest mod am reusit sa diferentiez butonul care genereaza intreruperea si sa il introduc ca input in cod, folosind metoda digitalPinToInterrupt(2)! In ISR doar capturez butonul care a fost apasat si il atribui uneia dintre variabilele de control (lft, rgt, dwn, rot).
Nota: Evidenta LED-urilor aprinse pe display se realizeaza prin crearea unui vector bidimensional de dimensiune reglabila printr-un apel in constructorul clasei Board(ex: Board(8, 8): creeaza un vector bidimensional de dimensiune 8×8) care retine valorile booleene ale fiecarui LED(true: ON; false: OFF).
5. DotMatrixBoard : pana acum, implementarea a fost realizata la nivel conceptual, virtual(software). Aceasta clasa primeste ca input matricea generata(Board) si actualizeaza LED-urile in functie de comenzile date pe modulele fizice.(pini: DataInput, ChipSelect si CLK). In metoda print, preia matricea generata in display-ul virtual si o afiseaza pe display-ul fizic(format din 4 module cu chip MAX7219 de Matrice unicolore).Biblioteca MD_MAX72xx ofera acest output simplificat: afisarea unei matrice generate virtual(ex: b[i][j]) pe cele 4 module MAX7219.
Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.
Resurse:
Coding Tetris in Arduino Explained Inspo Tetris Project Interface Multiple Buttons in 1 ARDUINO Input