Differences

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

Link to this comparison view

pm:prj2022:avaduva:musicplayer [2022/05/25 23:34]
hermina_maria.matei [Schema Bloc]
pm:prj2022:avaduva:musicplayer [2022/05/26 23:27] (current)
hermina_maria.matei [Jurnal]
Line 48: Line 48:
 |Speaker | 1| |Speaker | 1|
  
-{{:​pm:​prj2022:​avaduva:​dongle.jpg?​200|}}==== Schema Bloc ====+ 
 +==== Schema Bloc ====
  
 {{:​pm:​prj2022:​avaduva:​schema_bloc_hermina.png?​600|}} {{:​pm:​prj2022:​avaduva:​schema_bloc_hermina.png?​600|}}
  
-{{:​pm:​prj2022:​avaduva:​circuit_hermina.png?800|}}+==== Schema Electrica ==== 
 + 
 +{{:​pm:​prj2022:​avaduva:​circuit_music_player_hermina.png?790|}}
  
  
Line 61: Line 64:
 ===== Software Design ===== ===== Software Design =====
  
 +=== Descriere mod de functionare ===
 +
 +In metoda de setup() se initializeaza pinii folositi, se citeste numarul de melodii care se afla in playlist de pe un fisier stocat pe cardul SD, se afiseaza un mesaj de bun venit, dupa care se porneste prima melodie.\\
 +
 +In loop, se verifica daca unul dintre pinii PAUSE_PIN, NEXT_PIN, respectiv PREV_PIN si-a modificat starea. In caz afirmativ, se pune melodia pe pauza, se trece la urmatoarea melodie sau se la melodia anterioara, in functie de pin. In plus, daca nicio melodie nu mai este redata, se trece la melodia urmatoare.\\
 +
 +Atunci cand melodia este schimbata, prin incrementarea/​decrementarea unui contor care retine numarul melodiei curente se calculeaza numele fisierului "​.wav"​ dupa urmatoarea formula: "​music"​ + <​song_idx>​ + "​.wav",​ unde song_idx este numarul melodiei curente. Numele artistului si numele melodiei sunt citite dintr-un fisier de pe carul SD, de forma "​name"​ + <​song_idx>​ + "​.txt"​. Ulterior, informatiile despre melodie sunt afisate pe ecranul LCD si melodia este redata.\\
 +
 +=== Alte surse folosite ===
 +Intrucat memoria dintr-un progam Arduino este limitata, am optat pentru stocarea numelui artistului si a numelui melodiei intr-un fisier pe cardul SD, pentru fiecare melodie in parte. Astfel, chiar daca avem un numar foarte mare de melodii, tot vom putea afisa informatiile cantecului curent pe LCD.
 +
 +Pentru a realiza fisierele care contin informatii despre fiecare melodie am folosit urmatoarea sursa de C++:
  
 <note tip> <note tip>
-Descrierea codului aplicaţiei ​(firmware): +    ifstream f("​songs.in"​)
-  * mediu de dezvoltare ​(if any) (e.g. AVR StudioCodeVisionAVR+    ofstream g; 
-  * librării şi surse 3rd-party (e.g. Procyon AVRlib+    int idx = 0; 
-  * algoritmi şi structuri pe care plănuiţi să le implementaţi +    string line; 
-  ​* ​(etapa 3surse şi funcţii implementate+    while (getline(f, line)){ 
 +        idx++; 
 +        std::size_t found = line.find("​-"​);​ 
 +        ​string artist = line.substr(0, found - 1); 
 +        ​if(artist.size(> MAX_LEN) 
 +            artist.resize(MAX_LEN); 
 +        while(artist.size() < MAX_LEN) 
 +            artist += " "; 
 +        string song = line.substr(found + 2); 
 +        if(song.size() > MAX_LEN) 
 +            song.resize(MAX_LEN);​ 
 +        while(song.size() < MAX_LEN) 
 +            song += " "; 
 +        ​g.open("​name"​ + to_string(idx) + "​.txt"​ ​std::​ofstream::​out); 
 +        ​g<<​artist<<'​\n'<<​song;​ 
 +        g.close(); 
 +    } 
 +    ​g.open("​number.txt",​ std::​ofstream::​out); 
 +    ​g<<​idx;​ 
 +    ​g.close();
 </​note>​ </​note>​
 + 
 +Acest cod de C++ citeste informatiile despre toate melodiile din playlist dintr-un fisier si determina numarul de melodii, precum si fisierele ce contin informatiile specfice fiecarei melodii. Important de mentionat este ca LCD-ul perminte afisearea a maximum 16 caractere pe linie. Din acest motiv, daca numele artistului sau daca numele melodiei este mai lung de 16 caractere, doar primele 16 caractere se vor lua in considerare.
 +Pentru a face citirea din fisier cat mai usoara, numele artistului este afisat pe prima linie din fisier, la care se adauga un padding de spatii pana se ajunge la limita de 16 caractere. Apoi, se trece pe urmatorul rand si se procedeaza identic si pentru numele melodiei.
  
-===== Rezultate Obţinute ===== +Fisierul de intrare folosit pentru sursa de C++ este urmatorul:
 <note tip> <note tip>
-Care au fost rezultatele obţinute în urma realizării proiectului vostru.+Bruno Mars - Uptown funck\\ 
 +Luis Fonsi - Despacito\\ 
 +Don Omar - Danza Kuduro\\ 
 +Maluma - Corazon\\ 
 +Modern Talking - Brother Louie\\ 
 +MrPresident - Coco Jamboo\\ 
 +Eminem - Godzilla\\ 
 +FISHER - Losing It\\ 
 +Disturbed - Down With The Sickness\\ 
 +Slipknot - Psychosocial\\
 </​note>​ </​note>​
 +
 +Astfel, adaugarea informatiilor despre o melodie noua este foarte rapida. Trebuie adaugate detaliile melodiei in fisierul care contine toate melodiile, in forma <​nume_artist>​ - <​nume_melodie>​ si rulat executabilul.
 +
 +===Biblioteci folosite===
 +  * LiquidCrystal_I2C.h
 +  * SPI.h
 +  * SD.h
 +  * TMRpcm.h
 +
 +===== Rezultate Obţinute =====
 +
 +Link la video: https://​drive.google.com/​file/​d/​1C5zzNqLmtb_GaGvuVCp3kN1-kn8zb0Y3/​view?​usp=sharing
 +
 +
  
 ===== Concluzii ===== ===== Concluzii =====
  
 +Proiectul a fost foarte distractiv de implementat,​ intrucat m-am putut bucura de melodiile mele preferate. Consider ca realizarea acestui m-a ajutat sa fixsez diverse notiuni pe care le-am dobandit in cadrul laboratorului de PM.\\
 +
 +In plus, am fost fortata sa gandesc outside de box in momentul in care mi-am dat seama ca stocarea in memorie a informatiilor melodiei este posibila doar pentru un numar limitat de melodii. Citirea informatiilor de pe fisiere dintr-un card SD este mult mai eficienta din punct de vedere al memoriei. Am ales sa fac fisiere separate pentru fiecare melodie in parte intr-un mod automat, folosind o sursa de C++, deoarece functia read() oferita de biblioteca <​SD.h>,​ pe care o folosesc in codul de Arduino vine cu anumite limitari: poate citi un singur caracter o data / un numar predefinit de caractere.
 +
 +Din punct de vedere electronic, circuitul functioneaza in modul in care mi-am dorit. Cu toate acestea, modificarea playlistului este destul de neplacuta, intrucat numele fisierelor "​.wav"​ trebuie modificate in cazul in care o melodie este adaugata/​stearsa. Sursa de C++ pe care am implementat-o faciliteaza adaugarea unei melodii noi la finalul playlist-ului.
 +
 +In continuare, imi doresc sa mai implementez o sursa de C++ care sa faca adaugarea si stergerea de melodii mult mai rapida pentru un user.
 ===== Download ===== ===== Download =====
  
 <note warning> <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ă ;-). +{{:pm:prj2022:avaduva:331ca_matei_hermina_pm_project.zip|}}
- +
-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>​ </​note>​
  
Line 89: Line 153:
  
 20.04.2022 - Alegere tema proiect \\ 20.04.2022 - Alegere tema proiect \\
-21.04.2022 - Publicare descriere proiect+21.04.2022 - Publicare descriere proiect\\ 
 +24.05.2022 - Editare descriere proiect\\ 
 +25.05.2022 - Adugare Hardware design\\ 
 +26.05.2022 - Adaugare Software desgin + Adaugare video + Adaugare arhiva
  
 ===== Bibliografie/​Resurse ===== ===== Bibliografie/​Resurse =====
pm/prj2022/avaduva/musicplayer.1653510863.txt.gz · Last modified: 2022/05/25 23:34 by hermina_maria.matei
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