Mini-Tetris
Nume: Riciu Vladut-Stefan
Grupa: 333CB
Introducere
Despre proiect
Proiectul consta in implementarea jocului Tetris intr-un mod redus, pe un ecran format din 2 matrice de 8×8 LED-uri, cu un difuzor pentru redat sunete in diverse faze ale jocului de pe un card SD.
Scopul proiectului
Inspiratie
Sursa principala de inspiratie este proiectul meu de la materia ADIV, “Mini-Tetris”, la care am adaugat difuzorul si cardul SD.
Ideea de Mini-Tetris a pornit de la curiozitatea de a programa un ecran din matrice de LED-uri interfatate prin shift registers, pentru o aplicatie in timp real, utilizata de un om. Astfel, programul trebuie realizat intr-un mod eficient pentru a minimiza diverse latente, precum cea dintre apasarea unui buton si efectuarea actiunii dorite, sau cea dintre afisarea a doua cadre succesive.
Utilitatea proiectului
Programarea unui ecran de matrice de LED-uri intr-un mod asemanator cu un monitor cu refresh rate;
Citirea unor melodii de pe un card SD si redarea lor pe un difuzor intr-un sistem cu memorie limitata;
Imbinarea mai multor module software intr-un mod non-blocant, pentru a reda o experienta placuta utilizatorului.
Descriere generală
Schema bloc
Hardware Design
Lista de piese
Software Design
Mediu de dezvoltare
VSCode + Platformio extension, pentru scris codul;
Arduino IDE cu 'Arduino as ISP' si 'ATMEGA328 on a breadboard' pentru incarcat codul in microcontroller;
Un Arduino UNO cu microcontroller-ul scos, folosit ca un programmer;
Din cauza faptului ca folosesc ATMEGA328, iar hardware specs pentru 'ATMEGA328 on a breadboard' se bazeaza pe ATMEGA328P, a fost necesara schimbarea unui octet in fisierul cu semnatura hardware a microcontrollerului pentru incarcarea bootloader-ului.
Module Software
Pentru afisarea pe matricele de LED-uri am folosit un vector de 16 octeti care sunt shiftati in registre. Din cauza faptului ca LED-urile sunt cu anod (sau catod? nu mai stiu, vezi UPDATE la componente) comun, nu se pot aprinde individual. Astfel, afisarea functioneaza similar cu afisarea pe un monitor cu “refresh rate”, adica se aprind succesiv cele 16 linii de cate 8 LED-uri.
Pentru mentinerea starii pieselor de tetris a fost folosita o matrice de dimensiunea ecranului pe care sunt efectuate calculele logice (rotit / miscat piesa). Inainte de afisare, ecranul logic se translateaza la ecranul de octeti;
Pentru redat muzica de tetris de pe card SD pe difuzor, am folosit un timer la 8000 Hz (0.125ms) si fast PWM. Exista un buffer de 512 octeti in care este tinuta urmatoare secventa din melodie (fisier .wav monocanal, 8000Hz, 8 bits rezolutie). In cadrul intreruperii de timer, urmatorul octet este pus in registrul PWM, iar daca bufferul a fost epuizat, se citeste urmatorul sector de 512B de pe card. Citirea este suficient de rapida si nu se pune problema blocarii codului care executa logica jocului.
Rezultate Obţinute
Un joc de Mini-Tetris distractiv si o experienta educationala frumoasa.
Jocul merge bine, sunt unele probleme la afisare (scade intensitatea LED-urilor) atunci cand sunt prea multe instructiuni de executat intre afisari (e.g. intrerupere + citit de pe card + prelucrat logica joc si apoi afisare).
Concluzii
In configuratia curenta, ATMEGA328 nu este suficient de rapid pentru citirea de pe card si afisarea pe display in cadrul intreruperilor. Ma gandesc ca o posibila solutie ar fi realizarea citirii de pe card prin SPI manual, cu registre, asincron si realizarea shiftarii pe ecran cu cate o coloana (sau linie) pe intrerupere.
Download
Bibliografie/Resurse