Add Voice Commands to your Projects DFPlayer Mini | Arduino
DFPlayer Mini (or) MP3-TF-16P Module is a tiny low-cost mp3 module with inbuilt Amplifier. You can connect a 3-Watt Speaker directly to the Module. Additionally, you can use an audio amplifier like PAM8403 to boost the Audio signal. It has an SD Card port and reads the MP3 files from the SD Card. This MP3 Module can work standalone or you can use any Microcontroller like Arduino via UART Ports (TX & RX). A Special library is published by DFRobot on GitHub.
By using this MP3 Module you can use it in many applications like Train Announcements in Railway Stations, Fire alarm Voice Prompts, Car Navigation Voice Broadcast, Voice alert Blind Stick and many projects that need voice-based alerts.
In this tutorial, we will see how to use this module with Arduino.
Specifications:
- supported sampling rates (kHz): 8/11.025/12/16/22.05/24/32/44.1/48
- 24 -bit DAC output, support for dynamic range 90dB, SNR support 85dB
- fully supports FAT16, FAT32 file system, maximum support 32G of the TF card, support 32G of U disk, 64M bytes NORFLASH
- a variety of control modes, I/O control mode, serial mode, AD button control mode
- Advertising sound waiting function, the music can be suspended. when advertising is over in the music continue to play
- audio data sorted by folder, supports up to 100 folders, every folder can hold up to 255 songs
- 30 level adjustable volume, 6 -level EQ adjustable
This module has TX and RX pin used to communicate with the Arduino. It also has DAC and USB Functions.
Pin Diagram:
Pin | Description | Note |
VCC | Power Supply + | DC 3.2V – 5V |
RX | Serial Input | UART |
TX | Serial Output | UART |
DAC_R | Audio Output Right Channel | Drive Earphone & Amplifier |
DAC_L | Audio Output Left Channel | Drive Earphone & Amplifier |
SPK2 | Speaker – | Drive Speaker Less than 3W |
GND | Ground | Power GND |
IO1 | Trigger Port 1 | Short Press to Play Previous (Long – Volume Decrease) |
GND | Ground | Power GND |
IO2 | Trigger Port 2 | Short Press to Play Next (Long – Volume Increase) |
ADKEY1 | AD Port 1 | Trigger Play First Segment |
ADKEY2 | AD Port 1 | Trigger Play Fifth Segment |
USB+ | USB+ DP | USB Port |
USB- | USB- DM | USB Port |
BUSY | Playing Status | Low Means Playing |
To use with Arduino we will need VCC, GND, SP+, SP-, TX and RX Pins only. Other Pins are optional.
Components Required:
- Arduino UNO/Mega
- MP3 Player Module – MP3-TF-16P/DFPlayer Mini
- Jumper Wires
- 1K Ohm Resistor (to avoid crackling sound as the RX pin is 3.3V Level)
- Breadboard (Optional)
Circuit Diagram:
Connect the circuit as per the circuit diagram. On the RX Pin of MP3 Module, we use a 1K Ohm resistor. Because the TX and RX Pins are 3.3V Logic (Arduino Uno pins are 5V level) and the resistor will drop the necessary voltage to avoid crackling sounds on the speaker.
Pre-requisites:
- The module accepts only MP3 Files. To convert your files to MP3 before using it. You can use many online converters for this.
- The naming should be 001, 002, 003 and so on. Else the player will pick the first file copied into the SD Card.
- Copy the files to the SD Card
- Install the DFPlayer Mini Library from GitHub or Search it on the Arduino Library manager. There are new versions available and didn’t work well. So Choose the Version 1.0 that works perfectly.
After installing the library, Copy and paste the below code and Upload.
#include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" SoftwareSerial mySoftwareSerial(2, 3); // RX, TX DFRobotDFPlayerMini myDFPlayer; 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); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.volume(20); //Set volume value. From 0 to 30 } void loop() { myDFPlayer.play(1); //Play the first mp3 delay(2000); myDFPlayer.next(); //Play next mp3 delay(2000); myDFPlayer.next(); //Play next mp3 delay(2000); myDFPlayer.next(); //Play next mp3 delay(2000); }
The above codes play the first MP3 for 2 Seconds and then play next for 3 Times. This will loop continuously. To use other functions, check the full function code to use the specific functions as per your choice.
Description:
To initialize the Software Serial functions we use the following lines of code
#include "SoftwareSerial.h"
This line adds the Software Serial library to our program.
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
This function assigns the 2 and 3 Pin of Arduino for Serial Communication.
DFRobotDFPlayerMini myDFPlayer;
This line creates an Object for DFRobotDFPlayerMini as myDFPlayer (To simplify the function).
Important Functions:
myDFPlayer.volume(20); //Set volume value (0~30).
This function sets the volume as 20. It can be modified from 0 to 30.
myDFPlayer.play(1); //Play the first mp3
This function plays the First MP3 on the SD Card.
myDFPlayer.next(); //Play next mp3.
Plays Next MP3 file on SD Card.
myDFPlayer.previous(); //Play previous mp3
Plays Previous MP3 File on SD Card.
Other Functions:
myDFPlayer.next(); //Play next mp3 myDFPlayer.previous(); //Play previous mp3 myDFPlayer.play(1); //Play the first mp3 myDFPlayer.loop(1); //Loop the first mp3 myDFPlayer.pause(); //pause the mp3 myDFPlayer.start(); //start the mp3 from the pause myDFPlayer.playFolder(15, 4); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255) myDFPlayer.enableLoopAll(); //loop all mp3 files. myDFPlayer.disableLoopAll(); //stop loop all mp3 files. myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535) myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535) myDFPlayer.stopAdvertise(); //stop advertise myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000) myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05. myDFPlayer.randomAll(); //Random play all the mp3. myDFPlayer.enableLoop(); //enable loop. myDFPlayer.disableLoop(); //disable loop.
FULL Function Code:
#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); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.setTimeOut(500); //Set serial communictaion time out 500ms //----Set volume---- myDFPlayer.volume(10); //Set volume value (0~30). myDFPlayer.volumeUp(); //Volume Up myDFPlayer.volumeDown(); //Volume Down //----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); //----Mp3 control---- // myDFPlayer.sleep(); //sleep // myDFPlayer.reset(); //Reset the module // myDFPlayer.enableDAC(); //Enable On-chip DAC // myDFPlayer.disableDAC(); //Disable On-chip DAC // myDFPlayer.outputSetting(true, 15); //output setting, enable the output and set the gain to 15 //----Mp3 play---- myDFPlayer.next(); //Play next mp3 delay(1000); myDFPlayer.previous(); //Play previous mp3 delay(1000); myDFPlayer.play(1); //Play the first mp3 delay(1000); myDFPlayer.loop(1); //Loop the first mp3 delay(1000); myDFPlayer.pause(); //pause the mp3 delay(1000); myDFPlayer.start(); //start the mp3 from the pause delay(1000); myDFPlayer.playFolder(15, 4); //play specific mp3 in SD:/15/004.mp3; Folder Name(1~99); File Name(1~255) delay(1000); myDFPlayer.enableLoopAll(); //loop all mp3 files. delay(1000); myDFPlayer.disableLoopAll(); //stop loop all mp3 files. delay(1000); myDFPlayer.playMp3Folder(4); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535) delay(1000); myDFPlayer.advertise(3); //advertise specific mp3 in SD:/ADVERT/0003.mp3; File Name(0~65535) delay(1000); myDFPlayer.stopAdvertise(); //stop advertise delay(1000); myDFPlayer.playLargeFolder(2, 999); //play specific mp3 in SD:/02/004.mp3; Folder Name(1~10); File Name(1~1000) delay(1000); myDFPlayer.loopFolder(5); //loop all mp3 files in folder SD:/05. delay(1000); myDFPlayer.randomAll(); //Random play all the mp3. delay(1000); myDFPlayer.enableLoop(); //enable loop. delay(1000); myDFPlayer.disableLoop(); //disable loop. delay(1000); //----Read imformation---- Serial.println(myDFPlayer.readState()); //read mp3 state Serial.println(myDFPlayer.readVolume()); //read current volume Serial.println(myDFPlayer.readEQ()); //read EQ setting Serial.println(myDFPlayer.readFileCounts()); //read all file counts in SD card Serial.println(myDFPlayer.readCurrentFileNumber()); //read current play file number Serial.println(myDFPlayer.readFileCountsInFolder(3)); //read fill counts in folder SD:/03 } 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 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; } }
Leave a Reply
You must be logged in to post a comment.