Dudas acerca proyecto con DFPlayer

Hola a todos.

Es mi primer mensaje en el foro, también mi primer proyecto con Arduino. Espero haber entendido bien las normas del foro y no saltarme ninguna.

Para contextualizar, comentaros que soy Ingeniero Informático y que tengo mucha experiencia programando pero no demasiada con proyectos electrónicos. Se trata de un proyecto profesional y que, a grandes rasgos, implementa un reproductor de mp3 "doble", es decir: el desarrollo cuenta con dos DFPlayer mini, cada uno con un audio diferente pero de la misma duración. La reproducción de ambos audios está sincronizada: se inician ambos a la vez; al pausar, se pausan ambos a la vez, etc.

Os paso un esquema, espero que sea lo más fiel posible a la realidad, también es mi primera vez con fritzing.

Se trata de dos DFPlayer Mini HW-247A y utilizo la librería GitHub - enjoyneering/DFPlayer: Small and fast Arduino library for DFPlayer Mini MP3 Player para controlarlos.

Os dejo el código que estoy utilizando:

#include <SoftwareSerial.h>
#include <DFPlayer.h>


#define MP3_SERIAL_SPEED    9600  //DFPlayer Mini suport only 9600-baud
#define MP3_SERIAL_TIMEOUT  350   //average DFPlayer response timeout 200msec..300msec for YX5200/AAxxxx chip & 350msec..500msec for GD3200B/MH2024K chip

#define PULSADOR_PLAY       6
#define LED_PIN_VERDE       7
#define PULSADOR_STOP       8
#define LED_PIN_ROJO        9

SoftwareSerial mp3Serial(2, 3, false); //false=signal not inverted
DFPlayer       mp3;

SoftwareSerial mp3Serial_2(4, 5, false); //false=signal not inverted
DFPlayer       mp3_2;

bool playPulsado = false;
bool play = false;
bool pause = false;

int valorPulsadorPlay = 0;
int valorPulsadorStop = 0;
int contador = 0; 

void setup()
{
  Serial.begin(115200);  

  // INICIALIZO DFPLAYER MINI 1
  
  mp3Serial.begin(MP3_SERIAL_SPEED);

  mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_MINI, false); //"DFPLAYER_HW_247A" see NOTE, false=no feedback from module after the command

  mp3.stop();                             //if player was runing during ESP8266 reboot
  mp3.reset();                            //reset all setting to default
  
  mp3.setSource(2);                       //1=USB-Disk, 2=TF-Card, 3=Aux, 4=Sleep, 5=NOR Flash
  
  mp3.setEQ(0);                           //0=Off, 1=Pop, 2=Rock, 3=Jazz, 4=Classic, 5=Bass
  mp3.setVolume(25);                      //0..30, module persists volume on power failure

  mp3.sleep();                            //inter sleep mode, 24mA

  mp3Serial.listen();                     //enable interrupts on RX-pin for better response detection

  mp3Serial.stopListening();              //disable interrupts on RX-pin
  
  // INICIALIZO DFPLAYER MINI 2
  
  mp3Serial_2.begin(MP3_SERIAL_SPEED);

  mp3_2.begin(mp3Serial_2, MP3_SERIAL_TIMEOUT, DFPLAYER_MINI, false); //"DFPLAYER_HW_247A" see NOTE, false=no feedback from module after the command

  mp3_2.stop();                             //if player was runing during ESP8266 reboot
  mp3_2.reset();                            //reset all setting to default
  
  mp3_2.setSource(2);                       //1=USB-Disk, 2=TF-Card, 3=Aux, 4=Sleep, 5=NOR Flash
  
  mp3_2.setEQ(0);                           //0=Off, 1=Pop, 2=Rock, 3=Jazz, 4=Classic, 5=Bass
  mp3_2.setVolume(25);                      //0..30, module persists volume on power failure

  mp3_2.sleep();                            //inter sleep mode, 24mA

  mp3Serial_2.listen();                     //enable interrupts on RX-pin for better response detection

  mp3Serial_2.stopListening();              //disable interrupts on RX-pin

  // INICIANDO LEDS Y PULSADORES

  pinMode(PULSADOR_PLAY, INPUT_PULLUP);
  pinMode(PULSADOR_STOP, INPUT_PULLUP);

  pinMode(LED_PIN_VERDE, OUTPUT);
  digitalWrite(LED_PIN_VERDE, LOW);

  pinMode(LED_PIN_ROJO, OUTPUT);
  digitalWrite(LED_PIN_ROJO, HIGH);
  
}

void loop()
{
  valorPulsadorPlay = digitalRead(PULSADOR_PLAY);

  valorPulsadorStop = digitalRead(PULSADOR_STOP);

  if (pause){
    if (contador == 20000) {
      int valorLedPinVerde = digitalRead(LED_PIN_VERDE);
      digitalWrite(LED_PIN_VERDE, !valorLedPinVerde);
      contador = 0;
    }
    contador++;
  }

  if (valorPulsadorPlay == LOW)
  {
    if (!playPulsado)
    {
      if (!play)
      {
        play = true;
        digitalWrite(LED_PIN_VERDE, HIGH);
        digitalWrite(LED_PIN_ROJO, LOW);
        mp3.playTrack(1);
        mp3_2.playTrack(1);
      }
      else
      {
        if (!pause)
        {
          pause = true;
          mp3.pause();
          mp3_2.pause();
        }
        else
        {
          pause = false;
          digitalWrite(LED_PIN_VERDE, HIGH);
          mp3.resume();
          mp3_2.resume();
        }
      }
    }
    playPulsado = true;
  }
  else
  {
    playPulsado = false;
  }

  if (valorPulsadorStop == LOW)
  {
    if (play)
    {
      play = false;
      pause = false;
      digitalWrite(LED_PIN_VERDE, LOW);
      digitalWrite(LED_PIN_ROJO, HIGH);
      mp3.stop();
      mp3_2.stop();
    }
  }

  //delay(1000);
}

Y aquí las dudas:

  • La función setVolume() no funciona, no estoy seguro que falla pero el volumen no cambia aunque modifique el valor que le paso.
  • No estoy seguro de haber conectado bien los altavoces. Si en lugar de utilizar las salidas DAC_R y DAC_L utilizo las salidas SPK1 y SPK2, el volumen se incrementa considerablemente (aunque sigue sin funcionar setVolume). Creo que el problema es que no acabo de entender la diferencia entre estas salidas: DAC_R y DAC_L paracen utilizarse para estéreo y SPK1 y SPK2 para mono, pero no entiendo porque son necesarias las cuatro salidas.
  • Necesito hacer 8 montajes del prototipo una vez lo termine. No se cual es la mejor opción: por una parte, utilizar una PCB y soldar yo los componentes y las pistas; por otra, utilizar el propio servicio que parece ofrecer fritzing y por el cual te crean el circuito a partir de tu diseño.

Cualquier otra sugerencia o comentario será bienvenido, ando un poco verde en este mundillo.

¡Gracias

Supuse el DFPlayer Mini, no la placa que tienes. Ignora mi publicación. Lo siento.

Usando esta página como referencia:

DAC debe estar habilitado y deshabilitado (busque "Sample Code/ Full Function") La ganancia del DAC puede ser de 0 a 15 (busque "Sample Code/ Full Function") (muchas más funciones en el código de ejemplo) Para SPKR+/SPKR-, pruebe la conexión a tierra de "pulsación larga" de IO_2 y IO_1 para aumentar y disminuir el volumen ("pulsación corta" cambia los archivos)

Gracias xfpd por tu respuesta.

En primer lugar comentarte que las librerías de DFRobot no funcionan con los DFPlayer Mini HW-247A, por eso utilizo unas distintas.

Por otro lado, no acabo de entender tu mensaje, si puedes explayarte un poco más en la explicación te lo agradecería (soy muy novato en algunos temas).

Gracias!

Supuse el DFPlayer Mini, no la placa que tienes. Ignora mi publicación. Lo siento.

Las compré en Amazon, y aunque en la imagen aparece el MP3-TF-16P (que sí funciona con las librerías de DFRobot), me vino el HW-247A.

Fijate si te sirve para identificar el problema de volumen (y algún otro que pueda haber)

Agregué al setup el siguiente código para monitorizar lo que está pasando sin tener que cambiar de librería ni crear otro sketch.

Serial.println(mp3.getStatus());
Serial.println(mp3.getVolume());
Serial.println(mp3.getCommandStatus());

El caso es que con el código tal y como está en el primero de los comentarios, la salida es 4 0 126 (el primer 4 indica un error de comunicación).

Si en mp3.begin() le indico que el modelo es DFPLAYER_HW_247A, mp3.getStatus() me muestra un 0 (indicando que el módulo está activo, pero parado), en cambio no se enciende el led del DFPlayer y por supuesto, no reproduce nada.

¿Alguna sugerencia? ¿Debería cambiar los DFPlayer que tengo por un modelo diferente?

¡Gracias!

Hi,
Una cosa que tienes que tener en cuenta es que solamente acepta memorias hasta 32gb y que este formateada fat32. De lo contrario no te trabaja.

Hola @tauro0221, gracias por tu respuesta.

El montaje funciona bien a excepción del volumen, que se mantiene invariable ignorando el valor que le paso a la función setVolume().

De todas formas, las tarjetas que utilizo son de 512Mb y formateadas correctamente.

Hi,
Segun las especificaciones dice que la memoria debe de ser de menos o igual a 32GB. Yo uso el de DFROBOT y trabajo imediatamente sin problemas. Adjunto link donde te dice que la memoria debe de ser de 32G.

[Buy HW 247 DF Mini Player Mini MP3 Player Module For Arduino By Arrowtechcart.com | Audio module – ArrowTechCart]

@tauro0221 el PO dice que

Y 512Mb son menos que 32Gb. :wink:

Hi,
Pido disculpa no me di cuenta que era de 512mb

Hi,
Como ya te dije yo uso el de DFROBOT mp3 player . Mi consejo es de que trates de conseguir el MP3 player de DFROBOT ya que hay muchos usando ese. Si haces un google veras que casi nadie usa ese y hay muy poca informacion de ese que tu usas. Sugerencia trata de usar la libreria de DFROBOT #include "DFRobotDFPlayerMini.h" ya que ese se parece mucho al de DFROBOT. Solamente una sugerencia.

Hola, no estoy habituado a esa libreria pero mirando en sus ejemplos estas dos lineas

mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_MINI, false);
mp3_2.begin(mp3Serial_2, MP3_SERIAL_TIMEOUT, DFPLAYER_MINI, false);

¿No tendrían que ser?:

mp3.begin(mp3Serial, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false);
mp3_2.begin(mp3Serial_2, MP3_SERIAL_TIMEOUT, DFPLAYER_HW_247A, false);

En cuanto a las salidas de audio, el dfplayer internamente lleva un amplificador mono de 3W cuyas salida son SPK1 y SPK2. Ese amplificador es de baja calidad, por eso incluye las salidas L y R para atacar cualquier amplificador HIFI o unos auriculares con amplificación.
La forma en que conectas los altavoces no es correcta e incluso creo que podrías dañar el dfplayer, y por supuesto no conseguirias un stereo. Te aconsejo el siguiente montaje, (a falta de los pulsadores y leds).


Las resistencias: Prácticamente usadas en cualquier montaje que se encuentra por la red y que algunos indican que es para evitar ruidos, como por ejemplo los autores de la libreria que usas:

No es para eso, Los pines TX y RX del dfplayer van a 3,3V, por el lado del arduino no hay problema lee en su RX correctamente los 3,3V de dfplayer como HIGH. Pero los 5V del pin TX del arduino podrian dañar el pin RX del dfplayer que como dije van a 3V3.
¿Una sola resistencia?, bueno baja la tensión, pero no es lo mas apropiado yo prefiero usar un divisor de tensión como te propongo en el montaje, o incluso usar un adaptador de nivel lógico.
El diodo: Aunque el dfplayer puede funcionar a 5V su valor nominal es de 4V2, con el diodo hacemos caer la tensión unos 0,6V alimentando al dfplayer a unos 4,4V mas cercano a su tensión nominal de trabajo.

Hola @gonpezzi , gracias por tomarte el tiempo en responder tan detalladamente.

Tienes razón en que debería utilizar la opción DFPLAYER_HW_247A en lugar de la opción DFPLAYER_MINI, pero con la primera no consigo reproducir nada, y con la segunda consigo que todo funcione bien a excepción del volumen.

En cuanto a la propuesta que me haces, la entiendo y me parece muy interesante. Solo por comentar algunas cosas:

  • En el montaje final, en lugar de altavoces voy a conectar unos auriculares a uno de los DFPlayer, y 6 auriculares al otro.
  • Entiendo que tengo estas 3 opciones:
    • Utilizar unos auriculares autoamplificados conectados a las salidas L y R.
    • Utilizar un amplificador (tipo PAM8403) conectado a las salidas L y R y conectar a este los auriculares.
    • Conectar los auriculares a la salidas SPK1 y SPK2 y utilizar el amplificador interno del DFPlayer, asumiendo que la reproducción no será en stereo.

Quizá por sencillez pruebe con la tercera de las opciones, los audios que voy a reproducir no están grabados en stereo. Si decido hacerlo así:

  • ¿Basta con conectar el canal izquierdo del auricular a SPK1, el derecho a SPK2 y la tierra?
  • ¿Funcionaría bien en el DFPlayer al que conectaré 6 auriculares?

¿Cómo lo veis?

¡¡Muchas muchas gracias!!

Hola de nuevo.

Conseguí solucionar el problema del volumen al cambiar el DFPlayer por uno diferente, en concreto por el modelo MP3-TF-16P. No estoy seguro de si el problema es de la librería que utilizo o del modelo HW-247A, el caso es que esta duda quedó resuelta.

¡Gracias a todos! A ver si me podéis ayudar con el resto de dudas.

Hi,
Consejo para la proxima vez que vayas a usar un modulo primero haz un google para ver cuantas tutorias tiene el modulo. Si buscas ese module encontraras zero tutoria. Mientras mas tutorias que encuentres sabras si lo usas o no.

Me alegro que lo solucionaras con el MP3-TF-16P, ( ese le tengo), te sugiero que cambies a la libreria "DERobotDFPlayerMini." es la mas documentada y lleva una función de comunicación con el modulo bastante interesante. La tienes en el gestor de bibliotecas del IDE.

No da 3W que dividido entre lo 30 pasos del dfplajer nos daría un mínimo de 900mW, (volumen 1 del dfplayer). Acabo de mirar los datos de unos auriculares normales de los que tengo y solo soporta 10mW, los quemaría.

La conexion seria un spk a tierra y el otro alas sesñales r y l. Pero tendriamos el mismo problema de potencia que con el PAM8403. inviable tambien.

Seria lo lógico pero, ¿y el coste de los 7?, podrías usar usar unos TDA1308 con pinganillos normales.
¿como lo ves?.

Gracias @gonpezzi.

No entiendo tus cálculos, 3W entre los 30 pasos del DFPlayer, nos darían 100mW por paso, ¿no es así? Es decir, un mínimo de 100mW si no me equivoco.

Y en el DFPlayer con los 6 auriculares, ¿este valor se repartiría entre los 6? es decir, un mínimo de 16,7mW por auricular si no me equivoco.

Los auriculares que utilizaré son de diadema. Yo he probado con unos que tengo en casa (en los detalles del fabricante dice que tienen una capacidad de 1000mW) y funciona bien a un nivel 20, aunque solo los he tenido a prueba unos minutos (¿a un nivel 20 no se supone que deberían salir 2W y me cargaría los auriculares?)

De todas formas, sigo sin entender algo (soy novato en temas de electrónica, y aún más novato en temas de sonido):

  • Entiendo que de SPK1 y SPK2 salen de 100mW a 3W dependiendo del volumen configurado en el DFPlayer. Pero, ¿no sucederá lo mismo con el TDA1308? Entiendo que el DFPlayer cuenta con un amplificador interno similar.
  • Si utilizo el TDA1308, ¿no sería suficiente con poner uno por DFPlayer? es decir, en el DFPlayer al que conectaré 6 auriculares, ¿sería suficiente poner un TDA1308 al que conectaría los 6 auriculares? Más que por el precio, por el espacio y porque el montaje se me complica.
  • Jugando a cambiar la forma en la que conecto los auriculares, he conectado el canal izquierdo a SPK1 y el canal derecho a SPK2 dejando la tierra sin conectar. De esta forma es como mejor suena y además a un nivel 8, aunque no entiendo por qué.

Las salidas SPK1 y SPK2 son las salidas del amplificador monoaural que trae el módulo y son los terminales que se conectan a cada pin de un único parlante (tal y como te ha explicado @gonpezzi en #14)



(Fuente: wiki.dfrobot.com)

Si quieres sonido estéreo debes agregar un amplificador también estéreo (o dos mono) y tomar la señal de DAC_R (y GND) para un canal y DAC_L (y GND) para el otro.

El tema de los auriculares no es tan sencillo como conectarlos en paralelo y dividir la potencia entre 6.
Hay que calcular la impedancia resultante y recalcular la potencia de salida para esa impedancia, recién entonces se podría calcular la potencia entregada a cada auricular.