Table of Contents

Tetris

Autor

Autor: Andrei Stoian

Introducere

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.

Descriere generală

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

Design hardware

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:

Design software

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.

Rezultate obţinute

Videoclip demonstrativ:

Timestamp-uri (se găsesc și în descrierea videoclipului):

Concluzii

În urma realizării proiectului am descoperit lucruri pe care nu le știam despre mecanicile jocului Tetris.

Download

Jurnal

  • 25.04.2021 - am creat pagina de wiki
  • 25.04.2021 - am creat draft-ul inițial al proiectului pe pagina de wiki
  • 29.04.2021 - am legat componentele pe breadboard
  • 01.05.2021 - am început scrierea codului într-un singur fișier sursă
  • 06.05.2021 - am spart codul sursă în fișiere separate pentru o organizare mai bună
  • 09.05.2021 - am terminat scrierea codului sursă pentru interacțiunea cu perifericele
  • 14.05.2021 - am implementat grid-ul de joc
  • 16.05.2021 - am conceput un sistem de memorare a proprietăților tetromino-urilor
  • 22.05.2021 - am terminat implementarea logicii jocului
  • 24.05.2021 - am realizat videoclipul demonstrativ al proiectului

Bibliografie/Resurse