Go Down

Topic: MP3-TF-16P aka DFPlayer Mini .. another cheap sound module (Read 74610 times) previous topic - next topic

ever30

hi friends
i send to module a cmd for playing those attached files with uart port but dont hear any clear voice
please help me,please

Ironic62

Hum, i don't know why your DFP doesn't work.
Mine work great.

What is your power Supply ?
Have you try to format your mSD with : "HP USB Disk Storage Format Tool" ?
Is you speaker works ?



caramac

Im currently working on a project to play random audio tracks when no sound is detected, the random track played when there is no sound MUST start from the beginning. When sound is detected the DFPlayer must stop playing or pause. The DFPlayer is connected to the Arduino via serial connection. Ive spent 3 days playing with the serial code but cant get it to work, the DFPlayer works fine stand alone but not via serial can someone please help. Ive included my code but have removed all the code to send via serial if someone can help its driving me mad.
Code: [Select]
int soundSensorpin=A4;
int soundReading=0;
int soundThreshold=300;
int relay1pin=9;
int relay2pin=10;

void setup() {

    // initialize the button pin as a input:
pinMode(relay1pin, OUTPUT);
pinMode(relay2pin, OUTPUT);
pinMode(soundSensorpin, INPUT);

// initialize serial communication:
    Serial.begin(9600);
   
     
       //setup code for player if needed
       
   
     
}
   
    void loop() {
  static uint32_t ts = millis();
  static uint16_t counter = 0;

  // If the counter > 0 then count down by 1.  If it reaches 0 then switch back to music.
  if (millis() - ts > 0) {
    if (counter > 0) {
      counter--;
      if (counter == 0) {
       
        //code here needs to play random track starting from the beginning of track
     
       
        digitalWrite(relay1pin, LOW); // relay open
        digitalWrite(relay2pin, HIGH); // relay close
      }
    }
  }

  // If there is sound, then switch to speech, and set the counter to 1000.
  soundReading = analogRead(soundSensorpin);
  if (soundReading > soundThreshold) {
    counter = 5000;
   
   //code here needs to stop or pause player
 

    digitalWrite(relay1pin, HIGH); // relay close
    digitalWrite(relay2pin, LOW); // relay open
  }

}

onesky

#18
Aug 24, 2014, 01:19 am Last Edit: Aug 24, 2014, 01:53 am by onesky Reason: 1
u can find code, library and examples here
https://github.com/DFRobot/DFPlayer-Mini-mp3/tree/master/DFPlayer_Mini_Mp3

the problem of this module is that if you don't use the library above u have to calculate checksum for each serial string..

the serial connection need 100ohm resistor (3.3 volts vs. 5volts arduino) the manual states 1k ohm but i guess it's not correct

everytime after uploaded the code to arduino it needs to unplug the power to works with the new code

many times it doesnt' do what requested in the code

this module is not reliable, i prefer the WT5001M02-28P much more.

Deniska407

Hello, All!

Please tell me how to calculate the checksum?

I need a module from a total of seven control commands:

1. Play.
0X7E, 0xFF, 0x06, 0X03, 00, 00, 0x01, 0xFE, 0xF7, 0XEF

2. Loop.
0X7E, 0xFF, 0x06, 0X11, 00, 00, 0x01, ?? , ?? , 0XEF

3. Pause.
0X7E, 0xFF, 0x06, 0X0E, 00, 00, 0x00, ?? , ?? , 0XEF

4. Volume level 0.
0X7E, 0xFF, 0x06, 0X06, 00, 00, 0x00, ?? , ?? , 0XEF

5. Volume level 10.
0X7E, 0xFF, 0x06, 0X06, 00, 00, 0x0A, ?? , ?? , 0XEF

6. Volume level 20.
0X7E, 0xFF, 0x06, 0X06, 00, 00, 0x14, ?? , ?? , 0XEF

7. Volume level 30.
0X7E, 0xFF, 0x06, 0X06, 00, 00, 0x1E, ?? , ?? , 0XEF

I am familiar (thank you, Ironic62) with the format of these commands, but do not know how to calculate the checksum.

Help me, please ...

Thank you.

Denis.

flyrontech

@Denis

It's easy to calculate checksum if you understand hex well. Here is an example below.
FF+06+03+00+00+01=0109   0-0109=FE F7 

In pursuit of top quality and professional services.

Protonerd

Hi guys,

Following your instructions (I'm greatly indepted to you, especially onesky), I could make my DFPlayer work quite easily. Now I can play .wav files, but what I would need is the Sounds overlapping. The Intercut Advertisement feature of the DFPlayer to stop a track, store the Position in the track, Play another file, then resume the paused file from the stored Position seems to me the perfect solution, but alas I cannot make it work. All the other serial commands I send seem to work with the Github library functions, but not the intercut.

I made a Directory ADVERT on the SD-Card like described in the spec, still no luck :(

Has anyone experience with this particular feature?

Cheers and thanks!

awwwt

Hi!

I recently bought a few of these and have come to realize that the RX and TX pins are swapped on my particular modules in comparison to the pin map image that's online, just in case anyone is having issues with their dfplayer mini - I hope to save you some time :)


mclareniak

I have a problem.

It makes it even when softserial well as HWserial
When connecting RX hear the hum. After disconnecting the RX hum is mute.

Check here

https://youtu.be/XI6K5BHXOPI

raysputin

I have had no trouble getting this module to work in random play mode with a Nano using the dfplayer_mini_mp3 library.  My current card has two folders on it but the mp3_random command plays files from both folders.

I have a project in mind to provide sound ambience in a garden depending on whether it is day or night.  I have no doubt that I could organise the files into two groups and get the software to play the files in each group sequentially depending on the light but (and here's the rub) I want to play the files randomly.

I have taken a look at dfplayerminimp3ad library but it does not have an ad-random command. 

I could use the arduino random function in the sketch but I would prefer to use the built-in random of the dfplayer if possible.


Here's how I see it working:

An LDR and pullup resistor using analogRead can do the day/night detecting.  Alternatively a shield with an LDR and comparator could be used via digitalRead.

Ideally it would entail putting the day files in one folder and the night files in another. 
When the light reduces below the threshhold, the night folder would be randomly played, else the day folder would be randomly played.


My problem is how to tell the dfplayer which folder to use.  The dfplayer manual says that up to ten folders can be serially selected but does not go into detail beyond saying user specified. 

Can anyone please offer me details on how to select a specific folder and what folder naming conventions (if any) I need to adopt.  I am a serial and library noob - please keep it simple.

budidiro

I use this module. This is the same as dfplayer mini?

Protonerd

It might use the same chipset (not visible), but judging by the pinout it's not the DPFplayer.

SimLego

#27
Feb 28, 2016, 08:52 pm Last Edit: Feb 28, 2016, 09:05 pm by SimLego Reason: Misplaced comments in code snippet
Hello, All!

Please tell me how to calculate the checksum?

I need a module from a total of seven control commands:

8<---

Help me, please ...

Thank you.

Denis.
I found this sketch very useful:

Code: [Select]

///              MP3 PLAYER PROJECT
//////////////////////////////////////////
//[SL]  FILE: mp3.ino
//[SL]  from http://educ8s.tv/wp-content/uploads/2015/10/mp3.zip
//[SL]  found at http://educ8s.tv/arduino-mp3-player/
//[SL]  "//[SL]" indicates remarks and questions by SimLego
//////////////////////////////////////////


#include "SoftwareSerial.h"
SoftwareSerial mySerial(10, 11);
# define Start_Byte 0x7E
# define Version_Byte 0xFF
# define Command_Length 0x06
# define End_Byte 0xEF
# define Acknowledge 0x00 //Returns info with command 0x41 [0x01: info, 0x00: no info]

# define ACTIVATED LOW

int buttonNext = 2;
int buttonPause = 3;
int buttonPrevious = 4;
boolean isPlaying = false;



void setup () {

pinMode(buttonPause, INPUT);
digitalWrite(buttonPause,HIGH);
pinMode(buttonNext, INPUT);
digitalWrite(buttonNext,HIGH);
pinMode(buttonPrevious, INPUT);
digitalWrite(buttonPrevious,HIGH);
//[SL] Shouldn't it be pinMode(..., INPUT_PULLUP)?

mySerial.begin (9600);
delay(1000);
playFirst();
isPlaying = true;


}



void loop () {

 if (digitalRead(buttonPause) == ACTIVATED)
  {
    if(isPlaying)
    {
      pause();
      isPlaying = false;
    }else
    {
      isPlaying = true;
      play();
    }
  }


 if (digitalRead(buttonNext) == ACTIVATED)
  {
    if(isPlaying)
    {
      playNext();
    }
  }

   if (digitalRead(buttonPrevious) == ACTIVATED)
  {
    if(isPlaying)
    {
      playPrevious();
    }
  }
}

void playFirst()
//[SL] Plays first entry.
//[SL] Probably to be called first time only(???)
{
  execute_CMD(0x3F, 0, 0);
    //[SL] "Send initialization parameters"
  delay(500);
  setVolume(20);
  delay(500);
  execute_CMD(0x11,0,1);
    //[SL] "Repeat play" - PDF documentation quite cryptic
  delay(500);
}

void pause()
{
  execute_CMD(0x0E,0,0);
  delay(500);
}

void play()
{
  execute_CMD(0x0D,0,1);
    //[SL] "Playback" - only as opposed to Pause?
  delay(500);
}

void playNext()
{
  execute_CMD(0x01,0,1);
  delay(500);
}

void playPrevious()
{
  execute_CMD(0x02,0,1);
  delay(500);
}

void setVolume(int volume)
{
  execute_CMD(0x06, 0, volume); // Set the volume (0x00~0x30)
    //[SL] Most documentation say 0~30
    //[SL] 48 (ie 0x30) works, but sound comes out very distorted.
  delay(2000);
}

void execute_CMD(byte CMD, byte Par1, byte Par2)
// Excecute the command and parameters
{
// Calculate the checksum (2 bytes)
word checksum = -(Version_Byte + Command_Length + CMD + Acknowledge + Par1 + Par2);
// Build the command line
byte Command_line[10] = { Start_Byte, Version_Byte, Command_Length, CMD, Acknowledge,
Par1, Par2, highByte(checksum), lowByte(checksum), End_Byte};
//Send the command line to the module
for (byte k=0; k<10; k++)
{
mySerial.write( Command_line[k]);
}
}



The last function, void execute_CMD(byte CMD, byte Par1, byte Par2), automatically takes care of checksum calculations.

I also like the fact that the sketch is self-containing (except from the include file SoftwareSerial.h), because I do hate hunting for files and libraries, often to get stuck in version conflicts.

(Of course, in larger projects I would name the functions more specific than play(), pause(), and so on...)

But apart from that, this is a very good sketch to begin with IMO.

Protonerd


There is an Arduino compatible board with integrated DFPlayer mini, using the SD-card version, check it out here:
DIYino

Among the links you can also find one to LSOS by neskweek on GitHub which has a strongly upgraded DFPlayer library.

NewSimblee

I am trying to get the DFPlayer Mini to work with a Simblee, which is not compatible with Software.Serial.h. So I am looking for some simple code to send the serial commands with check sum. Any help??

Go Up