Student: Fatu Miruna-Maria
Grupa: 331 CA
Obiectivul proiectului este implementarea unui joc de reconstituire a unor melodii standard, cu diferite grade de complexitate, prin intermediul unor instrumente muzicale simulate - pian si percutie.
Circuitul implementat poate avea aplicabilitate practica in proiectarea unei jucarii pentru copii sub forma unei cutii muzicale ce le va dezvolta atat creativitatea intrucat acestia isi pot crea propriile melodii, cat si memoria datorita jocului de reconstituire a melodiilor.
Magic Music Box cu pian si percutie.
Percutia va fi redata prin accelerometre ce emit sunete simuland lovirea unor tobe, iar pianul prin butoane. Afisarea notelor muzicale si a rezultatelor se va face pe un ecran LCD, iar volumul cutiutei muzicale va putea fi ajustat printr-un potentiometru.
• Proiectul dispune de doua moduri:
• Interfata cu utilizatorul este formata din:
• Pentru a comuta intre cele doua moduri disponibile, va fi folosit un comutator (switch button).
Schema bloc
Nume | Numar Piese |
---|---|
Arduino UNO | 1 |
Breadboard | 1 |
Ecran LCD | 1 |
Accelerometru MPU6050 | 2 |
Tranzistor BC547 | 1 |
Push Button | 7 |
Slideswitch button | 1 |
Potentiometru | 1 |
Arduino Speaker 1W | 1 |
Schema electrica
Implementarea proiectului a fost facuta in mai multe etape:
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.
In functia loop() se identifica modul de functionare al cutiei muzicale, dupa care urmeaza algormitmul specific fiecarui mod, asa cum este descris in continuare.
Atunci cand este selectat acest 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, denumirea acestora fiind afisata simultan si pe LCD - playNote() & displayNotes(). Dupa ce intreaga secventa a fost redata, este asteptata interactiunea utilizatorului.
Functia buttonCheck() va identifica instrumentul pe care utilizatorul l-a folosit si va verfica simultan daca sunetul emis corespunde cu cel asteptat conform secventei.
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.
Se asteapta input de la utilizator - functia buttonCheck() - , acesta avand posibilitatea de a crea o melodie personalizata.
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().
void checkToSing1(int16_t lastX){ int16_t oldStick1X = stick1X; int16_t oldStick1Y = stick1Y; int16_t oldStick1Z = stick1Z; getStick1Values(MPU1); double dist = sqrt(pow(oldStick1X - stick1X, 2) + pow(oldStick1Y - stick1Y, 2) + pow(oldStick1Z - stick1Z, 2)); if (isPlayingSound && millis() - startSound > soundDuration) { isPlayingSound = false; } if (dist > 22000 && !isPlayingSound) { enaughSpeed = true; } if (dist < 2000 && enaughSpeed) { flag1 = true; enaughSpeed = false; startPlayback(sound1, sizeof(sound1)); isPlayingSound = true; startSound = millis(); } }
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().
if (reading != lastButtonState[idx]) { // Reset the debouncing timer lastDebounceTime[idx] = millis(); } if (isPlayingSound && millis() - startSound > soundDuration) { isPlayingSound = false; } if ((millis() - lastDebounceTime[idx]) > debounceDelay) { if (reading != buttonState[idx]) { buttonState[idx] = reading; if (reading == LOW) { tone(SPK, note, 100); isPlayingSound = true; startSound = millis(); return 1; } } } lastButtonState[idx] = reading;
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.
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.
startPlayback(sound1, sizeof(sound1));
Proiectul a fost implementat in Arduino IDE.
Biblioteci utilizate:
Link drive (demo + poze): https://drive.google.com/drive/folders/1UgzV9hHkORNomN6ilFcIYVc8YpFYCg6a?usp=sharing
Proiectul a fost foarte placut de implementat, desi implementarea a fost mai complexa decat ma asteptam.
Consider ca acum sunt mult mai sigura pe notiuni ce tin atat de electronica, cat si pe protocoalele invatate la laborator pe care le-am aprofundat prin prisma acestui proiect.
De asemenea, acum nu imi mai este frica de o rezistenta sau un tranzistor si chiar am invatat sa lipesc fire si componente singura .
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.
Arhiva sursa + scheme (bloc si electrica): fatumirunamaria_331ca_proiectpm.zip
20.04.2022 - Alegere tema 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