Je viens de recevoir , mon mini DFPlayer , un petit module pour lire des fichiers mp3 présent sur une carte SD , que l’on peut trouver pour 2 € , dans la plupart des magasins chinois.
Ce module , va permettre à votre Mini wemos ( ou tout autre module compatible avec les bibliothèques Arduino ), de jouer des morceaux MP3 présent sur une carte Micro SD.
je vous propose d’étudier ensemble les possibilités offertes par ce module . Afin de pouvoir l’intégrer dans un projet nécessitant une lecture de mp3 ou une futur version du notifheure si possible.
La liste du matériel
- Un wemos mini D1 , ou tout autre module ESP8266 compatible ( Chez banggood à moins de 3 € )
- le DFplayer mini
- Un mini speaker ( 3w maxi – 4 ohm ) , j‘utilise ce modèle .
Le DFPlayer mini
Vous pouvez trouvez la doc détaillée de ce module sur le site de DFRobot.
PIN | Description | Remarque |
VCC | Alimentation + | Entre 3,2 et 5V |
RX | Entrée Donnée Serie | |
TX | Sortie Donnée Série | |
DAC_R | Sortie audio droite | Pour prise casque audio / ampli |
DAC_L | Sortie audio gauche | Pour prise casque audio / ampli |
SPK_1 | haut parleur externe + | 3W maxi |
GND | Alimentation – | Masse |
SPK_2 | haut parleur externe – | |
BUSY | Etat lecture | Etat bas pour lecture / état haut si arrêt |
USB – | Port USB | Permet de relier port USB pour lire sur stockage externe |
USB + | Port USB | |
ADKEY_2 | AD port 2 | permet d’envoyer des commandes via un réseau de BP. |
ADKEY_1 | AD port 1 | plus de détails sur le site de DFRobot. |
IO_2 | Entrée 2 BP | Pression courte NEXT / Pression longue VOLUME + |
IO_1 | Entrée 1 BP | Pression courte PREC / Pression longue VOLUME – |
Schema de connexion
Ci dessous le schema de connection avec le Wemos Mini.
Les PIN reliant à RX et TX , peuvent être différentes de D2 et D8 , que j’ai choisis. Ne pas utiliser les entrées TX et RX du Wemos ( elles servent pour un autre usage ). Pourquoi j’ai choisi ces PIN , tout simplement , ce sont les Deux PINs de libres qui me restait sur mon Notifheure.
Selon les PINs retenues , par exemple ici D2 ( wemos) relié à Tx ( dfplayer ) , la PIN D2 sera vu par la librairie softwareSerial comme Rx du coté Wemos , et la PIN D8 , comme Tx du coté Wemos.
Préparation de la carte SD
La carte SD , devra être formatée en fat32 et d’une capacité entre 4 et 32 Go. J’ai testé avec une carte micro SD de 16 Go , formaté en fat32 sous Mac Osx.
Les fichiers mp3 , peuvent être déposés à la racine ou dans des dossiers.
Chaque fichier mp3 placé à la racine , doit commencer par 4 digit : Exemple le premier morceau sera 0001.mp3 , après les 4 digits , il peut y avoir d’autres caractères .
il est possible d’aller jusqu’a 2999 fichier à la racine.
exemple : 0001Bowie.mp3 , 0002.mp3 , 0003-Queen-bohemian.mp3 etc …..
Dans un premier temps , on va se contenter de mettre quelques fichiers à la racine de la carte.
Sous MAC os X , le systéme de fichier à tendance à ajouter des fichiers cachés sous la forme ._0001.mp3 ,afin d’indexer ces derniers. Ces fichiers , sont vu par le DFplayer comme des pistes de lectures possibles et peuvent donc entrainer des erreurs. Apés avoir ajouté des fichiers , il faut penser à exécuter la commande suivante Depuis le terminal.
dot_clean /Volumes/NomSDCard ( remplacer NomSDCard , par le nom de votre carte SD )
Il est possible d’organiser les MP3 , en sous dossier . Il existe Deux types de classement possible et deux dossier spéciaux :
- Dossier de 00 à 10 : Peuvent contenir jusqu’a 1000 fichiers , codés de 000.mp3 à 999.mp3 ( codage sur 3 digits )
- ou Dossier de 00 à 99 : Peuvent contenir jusqu’a 255 fichiers , codés de 000.mp3 à 254.mp3
- MP3 : les fichiers mp3 , peuvent être nommé de 0000 à 65535 ( codage sur 4 digits )
- ADVERT : les fichiers mp3 , peuvent être nommé de 0000 à 65535 . Ce dossier est utilisé pour sélectionner des sons qui viendront interrompre la musique en cours , diffusera le son d’interruption et reprendra la musique ou elle s’était interrompu.
On verra , dans un second temps , comment appeler ces fichiers situés dans ces dossiers.
Le Programme
Inclusion des bibliothéques :
La bibliothèque SoftwareSerial est inclus dans l’ide Arduino , la bibliothèque Dfplayermini est à récupéré sur le lien suivant , ou directement sur le github de dfrobot : Github dfplayer
Copier le dossier récupéré dans le répertoire library de l’arduino.
Le Sketch
Afin de tester , notre montage , j’ouvre l’IDE Arduino je créé un nouveau sketch et je copie le script suivant.
// Bibliothèque à inclure au minimum
#include "SoftwareSerial.h" // pour les communications series avec le DFplayer
#include "DFRobotDFPlayerMini.h" // bibliotheque pour le DFPlayer
// PIN qui serviront pour la communication série sur le WEMOS
SoftwareSerial mySoftwareSerial(D2,D8); // RX, TX ( wemos D2,D8 ou 4,15 GPIO ) ou Tx,RX ( Dfplayer )
DFRobotDFPlayerMini myDFPlayer; // init player
void setup() {
mySoftwareSerial.begin(9600);
Serial.begin(115200); // optionnel pour info dans terminal
if (!myDFPlayer.begin(mySoftwareSerial)) { //Utilisation de softwareSerial pour communiquer
Serial.println(F("Pb communication:"));
Serial.println(F("1.SVP verifier connexion serie!"));
Serial.println(F("2.SVP verifier SDcard !"));
while(true);
}
Serial.println(F("DFPlayer Mini En ligne."));
myDFPlayer.setTimeOut(500); // Définit un temps de time out sur la communication série à 500 ms
//----Controle volume----
myDFPlayer.volume(18); //Monte le volume à 18 ( valeur de 0 à 30 )
// ---- indique d'utiliser le player de carte SD interne
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
// optionel , permet d'afficher quelques infos
Serial.println(myDFPlayer.readFileCounts()); //Le nombre total de fichier mp3 sur la carte ( dossier inclus )
Serial.println(myDFPlayer.readCurrentFileNumber()); // l'index courant
// Joue le premier morceau de la liste
myDFPlayer.play(1);
}
void loop() {
}
Ce script est assez simple à comprendre , il permet d’initialiser le dfplayer , puis de lire le premier fichier mp3 trouvé sur la microSD.
SoftwareSerial mySoftwareSerial(D2,D8); permet d’initialiser la bibliothèque SoftwareSerial entre les PIN du démos en relation avec les PIN Rx et TX du DFplayer. Attention à l’ordre des PIN , qui est RX, TX du coté Wemos ou TX, RX du coté DFplayer.
DFRobotDFPlayerMini myDFPlayer; pour initialiser notre objet myDFplayer.
Dans la boucle Setup() , la commande mySoftwareSerial.begin(9600); permet de demarrer la communication serie avec le DFplayer.
La commande myDFPlayer.begin(mySoftwareSerial) , permet de verifier si la communication est bien établis avec le DFplayer.
Paramètre du DFplayer :
myDFPlayer.setTimeOut(500); Configure in TimeOut par défaut pour le port série
myDFPlayer.volume(18); Configure un volume de 18 par défaut ( valeur possible entre 0 et 30 )
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); Configure la source par defaut ( ici Lecteur SD ) autre valeur possible ( DFPLAYER_DEVICE_U_DISK , DFPLAYER_DEVICE_AUX , DFPLAYER_DEVICE_SLEEP , DFPLAYER_DEVICE_FLASH ).
Info DFPlayer :
Serial.println(myDFPlayer.readFileCounts()); Affiche le nombre total de fichier mp3 présent sur la carte SD
Serial.println(myDFPlayer.readCurrentFileNumber()); Affiche l’index du numéro de piste , l’index démarre à 0 . Par exemple pour le titre 1 , l’index sera 0 , pour 2 -> 1 etc …. L’index est donc compris entre 0 et le nombre total de fichier – 1.
d’autres infos possibles avec :
Serial.println(myDFPlayer.readState()); Affiche l’etat du lecteur ( par exemple 513 en lecture et 512 à l’arrêt )
Serial.println(myDFPlayer.readVolume()); Affiche le niveau du volume.
myDFPlayer.readFileCountsInFolder(1); recupére le nombre de fichier dans le dossier 01
myDFPlayer.readFolderCounts(); récupère le nombre de dossier
Lecture fichier :
myDFPlayer.play(1); Permet de jouer le premier morceau de la liste , pour le deuxième play(2) , etc ….
Cette fonction , se contente juste de lire le premier fichier mp3 , puis ne fait plus rien.
Variante du sketch
Ci dessous différentes commandes.
A la place de myDFPlayer.play(1);
on choisi la commande myDFPlayer.loop(1); la paiste 1 sera joué à l’infini.
myDFPlayer.enableLoopAll(); La commande jouera tous les morceaux , les uns après les autres à l’infini. ( l’option disableLoopAll() , désactivera le bouclage des mp3 ).
myDFPlayer.randomAll(); joue toutes les pistes aléatoirement.
Jouer les morceaux dans un dossier spécifique : Ci dessous , un exemple de l’arborescence de la carte SD , qui me sert pour ce test.
Selon le type de dossier choisis de 0 à 10 ( fichier de 000 à 999 )
myDFPlayer.playLargeFolder(2, 999); Permet de lire le fichier 999 du dossier 02
ou dossier de 00 à 99 ( fichier mp3 de 000 à 254 )
myDFPlayer.playFolder(1, 9); Permet de lire le fichier numero 009 du dossier 01 ( exemple arborescence présenté au dessus ).
myDFPlayer.loopFolder(1); Joue , en boucle tous les morceaux présents dans le dossier 01
myDFPlayer.playMp3Folder(1); Permet de lire le fichier 0001 du dossier MP3
Le dossier Advertise :
Ce dossier permet de jouer , un son , qui viendra interrompre la musique en cours , puis à la fin de ce dernier , la musique reprend, là ou elle s’est arrêté.
myDFPlayer.advertise(9); Permet de lire le fichier 0009 du dossier ADVERT , la fonction ne se déclenche que si une musique est en train d’être joué.
Pour tester , je rajoute dans la boucle loop() les lignes suivantes :
setup() {
.....
myDFPlayer.randomAll();
...
}
void loop() {
static unsigned long timer = millis();
if (millis() - timer > 20000) {
timer = millis();
Serial.println("joue l'interruption toutes les 20s");
myDFPlayer.advertise(9);
}
}
La fonction randomAll() , joue un morceau aléatoire , et toute les 20 secondes , le son 0009 vient interrompre la musique en cours.
Les autres Paramètres / Fonctions
Gestion du volume
myDFPlayer.volumeUp(); Augmenter le volume.
myDFPlayer.volumeDown(); Diminue le volume .
Egaliseur
Il existe 6 mode pré-réglé d’égalisation audio .
DFPLAYER_EQ_NORMAL , DFPLAYER_EQ_POP , DFPLAYER_EQ_ROCK , DFPLAYER_EQ_JAZZ , DFPLAYER_EQ_CLASSIC ou DFPLAYER_EQ_BASS .
Pour activer un de ces égaliseur , il faut utiliser la fonction EQ();
par exemple pour le réglage Rock : myDFPlayer.EQ(DFPLAYER_EQ_ROCK);
Commande de contrôle
myDFPlayer.next(); Passe au morceau suivant
myDFPlayer.previous(); Passe au morceau précédent
myDFPlayer.pause(); Met en pause
myDFPlayer.start(); Reprend , après une pause
Gestion module
myDFPlayer.sleep(); pour mettre en veille prolongé
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD); pour réactiver le lecteur sur SDcard
myDFPlayer.reset(); pour une remise à zero du module .
Information état DFPlayer
myDFPlayer.readType() ; Renvoie l’état en cours du DFPlayer , code de 0 à 11 .
Extrait des codes d’état , dans bibliothèque Dfplayermini
#define TimeOut 0
#define WrongStack 1
#define DFPlayerCardInserted 2
#define DFPlayerCardRemoved 3
#define DFPlayerCardOnline 4
#define DFPlayerPlayFinished 5
#define DFPlayerError 6
#define DFPlayerUSBInserted 7
#define DFPlayerUSBRemoved 8
#define DFPlayerUSBOnline 9
#define DFPlayerCardUSBOnline 10
#define DFPlayerFeedBack 11
Par exemple le script suivant passe à la chanson suivante à chaque fin de chanson ( dans boucle )
void loop() {
if (myDFPlayer.readType() == DFPlayerPlayFinished ) { // si fin de chanson
Serial.println("fin chanson");
myDFPlayer.next();
delay(1000);
}
}
myDFPlayer.read() : Renvoie le numero de l’index en cours si lecture , ou code Erreur si DFPlayerError
description code erreur :
#define Busy 1
#define Sleeping 2
#define SerialWrongStack 3
#define CheckSumNotMatch 4
#define FileIndexOut 5
#define FileMismatch 6
#define Advertise 7
A quoi ça peut servir ?
Une fois le module DFplayer bien maitrisé , il va être possible de mettre en place plusieurs projets , ayant besoin de jouer un fichier MP3, aussi bien pour de la musique ( comme lecteur MP3 , radio , etc … ou fichier son , pour des notifications , alarmes , etc … )
Par exemple , pour le Notifheure , cela va me permettre d’avoir une notification sonore ( plus sympa qu’un buzzer ) , pour chaque Message. Une nouvelle fonctionnalité Radio Réveil , pour se lever avec sa playlist favorite. etc…. et pleins d’autres idées.
Pour des projets , ayant besoin de plus de puissance sonore , il est possible d’associer un module d’amplification , comme le module PAM8403 ( 3 € sur Amazon ). ou tout autre systéme d’amplification , par exemple récupérer une enceinte amplifié qui taine dans un coin de la cave.
On se branchera à la place sur les sorties DAC_R et DAC_L , à la place des SPK_1 et SPK_2.
A vous d’imaginer la suite , vous avez toutes les commandes ( du moins les principales ) , pour intégrer du MP3 , dans tous vos projet DIY. Si cet article , vous a permis d’avancer sur des projets , merci de votre retour .
6 commentaires sur “DIY Un lecteur MP3”
J’ai deja fait une integr du dfplayer avec Notifheure mais le port D8 pour le bouton du notif heure rentre en conflit avec celui du dfplayer. J’ai réussi a tiut faire fonctionner mais par manque de temps je n’ai pas fini le boulot pour faire un projet fonctionnel.
bonjour landry ,
le port D8 sur le wemos mini , correspond au numero 15 du GPIO , pas de conflit avec les boutons qui sont sur les GPIO ( 0 et 2 ) égale à la notation Wemos Mini D3 et D4.
Je suppose que tu utilises un Wemos D1 , sur le D1 , la GPIO 15 est égale à l’entrée D10 ( au lieu de D8 sur le Mini ), effectivement sur le D1 , la pin D8 est égale à la GPIO 0 utilisé par un des boutons.
J’utilise un wemos D1 mini. J’ai donc modifié mes ports et cela fonctionne avec Notif’heure.
En fonction du message envoyer sur l’afficheur cela lance la lecteur ou la mets en pause.
Par contre j’ai souvent des retours d’erreur (-1) sur ce type de commande myDFPlayer.readFileCounts(), myDFPlayer.readVolume(), …
Merci pour le retour , je suis un peu débordé en ce moment . Mais je vais regarder ça , quand je vais m’attaquer à la nouvelle version du notifheure.
Bonjour,,très intéressant cela pour le notif heure en particulier. Je pense en refaire un autre pour afficher l’état de l’alarme, ça pourrait être bien pour le faire en plus parler. Merci pour le partage, c’est top.