DFPlayer Mini Serial Communication Doesn't work

Hi Everyone,
I'm Using arduino uno rev 3 and elegoo mega 2560 r3, but I'm having with both the same problem.

Using only the DFPlayer, by grounding pin ADKEY1, I can reproduce everything which is inside the SD card.
Meanwhile, with arduino, It doesn't communicate (grounding pin ADKEY1 still works).
[DFPlayer_Mini_SKU_DFR0299-DFRobot](https://I'm studying everything from the manufactuer)

I'm following this schema
NOTE: I've removed the speaker and directly connected 5v and GND to make a cleaner picture, It still works by grounding ADKEY1. The resistor is 1K ohms.

I've installed the library DFRobotDFPlayerMini and started the Example: GetStarted

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

void setup()
{
  mySoftwareSerial.begin(9600);
  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(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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);  //Set volume value. From 0 to 30
  myDFPlayer.play(1);  //Play the first mp3
}

void loop()
{
  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 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;
  }
  
}

Everytime i run the programm, i receive this errors:

DFRobot DFPlayer Mini Demo
Initializing DFPlayer ... (May take 3~5 seconds)
x���������C/>ӷK(�

If I set Serial.begin(9600) I go inside the if and It prints the 2 option.

I don't know what to do anymore: I've grounded both the pins (or tried with only 1), changed microcontrollers, breadboards and cable but it doesn't communicate.

1 Like

You didn't include the first 20 lines of DFR's 'Getting Started' sketch, which I've shown below, but I assume you did use its link? And did then click the 'User manual' link you found there? I'm not sure from your photos, but I also assume your wiring is correct.

However, rest assured that many other users have had the same problem you describe. The DFR library is poorly documented and has several flaws. Add the inconsistent performance of some of the many modules on the market and it's not surprising new users have a hard time getting it working. I certainly did.

/***************************************************
  DFPlayer - A Mini MP3 Player For Arduino
  <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>

 ***************************************************
  This example shows the basic function of library for DFPlayer.

  Created 2016-12-07
  By [Angelo qiao](Angelo.qiao@dfrobot.com)

  GNU Lesser General Public License.
  See <http://www.gnu.org/licenses/> for details.
  All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
  1.Connection and Diagram can be found here
  <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
  2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

As a first practical step, try changing this line

if (!myDFPlayer.begin(mySoftwareSerial))    //Use softwareSerial to communicate with mp3.

to

if (!myDFPlayer.begin(mySoftwareSerial, false))    //Use softwareSerial to communicate with mp3.

(I just tested that and it works here with a UNO.)

Thank you, it worked. How did you discovered this?

1 Like

Many hours of searching!
:slightly_smiling_face:

2 Likes

dfplayer This is what I have found out.

DFRobot DFR0299 DFPlayer - A Mini MP3 Player Compatible with Arduino

works but is relatively expensive.

I have ordered from aliexpress 2PCS Original DFPlayer Mini Serial MP3 Module Genuine MP3-TF-16P MP3 Player Module Using YX5200 Audio Chip from Flyrontech for testing.

I use a resistor divider to produce 3.3v for usart RX.
I also use busy.

If you used 5v psu, busy low is approx .8v which is not low enough. "Boarderline"
If you use 3.3v psu, busy low is approx .3v which is fine.

The main symptom of the none working one is that even with ridiculous delays of 500ms the thing does not work properly.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.