Saludos! Recien ayude a un colega con un proyecto, en el cual incorporaba el modulo de MP3 de DFROBOT, asi que antes de realizar dicho proyecto he experimentado un poco con este modulo y mi ESP32 en realidad probe mas con el harware que esto implicaba ya que con respecto al firmware el fabricarte proporciona la libreria con un par de ejemplos completamente utiles para el enteorno de arduino.
Circuito:
Para el circuito estuve probando varias formas de hacer la conexion, es importante mencionar que el modulo se alimenta de 3.3 a 5V (aunque yo tuve mejores resultados alimentando a 5V).
- Si utilizas 3.3V en su alimentacion basta con conectar TX y RX del ESP32 a RX y TX del MP3 ya que estarian trabajando al mismo voltaje.
- Como yo he dedicido utilizar 5V para su alimentacion, tenemos que ver la forma de aislar o acoplar los voltajes ya que en las lineas de TX y RX exitirian 3.3V por parte del ESP32 y 5V por parte del MP3.
- Una primer forma es solo usar un divisor de voltaje en el pin TX del MP3 para asi asegurar de que no le llegue los 5V al pin RX del ESP32 (esto implica a que se tenga que calcular los valores de dicho divisor), para la conexion entre el pin RX del MP3 y TX del ESP32 no es necesario agregar nada ya que al modulo MP3 le estarian llegando 3.3V y es suficiente para trabajar, aunque con esta configuracion note un poco de ruido y en ocasiones el modulo no trabajaba adecuadamente, para el ruido encontre que algunos colocaban una resistencia de 1K entre el pin RX del MP3 y TX del ESP32, aunque yo no he notado mucho cambio.
- La segunda forma y creo que es la mas confiable es usar un adaptador de voltaje mejor conocido como "Level Shifter" con esto podemos tener dos niveles de tension y dar solucion a nuestro problema. En el mercado hay varias formas de hacer esto, se podria hacer con MOSFETs o transistores BJT, pero tambien hay integrados dedicos para esta tarea.
Bueno una vez sabiendo esto, he decidido utilizar integrado TXS0108 de Texas Instruments el cual es un adaptador de voltaje bidireccional (esto lo decidi asi ya que en el proyecto tambien necesito aistalr unas linea de comunicacion I2C, asi que me conviene para mi proyecto pero eso es otra historia), por cierto para este demo he utilizado los 5V presentes en el pin VIN del ESP32 (claro cuando esta alimentado con el USB, caso contrario en ese pin tendrian que alimentar con 5V), por lo tanto el circuito de conexion sera el siguiente:
Código:
Con respecto al codigo he usado el ejemplo basico que incorpora la libreria.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* ESP32: Uso del modulo DFPlayer Mini MP3 Player | |
* | |
******************************************************************************* | |
* FileName: ESP32-DevKitv1_DFPlayer_GetStarted.ino | |
* Processor: ESP32 | |
* Complier: Arduino IDE v2.3.3 | |
* Author: Pedro Sánchez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: Pequeño ejemplo para testear el modulo DFPlayer Mini MP3 Player | |
* con la UART2 que incorpora el ESP32-WROOM. | |
******************************************************************************* | |
* Rev. Date Comment | |
* v1.0.0 18/11/2024 - Modificacion y prueba de funcionamiento con ESP32 | |
******************************************************************************/ | |
#include "Arduino.h" | |
#include "DFRobotDFPlayerMini.h" | |
//Define UART2 | |
#define RXD2 16 | |
#define TXD2 17 | |
const int LEVELShifter_Enable = 4; | |
DFRobotDFPlayerMini myDFPlayer; | |
void printDetail(uint8_t type, int value); | |
void setup(){ | |
pinMode(LEVELShifter_Enable, OUTPUT); | |
digitalWrite(LEVELShifter_Enable, HIGH); //Enable lever shifter | |
Serial2.begin(9600, SERIAL_8N1, RXD2, TXD2); //UART2 Iitialize | |
Serial.begin(115200); | |
Serial.println(); | |
Serial.println(F("DFRobot DFPlayer Mini Demo")); | |
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); | |
if (!myDFPlayer.begin(Serial2)) { //Use serial to communicate with mp3. | |
Serial.println(F("Unable to begin:")); | |
Serial.println(F("1.Please recheck the connection!")); | |
Serial.println(F("2.Please insert the SD card!")); | |
while(true){ | |
delay(0); // Code to compatible with ESP8266 watch dog. | |
} | |
} | |
Serial.println(F("DFPlayer Mini online.")); | |
//myDFPlayer.reset(); //Reset the module | |
myDFPlayer.volume(15); //Set volume value. From 0 to 30 | |
myDFPlayer.play(1); //Play the first mp3 | |
} | |
void loop() | |
{ | |
static unsigned long timer = millis(); | |
if (millis() - timer > 10000) { | |
timer = millis(); | |
myDFPlayer.next(); | |
} | |
if (myDFPlayer.available()) { | |
printDetail(myDFPlayer.readType(), myDFPlayer.read()); | |
} | |
} | |
void printDetail(uint8_t type, int value){ | |
switch (type) { | |
case TimeOut: | |
Serial.println(F("Time Out!")); | |
break; | |
case WrongStack: | |
Serial.println(F("Stack Wrong!")); | |
break; | |
case DFPlayerCardInserted: | |
Serial.println(F("Card Inserted!")); | |
break; | |
case DFPlayerCardRemoved: | |
Serial.println(F("Card Removed!")); | |
break; | |
case DFPlayerCardOnline: | |
Serial.println(F("Card Online!")); | |
break; | |
case DFPlayerUSBInserted: | |
Serial.println("USB Inserted!"); | |
break; | |
case DFPlayerUSBRemoved: | |
Serial.println("USB Removed!"); | |
break; | |
case DFPlayerPlayFinished: | |
Serial.print(F("Number:")); | |
Serial.print(value); | |
Serial.println(F(" Play Finished!")); | |
break; | |
case DFPlayerError: | |
Serial.print(F("DFPlayerError:")); | |
switch (value) { | |
case Busy: | |
Serial.println(F("Card not found")); | |
break; | |
case Sleeping: | |
Serial.println(F("Sleeping")); | |
break; | |
case SerialWrongStack: | |
Serial.println(F("Get Wrong Stack")); | |
break; | |
case CheckSumNotMatch: | |
Serial.println(F("Check Sum Not Match")); | |
break; | |
case FileIndexOut: | |
Serial.println(F("File Index Out of Bound")); | |
break; | |
case FileMismatch: | |
Serial.println(F("Cannot Find File")); | |
break; | |
case Advertise: | |
Serial.println(F("In Advertise")); | |
break; | |
default: | |
break; | |
} | |
break; | |
default: | |
break; | |
} | |
} |
Vídeo:
Aquí un pequeño vídeo del circuito en funcionamiento:
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Links:
- DFRobot Wiki, "DRF0299 DFPlayer mini", https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299
0 Comentarios