This shows you the differences between two versions of the page.
pm:prj2021:agrigore:tetris [2021/05/24 02:09] sergiu.toader |
pm:prj2021:agrigore:tetris [2021/05/24 09:26] (current) sergiu.toader [Hardware Design] |
||
---|---|---|---|
Line 16: | Line 16: | ||
=== Schema bloc === | === Schema bloc === | ||
+ | |||
+ | {{ :pm:prj2021:agrigore:tetris_schema_bloc.jpg |}} | ||
Arduino | Arduino | ||
Line 31: | Line 33: | ||
- | {{ :pm:prj2021:agrigore:tetris_schema_bloc.png ?200|}} | + | |
=== Componente === | === Componente === | ||
Line 44: | Line 46: | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | {{ :pm:prj2021:agrigore:schema_tetris_img.png?200|}} | + | {{ :pm:prj2021:agrigore:schema_tetris_img.jpg?800 |}} |
+ | |||
+ | {{ :pm:prj2021:agrigore:tetris_schema_electrica.jpg?600 |}} | ||
Conectarea LCD-ului a presupus conectarea celor 8 pini ai LCD-ului la pinii Arduino. | Conectarea LCD-ului a presupus conectarea celor 8 pini ai LCD-ului la pinii Arduino. | ||
Line 67: | Line 71: | ||
Buzzerul s-a conectat cu un pin la GND si cu un pin la pinul 5 al placii Arduino. | Buzzerul s-a conectat cu un pin la GND si cu un pin la pinul 5 al placii Arduino. | ||
- | Conectarea componentelor a fost usurata de utilizarea unui Breadboard, Astfel, semnalul GND a fost adus aproape de componentele de input output pentru compactarea si reducerea numarului de fire utilizate. | + | Conectarea componentelor a fost usurata de utilizarea unui Breadboard, Astfel, semnalul GND a fost adus aproape de componentele de input si output pentru compactarea si reducerea numarului de fire utilizate. |
===== Software Design ===== | ===== Software Design ===== | ||
- | * Este planificata folosirea unor algoritmi de generare random a pieselor, de crestere graduala a dificultatii (viteza cu care apar piesele / cu care se deplaseaza acestea). | + | |
+ | === Mediul de dezvoltare === | ||
+ | Arduino IDE | ||
+ | |||
+ | === Biblioteci Folosite === | ||
+ | * [[https://github.com/olikraus/ucglib|Ucglib.h]]: Folosit pentru afisarea ecranului LCD, desenarea componentelor, desenarea elementelor de text pe ecran | ||
+ | * [[https://gist.github.com/mikeputnam/2820675|pitches.h]]: din aceasta biblioteca au fost utilizate anumite note muzicale predefinite pentru realizarea sunetelor din joc | ||
+ | |||
+ | === Ecrane principale ale programului === | ||
+ | Ecranul de start: | ||
+ | |||
+ | {{ :pm:prj2021:agrigore:tetris_ecran_start.jpg?400 |}} | ||
+ | |||
+ | * Ecranul care apare la alimentarea placii. Contine textul "Tetris Game", urmat de "Press Start". Ecranul indica jucatorului butonul pe care trebuie sa apese pentru a incepe jocul. Ecranul apare din nou dupa incheierea unui joc. | ||
+ | |||
+ | Ecranul principal de joc: | ||
+ | |||
+ | {{ :pm:prj2021:agrigore:tetris_ecran_joc.jpg?400 |}} | ||
+ | |||
+ | * Este ecranul in care se desfasoara jocul. In acest mod, apar continuu piese din partea de sus a ecranului, piese care vor fi deplasate si rotite de catre jucator prin intermediul butoanelor de control. Se poate iesi imediat din acest ecran folosind butonul de START care va incheia imediat jocul si va duce din nou utilizatorul la ecranul de start. | ||
+ | |||
+ | Ecranul de sfarsit de joc: | ||
+ | |||
+ | {{ :pm:prj2021:agrigore:tetris_ecran_sfarsit.jpg?400 |}} | ||
+ | |||
+ | * Ecranul de sfarsit de joc. Acest ecran apare in momentul in care ecranul principal de joc este umplut de piese, generarea altor piese noi fiind imposibila din lipsa de spatiu. Ecranul contine textul "Game over". Buzzerul produce sunetul unei melodii in timpul afisarii ecranului. La scurt timp, utilizatorul este trimis inapoi automat la ecranul de start de unde poate incepe un joc nou. | ||
+ | |||
+ | === Detalii implementare === | ||
+ | |||
+ | Flow principal: | ||
+ | * In setup este initializat obiectul ucg care va realiza manipularea ecranului, apoi este desenat ecranul de inceput de joc. Sunt configurati pinii de input si output. Este initializata si prima piesa generata. | ||
+ | * Functia loop va defini doua stari posibile: Daca jocul nu este in desfasurare, se asteapta apasarea butonului de start, caz in care se va trece in starea 2. Starea 2 reprezinta starea jocului in desfasurare. Se salveaza pozitia veche a piesei, se asculta pinii de input de la butoabe, se realizeaza orice tip de miscare, in functie de starea pinilor de intrare, se deseneaza piesa pe noua pozitie si se "sterge" (de fapt se realizeaza o desenare cu negru) piesa de pe pozitia anterioara. La apasarea butonului de start se va trece inapoi in starea 1. | ||
+ | * Proprietatile pieselor sunt incapsulate in clasa Piece (culoare, vector de patrate, pozitie, tip de piesa, rotatie curenta). Clasa contine functii pentru rotatie, miscare, desenare, a unei piese. | ||
+ | * Generarea piesei se face in constructorul clasei. Se genereaza un tip de piesa random si o culoare random folosind functia predefinita random() ce foloseste ca seed valoarea citita de pe pin-ul analogic 0. Pentru culoare, se genereaza un numar pe 3 biti diferit de 0, fiecare bit existent in numar reprezentand valoarea pentru rosu, verde respecitv albastru (se genereaza astfel 6 culori posibile diferite: rosu, verde, albastru, galben, violet, turcoaz). | ||
+ | * Miscarea pieselor in jos se realizeaza la fiecare jumatate de secunda folosind intreruperi, declansate la fiecare jumatate de secunda (am setat pentru asta Timer1 sa declanseze un semnal de 2Hz). Intreruperea verifica daca piesa poate cobori, si realizeaza miscarea ei. In cazul in care aceasta s-a asezat pe sol sau pe alte piese, se va genera alta piesa. | ||
+ | * Pentru coliziunile dintre piese se foloseste o matrice de booleeni square_map reprezentand harta de patrate deja asezate. Coliziunea piesei din aer cu patratele deja asezate se face prin verificarea existentei valorilor din square_map egale cu true pe tot parcursul miscarii piesei in aer. In momentul in care piesa isi incheie coborarea, se seteaza alte noi valori in matrice. In momentul in care o linie este competata, se elimina o linie si din aceasta matrice. | ||
===== Rezultate obtinute ===== | ===== Rezultate obtinute ===== | ||
- | * TBD | + | * Rezultatul este un joc dinamic, amuzant si care iti poate capta atentia minute bune incercand de a rezista cat mai mult fara a pierde. |
+ | * Este un joc care se aseamana foarte mult cu cele de pe gameboy-ul cu care petreceam timpul in copilarie. | ||
+ | |||
+ | === Demo === | ||
+ | * [[https://youtu.be/TzEkXviLMvE|Demo Youtube]] | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
- | * TBD | + | * Acest proiect m-a ajutat sa dobandesc foarte multe cunostiinte noi legate de lucrul cu microcontrollere, in special lucrul cu SPI, cu timere si intreruperi, utilizarea unor biblioteci Arduino si mai ales importanta eficientizarii codului datorita resurselor limitate pe care le are placa Arduino. |
+ | * Jocul este perfect functional, functioneaza fara probleme la oricate rulari succesive. | ||
+ | * Ca feature-uri posibile care mai pot fi adaugate pot enumera: | ||
+ | * Incadrarea structurii hardware intr-o carcasa de plastic, cu ecranul si butoanele in exterior | ||
+ | * Adaugarea unui buton pentru accelerarea miscarii in jos | ||
===== Download ===== | ===== Download ===== | ||
- | * TBD | + | * {{:pm:prj2021:agrigore:tetris_soft_schematic.zip|Soft & Schematic}} |
===== Jurnal ===== | ===== Jurnal ===== | ||
- | * 25.04: Realizare diagrama bloc, realizare pagina wiki | + | * 25.04: Realizare diagrama bloc, realizare pagina wiki initiala |
+ | * 26.04 - 08.05: - Achizitionare componente, realizarea partii hardware, testarea conexiunii cu ecranul LCD | ||
+ | * 09.05 - 15.05: - Constructia si generarea pieselor, implementarea miscarii corecte, realizarea tuturor rotatiilor pentru piese. | ||
+ | * 16.05 - 22.05: - Coliziuni, eliminari de linii, verificare incheiere a jocului, ecran de sfarsit de joc, sunete buzzer | ||
+ | * 23.05: Finalizare pagina de wiki | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | * [[https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody/]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab1-2021]] | ||
+ | * [[https://www.youtube.com/watch?v=TQ-Z1alBUME&ab_channel=learnelectronics]] | ||
+ | * [[https://github.com/electricmango/Arduino-Music-Project/blob/master/A_Theme___Tetris_with_Bass/A_Theme___Tetris_with_Bass.ino]] | ||
+ | |||
+ | * [[https://github.com/olikraus/ucglib]] | ||
+ | * [[https://gist.github.com/mikeputnam/2820675]] | ||
+ | |||
+ | * {{:pm:prj2021:agrigore:tetris.pdf|Pagina aceasta in format PDF}} |