This shows you the differences between two versions of the page.
pm:prj2021:dbrigalda:tetris [2021/04/25 15:42] andrei.stoian0307 |
pm:prj2021:dbrigalda:tetris [2021/05/29 16:59] (current) andrei.stoian0307 [Download] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Tetris ====== | ====== Tetris ====== | ||
+ | |||
+ | ===== Autor ===== | ||
+ | <note tip> | ||
+ | **Autor:** [[https://github.com/cheez3d|Andrei Stoian]] | ||
+ | </note> | ||
===== Introducere ===== | ===== Introducere ===== | ||
Line 5: | Line 10: | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | Pentru interacțiunea cu jocul, utilizatorul se va folosi de 4 butoane sau de anumite taste de pe o tastatură PS/2 conectată la Arduino. Cele 4 butoane vor avea următoarele funcții: | + | 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. |
- | * deplasarea piesei curente către stânga | + | |
- | * deplasarea piesei curente către dreapta | + | |
- | * accelerarea deplasării peisei curente în jos | + | |
- | * rotirea piesei curente | + | |
- | Va exista un potențiometru pentru controlul luminozității ecranului LCD. | + | |
- | Mai jos se află schema bloc a proiectului cu componentele principale: | + | Mai jos se află schema bloc cu componentele principale ale proiectului: |
- | {{:pm:prj2021:dbrigalda:tetris-schema-bloc.png|}} | + | {{:pm:prj2021:dbrigalda:tetris-block-diagram.png?direct|}} |
- | ===== Hardware Design ===== | + | 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: | Lista cu piesele utilizate în realizarea proiectului este următoarea: | ||
* Arduino Uno | * Arduino Uno | ||
- | * LCD Nokia 5110 | ||
- | * Butoane | ||
* Breadboard | * Breadboard | ||
- | * Fire | + | * 2 butoane |
- | * Rezistori | + | * 2 potențiometre |
- | * Buzzer | + | * Joystick |
- | * LED-uri | + | * Tastatură PS/2 |
- | * Potențiometru | + | * Buzzer pasiv |
+ | * Ecran LCD Nokia 5110 | ||
+ | * Fire tată-tată și mamă-tată de diverse culori | ||
+ | * Rezistori de diferite valori | ||
- | ===== Software Design ===== | + | Schema de legare a componetelor este următoarea: |
- | Bibliotecile ce vor fi utilizate sunt următoarele: | + | |
+ | {{:pm:prj2021:dbrigalda:tetris-schematic.png?direct&750|}} | ||
+ | |||
+ | Mai jos este o poză cu toate componentele aranjate pe breadboard: | ||
+ | |||
+ | {{:pm:prj2021:dbrigalda:tetris-components-arrangement.jpg?direct&300|}} | ||
+ | |||
+ | ===== Design software ===== | ||
+ | Codul sursă se găsește pe [[https://github.com/cheez3d/acs-arduino-tetris|GitHub]]. | ||
+ | |||
+ | Bibliotecile utilizate în cadrul realizării proiectului sunt următoarele: | ||
* https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library | * https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library | ||
* https://github.com/adafruit/Adafruit-GFX-Library | * https://github.com/adafruit/Adafruit-GFX-Library | ||
+ | * https://github.com/JChristensen/movingAvg | ||
+ | * https://github.com/PaulStoffregen/PS2Keyboard | ||
- | ===== Rezultate Obţinute ===== | + | Descriere de nivel înalt: |
- | <note tip> | + | |
- | TODO | + | |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | 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. |
- | </note> | + | |
- | ===== Concluzii ===== | + | 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. |
- | TODO | + | |
+ | Mediul de dezvoltare a fost [[https://code.visualstudio.com/updates/v1_55|Visual Studio Code 1.55.2]] cu [[https://marketplace.visualstudio.com/items?itemName=vsciot-vscode.vscode-arduino|extensia pentru Arduino]]. | ||
+ | |||
+ | ===== Rezultate obţinute ===== | ||
+ | Videoclip demonstrativ: | ||
+ | |||
+ | [[https://www.youtube.com/watch?v=e2ZMBsfVYT4|{{:pm:prj2021:dbrigalda:tetris-demo-thumbnail.png?nolink&600|}}]] | ||
+ | |||
+ | Timestamp-uri (se găsesc și în descrierea videoclipului): | ||
+ | * Joystick gameplay - [[https://www.youtube.com/watch?v=e2ZMBsfVYT4&t=5|0:05]] | ||
+ | * Keyboard gameplay - [[https://www.youtube.com/watch?v=e2ZMBsfVYT4&t=178|2:58]] | ||
+ | * Extra stuff - [[https://www.youtube.com/watch?v=e2ZMBsfVYT4&t=312|5:12]] | ||
+ | |||
+ | ===== Concluzii ===== | ||
+ | În urma realizării proiectului am descoperit lucruri pe care nu le știam despre [[https://tetris.wiki/Super_Rotation_System|mecanicile jocului Tetris]]. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | + | * [[https://github.com/cheez3d/acs-arduino-tetris/archive/refs/heads/master.zip|Cod sursă]] ([[https://github.com/cheez3d/acs-arduino-tetris|repository]]) |
- | TODO | + | * {{:pm:prj2021:dbrigalda:tetris-resources.zip|Resurse (bitmap-uri, poze etc.)}} |
- | O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-). | ||
- | Fişierele se încarcă pe wiki folosind facilitatea **Add Images or other files**. Namespace-ul în care se încarcă fişierele este de tipul **:pm:prj20??:c?** sau **:pm:prj20??:c?:nume_student** (dacă este cazul). **Exemplu:** Dumitru Alin, 331CC -> **:pm:prj2009:cc:dumitru_alin**. | ||
- | </note> | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
<note> | <note> | ||
* 25.04.2021 - am creat pagina de wiki | * 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 | ||
</note> | </note> | ||
+ | |||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | * https://ocw.cs.pub.ro/courses/_media/pm/lab/uno.jpg | ||
* https://create.arduino.cc/projecthub/muhammad-aqib/interfacing-nokia-5110-lcd-with-arduino-7bfcdd | * https://create.arduino.cc/projecthub/muhammad-aqib/interfacing-nokia-5110-lcd-with-arduino-7bfcdd | ||
* https://learn.adafruit.com/nokia-5110-3310-monochrome-lcd/testing | * https://learn.adafruit.com/nokia-5110-3310-monochrome-lcd/testing | ||
+ | * https://learn.adafruit.com/adafruit-gfx-graphics-library | ||
+ | * https://www.nongnu.org/avr-libc/user-manual/pgmspace.html | ||
* http://javl.github.io/image2cpp/ | * http://javl.github.io/image2cpp/ | ||
+ | * https://en.wikipedia.org/wiki/Tetromino | ||
+ | * https://harddrop.com/wiki/Tetris_Guideline | ||
+ | * https://harddrop.com/wiki/Spawn_Location | ||
+ | * https://tetris.fandom.com/wiki/SRS | ||
+ | * https://gamedevelopment.tutsplus.com/tutorials/implementing-tetris-collision-detection--gamedev-852 | ||
* [[https://ocw.cs.pub.ro/courses/pm/prj2021/dbrigalda/tetris?do=export_pdf|Export PDF]] | * [[https://ocw.cs.pub.ro/courses/pm/prj2021/dbrigalda/tetris?do=export_pdf|Export PDF]] | ||