DFPlayer appears to reset after a couple of seconds

Hello everyone, first post here.

I am currently experimenting with a DFPlayer module. I have it on a breadboard, connected to an ELEGOO Arduino Uno. The DFPlayer is then connected to a 3W 4Ohm speaker.

At first everything worked properly, but when i tried to power the board via a 9V battery, the player didn't seem to start (the red LED onboard wasn't turning on). Thus, i tried disconnecting the speaker, and as soon as i did that, the LED turned ON.

I read here that 9V batteries may not output enough power, so i put the board back on USB power. But now the DFPlayer controller seems to... "die" after a couple of seconds playing. The Serial Output reports a "Time Out!" event, followed by a "Card Online!" event after the DFPlayer (i assume) reboots. This cycle repeats after 6/7 seconds, until power is cut off from the UNO.

Any guess what might be happening? Before trying to go on battery power, everything worked fine, and i even managed to play a couple of songs uninterrupted.

I don't know if it is relevant, but ever since i tried to switch to batteries, the speaker now produces a "cracling pop" sound, until the DFPlayer is properly booted, which it didn't do before (in the testing where everything worked fine)

Following here i'm attaching the project schematics i'm following, as well as a photo of the whole contraption (i'm using the resistor with 2 DuPont F-M cables for ease-of-use. Apart from that, i've followed the schematic):

Here's my example code i'm using:

#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)"));

  while (!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!"));
    delay(500);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(5);  //Set volume value. From 0 to 30
  myDFPlayer.play(2);  //Play the first mp3

}

void loop()
{
  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!"));
      myDFPlayer.play(2);
      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;
  }

}

Use the symbol up to the left in this window. Click on it and paste the code.
Use autoformat, in the IDE, before copying.

Edited into scrollable code.

Also, the problem seems somewhat mitigated if i lower the volume to 5 or so. Could it be some power delivery issue?

Can You use a multimeter and check Vcc for each board?

I don’t have it on hand right now. I’ll try and fetch one as soon as i can.

Okey.
Check the wiring for intermittent contact.
As a test, disconnect the yellow and green cable from the controller and connect them GND. Any noice then?

I tried that, and it doesn't make any sound whatsoever.

After a bit of testing, i discovered that, whenever the DFPlayer reboots, it defaults to the "max" volume. If i start the board with the speaker connected, the speaker crackles loudly and the DFPlayer won't turn on. But if i power the system on with the speaker disconnected, wait for the Player led to turn red, then connect the speaker, it works as long as i also specify a volume (when it starts or when i catch its reboot with the "Card Online" event.

At this point, i think that the cause are the speakers, that are a tad too much for the DFPlayer to handle at full volume.

Also, regarding the fact that i fisically have to connect/disconnect the speakers at every reboot. I have a spare 5V Relay. I'm not too sure about this, but do you think i could use it to avoid this issue? I never used it on lower voltage currents so i'm not too sure if that would work.

Thanks for everything :slight_smile:

Good! Then the sound module is not generating the noice. Well done making the observations You did!
Study the data sheets for the sound module and look for an eventual setting/strapping that would help You!
I got a 5 volt relay from Ebay that uses very little current for the coil and a low current for activating the unit. The activation can be done directly from my UNO. A "heavy" solution to use a relay but if no other cure is found, do it.
I feel it is possible that the current draw might get too high if the sound module starts at full speaker power.

Just in case someone might need this info (and as a thank you to Railroader for his time):
I tested with a Multimeter the various voltages. Turned out that, whilst the Controller was booting, its Vout to the Speaker fluctuated between 1.7V and 0.8V, instead of the normal 2.5V nominal tension. After some shipping troubles here and there (thanks Covid, your effort to mess things up was noted), i finally got a hold of a 9V1A DC charger. This solved the issue, and the circuit can now peoperly boot up and use any volume to the speaker.

Thanks again Railroader fot your patience and support :slight_smile:

Tl;Dr (for any possible future searches): If you're using a DFPlayer Mini with a 3W4Ohm Speaker, you'll probably need a 9V or higher DC charger to get enough juice to run everything (Don't go over 12V, otherwise you'll risk damaging your board!!)

It look like You feed 9 volt into Vin, the "barrel jack". Then You use the ombord 5 volt converter to feed the audio. I would suggest having a 5 vot charger connected to Arduio +5 and to audio +5.
Check the Arduino that nothing gets hot!

The breadboard was designed to accept component leads. You should put the 1k resistor there, not in "outer space" between two jumpers.

LOL, good eye @aarg.

a7

Yea @aarg, i now have the Resistor plugged directly into the breadboard. As i said above, that was just a "test config". I was trying to determine if the Resistor was needed on both of the DFPlayer's Serial Pins, so before bending it, i used DuPonts.

Also @RailRoader, regarding what you said, i might have explained it badly. The speaker is directly and only fed from the DFPlayer controller, which is in turn fed by the 5V rail. With USB power, the load exceeded the available capacity. Using the 9V charger solved this issue :smiley: