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 ESP32DFRobotDFPlayerMini myDFPlayer; //Periférico para reproducción de audio; nos comunicamos con él por medio de la UARTconst 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//}