Table of Contents

Tetris Game

Nume: Didoaca Costin

Grupa: 333CA

Introducere

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!

Descriere generală

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:

  1. GPIO si Intreruperi - Cele 4 butoane sunt legate la un singur pin GPIO pe microcontroller, generarea intreruperilor fiind tratata de interfatarea acestora folosind diode.
  2. UART - Proiectul foloseste interfata seriala UART in loc de display pentru a extrage comenzile date ca input.
  3. SPI - Modulul FC-16 format din 4 matrice de dimensiune 8×8 LED bicolore foloseste chipsetul MAX7219 care comunica cu Arduino prin SPI.

Schema bloc:

Hardware Design

Schema de circuit:

Lista de componente:

  • 1 x Arduino Uno (Plusivo Uno R3)
  • 1 x FC-16 Modul MAX7219 (4x 8×8 LED MAtrix)
  • 4 x Push Button
  • 5 x Resistor 4.7k Ohm
  • 4 x Diode
  • 1 x 5V Phone Charger
  • Wires

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 Header de 8 pini (Folosind primii 4 in urmatoarea ordine: CLK, CS, DIN, GND, VCC)

In implementarea circuitului am lipit cele 4 module MAX7219 cu Dot Matrix atasate pin la pin folosind pin-headere duble a cate 5 pini(pini: CLK, CS, D IN/OUT, GND, VCC) si un header in L pentru directionarea inputului(cabluri mama-tata) cu fludor. Am alimentat separat modulele cu 5V DC prin intermediul unui transformator de telefon si un cablu USB sectionat si izolat, atasand firele de VCC si GND pe un breadboard separat.

DEMO circuit:

Software Design

Descrierea codului aplicaţiei (firmware):

  • mediu de dezvoltare: ArduinoIDE, VSCode, PyCharm - surse: *.cpp, *.ino, *.py
  • biblioteci şi surse 3rd-party: MD_MAX72xx
  • reproducerea jocului Tetris (folosirea deplasarii matriceale)

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.

Rezultate Obţinute

Video cu cablajul si gameplay: <link> </link>

Video cu varianta finala: <link> </link>

Concluzii

Prin implementarea acestui proiect am reusit sa inglobez dezvoltarea software in hardware. La inceput axandu-ma pe implementarea software a popularului joc “Tetris”, am putut sa creez un device care expune acest joc in mediul fizic, real. Acest model are posibilitatea sa fie imbunatatit foarte usor prin adaugarea unui difuzor(sau buzzer), unui DISPLAY LED/OLED pentru afisarea scorului(parte care este deja implementata in cod, trebuie doar conectat display-ul fizic si transmis output-ul).

Download

Codul sursa complet, organizarea claselor si o imagine cu cablajul:

tetris_game_arduino_source.zip

Jurnal

Progres:

Schema Gantt:

Bibliografie/Resurse

Export to PDF