Les Carnets de Byfeel domotique , Objets connectés , DIY , Programmation, Nouvelles Technologies ….

DIY Un lecteur MP3

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

Le DFPlayer mini

Vous pouvez trouvez la doc détaillée de ce module sur le site de DFRobot.

PIN DFPlayer mini
PINDescriptionRemarque
VCCAlimentation +Entre 3,2 et 5V
RXEntrée Donnée Serie
TXSortie Donnée Série
DAC_RSortie audio droitePour prise casque audio / ampli
DAC_LSortie audio gauchePour prise casque audio / ampli
SPK_1haut parleur externe +3W maxi
GNDAlimentation –Masse
SPK_2haut parleur externe –
BUSYEtat lectureEtat bas pour lecture / état haut si arrêt
USB –Port USBPermet de relier port USB pour lire sur stockage externe
USB +Port USB
ADKEY_2AD port 2permet d’envoyer des commandes via un réseau de BP.
ADKEY_1AD port 1plus de détails sur le site de DFRobot.
IO_2Entrée 2 BPPression courte NEXT / Pression longue VOLUME +
IO_1Entrée 1 BPPression courte PREC / Pression longue VOLUME –

Schema de connexion

Ci dessous le schema de connection avec le Wemos Mini.

Schéma de connexion

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.

exemple arborescence de la carte SD

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.

Module amplification

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”

Les commentaires sont fermés.