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//
}