This shows you the differences between two versions of the page.
pm:prj2023:apredescu:karaoke-machine [2023/05/29 14:21] andrei.otetea [Concluzii] |
pm:prj2023:apredescu:karaoke-machine [2023/05/30 00:33] (current) andrei.otetea [Software Design] |
||
---|---|---|---|
Line 13: | Line 13: | ||
Utilizatorul stochează melodiile în formatul WAV și versurile în formatul LRC. La introducerea cardului de memorie în slot, utilizatorul vede pe ecranul LCD melodia curentă și o poate schimba folosind butonul next. De asemenea, cu butonul play/pause poate continua reluarea melodiei, respectiv poate pune pauză la melodia curentă. În plus, butonul on/off mic pornește/oprește microfonul. | Utilizatorul stochează melodiile în formatul WAV și versurile în formatul LRC. La introducerea cardului de memorie în slot, utilizatorul vede pe ecranul LCD melodia curentă și o poate schimba folosind butonul next. De asemenea, cu butonul play/pause poate continua reluarea melodiei, respectiv poate pune pauză la melodia curentă. În plus, butonul on/off mic pornește/oprește microfonul. | ||
- | Pe ecranul LCD o să apară versurile curente, iar utilizatorul va putea folosi microfonul pentru a obține puncte, dacă cântă în timp ce apar versurile. Scorul este cu atât mai mare cu cât cântă mai tare. | + | Pe ecranul LCD o să apară versurile curente, iar utilizatorul va putea folosi microfonul pentru a obține puncte, dacă cântă în timp ce apar versurile. Scorul este cu atât mai mare cu cât cântă mai tare. Utilizatorul poate obține puncte dacă rulează o melodie și dacă acesta are microfonul pornit. |
Melodia se va auzi pe o boxă, sunetul fiind amplificat. | Melodia se va auzi pe o boxă, sunetul fiind amplificat. | ||
Line 31: | Line 31: | ||
{{:pm:prj2023:apredescu:pm-schema-electrica-2-andrei-otetea.png?1000|}} | {{:pm:prj2023:apredescu:pm-schema-electrica-2-andrei-otetea.png?1000|}} | ||
+ | |||
+ | {{:pm:prj2023:apredescu:poza_proiect_karaoke_machine.jpg?500|}} | ||
===== Software Design ===== | ===== Software Design ===== | ||
Line 38: | Line 40: | ||
=== Descrierea codului aplicaţiei (firmware) === | === Descrierea codului aplicaţiei (firmware) === | ||
- | * **void setup()**- Setez seriala pe 9600 baud, inițializez obiectele TMRpcm și SdFat, inițializez LCD-ul și configurez întreruperile pentru cele 3 butoane, când sunt apăsate, respectiv configurez întreruperile pentru Timer2 la 10ms. | + | * **void setup()**- Setez seriala pe 9600 baud, inițializez obiectele TMRpcm și SdFat, inițializez LCD-ul și configurez întreruperile pentru Timer2 la 10ms. |
* **ISR(TIMER2_COMPA_vect)** - o dată la 10ms, atunci când e cazul, cresc timpul trecut din melodie si actualizez scorul | * **ISR(TIMER2_COMPA_vect)** - o dată la 10ms, atunci când e cazul, cresc timpul trecut din melodie si actualizez scorul | ||
- | * **void loop()**- verific dacă oricare dintre butoane sunt apăsate, dacă nu e pauză verific dacă ar trebui modificat textul de pe LCD și, dacă primesc comanda s pe serială afișez scorul curent | + | * **void loop()**- verific dacă oricare dintre butoane sunt apăsate, dacă nu e pauză verific dacă ar trebui modificat textul de pe LCD și citesc noul text care ar trebui afișat pe LCD, și, dacă primesc comanda **S** pe serială afișez scorul curent |
- | * **buttonInterruptHandler()** - se ocupa de intreruperea butoanelor | + | * **void displayTextOnLCD(const char* text)** - afișează textul primit pe ambele linii ale LCD-ului |
- | * **displayTextOnLCD(const char* text)** - afișează textul primit pe ambele linii ale LCD-ului | + | |
* **bool isWAV(const char* filename)** - verifică dacă un fișier are extensia .wav. | * **bool isWAV(const char* filename)** - verifică dacă un fișier are extensia .wav. | ||
* **void listFiles()** - afiseaza fișierele din rădăcina cardului SD | * **void listFiles()** - afiseaza fișierele din rădăcina cardului SD | ||
- | * **void readLyricsLine()** - citește o linie din fișierul de lyrics și extrage versul și timpul când ar trebui să apară. | + | * **void readLyricsLine()** - citește o linie din fișierul de lyrics și extrage versul și timpul când ar trebui să apară; nu citesc tot fișierul din prima, îl citesc pe parcurs fiindcă nu aș avea destul SRAM să-l salvez pe tot |
* **unsigned long parseTimestamp(const char* timestampStr)** - transformă un string ce conține ora în formatul MM:SS.MM în milisecunde. | * **unsigned long parseTimestamp(const char* timestampStr)** - transformă un string ce conține ora în formatul MM:SS.MM în milisecunde. | ||
* **void performAction(int buttonIndex)** - în funcție de butonul apăsat, execută acțiunea asociată lui | * **void performAction(int buttonIndex)** - în funcție de butonul apăsat, execută acțiunea asociată lui | ||
+ | * mic on/off | ||
+ | * pause/play | ||
+ | * next - de fiecare dată când apăs next trec la următoarea melodie de pe cardul microSD. Dacă am epuizat toate melodiile, o iau de la început. De asemenea, deschid și fișierul cu lyrics, folosind același basename, schimbând doar extensia și afișez pe LCD titlul melodiei curente | ||
- | Ca sa pot folosi biblioteca TMRpcm a trebuit sa modific in fișierul de configurare **pcmConfig.h** sa decomentez urmatoarele: | + | Ca să pot folosi biblioteca TMRpcm a trebuit sa modific in fișierul de configurare **pcmConfig.h** sa decomentez urmatoarele: |
* **#define SD_FULLSPEED** - ca sa citesc cât mai repede | * **#define SD_FULLSPEED** - ca sa citesc cât mai repede | ||
- | * **#define SDFAT** - ca sa pot folosi împreună cu biblioteca sdFat | + | * **#define SDFAT** - ca sa pot folosi împreună cu biblioteca SdFat |
* **#define buffSize 128** - am crescut buffer-ul | * **#define buffSize 128** - am crescut buffer-ul | ||
+ | |||
+ | === Setup date microSD === | ||
+ | |||
+ | Pentru a stoca fișierele audio am ales formatul WAV și am comprimat fișierele cu următoarele setări pe site-ul [[https://audio.online-convert.com/convert-to-wav]]: | ||
+ | * Rezoluție biți: 8 Bit | ||
+ | * Rata de eșantionare: 16000 Hz | ||
+ | * Canale audio: mono | ||
+ | * Format PCM: PCM U8 | ||
+ | |||
+ | Pentru a stoca lyrics am folosit fișiere LRC; acestea stochează versurile în acest format: | ||
+ | |||
+ | [00:33.95]We are the champions, my friends | ||
+ | [00:41.45]And we'll keep on fighting till the end | ||
+ | unde 00:33.95 e timpul când ar trebui să apară, 0 minute, 33 de secunde și 95 de milisecunde, respectiv We are the champions, my friends e versul. Parsarea versului se face în **readLyricsLine**. | ||
===== Rezultate Obţinute ===== | ===== Rezultate Obţinute ===== | ||
- | TODO: Add video | + | <html> |
+ | <iframe | ||
+ | src="https://www.youtube.com/embed/0mCvmLSkuk0" | ||
+ | title="YouTube video 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> | ||
===== Concluzii ===== | ===== Concluzii ===== | ||
Proiectul în mare a ieșit cum mi-am dorit, sunt sigur că mai pot fi aduse îmbunătățiri. Lucrând la el mi-am însușit mai bine lucrurile învățate la lab. | Proiectul în mare a ieșit cum mi-am dorit, sunt sigur că mai pot fi aduse îmbunătățiri. Lucrând la el mi-am însușit mai bine lucrurile învățate la lab. | ||
- | Singura problemă pe care am întâmpinat-o a fost atunci când am încercat să fac întreruperi pe **Timer0** fiindcă mergea în jur de un minut, după se bloca orice interacțiune cu placa(nu mai mergea niciun buton, nu se mai afisa nimic pe serială sau pe LCD, millis() făcea overflow etc.), așa că am folosit **Timer2**. | + | Singura problemă pe care am întâmpinat-o a fost atunci când am încercat să fac întreruperi pe **Timer0** fiindcă mergea în jur de un minut, după se bloca orice interacțiune cu placa(nu mai mergea niciun buton, nu se mai afișa nimic pe serială sau pe LCD, millis() făcea overflow etc.), așa că am folosit **Timer2**. |
===== Download ===== | ===== Download ===== | ||
+ | |||
+ | {{:pm:prj2023:apredescu:proiect_pm_karaoke_machine_andrei_otetea.zip|}} | ||
===== Jurnal ===== | ===== Jurnal ===== | ||
Line 69: | Line 99: | ||
* 21.05 - Adăugare schemă electrica | * 21.05 - Adăugare schemă electrica | ||
* 28.05 - Adăugare descriere software | * 28.05 - Adăugare descriere software | ||
+ | * 29.05 - Retușare pagină wiki | ||
===== Bibliografie/Resurse ===== | ===== Bibliografie/Resurse ===== |