Problemas inciando DFPlayer

Buenas a todos.

Estoy empezando un pequeño proyecto que consiste en un juguete musical para mi hija.
El típico que según qué botón pulsas suena una canción o un sonido.
Compré un DFPlayer mini y lo he estado probando, pero no consigo hacerlo funcionar.

He visto ejemplos de código en muchos foros y blogs y he creado un programa muy básico para reproducir alguna canción desde una tarjeta SD.
El caso es que llegué a hacerlo funcionar y sonaban las canciones pulsando unos botones, pero en cuanto que movía un poco la protoboard o algo dejaba de funcionar con el típico mensaje de inicio:

Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!

He estado añadiendo algunas cosas más y ahora no soy capaz de que funcione nunca...

siempre sale el dichoso:

Unable to begin:
1.Please recheck the connection!
2.Please insert the SD card!

Así que he vuelto a dejar el código lo más limpio posible, he eliminado del arduino y la proto todo lo innecesario, pero nada, sigo con ese mensaje.

Cosas que he probado:

  • Cambiar el DFPlayer a otra parte de la protoboard
  • Cambiar los cables
  • Usar otros pines en el arduino
  • Intercambiar RX y TX
  • Usar una resistencia en el RX y conectarlo sin ella
  • Quitar la parte del código con el bucle infinito para iniciar el reproductor e iniciarlo directamente sin la comprobación de esos errores en el begin y el bucle
  • Borrar de la SD todas las canciones menos una. (Con nombre: 0001Nombre canción)

Pero no consigo iniciar el reproductor más... ¿Tendría que encenderse la luz led del DFPlayer mini al conectarle el voltaje aunque no consiga iniciarlo? porque está siempre apagada ahora...
¿Hay alguna forma de comprobar si funciona o está estropeado?

Os pongo mi código, veréis que ahora mismo es muy simple, he borrado todo.
Y una foto de la proto donde he quitado casi todos los cables menos los necesarios

Muchas gracias por adelantado por cualquier consejo o ayuda !

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

//Iniciar puerto serie
SoftwareSerial mySoftwareSerial(8, 9); // RX, TX

//Declaramos variable para el reproductor MP3
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


void setup() {
  
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);

 //Inicializar el reproductor de MP3
 if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial 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);
  }
  //myDFPlayer.begin(mySoftwareSerial);


  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms
  
  //Volumen por defecto al 10
  myDFPlayer.volume(15);  //Set volume value (0~30).  

  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);  
//  myDFPlayer.EQ(DFPLAYER_EQ_POP);
//  myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
//  myDFPlayer.EQ(DFPLAYER_EQ_JAZZ);
//  myDFPlayer.EQ(DFPLAYER_EQ_CLASSIC);
//  myDFPlayer.EQ(DFPLAYER_EQ_BASS);

  //----Set device we use SD as default----
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_U_DISK);
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_AUX);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SLEEP);
//  myDFPlayer.outputDevice(DFPLAYER_DEVICE_FLASH);
  
  myDFPlayer.play(1);

}

void loop() {
  
  //myDFPlayer.play(1);
  //delay(1000);
  

  static unsigned long timer = millis();

   if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  }

 if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
  }  
}

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

¿ Y el Vcc del Dfplayer ? .

Hola, lo tengo conectado a la salida de 5v de Arduino, no sé si aprecia bien en la foto.

Si veis algo mal decidme, please.

(Obviad los botones, solo están conectados a tierra, quité el resto de cables...)

Tal como lo tienes conectado ahora, permuta en el arduino los pines RX/TX

Hola, Gonpezzi.
Gracias por la ayuda, aunque sigo sin conseguir hacerlo funcionar...

He cambiado los cables como decías, pero nada.
¿Será problema de la tarjeta SD? Es una de 8 gb que tenía por ahí, formateada en fat32. Aunque ya os digo que he conseguido hacerlo funcionar con la misma tarjeta.

Pero, como decía, cuando tocaba un poco algo o movía algún cable dejaba de hacerlo, supuse que algún cable no conectaba bien en la proto o el Arduino, pero ahora es que es imposible....

Te pongo un vídeo de la prueba que acabo de hacer cambiando los pines como me has dicho

Edit: en el vídeo no se ve bien, pero antes de pulsar Reset la primera vez he borrado el log del Serial, cuando vuelvo a enfocar la pantalla ya vuelve a salir el mensaje de que no inicia bien...

Gracias !

Yo me inclino más por que sea un problema de alimentación, mientras que el led del DFPlayer no se encienda no va a funcionar.

Dices que lo alimentas desde el +5V del Arduino, comprueba que ese pin está sacando los +5V, si no tienes un voltimetro pruea con un led y su correspondiente resistencia en serie.

No es buena idea alimentar un DFPlayer desde el Arduino porque lleva un amplificador de audio que aunque sea de poca potencia puede producir un exceso de consumo y se lleve por delante el regulador de 5V del Arduino, espero que no sea tu caso.

Hola. acabo de hacer un montaje básico con un dfplayer y la cosa no me huele muy bien.
Con el código que has publicado se inicia y funciona correctamente incluso los mensajes de status.

No, el led solo se enciende cuando esta reproduciendo.

Esto me da miedo. Los pines RX/TX del dfplayer van a 3,3V por eso lleva la resistencia en el pin RX. Si en algún momento ese pin ha estado conectado sin resistencia al arduino se ha podido dañar y ya no es posible la comunicación serial entre ambos.

Haz una prueba usando los pines IO y ADKEY, aunque si así te funciona esto no garantiza que la línea TX/RX no este quemada.

Hola, gracias a todos por la respuestas. Y por tomar el tiempo en copiar el circuito y probar el código !

La verdad es que estoy todavía muy pez en esto de Arduino (y en electronica en general) y probablemente termine cargándome algo :sweat_smile:
Sí, probé en RX sin la resistencia y estoy viendo que en las últimas pruebas que conectó bien se volvía un poco loco con los botones puestos, y revisando el código he visto que no inicialicé en el Setup los pulsadores diciendo qué pines eran de entrada o salida... en fin, vete a saber si me terminé cargando el reproductor o algo...

He medido como decía Tresvdoble que tensión llegaba al pin de Vcc del DFPlayer y llegan unos 4.5v:

Si lo he alimentado así es porque lo he visto en el 99% de los ejemplos de uso que he visto. Ya sé que copiar y pegar está feo y que no todo lo que hay en estos ejemplos estará bien...

He comprado otro DFPLayer, cuando llegue haré una pequeña prueba con más mimo mirando bien todo antes de probar.

Una cosa, mi idea es, cuando esté terminado, alimentar todo el proyecto con 4 pilas AA, si no debo alimentar el DFPlayer directamente desde la salida de 5v del arduino ¿Cómo lo haríais mejor?
Componentes que voy a usar: un Arduino nano, el dfplayer, altavoz de 3w, 4 leds y 6 pulsadores para controlarlo. Lo más seguro es que añada también un potenciómetro para regular el volumen.

Gracias por la paciencia y la ayuda.

Bueno, fin ese código al final no funciona tan bien como debiera. Mientras te llega el nuevo vamos ha hacer unas pruebillas.
Con las conexiones básicas correctas es decir:

  • Vcc y gnd bien puestas.
  • TX arduino------ R de 1K---- RX Dfplater
  • RX arduino directo a TX Dfplayer

Añade a tu código publicado y justo antes de inicializar el Dfplayer un pequeño retraso. Algo así:

void setup() {
  mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  
  delay (500); // Retraso que habra que ajustar.
  
  //Inicializar el reproductor de MP3
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial 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);
  }

Pruébalo y cuenta lo que pasa

Hola, pues he probado y nada...

Me ha llegado ya el DFPlayer nuevo, y no va esto ni con el nuevo ni con el antiguo...

He visto que la tarjeta SD no reconocía todo el tamaño que tiene y he comprobado que tenía alguna partición extraña...
He borrado todas y vuelto a formatear con una sola partición en FAT32.

Pero sigue fallando, voy a ver si encuentro otra tarjeta SD diferente, porque ya es lo último que me queda por probar...

Nada, he probado con otra tarjeta y tampoco !
Ya no sé qué más puede pasar... cambié cables, el dfplayer de sitio...
¿Será problema de la protoboard o del arduino ???

He hecho un pequeño ejercicio de poner dos pulsadores en los mismos pines que uso para el dfplayer y que enciendan o apaguen un led según se pulsen y funciona bien. Parece que el Arduino en esta prueba va bien...

Tiene que ser algo de las SD :thinking:

Prueba a alimentar el DFPlayer independientemente pero con GND de Arduino unida al GND de la alimentacion independiente.

Mete ese mega en un cajón y ni que lo vea el dfplayer :rofl:. Utiliza un UNO o un nano directamente, me parece que al mega al llevar mas puertos serie nativos no le hace mucha gracia la libreria SoftwareSerial.h
Lo acabo de probar y va en un uno y un nano y no en el mega.

A mi no me ha dado problemas usar SoftwareSerial.h en un Mega, es más siempre lo uso para no tener que modificar el codigo al cargarlo en el UNO, pero podria ser.

Puede probar a usar alguno de los otros puertos nativos y así eliminar el uso SoftwareSerial.h del codigo.

Si yo también lo he usado en el mega, (aunque en pines mas bajos, no se si importara), y me he sorprendido. He hecho la prueba solo para usar su harware y me ha salido eso.
Si podría usar un puerto nativo del mega pero post arriba creo que dice que va a usar un nano.
En fin.. a ver si es de eso.

Hola, pues he probado a alimentar el DFPlayer desde una fuente externa y parece que al conectar la primera vez se enciende momentáneamente el led, luego se apaga.
Alimentándolo desde el Arduino no me ha parecido que haga eso, aunque desde ambos lados le llega más o menos la misma tensión.

Os pongo un vídeo, aunque se ve regular de calidad

Las tierras están unidas por el cable azul que se ve más cerca. Cuando enfoco a la pantalla del pc se ve el mensaje de que no inicia bien...

He pedido unos nano por AliExpress así que tardarán en llegar todavía... Comprare un Uno por Amazon a ver si llega antes y puedo probar.

Edit:
Intentaré probar lo que decís de los puertos nativos, tengo que buscar info a ver qué puertos son y cómo inicializar el dfplayer sin la librería .h esa, ya os digo si lo consigo

Gracias a los dos !

Fácil prueba este setup, ya hice funcionar el dfplayer con el mega.

#include "Arduino.h"
#include "DFRobotDFPlayerMini.h"

//Declaramos variable para el reproductor MP3
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup() {
  //mySoftwareSerial.begin(9600);
  Serial.begin(9600);
  Serial1.begin(9600);//Iniciar puerto serie nativo-1 RX pin 19 TX pin 18  
  delay (250);  
  //Inicializar el reproductor de MP3
  if (!myDFPlayer.begin(Serial1)) {  //Use serial-1 nativo 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);
  }

  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms

  //Volumen por defecto al 10
  myDFPlayer.volume(15);  //Set volume value (0~30).
  //----Set different EQ----
  myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);
  //----Set device we use SD as default---- 
  myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); 

  myDFPlayer.play(1);
}

Hola, Vale, ya entiendo lo de los puertos nativos.
He probado con el serie1 como me has dicho con los pines 19 y 18.
También con serial2 con los 16 y 17 y con el serial3 con los 14 y 15...
Y nada, mismo error. Ha sido una prueba rápida, luego después del curro lo desmonto todo y miro todo de nuevo, porque es imposible que sea tan complicado esto, alguna tontería se me escapa, algún cable mal o lo que sea...

Muchas gracias, os cuento si lo consigo.

PD : He probado alimentando el DFPlayer desde el propio arduino, nada más conectar el usb se enciende momentáneamente su led y se apaga. Parece que le llega bien la corriente, pero no inicia... bueno, luego pruebo otra vez...

Bueno, pues por fin he conseguido hacerlo funcionar !!!

He comprado un Arduino Uno y otras protoboard.
Lo he montado con el Uno y la nueva proto y me seguía saliendo el mismo mensaje... :frowning:
pero me di cuenta que tenía intercambiados el RX y TX y al ponerlos bien:

Como ya funcionaba he desconectado el Uno y he conectado todo esto al Mega y ... tachán:

¿Sería problema de la otro protoboard ????
No sé alguna tontería fallaría porque ha sido muy raro todo... Y ya probé a cambiar tx/Rx y todo lo que se me ocurrió... en fin, bienvenido al mundo de la electrónica supongo...

Muchas gracias a los dos. No os vayáis muy lejos porque ahora empiezo, por fin, con el proyecto de verdad y seguro que tengo dudas con otras cosas... jeje