This is an old revision of the document!
Proiectul presupune crearea unui MP3 Player portabil care îi permite utilizatorului să încarce muzică pe un card SD, iar titlul melodiei va fi afișat pe un ecran LCD. Utilizatorul poate schimba piesele prin 4 butoane (next/back, pause/play), iar volumul poate fi controlat cu un potențiometru.
Music playerul construit cu Arduino UNO permite redarea fisierelor audio de pe un card microSD folosind DFPlayer mini. Intreg sistemul este alimentat la o baterie 9v, iar interactiunea utilizatorului cu dispozitivul se face prin 4 butoane(next, prev, pause, play) conectate la pinii digitali ai placii, un potentiometru de 10k pentru reglarea volumului citit prin ADC si un LCD display cu interafata I2C, pe care se afiseaza titlul piesei. La pornirea sistemului, Arduino configureaza I2C si UART, stabileste conexiunile cu LCD, modulul DFPlayer si citeste valoarea analogica de la potentiometru care este convertita intr-o unitate de volum. Simultan, Arduino selecteaza o melodie de pe cardul microSD si afiseaza titlul pe display.
Lista piese:
Proiectul fost realizat in Arduino IDE.
Acest program este destinat unui sistem audio controlat de Arduino UNO, care permite redarea de fișiere audio, afișarea informațiilor pe un ecran LCD și controlul interacțiunii printr-un potențiometru și câteva butoane fizice.
Redarea melodiilor se face cu ajutorul modulului DFPlayer Mini, un player MP3 autonom ce poate reda fișiere direct de pe un card microSD. Modulul este controlat printr-o conexiune serială realizată software, folosind pinii digitali 10 și 11. Programul inițializează acest modul, îl configurează și începe automat redarea unei melodii. De asemenea, detectează când o melodie s-a terminat și trece automat la următoarea.
SoftwareSerial mySoftwareSerial(10, 11); // tx = 10, rx = 11 DFRobotDFPlayerMini myDFPlayer;
Inițializarea în setup()
mySoftwareSerial.begin(9600); if (!myDFPlayer.begin(mySoftwareSerial)) { lcd_setCursor(0, 1); lcd_print("DFPlayer ERR"); while (true); } myDFPlayer.setTimeOut(500); myDFPlayer.volume(20); myDFPlayer.EQ(DFPLAYER_EQ_NORMAL); currentTrack = 1; myDFPlayer.play(currentTrack); displaySong(currentTrack);
Detectarea sfârșitului unei melodii în loop()
if (myDFPlayer.available()) { uint8_t type = myDFPlayer.readType(); uint16_t value = myDFPlayer.read(); if (type == DFPlayerPlayFinished) { currentTrack++; if (currentTrack > 5) currentTrack = 1; myDFPlayer.play(currentTrack); displaySong(currentTrack); } }
Volumul este controlat printr-un potențiometru conectat la o intrare analogică (ADC0). Codul configurează manual convertorul analog-digital al microcontrollerului pentru a citi valoarea de tensiune de la potențiometru, care este apoi transformată într-un procent între 0 și 100. Această valoare este folosită atât pentru a ajusta volumul în modulul DFPlayer, cât și pentru a fi afișată pe ecranul LCD.
Configurarea ADC-ului
void adc_init() { ADMUX = (1 << REFS0); // Referință AVcc, canal ADC0 ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Activare + prescaler 128 }
Citirea valorii analogice
uint16_t adc_read() { ADMUX = (ADMUX & 0xF0) | 0; // Selectează ADC0 ADCSRA |= (1 << ADSC); // Start conversie while (ADCSRA & (1 << ADSC)); return ADC; }
Utilizarea valorii pentru volum
uint16_t potValue = adc_read(); int volumePercent = map(potValue, 0, 1023, 0, 100); if (volumePercent != lastVolume) { lastVolume = volumePercent; lcd_setCursor(0, 1); lcd_print("Volum: "); lcd_setCursor(7, 1); char buf[5]; itoa(volumePercent, buf, 10); lcd_print(buf); lcd_print("%"); int dfVol = map(volumePercent, 0, 100, 0, 30); myDFPlayer.volume(dfVol); }
Pentru afișaj se folosește un LCD 16×2 conectat prin I2C. Comunicarea I2C este realizată direct, la nivel de registru, prin perifericul TWI al microcontrollerului. Sunt implementate funcții proprii pentru inițializare, trimiterea comenzilor și datelor către LCD, precum și funcții pentru poziționarea cursorului și scrierea textului.
Inițializare și comunicație I2C
void TWI_init(); void TWI_start(); void TWI_stop(); void TWI_write(uint8_t data);
Funcții pentru trimiterea comenzilor către LCD
void lcd_pulse_enable(uint8_t data); void lcd_send_nibble(uint8_t nibble, uint8_t mode); void lcd_send_byte(uint8_t value, uint8_t mode); void lcd_command(uint8_t cmd); void lcd_data(uint8_t data); void lcd_init();
Funcții pentru scriere text și control cursor
void lcd_setCursor(uint8_t col, uint8_t row); void lcd_clear(); void lcd_print(const char* str);
Pe ecranul LCD sunt afișate informații despre melodia curentă (nume prestabilite pentru fiecare piesă de la 1 la 5) și nivelul actual al volumului în procente. La fiecare schimbare de volum sau melodie, ecranul este actualizat corespunzător.
Afișarea informațiilor despre melodie și volum
void displaySong(int song) { lcd_clear(); lcd_setCursor(0, 0); switch (song) { case 1: lcd_print("The Smiths Bigmouth Strikes Again"); break; case 2: lcd_print("Enjambre Impacto"); break; case 3: lcd_print("Surf Curse Disco"); break; case 4: lcd_print("Steve Lacy Some"); break; case 5: lcd_print("Abandoned Pools Armed To The Teeth"); break; } lcd_setCursor(0, 1); lcd_print("Volum: "); char buf[5]; itoa(lastVolume >= 0 ? lastVolume : 0, buf, 10); lcd_print(buf); lcd_print("%"); }
Interacțiunea utilizatorului este facilitată de patru butoane conectate la pinii digitali 4 până la 7. Acestea sunt configurate ca intrări cu rezistențe de pull-up interne. Butoanele permit pornirea redării, oprirea ei, trecerea la melodia următoare sau revenirea la cea anterioară.
Configurarea butoanelor ca intrări cu pull-up
DDRD &= ~((1 << DDD4) | (1 << DDD5) | (1 << DDD6) | (1 << DDD7)); PORTD |= (1 << PORTD4) | (1 << PORTD5) | (1 << PORTD6) | (1 << PORTD7);
Citirea butoanelor și acțiunile corespunzătoare
if ((PIND & (1 << PIND4)) == 0) { // Buton PLAY myDFPlayer.play(currentTrack); displaySong(currentTrack); delay(300); }
Cod sursă: https://github.com/ciobanualexandra330/Proiect-PM/tree/main
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.