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

Divertisment

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

  • ATMEGA328
  • Soclu DIP28
  • 4x Butoane
  • 2x Matrice de 8×8 LED-uri interfatate prin shift registers (detalii aici) UPDATE: Am ars cele 2 matrice de LED-uri, in locul lor am folosit alte 2 matrice de LED-uri facute manual de mine acum cativa ani. Functionalitatea lor este asemanatoare cu cele anterioare, putin diferita, insa, datorita vechimiii lor, nu mai am schemele hardware.
  • Modul cititor card SD
  • Card SD 4GB
  • Difuzor 8Ω 1.5W
  • Amplificator difuzor
  • Diverse rezistente + condensatori
  • Alimentator AC → DC 12V
  • Divizor de tensiune +12V → +5V

project_photo.jpeg

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

pm/prj2023/drtranca/vladut_stefan.riciu.txt · Last modified: 2023/05/29 11:28 by vladut_stefan.riciu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0