Esto es algo que últimamente ha traído de cabeza a un alumno (y a mí de camino) para hacer funcionar algo que realmente no es nada complicado y que hemos hecho funcionar mil veces con Arduino UNO, Mega y D1 mini. Total, cosas a recordar:

  • TX del micro, pin 7 en nuestro caso, que se corresponde con el RX del periférico (DFPlayerMini)
  • RX del micro, pin 3 en nuestro caso, que se corresponde con el TX del periférico (DFPlayerMini)
  • Uso de HardwareSerial en lugar de SoftwareSerial, que es la forma de comunicar con UART del ESP32 (SoftwareSerial se usa con los Arduino).
  • UART2, que es la configurable en cualquier pin (esto es un puntazo del ESP32, tienes 3 UART, dos están fijas en dos parejas de pines y te queda una tercera para que la pongas donde quieras).
  • Alimentación del DFPlayer a 5V, se pueden sacar del cable directamente y luego alimentar al micro por 5Vin y GND. Esto es clave, el DFPlayer necesita 5V sí o sí y el ESP32 NO los provee. Por tanto hay que sacarlos directamente de fuente externa cortocircuitando tierras o del cable USB y luego alimentar al ESP32 por su entrada 5Vin.
  • El audio a reproducir en el DFPlayer se indica con un número. En nuestro caso sólo había una pista, pero va por orden alfabético; es decir, el DPPlayer mira su tarjeta SD, ordena las pistas por orden alfabético (lo sencillo es poner 0000.mp3, 0001.mp3…) y según el número que le hayas puesto, esa reproduce. Es trivial hacer una función de mapeo para que se vaya a la pista que quieres con el uso de un switch case.

Pongo por aquí el montaje de prueba:

Y pongo por aquí el código que finalmente funciona:

//PLACA ESP32-S3-USB-OTG según Arduino IDE. ESP32-S3 devKit V1
#include "HardwareSerial.h"
#include "DFRobotDFPlayerMini.h"
const int MySerialRX=3;       //Pin GPIO fijado para ser RX del micro (TX del periférico, que es el DFPlayer)
const int MySerialTX=7;       //Pin GPIO fijado para ser TX del micro (RX del periférico, que es el DFPlayer)
HardwareSerial mySerial(2);   // UART 2, configurable por usuario en cualquier pareja de pines del ESP32
DFRobotDFPlayerMini myDFPlayer; //Periférico para reproducción de audio; nos comunicamos con él por medio de la UART
const int RETARDO = 3000;   //Sólo para prueba de sonido
/* Función para arrancar el periférico de reproducción de sonido - DFPlayerMini */
void setupDFPlayer()  // Función para el arranque del reproductor de audio
{
  mySerial.begin(9600, SERIAL_8N1, MySerialRX, MySerialTX); // Arranque de UART 2 para comunicación con DFPlayer
  Serial.println("SETUP");
  Serial.println(F("Arrancando DFPlayer ... (Puede tomar 3~5 segundos)"));
  if (!myDFPlayer.begin(mySerial)) {  //Usamos HardwareSerial para comunicar con UART del ESP32
    Serial.println(F("Incapaz de arrancar:"));
    Serial.println(F("1.Revisar conexiones"));
    Serial.println(F("2.Insertar SD card"));
    Serial.println(F("3.Asegurar que llegan 5V a la alimentación del DF Player y la tierra es común con la del micro"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  //---- Time out ----
  myDFPlayer.setTimeOut(500);  //Establecemos time out de la comunicación serie a 500ms
  //---- Volumen ----
  myDFPlayer.volume(25);  //Fijamos valor de volumen (0~30).
  //---- Ecualización ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  //---- Se fija el dispositivo de almacenamiento por defecto
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}
void setup() {
  Serial.begin(115200); //Velocidad del puerto serie estándar (monitor serie)
  setupDFPlayer();      //Arranque del DFPlayer
}
void loop() {
  //PRUEBA DE SONIDO//
  myDFPlayer.play(1);  //Hacemos sonar la primera canción (orden alfabético)
  Serial.println(F("SONANDO..."));
  delay(RETARDO);
  //PRUEBA DE SONIDO//
}