This is an old revision of the document!


Player mp3

Introducere

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.

Descriere generală

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.

Hardware Design

Lista piese:

  • Arduino UNO
  • LCD Display I2C
  • Potentiometru 10k
  • Breadboard
  • MicroSD Card 2GB
  • DFPlayer mini
  • Speaker
  • Rezistenta 1k
  • 4 butoane fara hold

Software Design

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);
}

Rezultate Obţinute

Care au fost rezultatele obţinute în urma realizării proiectului vostru.

Concluzii

Download

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ă ;-).

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.

Jurnal

  • 28/04/2025 - alegerea proiectului
  • 05/06/2025 - achizitionarea pieselor
  • 14/06/2025 - realizarea hardware-ului
  • 24/06/2025 - implementarea software-ului

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2025/ccristi/alexandra.ciobanu.1748282175.txt.gz · Last modified: 2025/05/26 20:56 by alexandra.ciobanu
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