This is an old revision of the document!


Karaoke machine

Nume: Oțetea Andrei
Grupa: 331CA

Introducere

Proiectul constă în realizarea unui sistem de karaoke în care utilizatorii primesc puncte. Utilizatorul va putea încărca pe un card microSD melodiile și versurile, urmând ca să vadă versurile pe un ecran LCD, respectiv să audă melodiile într-o boxă legată la un amplificator. De asemenea, utilizatorul va putea primi puncte, dacă cântă cât mai tare în timp ce apar versurile. Utilizatorul va putea trece prin lista de melodii și să selecteze melodia pe care și-o dorește. Acest sistem poate fi atât practic, prin dimensiunile sale reduse, cât și distractiv, putând concura cu alte persoane pentru a obține un scor mai mare. Proiectul este inspirat din jocurile de felul Just Sing sau asemănătoare.

Descriere generală

Schema bloc

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.

Melodia se va auzi pe o boxă, sunetul fiind amplificat.

Hardware Design

Listă piese:

  • 1 x Arduino Uno
  • 1 x Ecran LCD 1602 IIC/I2C
  • 1 x Breadboard 830 puncte MB102
  • 1 x Amplificator audio LM386
  • 1 x Boxă 1W
  • 1 x Modul microfon
  • 1 x Modul microSD
  • 3 x butoane

Schema electrică:

Software Design

Mediul de dezvoltare folosit în realizarea proiectului: Arduino IDE.

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 Timer2 la 10ms.
  • 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 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.
  • 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ă; 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.
  • void performAction(int buttonIndex) - în funcție de butonul apăsat, execută acțiunea asociată lui

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 SDFAT - ca sa pot folosi împreună cu biblioteca sdFat
  • #define buffSize 128 - am crescut buffer-ul

Pentru a stoca fișierele 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:

  • Bit resolution: 8 Bit
  • Sampling rate: 16000 Hz
  • Audio channels: mono
  • PCM format: PCM unsigned 8-bit

Fișierele LRC 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

TODO: Add video

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.

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.

Download

Jurnal

  • 07.05 - Crearea paginii de proiect și scrierea documentației
  • 21.05 - Adăugare schemă electrica
  • 28.05 - Adăugare descriere software

Bibliografie/Resurse

pm/prj2023/apredescu/karaoke-machine.1685385434.txt.gz · Last modified: 2023/05/29 21:37 by andrei.otetea
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