This shows you the differences between two versions of the page.
pm:prj2022:arosca:gabriel.oprea2111 [2022/04/21 22:07] gabriel.oprea2111 created |
pm:prj2022:arosca:gabriel.oprea2111 [2022/05/27 23:57] (current) gabriel.oprea2111 [Descriere generală] |
||
---|---|---|---|
Line 4: | Line 4: | ||
Jocul care a cutremurat planeta in 2014 se intoarce ! Jocul va suferi totusi cateva modificari fata de varianta originala. In primul rand, repetitivitatea jocului din 2014 va fi inlaturata prin introducerea unui mecanism de dificultate pentru joc. Deasupra ecranului pe care se desfasoara jocul se vor afla 5 led uri galbene, care indica dificultatea curenta. Acesta va creste treptat, deoarece nu ne dorim ca jucatorii sa moara incepand din primul sau al doilea obstacol.In acest fel jocul va fi friendly si pentru incepatori, dar challenging si pentru cei hardcore. | Jocul care a cutremurat planeta in 2014 se intoarce ! Jocul va suferi totusi cateva modificari fata de varianta originala. In primul rand, repetitivitatea jocului din 2014 va fi inlaturata prin introducerea unui mecanism de dificultate pentru joc. Deasupra ecranului pe care se desfasoara jocul se vor afla 5 led uri galbene, care indica dificultatea curenta. Acesta va creste treptat, deoarece nu ne dorim ca jucatorii sa moara incepand din primul sau al doilea obstacol.In acest fel jocul va fi friendly si pentru incepatori, dar challenging si pentru cei hardcore. | ||
- | In plus, ar fi dragut ca fiecare sa isi poata customiza pasarea cum doreste. De aceea, voi introduce cateva butoane colorate prin apasarea carora pasarea se va colora corespunzator. Se va introduce si un filtru de dark mode, prin care orasul prin care se plimba pasarea noastra preferata va deveni unul intunecat si neprietenos. | + | In plus, ar fi dragut ca fiecare sa isi poata customiza pasarea cum doreste. De aceea, voi introduce un buton colorat prin apasarea caruia pasarea se va colora corespunzator. Se va introduce si un filtru de dark mode, prin care orasul prin care se plimba pasarea noastra preferata va deveni unul intunecat si neprietenos. |
Fara sunetele catchy jocul nu ar mai fi el insusi (https://www.youtube.com/watch?v=DMmlXBR5hs4), de aceea le voi reproduce printr-un buzzer. | Fara sunetele catchy jocul nu ar mai fi el insusi (https://www.youtube.com/watch?v=DMmlXBR5hs4), de aceea le voi reproduce printr-un buzzer. | ||
- | <note tip> | ||
- | Prezentarea pe scurt a proiectului vostru: | ||
- | * ce face | ||
- | * care este scopul lui | ||
- | * care a fost ideea de la care aţi pornit | ||
- | * de ce credeţi că este util pentru alţii şi pentru voi | ||
- | </note> | ||
===== Descriere generală ===== | ===== Descriere generală ===== | ||
- | {{:pm:prj2022:arosca:bkgabriel.png?200|}} | + | === Schema bloc === |
- | <note tip> | + | |
- | O schemă bloc cu toate modulele proiectului vostru, atât software cât şi hardware însoţită de o descriere a acestora precum şi a modului în care interacţionează. | + | |
+ | {{:pm:prj2022:arosca:bk2.png?500|}} | ||
+ | |||
+ | * Aplicatia va avea drept componente centrale un **Arduino Uno R3** si un **ecran TFT de 3.5 inch** cu controller ILI9488 si touchscreen. | ||
+ | |||
+ | * Jocul va fi conceput prin desenarea elementelor pe ecran, considerand o executie a functiei de loop drept un frame. Ecranul nu suporta o rata de refresh prea mare; motiv pentru care animatiile prea complexe au fost imposibil de realizat. Cu toate acestea, am facut anumite optimizari pentru a putea reda jocul cu o viteza buna si cu un aspect grafic placut. | ||
+ | |||
+ | * Pentru a ne juca, ne folosim de touchscreen-ul ecranului. | ||
+ | |||
+ | * Folosind un breadboard pe care jucatorul il are la indemana, acesta isi poate __customiza pasarea__ prin apasarea unui buton. De asemenea, utilizatorul poate vedea in timp real la ce nivel de dificultate a ajuns, in functie de cate LED-uri sunt aprinse. Jocul va avea __5 niveluri progresive de dificultate__. | ||
+ | |||
+ | * La fiecare nivel se va mari viteza cu care vin tuburile spre pasare sau dimensiunea spatiului prin care pasarea trebuie sa se strecoare. Ne dorim ca playerii sa poata vedea ritmul in care progreseaza, de aceea am implementat si un __mecanism de high score__. | ||
+ | |||
+ | * __Ciclul zi-noapte__ a fost implementat astfel incat sa redea desfasurarea normala a unei zile. Dupa sfarsitul unui run pe zi, pasarea va incepe un alt run pe noapte, si tot asa.' | ||
+ | |||
+ | * Buzzer-ul este folosit pentru a reda sunetele specifice jocului. Am compus 2 "melodii" din cate 2-3 note muzicale, una ce se ruleaza atunci cand pasarea trece printr-un tub, iar cealalta atunci cand pasarea se ciocneste. | ||
+ | |||
+ | === Schema hardware === | ||
+ | |||
+ | {{:pm:prj2022:arosca:hardware.png?500|}} | ||
+ | |||
+ | * Ecranul folosit este un TFT 3.5 inch shield, conceput pentru a acoperi toti pinii de pe Arduino. Deoarece nu doream acest lucru, am folosit fire mama-tata pentru a conecta ecranul la pinii de pe Arduino. | ||
+ | |||
+ | * Am lasat liberi pinii ce corespondeau pentru SD card, intrucat incarc imaginile hardcodat, folosind acesti pini liberi pentru buton, buzzer respectiv shift register. | ||
+ | |||
+ | * M-am folosit de breadboard pentru a conecta si celelalte componente la alimentare, respectiv la ground. | ||
+ | |||
+ | * Neavand suficienti pini initial pentru a conecta LED-urile, am folosit un __shift register__. | ||
- | Exemplu de schemă bloc: http://www.robs-projects.com/mp3proj/newplayer.html | ||
- | </note> | ||
===== Hardware Design ===== | ===== Hardware Design ===== | ||
- | Componente utilizate: | + | === Componente utilizate === |
- | Arduino Uno | + | * Arduino Uno |
- | Breadboard | + | * Breadboard |
- | 5 LED-uri galbene | + | * LED-uri galbene |
- | Buzzer | + | * Buzzer |
- | butoane colorate | + | * Buton colorat |
- | Ecran LCD | + | * Shift register 74HC595N |
- | <note tip> | + | * Ecran LCD 3.5 inch ILI9488, cu touchscreen |
- | Aici puneţi tot ce ţine de hardware design: | + | === Detalii de utilizare a componentelor === |
- | * listă de piese | + | |
- | * scheme electrice (se pot lua şi de pe Internet şi din datasheet-uri, e.g. http://www.captain.at/electronic-atmega16-mmc-schematic.png) | + | * LED-urile au fost inseriate cu cate o rezistenta, pentru a nu afecta durata lor de viata. |
- | * diagrame de semnal | + | * Cele 5 LED-uri sunt plasate in linie, pentru a reda grafic treapta de dificultate a jocului. |
- | * rezultatele simulării | + | * Butonul foloseste rezistenta de pull-up. |
- | </note> | + | |
===== Software Design ===== | ===== Software Design ===== | ||
- | Arduino IDE | ||
- | Una din librariile pentru utilizarea primitivelor geometrice pe LCD(Adafruit TFTLCD, MCUFRIEND, LCDWIKI, etc) | ||
- | <note tip> | + | Am utilizat **Arduino IDE**, impreuna cu librariile: |
- | Descrierea codului aplicaţiei (firmware): | + | * **MCUFRIEND_kbv** si **Adafruit_GFX** pentru a reda imagini pe ecran. Libraria standard Adafruit_TFT nu era compatibila cu ecrane atat de mari, de aceea am folosit o alternativa. Libraria e capabila de a desena primitive geometrice, de a umple fundalul ecranului cu o culoare si de a desena imagini bitmap serializate. |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | * **TouchScreen.h** pentru a implementa functionalitatea de touchscreen. Aceasta este capabila sa detecteze pozitia si presiunea aplicata pe orice punct de pe ecran. Pentru a interactiona cu aceasta librarie, am creat o functie isPressed() care imi spune daca la momentul curent, pe ecran a fost aplicata o presiune mai mare decat un anumit threshold. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | === Redarea imaginilor jocului === |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | * In joc am redat environment-urile specifice mediului urban de zi sau noapte folosind mai multe obiecte: nori, soare, luna, stele, cladiri. Pentru a face acest lucru, am preluat cateva imagini .png, le-am transformat in imagini binare .bmp, le-am serializat si am adaugat octetii specifici in cod. |
- | * (etapa 3) surse şi funcţii implementate | + | * Pasarea a fost desenata de la zero folosind primitive geometrice simple (dreptunghiuri, patrate, ovale). |
- | </note> | + | |
+ | === Animatiile === | ||
+ | |||
+ | * Pentru a reda animatia pasarii, este nevoie de a "sterge" pasarea prin desenarea unui patrat de dimensiuni ce coincid cu cele ale pasarii. Acest lucru ofera pasarii un efect ce seamana cu o animatie de zbor. | ||
+ | * Pentru tuburi am optimizat desenarea lor, stergand si desenand la fiecare frame doar bucati mici din tub. | ||
+ | |||
+ | === Utilizarea buzzer-ului === | ||
+ | |||
+ | * Pentru a reda cele 2 melodii, ma folosesc de functiile tone si noTone din biblioteca Arduino. | ||
+ | * Pentru a nu adauga delay intre operatiile de tone si noTone (ce ar face ca redarea sunetelor sa fie blocanta, si sa imi afecteze restul jocului), am redat cate o nota muzicala la fiecare "frame". | ||
+ | |||
+ | === Afisajul cu 5 LED-uri === | ||
+ | |||
+ | Initial am conceput trecerea de la o dificultate la alta in functie de numarul de tuburi parcurse de catre pasare, insa am adaugat posibilitatea de a face aceasta trecere in functie de **un timer configurat in modul CTC**, ce in rutina de tratare a intreruperii va incrementa numarul de led-uri aprinse. | ||
+ | |||
+ | === Butonul de culoare === | ||
+ | |||
+ | Acesta va cicla printr-un set de culori, folosind o **intrerupere de tip PCINT** pentru a modifica aspectul pasarii in orice moment, inclusiv cand aceasta zboara. | ||
+ | |||
+ | === Logica jocului === | ||
+ | |||
+ | * Este binecunoscuta, Flappy Bird fiind un joc de tip survival in care scopul e ca pasarea sa treaca prin cat mai multe obstacole. | ||
+ | * Pentru a reseta starea unui joc, ma folosesc de functia initRun(), apelata la inceput sau dupa ce pasarea se ciocneste si jucatorul doreste sa reinceapa un run. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | * Trecerea printr-un tub și finalizarea fiecărui run sunt marcate de sunetele buzzerelor. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | * Pasarea arata realistic, fiind putin mai complexa decat un oval cu ochi (in cazul jocului original) |
- | </note> | + | * Butonul de customizare este utilizabil oricand (inceput/in timpul run-ului/ciocnire). |
+ | * Animatiile sunt fluide. | ||
+ | * Sirul de leduri afișează corect dificultatea curenta. | ||
+ | * Peisajele create pentru zi si noapte sunt placute vizual: | ||
+ | |||
+ | {{:pm:prj2022:arosca:day.jpg?300|}} | ||
+ | {{:pm:prj2022:arosca:dark.jpg?300|}} | ||
+ | |||
+ | [[https://drive.google.com/file/d/17wox8Bi5VP3MMO3bWHkwaDkMpUT9cCbf/view?usp=sharing|Demo 2 run-uri pe zi si pe noapte | ||
+ | ]] | ||
+ | |||
+ | [[https://drive.google.com/file/d/1GEh_BmEDrNeIuTdVP92iYdb2ZT7x1Z23/view?usp=sharing|Demo schimbare culoare pasare | ||
+ | ]] | ||
+ | |||
+ | Se poate observa cum pasarea isi schimba culoarea atat in meniul de start, cat si in timpul run-ului. De asemenea, LED-uri se aprind progresiv, iar buzzer-ul emite sunetele corespunzatoare desfasurarii jocului. | ||
+ | |||
+ | P.S: Aceasta nu este versiunea finala din punct de vedere estetic a proiectului, acesta fiind ambalat intr-o cutie care sa separe logica hardware din spate (multitudinea de fire, multiplexarea), si sa ofere utilizatorului doar un ecran pe care sa se joace si un breadboard cu LED-uri si buton. Am filmat fara cutie pentru a se putea vedea conexiunile. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | |||
+ | A fost un proiect interesant; dar am considerat ca a fost si destul de costisitor ca timp si dificultate. Totusi, in final consider ca a fost worth it, pentru ca am inteles mult mai bine lucrul cu Arduino/Atmega, in acelasi timp avand un joc in plus cu care sa imi omor timpul liber :-D . | ||
===== Download ===== | ===== Download ===== | ||
+ | {{:pm:prj2022:arosca:flappy_bird_definitive_edition.zip|Cod Sursa}} | ||
- | <note warning> | + | {{:pm:prj2022:arosca:schema_hardware.pdf|Schema hardware PDF}} |
- | 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ă ;-). | + | ===== Jurnal ===== |
+ | * 4.21.2022: Adaugare pagina proiect | ||
- | 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**. | + | * 4.21.2022: Comandare componente |
- | </note> | + | |
+ | * 4.26.2022: Sosire componente si incepere proiect | ||
+ | |||
+ | * 4.27.2022: Adaugare buton si buzzer pe breadboard, testare buzzer folosind cateva din melodiile din sectiunea Bibliografie/Resurse | ||
+ | |||
+ | * 4.28.2022: Testare ecran, desenare pasare folosind figuri geometrice | ||
+ | |||
+ | * 4.30.2022: Desenare background-uri (norisori, stele, copaci, cladiri) | ||
+ | |||
+ | * 5.03.2022 - 5.15.2022: Implementare logica joc: animatii ale pasarii, tuburi miscatoare, scor, functionalitate de reset, etc. | ||
+ | |||
+ | * 5.18.2022: Adaugare shift register si LED-uri pe breadboard. | ||
+ | |||
+ | * 5.25.2022: Final fixes: Am reparat bug-uri ce fac jocul mult mai placut. Printre acestea se includ: ecranul este mult mai reactiv la atingere, coliziunile sunt mai bune, schimbarea dificultatii se face dupa un timer, si nu dupa numarul de tuburi traversate, jocul nu se mai blocheaza. Overall in aceasta zi am imbunatatit mult experienta de joc :-D. | ||
+ | |||
+ | * 5.27.2022: Documentare finala si asezare proiect in cutie pentru aspect mai placut. | ||
- | ===== Jurnal ===== | ||
- | 4.21.2022: Adaugare pagina proiect | ||
- | <note tip> | ||
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | ||
- | </note> | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | === Resurse Software === | ||
+ | |||
+ | * http://adafruit.github.io/Adafruit-GFX-Library/html/class_adafruit___g_f_x.html | ||
+ | * https://github.com/adafruit/Adafruit_TouchScreen | ||
+ | * https://github.com/prenticedavid/MCUFRIEND_kbv | ||
+ | * https://github.com/robsoncouto/arduino-songs | ||
+ | * https://www.youtube.com/watch?v=7ER1fbDoc20 | ||
+ | |||
+ | === Resurse Hardware === | ||
- | <note> | + | * https://www.elecrow.com/download/ILI9488%20Data%20Sheet_100.pdf |
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | + | * https://www.diodes.com/assets/Datasheets/74HC595.pdf |
- | </note> | + | * Laboratoarele de PM |
<html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||