Magic Music Box

Student: Fatu Miruna-Maria

Grupa: 331 CA

Introducere

Scopul proiectului

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.

Aspecte practice ale proiectului

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.

Cum?
 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.

Descriere generală

• Proiectul dispune de doua moduri:

  • Music Box
    • Utilizatorul isi poate antrena creativitatea prin generarea sunetelor corespunzatoare instrumentelor.
      Simularea tobelor se va activa prin crearea unor vibratii folosind accelerometrele. La apasarea butoanelor, vor fi generate sunetele adecvate notelor muzicale Do, Re, Mi, Fa, Sol, La, Si, Do, iar pe LCD se va afisa nota corespunzatoare sunetului care a fost emis.
  • Create that song!
    • La emiterea unei melodii standard, utilizatorul trebuie sa aleaga instrumentele potrivite si sa reconstituie
      melodia emisa. Daca melodia este identificata cu succes, se avanseaza la un nivel cu un grad mai mare
      de dificultate. Rezultatul va fi afisat pe un ecran LCD.

• Interfata cu utilizatorul este formata din:

  • Difuzor Arduino
  • Butoane - corespund notelor muzicale
  • Ecranul ECD - folosit pentru afisarea informatiilor
  • Potentiometru - divizor de tensiune variabil prin care se obtine intensitatea sonora dorita

• Pentru a comuta intre cele doua moduri disponibile, va fi folosit un comutator (switch button).



Schema bloc

Hardware Design

Componente

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 1W1



Schema electrica

Software Design

Logica implementarii

Implementarea proiectului a fost facuta in mai multe etape:

  • implementarea functionalitatilor butoanelor (pian)
  • implementarea functionalitatii accelerometrelor (percutie)
  • corelarea instrumentelor cu ajutorul debouncere-lor
  • implementarea algoritmului de joc

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.

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.

  • Game Mode - Algoritmul jocului

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.

  • 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

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

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;

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 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

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));

Biblioteci si mediu de dezvoltare

Proiectul a fost implementat in Arduino IDE.

Biblioteci utilizate:

  • LiquidCrystal_I2C.h - implementarea LCD ului pe magistrala I2C
  • PCM.h - redare sunete
  • Wire.h - operațiunile pe magistrala I2C a microcontrollerului
  • Math.h - diferite operatii matematice pentru calculul distantei

Rezultate Obţinute

Concluzii

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.

Download

Arhiva sursa + scheme (bloc si electrica): fatumirunamaria_331ca_proiectpm.zip

Jurnal

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

Bibliografie/Resurse

pm/prj2022/avaduva/magicmusicbox.txt · Last modified: 2022/05/27 23:46 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