Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pm:prj2022:avaduva:magicmusicbox [2022/05/27 14:11]
miruna_maria.fatu [Logica implementarii]
pm:prj2022:avaduva:magicmusicbox [2022/05/27 23:46] (current)
miruna_maria.fatu [Download]
Line 80: Line 80:
 {{ :​pm:​prj2022:​avaduva:​schema_electrica_fatumiruna.png?​750 |}} {{ :​pm:​prj2022:​avaduva:​schema_electrica_fatumiruna.png?​750 |}}
 ===== Software Design ===== ===== Software Design =====
 +
  
 ==== Logica implementarii ==== ==== Logica implementarii ====
Line 93: Line 94:
 === Mod functionare === === Mod functionare ===
  
-Functia setup() pregateste mediul de functionare al proiectului,​ initializand butoanele ca INPUT, configurand cele doua accelerometre si LCD-ul pentru interactiunea cu microcontroller-ul.+Functia ​**setup()** pregateste mediul de functionare al proiectului,​ initializand butoanele ca INPUT, configurand cele doua accelerometre si LCD-ul pentru interactiunea cu microcontroller-ul.
  
 Music Box are doua moduri de functionare prin care utilizatorul poate naviga prin intermediul unui buton de tip slideswitch. Music Box are doua moduri de functionare prin care utilizatorul poate naviga prin intermediul unui buton de tip slideswitch.
  
-In functia loop() se identifica modul de functionare al cutiei muzicale, dupa care urmeaza algormitmul specific fiecarui mod, asa cum este descris in continuare.+In functia ​**loop()** se identifica modul de functionare al cutiei muzicale, dupa care urmeaza algormitmul specific fiecarui mod, asa cum este descris in continuare.
    
-   * Game Mode - Algoritmul jocului +   * //**Game Mode - Algoritmul jocului**// \\ 
- La selectarea acestui ​mod, toate datele jocului vor fi resetate. Pentru inceput, se vor genera date aleatorii pentru cele 4 runde ale jocului - functia startSequence()+       
- La fiecare noua runda, initial, se vor genera sunetele corespunzatoare instrumentelor din secventa rundei respective, numele acestora fiind totodata afisate si pe LCD - playNote() & displayNotes(). Dupa ce intreaga secventa a fost redata, este asteptata interactiunea utilizatorului. +Atunci cand este selectat acest mod, toate datele jocului vor fi resetate.\\ 
-Functia buttonCheck() va identifica instrumentul pe care utilizatorul l-a folosit si va verfica simultan daca sunetul emis corespunde cu cel asteptat conform secventei. +Pentru inceput, se vor genera date aleatorii pentru cele 4 runde ale jocului - functia ​**startSequence()**.
-    ​In cazul in care este corect, se asteapta in continuare input pana cand secventa a fost redata. Daca intreaga secventa a fost reprodusa corect, se avanseaza la urmatoarea runda, acestea fiind in total 4, incapsulate intr-o bucla for. +
-    ​In cazul in care este gresit, se afiseaza un mesaj "Try again ..." impreuna cu un sunet, intrerupand astfel continuarea jocului - functia loseSequence(). Jocul este resetat automat, iar progresul utilizatorului este anulat. Un nou joc va incepe, pornind de la runda 1. +
-  * Daca toate cele 4 secvente au fost redate cu succes, jocul se incheie cu succes, afisand mesajul "You did it! Congrats!"​ acompaniat de o melodie - functia winSequence(). De asemenea, jocul va fi resetat, urmand sa inceapa un nou joc+
  
 +La fiecare noua runda, initial, se vor genera sunetele corespunzatoare instrumentelor din secventa rundei respective, denumirea acestora fiind afisata simultan si pe LCD - **playNote()** & **displayNotes()**. Dupa ce intreaga secventa a fost redata, este asteptata interactiunea utilizatorului. \\
  
-  ​* Free mode +Functia **buttonCheck()** va identifica instrumentul pe care utilizatorul l-a folosit si va verfica simultan daca sunetul emis corespunde cu cel asteptat conform secventei. 
- Se asteapta input de la utilizator - functia buttonCheck() - , acesta avand posibilitatea de a crea o melodie personalizata.+      * In cazul in care este corect, se asteapta in continuare input pana cand secventa a fost redata. Daca intreaga secventa a fost reprodusa corect, se avanseaza la urmatoarea runda, acestea fiind in total 4, incapsulate intr-o bucla for. 
 + 
 +      * In cazul in care este gresit, se afiseaza un mesaj "Try again ..." impreuna cu un sunet, intrerupand astfel continuarea jocului - functia **loseSequence()**. Jocul este resetat automat, iar progresul utilizatorului este anulat. Un nou joc va incepe, pornind de la runda 1. 
 + 
 +Daca toate cele 4 secvente au fost redate cu succes, jocul se incheie cu succes, afisand mesajul "You did it! Congrats!"​ acompaniat de o melodie - functia **winSequence()**. De asemenea, jocul va fi resetat, urmand sa inceapa un nou joc.  
 + 
 +  * //**Free mode**// \\ 
 + 
 + Se asteapta input de la utilizator - functia ​**buttonCheck()** - , acesta avand posibilitatea de a crea o melodie personalizata.
   ​   ​
    
 === Implementarea tobelor - percutie === === Implementarea tobelor - percutie ===
-Pentru a oferi o simulare cat mai realista a senzatiei de a bate la tobe, acestea sunt implementate folosind doua accelerometre MPU6050. Intrucat acest model ofera functionalitatea de giroscop, pentru a determina momentul de timp la care va fi emis sunetul, va fi calculata distanta folosind toate cele 3 axe X, Y, Z, iar apoi determinat timpul in care a fost parcursa aceasta distanta, obtinand in final valoarea acceleratiei. In cazul in care accelerometrul este miscat cu destula viteza, la finalul miscarii, va fi emis un sunet asemanator unei tobe. + 
 +Pentru a oferi o simulare cat mai realista a senzatiei de a bate la tobe, acestea sunt implementate folosind doua **accelerometre MPU6050**, cu ajutorul protocolului I2C 
 + 
 +Intrucat acest model ofera functionalitatea de giroscop, pentru a determina momentul de timp la care va fi emis sunetul, va fi calculata distanta folosind toate cele 3 axe (X, Y, Z - functia **getStickValues()**), iar apoi determinat timpul in care a fost parcursa aceasta distanta, obtinand in final valoarea acceleratiei. ​ 
 + 
 +In cazul in care accelerometrul este miscat cu destula viteza, la finalul miscarii, va fi emis un sunet asemanator unei tobe - functia **checkToSing()**.
   ​   ​
 <code java> <code java>
Line 145: Line 157:
 === Implementarea pianului === === Implementarea pianului ===
  
-Implementarea pianului a constat in configurarea a 7 butoane ce corespund notelor muzicale DO, RE, MI, FA, SOL, LA, SI, DO. La apasarea unuia dintre ele va fi emis sunetul corespunzator acelei note muzicale - debounceButton(),​ iar pe LCD se va afisa denumirea notei. Citirea datelor este facuta cu functia digitalRead(). ​+Implementarea pianului a constat in configurarea a 7 butoane ce corespund notelor muzicale DO, RE, MI, FA, SOL, LA, SI, DO.  
 + 
 +La apasarea unuia dintre ele va fi emis sunetul corespunzator acelei note muzicale - functia **debounceButton()**, iar pe LCD se va afisa denumirea notei. Citirea datelor este facuta cu functia digitalRead(). ​
  
 <code java> <code java>
Line 177: Line 191:
 === Corelarea butoanelor === === Corelarea butoanelor ===
  
- ​Pentru a asigura o functionalitate corecta a tuturor instrumentelor alcatuite din butoane si accelerometre,​ a fost nevoie de implementarea unui debouncer. Astfel, acesta asigura ca datele nu vor fi citite repetitiv la un moment de timp, fara ca doua sau mai multe instrumente sa se intercaleze sau sa se altereze sunetul unuia dintre ele. + ​Pentru a asigura o functionalitate corecta a tuturor instrumentelor alcatuite din butoane si accelerometre,​ a fost nevoie de implementarea unui **debouncer**. Astfel, acesta asigura ​faptul ​ca datele nu vor fi citite repetitiv la un moment de timp, fara ca doua sau mai multe instrumente sa se intercaleze sau sa se altereze sunetul unuia dintre ele. 
  
  
 === Creare sunete === === Creare sunete ===
-Pentru ca efectul de tobe nu poate fi reprodus explicit doar prin niste simple note muzicale, a fost nevoie sa convertesc secvente de melodii de tip MP3, codificand apoi sunetul cu aplicatia EncodeAudio,​ acesta fiind ulterior incarcat pe placuta Arduino. Pentru prelucrarea melodiilor cat si comprimarea dimensiunii acestora am folosit aplicatia Audacity. Datorita memoriei limitate a placutei, nu am avut posibilitatea de a incarca mai mult de doua astfel de efecte muzicale, ceea ce a fost putin neplacut. Pentru a reda aceste sunete am folosit functia startPlayback() din biblioteca PCM.h. 
  
 +Pentru ca efectul de tobe nu poate fi reprodus explicit doar prin niste simple note muzicale, a fost nevoie sa convertesc secvente de melodii de tip MP3, codificand apoi sunetul cu aplicatia EncodeAudio,​ acesta fiind ulterior incarcat pe placuta Arduino. ​
 +
 +Pentru prelucrarea melodiilor cat si comprimarea dimensiunii acestora am folosit aplicatia Audacity. Datorita memoriei limitate a placutei, nu am avut posibilitatea de a incarca mai mult de doua astfel de efecte muzicale, ceea ce a fost putin neplacut. Pentru a reda aceste sunete am folosit functia startPlayback() din biblioteca PCM.h.
 +
 +<code java>
 +startPlayback(sound1,​ sizeof(sound1));​
 +</​code>​
 +  ​
   ​   ​
 ==== Biblioteci si mediu de dezvoltare ==== ==== Biblioteci si mediu de dezvoltare ====
Line 197: Line 218:
 ===== Rezultate Obţinute ===== ===== Rezultate Obţinute =====
  
-<note tip> +Link drive (demo + poze): https://​drive.google.com/​drive/​folders/​1UgzV9hHkORNomN6ilFcIYVc8YpFYCg6a?​usp=sharing 
-Care au fost rezultatele obţinute în urma realizării proiectului vostru+ 
-</​note>​+{{ :​pm:​prj2022:​avaduva:​magic_box_miruna4.jpg?600 |}} 
 + 
 +{{ :​pm:​prj2022:​avaduva:​magic_box_miruna1.jpg?​600 |}} 
 + 
 +{{ :​pm:​prj2022:​avaduva:​magic_box_miruna2.jpg?​600 |}} 
 + 
 +{{ :​pm:​prj2022:​avaduva:​magic_box_miruna3.jpg?​600 |}}
  
 ===== Concluzii ===== ===== Concluzii =====
  
-===== Download =====+Proiectul a fost foarte placut de implementat,​ desi implementarea a fost mai complexa decat ma asteptam. \\
  
-<note warning>​ +Consider ca acum sunt mult mai sigura pe notiuni ce tin atat de electronicacat si pe protocoalele invatate la laborator ​pe care le-am aprofundat prin prisma acestui proiect\\
-O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului:​ sursescheme, 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**. +De asemenea, acum nu imi mai este frica de o rezistenta ​sau un tranzistor si chiar am invatat sa lipesc fire si componente singura ;-).
-</​note>​+
  
 +Pot spune ca dificultatile intalnite precum memoria limitata a placutei Arduino m-au pus sa regandesc putin intreaga implementare,​ fiind nevoita sa limitez numarul de efecte de tip MP3 la doar doua. Din punct de vedere software, am avut de rezolvat cele mai multe bug-uri datorita algoritmului de joc care nu a fost atat de usor de implementat din cauza corelarii software-hardware.
 +
 +Din punct de vedere al modului de functionare,​ acesta functioneaza exact asa cum mi-am propus, sfarsind sa adaug mai multe functionalitati decat imi propusesem initial. ​
 +
 +Ca experienta, a fost o modalitate chiar interesanta de a te desprinde de temele obisnuite de facultate prin faptul ca rezultatul este unul palpabil si poti sa te bucuri de ceva real.
 +===== Download =====
 +
 +Arhiva sursa + scheme (bloc si electrica): {{:​pm:​prj2022:​avaduva:​fatumirunamaria_331ca_proiectpm.zip|}}
 ===== Jurnal ===== ===== Jurnal =====
  
 20.04.2022 - Alegere tema proiect \\ 20.04.2022 - Alegere tema proiect \\
-21.04.2022 - Publicare descriere proiect+21.04.2022 - Publicare descriere proiect ​\\ 
 +27.04.2022 - Comanda componente \\ 
 +14.05.2022 - Finalizare proiect hardware \\ 
 +17.05.2022 - Finalizare proiect software \\ 
 +27.05.2022 - Finalizare pagina proiect 
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
  
 <​note>​ <​note>​
-Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe **Resurse Software** şi **Resurse Hardware**.+https://​github.com/​fdebrabander/​Arduino-LiquidCrystal-I2C-library\\ 
 +https://www.makerguides.com/​character-lcd-arduino-tutorial/​ \\ 
 +https://​www.youtube.com/​watch?​v=aaqaAXlZbuc&​t=127s&​ab_channel=ElectronicsBD \\ 
 +http://​highlowtech.org/?​p=1963 \\ 
 +https://​create.arduino.cc/​projecthub/​MissionCritical/​mpu-6050-tutorial-how-to-program-mpu-6050-with-arduino-aee39a
 </​note>​ </​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>​
  
pm/prj2022/avaduva/magicmusicbox.1653649911.txt.gz · Last modified: 2022/05/27 14:11 by miruna_maria.fatu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0