This shows you the differences between two versions of the page.
pm:prj2023:adarmaz:gesture-music-player [2023/05/29 02:11] lavinia.raduta [Software Design] |
pm:prj2023:adarmaz:gesture-music-player [2023/05/30 00:24] (current) lavinia.raduta [Descriere generală] |
||
---|---|---|---|
Line 36: | Line 36: | ||
* canalul audio de tip **Mono** | * canalul audio de tip **Mono** | ||
* Bit Resolution de **8 biti** | * Bit Resolution de **8 biti** | ||
+ | |||
+ | |||
+ | <html> | ||
+ | <iframe | ||
+ | src="https://www.youtube.com/embed/4Vwwe9KIhVA" | ||
+ | title="Nostalgia music player" | ||
+ | frameborder="0" | ||
+ | allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" | ||
+ | allowfullscreen | ||
+ | style="aspect-ratio: 16/9; width: 100%;" | ||
+ | ></iframe> | ||
+ | </html> | ||
+ | |||
Line 183: | Line 196: | ||
* frecventa de esantionare (sample rate) a sunetului intre 8 si 32kHz (frecventa de esantionare = cate esantioane audio sunt redate pe secunda) | * frecventa de esantionare (sample rate) a sunetului intre 8 si 32kHz (frecventa de esantionare = cate esantioane audio sunt redate pe secunda) | ||
* Mono = un singur canal audio care va fi redat pe toti pinii de iesire | * Mono = un singur canal audio care va fi redat pe toti pinii de iesire | ||
- | * permite accesarea metadatelor | + | * permite accesarea metadatelor fiecarei melodii (nume, artist etc) |
+ | * foloseste un singur timer, TIMER1, restul fiind disponibile utilizatorului | ||
+ | Cum functioneaza? | ||
+ | * biblioteca utilizeaza un buffer cu dimensiunea implicita de 128 de bytes, in care stocheaza datele audio care vor fi redate luate de pe cardul SD | ||
+ | * folosind timerul 1, de fiecare data cand se genereaza o intrerupere, bufferul este din nou umplut, iar datele sunt trimise catre modulul de redare audio | ||
+ | * timerul este folosit pentru a genera intreruperi la un interval regulat de timp, pentru ca redarea melodiilor sa fie fluenta | ||
- | ===== Rezultate Obţinute ===== | + | Modul de folosire al bibliotecii: |
+ | <code C> | ||
+ | TMRpcm audio; // instance of the TMRpcm class. | ||
+ | audio.play(filename); // plays a file | ||
+ | audio.speakerPin = 9; // the pin on which the speaker is connected | ||
+ | audio.isPlaying(); // returns 1 if music playing, 0 if not | ||
+ | audio.pause(); // pauses/unpauses playback | ||
+ | audio.volume(0); // 1 (up) or 0 (down) to control volume | ||
+ | audio.setVolume(0); // 0 to 7. Set initial volume level | ||
+ | audio.listInfo(filename, buf, n); // returns info from metadata in the buffer. 0 - title, 1 - artist, 2- album | ||
+ | </code> | ||
+ | Pentru ca biblioteca SD limiteaza lungimea numelui fisierelor la 8 caractere + extensie, am decis ca cel mai ok mod de a le denumi sa fie 01.wav, 02.wav etc. Astfel, este super usor de a construi numele fisierului avand indexul melodiei pe care vreau sa o redau. | ||
+ | |||
+ | === Microfonul si LED-urile === | ||
+ | La fiecare interatie a loop-ului, daca o melodie este in momentul curent redata, se va citi valoarea de pe pinul A1, pe care e conectat microfonul, folosind analogRead. Valoarea citita astfel este intre 0 si 1023 si pentru a mapa aceasta valoare intre 0 si 255 (valoare necesara pentru analogWrite) folosesc functia map().\\ | ||
+ | LED-urile sunt legate pe pinul PD3, care foloseste Tmer2 pentru PWM (ceea ce e ok, biblioteca de audio foloseste doar Timer1) si daca valoarea citita de la microfon e mai mare de un threshold (ales in functie de testele efectuate si de castigul ajustat al microfonului) cu analogWrite se transmite intensitatea cu valori intre 0-255. Altfel se transmite 0. | ||
+ | |||
+ | <code C> | ||
+ | if (!paused) { | ||
+ | int analogValue = analogRead(A1); // read value from A1 | ||
+ | int intensity = map(analogValue, 0, 1023, 0, 255); // map value between 0 and 255 | ||
+ | if (analogValue > 700) { | ||
+ | analogWrite(3, intensity); | ||
+ | } else { | ||
+ | analogWrite(3, 0); // turn off LED when analogValue under threshold | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Scrierea pe LCD === | ||
+ | Pentru scrierea pe LCD-ul cu modul I2C am folosit biblioteca LiquidCrystal_I2C care ofera o interfata mult mai usor de folosit in comunicarea I2C. | ||
+ | * in etapa de initializare, aceasta stabileste parametrii comunicarii I2C | ||
+ | * atunci cand se apeleaza functii de control ale LCD-ului, biblioteca construieste pachete de date care contin informatii necesare si le trimite pe linia SDA catre LCD | ||
+ | * pentru sincronizarea transferului de date intre Arduino si LCD (cand datele sunt valide si pot fi citite) se foloseste linia SCL | ||
+ | |||
+ | Principalele functionalitati pe care le-am folosit din aceasta biblioteca: | ||
+ | <code C> | ||
+ | LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address and number of columns and lines | ||
+ | lcd.init(); // initializing I2C communication | ||
+ | lcd.backlight(); // turn on backlight | ||
+ | lcd.clear(); // clear LCD | ||
+ | lcd.createChar(SHUFFLE_C, shuffle_char); // create a custom character | ||
+ | lcd.write(SHUFFLE_C); // printing a custom character on the LCD | ||
+ | lcd.setCursor(column, line); // set cursor befor writing | ||
+ | lcd.print("starting..."); // printing a string on the LCD | ||
+ | </code> | ||
+ | |||
+ | Pentru a crea un caracter custom, am declarat un array de bytes, cu 0 pe pozitiile pe care vreau sa fie stinse punctele si 1 unde vreau sa fie aprinse. Fiecare caracter are asociat un numar (define-uri declarate in extras.h) | ||
+ | <code C> | ||
+ | #define SHUFFLE_C 0 | ||
+ | byte shuffle_char[] = { | ||
+ | B00000, | ||
+ | B01010, | ||
+ | B01010, | ||
+ | B01010, | ||
+ | B01010, | ||
+ | B00100, | ||
+ | B01010, | ||
+ | B01010 | ||
+ | }; | ||
+ | </code> | ||
+ | ===== Rezultate Obţinute ===== | ||
+ | Sunt multumita de cum a iesit proiectul, mereu fiind insa loc de imbunatatiri. Initial voiam sa folsesc un senzor de gesturi pentru a controla activitatea player-ului, insa nu am reusit sa integrez toate componentele. cel mai probabil microcontroller-ul ramanea fara memorie, asa ca am inlocuit aceasta functionalitatea cu butoane (sa fie mai nostalgic :-) )\\ | ||
+ | O alta chestie pe care nu am resit sa o fac, a fost sa citesc in functia de setup toate fisierele de pe cardul SD, sa verific daca sunt in format wav si sa le numar, asa ca am hardcodat numarul de melodii in cod. Acesta ar fi urmatorul update pe care l-as adauga proiectului. | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
+ | Proiectul mi s-a parut foarte util pentru a intelege cum functioneaza intreruperile hardware, DAC-ul, PWM si I2C. | ||
+ | A fost o experienta foarte placuta, ma bucur ca am ales un proiect pe care sa-l vad cum evolueaza in fiecare zi in care lucram la el.\\ | ||
+ | Ce am mai invatat din acest proiect este sa verific cu MAI MARE atentie specificatiile componentelor si sa verific inainte de a da banii pe ele daca chiar o sa pot sa le conectez. Bibliotecile ascund multa informatie in spatele unui API dragut si cateodata e nevoie de ajustari pentru a le putea folosi impreuna. | ||
- | ===== Download ===== | + | <note warning> |
+ | Folositi modul de card MicroSD, nu de card SD mare, sau macar un modul cu level shifter integrat. Am invatat pe pielea mea.\\ | ||
+ | Aveti grija ce biblioteci folositi, (probabil) ca o biblioteca pe care am incercat-o pentru prima oara mi-a facut placuta sa fumege. \\ | ||
+ | Si componentele chinezesti nu sunt o investitie chiar buna :-) | ||
+ | </note> | ||
+ | ===== Download ===== | ||
+ | [[https://github.com/laviniaraduta/Arduino-Music-Player|Link GitHub]] | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== | ||
+ | === Software === | ||
+ | [[https://github.com/TMRh20/TMRpcm/wiki|documentatie biblioteca TMRpcm]] \\ | ||
+ | [[https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library|biblioteca LiquidCrystal_I2C]] \\ | ||
+ | [[https://lastminuteengineers.com/arduino-micro-sd-card-module-tutorial/|despre modulul MicroSD]]\\ | ||
+ | [[https://electropeak.com/learn/interfacing-max4466-microphone-module-with-arduino/|interfatare microfon cu Arduino]]\\ | ||
+ | [[https://ocw.cs.pub.ro/courses/_media/pm/lab/uno.jpg?cache=|Pinout Arduino - SFANT CEA MAI UTILA CHESTIE]]\\ | ||
+ | |||
<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> | ||