Proiectul își propunea recrearea jocului Tetris pe Arduino folosind pentru afișaj un ecran LCD monocromatic cu rezoluția de 48×84 de pixeli, scopul acestuia fiind de a mă familiariza cu lucrul cu microprocesoare.
Pentru interacțiunea cu jocul, utilizatorul poate folosi un joystick sau anumite taste de pe o tastatură PS/2 conectată la Arduino. Există și 2 butoane, ce sunt folosite pentru a pune jocul pe pauză, respectiv pentru a reseta jocul. Cele 2 potențiometre disponibile sunt folosite pentru a regla luminozitatea ecranlui LCD, respectiv pentru a regla volumul buzzer-ului ce produce sunete când se întâmplă anumite evenimenete în cadrul jocului.
Mai jos se află schema bloc cu componentele principale ale proiectului:
Tabelul de mai jos conține o listă cu acțiunile ce pot fi efectuate în joc și modalitățile prin care acestea pot fi efectuate:
Acțiune | Modalitate de efectuare |
---|---|
Deplasarea piesei către stânga | Mișcare joystick spre stânga / Tasta A / Tasta săgeată stânga |
Deplasarea piesei către dreapta | Mișcare joystick spre dreapta / Tasta D / Tasta săgeată dreapta |
Accelerarea căderii peisei | Mișscare joystick în jos / Tasta S / Tasta săgeată jos |
Rotirea piesei | Mișcare joystick în sus / Tasta W / Tasta săgeată sus |
Aruncare jos a piesei | Apăsare joystick / Tasta Space |
Punere pe pauză | Apăsare buton de pauză / Tasta P |
Resetare | Apăsare buton de resetare |
Reglare luminozitate ecran | Rotire potențiometru de luminozitate |
Reglare volum buzzer | Rotire potențiometru de volum |
Lista cu piesele utilizate în realizarea proiectului este următoarea:
Schema de legare a componetelor este următoarea:
Mai jos este o poză cu toate componentele aranjate pe breadboard:
Codul sursă se găsește pe GitHub.
Bibliotecile utilizate în cadrul realizării proiectului sunt următoarele:
Descriere de nivel înalt:
Ceasul jocului are o frecvență de 50Hz (50 de actualizări/cadre pe secundă). Acest ceas este derivat din Timer1 de pe chipul Atmel ATmega 328P care generează o întrerupere de timer la frecvența de 200Hz, deci odată la 4 întreruperi de timer va fi executată bucla jocului. Frecvența de 200Hz a fost aleasă pentru a convertorul ADC, întrucât citirea valorilor generate de convertorul ADC sunt executate odată cu întreruperea de timer de pe Timer1. ADC-ul citește 4 valori: luminozitatea ecranului LCD, volumul buzzer-ului și cele 2 axe ale joystick-ului.
Grid-ul jocului este memorat într-un array bidimensional în care o valoare de 0 înseamnă că pe poziția asociată nu se află un bloc iar o valoare de 1 înseamnă că pe poziția asociată se află un bloc. Toate datele despre tetromino-uri (rotații, wallkick-uri etc.) sunt stocate în memoria flash și transferate în RAM când este nevoie de acestea.
Mediul de dezvoltare a fost Visual Studio Code 1.55.2 cu extensia pentru Arduino.
Videoclip demonstrativ:
Timestamp-uri (se găsesc și în descrierea videoclipului):
În urma realizării proiectului am descoperit lucruri pe care nu le știam despre mecanicile jocului Tetris.