Unable to get DFPlayer Mini to work on Arduino Uno

Hello,
I have the following project and it is working perfectly. However I wanted to add sound to play an mp3 when the Switch is ON and the motors are running. The whole code is working perfectly until I added the DFPlayer Mini to the connection the Arduino does NOT work at all. If I disconnect it , everything works like normal. What I am trying to do is play the mp3 file on the DFPlayer when I hit the ON switch. I am thinking it's because because both A498 and the DFPlayer are on 5V, I'm not sure.
The On Switch occurs on Line 71 and the Play command is on Line 77. Here is the code and the schematics.


#include <Servo.h>
#include <AccelStepper.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

#define dirPin 12
#define stepPin 13
#define motorInterfaceType 1

Servo myservoRight;  // create servo object to control a servo
Servo myservoLeft;  // create servo object to control a servo
SoftwareSerial mySoftwareSerial(10, 11);  //RX, TX for the sound speaker DF Player
DFRobotDFPlayerMini myDFPlayer;

#define servoPinRight 3 //~
#define servoPinLeft 6 //~
#define pushButtonPin 2

int led = 5;         // the PWM pin the LED is attached to
int brightness = 0;  // how bright the LED is
int fadeAmount = 5;  // how many points to fade the LED by

int angleRight = 179;    // initial angle  for Right servo (beteen 1 and 179)
int angleLeft = 179;    // initial angle  for Left servo (beteen 1 and 179)

int servoAngleMax = 45;    // Minimum angle for stepper (instead of 0)
int angleStep = 1;
int stepperMotorPosition = 0;
int stepperLowestLevel = -18000;  // lowest level of stepper motor originally at -22000
int stepperHighestLevel = 22000;  // highest level of stepper motor originally at 28000
int stepperMaxSpeed = 2200.0; // max speed of stepper motor

unsigned long startMillis;
unsigned long currentMillis;
unsigned long timeSetToOff;
const unsigned long period = 40;

// initialize the stepper library on pins 8 through 11:
AccelStepper myStepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
  myStepper.setCurrentPosition(stepperLowestLevel);
  // set the speed at 30 rpm:
  //myStepper.setMaxSpeed(3000);       //set max speed the motor will turn (steps/second)
 // myStepper.setAcceleration(900);  //set acceleration (steps/second^2)

  // declare pin 5 to be an output:
  pinMode(led, OUTPUT);

  // initialize the serial port:
  Serial.begin(9600);          //  setup serial
  mySoftwareSerial.begin(9600);  //setup for DFplayer Serial

  myservoRight.attach(servoPinRight);  // attaches the servo on pin 3 to the servo object
  myservoLeft.attach(servoPinLeft);  // attaches the servo on pin 6 to the servo object
  pinMode(pushButtonPin, INPUT_PULLUP);
  startMillis = millis();
  timeSetToOff = millis();

  myservoRight.write(angleRight);
  myservoLeft.write(angleLeft);
  //Serial.println("Servo Button ");
  //myStepper.moveTo(stepperLowestLevel);

}

void loop() {
  //myStepper.run();

  if (digitalRead(pushButtonPin) == LOW) {  //switch is ON

    currentMillis = millis();  //get the current time
    if (currentMillis - startMillis >= period)  //test whether the period has elapsed
    {
      myDFPlayer.volume(30);  
      myDFPlayer.play(1);  //Play the first mp3

      analogWrite(led, brightness);    //set the brightness of the LED
      brightness = brightness + fadeAmount;
      if (brightness <= 0 || brightness >= 120) {
        fadeAmount = -fadeAmount;
      }
      startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED brightness
      if ((currentMillis - timeSetToOff >= 3000) || (angleRight < 179)) { //add a bit of delay before the action
        if (angleLeft > servoAngleMax && angleLeft <= 180 ) {

          angleLeft = angleLeft - angleStep;

          if (angleLeft < servoAngleMax) {
            angleLeft = servoAngleMax;
          }

          else {
            myservoLeft.write(angleLeft); // move the left servo to desired angle: open doors
          }

        }

        //wait for Servo right to reach 140 degree
        if ((angleRight > servoAngleMax && angleRight <= 180) && (angleLeft <= 110 )) {

          angleRight = angleRight - angleStep;

          if (angleRight < servoAngleMax) {
            angleRight = servoAngleMax;
          }

          else {
            myservoRight.write(angleRight); // move the right servo to desired angle: open doors
          }
          //end of Servo Left logic
        }
      }
    }
    // wait for 20 milliseconds to see the dimming effect
    //delay(20);

    if ((angleLeft == servoAngleMax) && (angleRight == servoAngleMax)) { //if door is fully open raise platform
      myStepper.moveTo(stepperHighestLevel);
      //myStepper.runToPosition(stepperHighestLevel);
      myStepper.setMaxSpeed(stepperMaxSpeed);//set desired speed of stepper motor
      //myStepper.setSpeed(stepperMaxSpeed);
      myStepper.setAcceleration(900);
      myStepper.run();
      stepperMotorPosition = myStepper.currentPosition();

      //Serial.println("raising platform ");
      //Serial.println(stepperMotorPosition);

      //Serial.println(stepperMotorPosition);
    }

    //this part to switch off LEDs once doors are open
    if (stepperMotorPosition == stepperHighestLevel) {
      brightness = 0;
    }
    //end of turning OFF LEDs

    //delay(20); // waits for the servo to get there

  }


  if (digitalRead(pushButtonPin) == HIGH) { //switch is OFF
    timeSetToOff = millis();
    currentMillis = millis();
    // wait for 20 milliseconds to see the dimming effect
    //delay(20);

    myStepper.moveTo(stepperLowestLevel);
    myStepper.setMaxSpeed(stepperMaxSpeed);//set desired speed of stepper motor
    myStepper.setAcceleration(900);
    myStepper.run();
    stepperMotorPosition = myStepper.currentPosition();

    if (angleLeft >= 179 && angleRight >= 179) {
      analogWrite(led, 0); //begin LED dimming code
    }
    else {
      //get the current time
      //analogWrite(led, brightness); //begin LED dimming code
      if (currentMillis - startMillis >= period) {
        analogWrite(led, brightness); //begin LED dimming code
        // change the brightness for next time through the loop:
        brightness = brightness + fadeAmount;

        // reverse the direction of the fading at the ends of the fade:
        if (brightness <= 0 || brightness >= 120) {
          fadeAmount = -fadeAmount;
        }
        startMillis = currentMillis;

        if (stepperMotorPosition == stepperLowestLevel) {
          if (angleRight >= servoAngleMax && angleRight <= 180)  {
            angleRight = angleRight + angleStep;
            if (angleRight > 180) {
              angleRight = 179; //was set to 180 should be same as starting position
            }

            else {
              //myservoRight.write(angleRight); // move the Right servo to desired angle
              myservoRight.write(angleRight); // move the Right servo to desired angle
            }
          }

          //Wait for Left motor to move

          if ((angleLeft >= servoAngleMax && angleLeft <= 180) && (angleRight >= 100 )) {
            angleLeft = angleLeft + angleStep;
            if (angleLeft > 180) {
              angleLeft = 179; //was set to 180 should be same as starting position
            }

            else {
              myservoLeft.write(angleLeft); // move the Left servo to desired angle
              //myservoLeft.write(angleLeft); // move the Left servo to desired angle
            }
          }

        }

      }

      //Serial.println("lowering platform ");
      //Serial.println(stepperMotorPosition);

      //Serial.println("Switch is OFF");
      //Serial.println(stepperMotorPosition);

      // Servo button demo by Robojax.com


    }
    //delay(20); // waits for the servo to get there, to keep same speed this has to be the total
    //of dimming LED delay and Servo delay when switch is in ON position
  }


}

Well - does it work with the A498 out of circuit?

It works with the DF Player Out of circuit.

That doesn't answer my question.

Your drawing shows two servos on one pin (3) and no servo on pin (6). I suspect your physical connections match the code as accurately as your drawing matches the code. Post a picture to help finding the issue(s).

[edit]The two servos on one pin are too much power sinking. Also, a speaker and an SD card reader being powered by the Arduino are again, too much. Try putting these on an external power supply.

Feeding 12 volt to Vin and tapping 5 volt out to the player is not good. The tiny onboard 5 volt converter is likely overloaded.
Make a test and feed the UNO with USB.
It would be better to have a separate 5 volt for the player. It needs some urrent.

Ok I will try connecting the SD card player on a an external power supply. But how would I run the connection?
I am guessing the positive goes to 5v power supply and both the ground of the power adapter and the ground of the SD player to Ground of the Arduino ?

So I connected the SD Player to an external Power source (4.5 Volt) and the ground of the power source and the ground of SD Player to the Arduino Ground and it still didn't work. When I press ON nothing happens. Not sure why it's not working !

Maybe you should try getting the "DFPlayer" running on its own.
Have you tried that yet?

Yes the DF player on its own works.

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