This shows you the differences between two versions of the page.
pm:prj2023:iotelea:rhythm-game [2023/05/05 14:13] ana_maria.varban |
pm:prj2023:iotelea:rhythm-game [2023/05/29 16:15] (current) ana_maria.varban [Download] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Rhythm Game ====== | ====== Rhythm Game ====== | ||
+ | * Nume: Vârban Ana-Maria | ||
+ | * Grupa: 336CB | ||
===== Introducere ===== | ===== Introducere ===== | ||
Line 32: | Line 34: | ||
==== Schema Electrica ==== | ==== Schema Electrica ==== | ||
- | {{ :pm:prj2023:amvarban:pm_hardware.png?850x500 |}} | + | {{ :pm:prj2023:amvarban:pm_hardware.png?705x438 |}} |
+ | |||
+ | ==== Implementarea Hardware ==== | ||
+ | |||
+ | {{ :pm:prj2023:amvarban:pm_hardware.jpg?600x450 |}} | ||
+ | |||
+ | * Dupa cum se poate observa, am asezat cele **4 butoane ce vor fi folosite pentru joc** in stanga breadboard-ului, iar cele **2 butoane de control** in partea dreapta. Butoanele sunt conectate alaturi de cate un rezistor de 10K ce actioneaza ca rezistenta de pull down. Cele 6 butoane sunt conectate la pinii digitali de pe placuta **Arduino Uno**. **Ecranul LCD** este asezat pe breadboard alaturi de rezistori de 10K, conform indicatiilor distribuitorului. Aceste rezistente previn arderea display-ului. Pinii folositi pentru LCD sunt pinii digitali 8, 9, 11-13. **Buzzerul** este conectat la unul dintre pinii digitali PWM ai placutei Arduino, acesta nefiind inseriat cu un rezistor pentru un sunet mai puternic. | ||
===== Software Design ===== | ===== Software Design ===== | ||
- | <note tip> | + | Deoarece notele ce vor aparea pe ecran sunt singurele elemente ce se vor misca, acestea sunt definite de clasa **NoteCircle**. Aceasta pastreaza atribute precum pozitia curenta a notei, pozitia precedenta a notei, daca nota este sau nu pe ecran, daca nota este sau nu un //blank//, spatiul in care se afla sau dimensiunea si metode precum //getteri// si //setteri//, respectiv o metoda de update a pozitiei. Pentru afisarea acestora pe ecran, am declarat global un array (**circles**) de 30 de elemente, dintre care 15 vor fi //blank//. Am ales sa folosesc note //blank// (note ce nu vor fi afisate) pentru a ma asigura ca notele nu sunt ingramadite pe ecran. |
- | Descrierea codului aplicaţiei (firmware): | + | |
- | * mediu de dezvoltare (if any) (e.g. AVR Studio, CodeVisionAVR) | + | Melodia ce va fi redata la apasarea notelor este un fragment din Korobeiniki (aka The Tetris song) si este reprezentata printr-un array declarat global. |
- | * librării şi surse 3rd-party (e.g. Procyon AVRlib) | + | |
- | * algoritmi şi structuri pe care plănuiţi să le implementaţi | + | In cadrul functiei **setup()**, pornesc interfata seriala pentru a putea comunica cu display-ul, setez pinii digitali aferenti butoanelor si buzzer-ului si asignez toate notele de la indecsi impari in array-ul **circles** ca fiind note //blank//. |
- | * (etapa 3) surse şi funcţii implementate | + | |
- | </note> | + | In cadrul functiei **loop()**, se determina starea jocului. Jocul se poate afla la un moment de timp intr-una dintre 3 stari predefinite: MENU, PLAY sau SCORE. |
+ | |||
+ | In starea MENU, se afiseaza pe ecran titlul jocului (ARDUINO RHYTHM GAME) si un mesaj indemnand jucatorul sa apese butonul (asociat firului) verde pentru a incepe jocul. Afisarea acestor elemente este facuta cu ajutorul functiei **displayMenu()**. | ||
+ | |||
+ | Odata apasat butonul de start, jocul se va afla in starea PLAY iar pe ecran vor aparea cele 4 spatii in care vor aparea notele. Notele vor ajunge la baza ecranului, in zona delimitata de o linie verde si una rosie, unde, daca jucatorul apasa butonul corespunzator, scorul va creste iar nota aferenta din cantec va fi redata sonor. Pentru verificarea localizarii corecte a notei se va verifica doar coordonata //y//, deoarece odata afisata, o nota nu isi va modifica coordonata //x// cat timp este pe ecran. Pentru verificarea apasarii butoanelor, se citesc valori de pe **pinii digitali** aferenti acestora. Pentru redarea notei se va mentine indexul curent din array-ul de note, acesta fiind pasat functiei **playSong(int note)**, care va reda sunetul corespunzator. Jocul se termina cand toate notele din cantec au fost redate. Pentru afisarea spatiului de joc ma folosesc de functia **drawPlayField()**, iar pentru logica din timpul jocului, de functia **play()** | ||
+ | |||
+ | Odata terminat cantecul, jocul va trece in starea SCORE, unde se va afisa pe ecran scorul obtinut. De aici, jucatorul poate apasa fie butonul verde, pentru a reveni la meniul de start, fie butonul rosu, pentru a juca din nou. De afisarea acestora se ocupa functia **displayFinalScore()**. | ||
+ | |||
+ | Scrierea si incarcarea codului pe placuta Arduino au fost facute folosind //Arduino IDE//. De asemenea, am folosit bibliotecile //SPI.h//, pentru comunicarea cu display-ul si //Adafruit_GFX.h//, respectiv //Adafruit_ILI9341.h// pentru afisarea elementelor grafice pe display. Codul aferent redarii sunetelor este preluat din proiectul //Arduino Songs//, de care ne-am folosit si la laboratorul 3. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | <note tip> | + | Prin cele de mai sus am obtinut un joculet minimalist de ritm. Din pacate, limitarile componentelor au dus la un gameplay relativ lent. |
- | Care au fost rezultatele obţinute în urma realizării proiectului vostru. | + | Mai jos se gaseste link-ul catre un demo. |
- | </note> | + | |
+ | {{ :pm:prj2023:amvarban:start.jpg?180x240 |}} {{ :pm:prj2023:amvarban:score_0.jpg?180x240 |}} {{ :pm:prj2023:amvarban:score_25.jpg?180x240 |}} {{ :pm:prj2023:amvarban:score_fin.jpg?180x240 |}} | ||
+ | |||
+ | [[https://drive.google.com/file/d/16Sq2WviRpvwQBLiT2VoP_rqPYwAk6Njz/view?usp=drive_link|Demo Rhythm Game]] | ||
+ | |||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Pe masura ce am implementat diversele functionalitati, m-am lovit de limitarile componentelor, precum viteza de transfer a datelor de la placuta la ecranul LCD, afisarea pe ecran a notelor si reimprospatarea scorului, ce se face foarte des, motiv pentru care acesta apare sa clipeasca. Acestea au dus la un joc cu o complexitate foarte redusa si la un gameplay relativ lent. | ||
+ | |||
+ | In ciuda aspectelor mai neplacute, a fost foarte imbucurator sa vad rezultatele pe ecran. Creerea de la 0 a ceva tangibil si functional a fost o experienta unica, de care nu am mai avut parte pana acum. Desi proiectul este unul rudimentar, sunt foarte mandra de el. | ||
===== Download ===== | ===== Download ===== | ||
- | <note warning> | ||
- | 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> | ||
+ | {{:pm:prj2023:iotelea:rhythm_game.zip| Download Rhythm Game}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
- | <note tip> | + | * 25 aprilie 2023 : Am ales tema si am creat pagina wiki pentru proiect |
- | Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului. | + | * 1 mai 2023: Am completat pagina wiki cu o descriere a proiectului si un outline al design-ului hardware |
- | </note> | + | * 2 mai 2023: Am comandat piesele necesare |
+ | * 9 mai 2023: Am lipit pinii display-ului la laborator | ||
+ | * 13 mai 2023: Am asamblat componentele si am finalizat design-ul hardware, am testat functionalitatile de baza ale componentelor | ||
+ | * 24 mai 2023: Am implementat meniul de start, afisarea spatiului de joc si afisarea scorului | ||
+ | * 26 mai 2023: Am implementat caderea notelor, incrementarea scorului si redarea notei la apasarea corecta a butoanelor | ||
+ | * 30 mai 2023: PM Fair! | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | * [[https://ardushop.ro/ro/index.php?controller=attachment&id_attachment=144|Cod exemplu display LCD]] | ||
+ | * [[https://github.com/adafruit/Adafruit_ILI9341|Biblioteca display LCD]] | ||
+ | * [[https://github.com/robsoncouto/arduino-songs|Cod Arduino Songs]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab2-2023|PM Lab 2]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab3-2023|PM Lab 3]] | ||
+ | * [[https://ocw.cs.pub.ro/courses/pm/lab/lab5-2023|PM Lab 5]] | ||
- | <note> | ||
- | Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**. | ||
- | </note> | ||
<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> | ||