Lecteur MP3

Un seul composant a tout faire, le mini lecteur MP3 DFPlayer.

Principe Le mini lecteur MP3 DFPlayer pour Arduino est un module MP3 de petit prix offrant une sortie simplifiée directement au haut-parleur.
Le module peut être utilisé de manière autonome avec une batterie, un haut-parleur et des boutons-poussoirs, ou être utilisé en combinaison avec un Arduino ou tout autre appareil doté d'une transmission série RX / TX.
Spécifications Taux d'échantillonnage pris en charge (kHz): 8/11,025/12/16/22.05/24/32/44.1/48 kHz
Sortie DAC 24 bits, prise en charge de la plage dynamique 90 dB.
Supporte les systèmes de fichiers FAT16, FAT32, 32G octet maximum.
Une variété de modes de contrôle, mode de contrôle E/S, mode série, mode de contrôle du bouton AD.
La musique peut être suspendue.
Données audio triées par dossier, prend en charge jusqu'à 100 dossiers; chaque dossier peut contenir jusqu'à 255 chansons
Volume réglable sur 30 niveaux, EQ réglable sur 6 niveaux
Brochage
PinDescriptionNotePinDescriptionNote
VccTension d'entréeDC 3,2 à 5V, typique 4,2VBUSYStatus de lecture0 Lecture/1 Non lecture
RxUART réception USB-USB- DM 
TxUART émission USB+USB+ DP 
DAC_RSignal casque audio droit ADKEY_2AD Port2Déclenche le premier segment
DAC_LSignal casque audio gauche ADKEY_1AD Port1Déclenche le 5ème segment
SPK_1Speaker, Haut parleur +Puissance inférieure à 3WIO2port trigger 2Appui court pour lire le suivant (appui long pour augmenter le volume)
GNDMasseGNDMasse
SPK_2Speaker, Haut parleur +Puissance inférieure à 3WIO1port trigger 1Appui court pour lire le précédent (appui long pour diminuer le volume)

Remarque: appuyez brièvement sur le bouton avant / suivant, et appuyez longuement sur le bouton vol-, vol +
Protocole En mode travail

Mode série

Prise en charge du mode de communication série asynchrone
Norme de communication: 9600 bps
Bits de données : 8
Bit de stop: 1
Parité: aucune
Contrôle de flux: aucun

Chaque commande commence par un octet d'entête (toujours 0x7E), suivi d'un numéro de version (toujours 0xFF), puis de la taille de la commande (toujours 0x06).
Vient ensuite la commande elle-même (un octet), suivi d'un octet permettant d'activer ou non le retour d'informations et de deux octets de paramètres pour la commande en cours.
Pour finir, une commande se termine toujours par l'octet 0xEF

Description du format

OctetDésignationCommentairesExemple
0x7EDébut $SCommande de démarrage0x7E
VERVersionInformation de version
toujours 0xFF
0xFF
LENNombre d'octetsNombre d'octets à partir d'ici
jusqu'à PARA2 inclus
0x06
CMDCommandeIndique l'opération spécifique0x09
FEEDBACKRetour de commandeSi besoin de retour,
1: retour, 0 pas de retour
0x00
PARA1Paramètre 1Requête octet haut0x00
PARA2Paramètre 2Requête octet bas0x04
CHECKSUMChecksumOctet de vérification
Pas obligatoire
0xFE 0xEE
0xEFFin $SCommande de fin 0xEF
pour le checksum, si je prends l'exemple ci-dessus:
CHECKSUM=0x10000-(0xFF+0x06+0x09+0x00+0x00+0x04)=0xfeee soit DH=0xFE et DL=xEE

Commandes

CMDFonctionParamètre (16bits)
DATA HDATA L
0x01Suivant0x000x00
0x02Précédent0x000x00
0x03Piste précise0 à 2999
0x04Augmente volume +0x000x00
0x05Baisse volume -0x000x00
0x06Spécifiez le volume. (0 à 30) 0: Muet, 30: Maximum (valeur initiale)0x000 à 0x1E
0x07Spécifie égaliseur (00: valeur initiale)0x0000: normal
01: Pop
02: Rock
03: Jazz
04: Classique
05: Basse
0x08spécifie le mode de lecture
Non/Répéter répertoire/Répéter musique/Aléatoire
0x000/1/2/3
0x09Spécifie la source de lecture0x000: Aucun
1: clef USB
2: carte SD (SDCARD)
4: PC (AUX)
8: Mémoire flash
0x0AEntre en veille - faible consommation0x000x00
0x0BFonctionnement normal0x000x00
0x0CReset module0x000x00
0x0Dplayback0x000x00
0x0EPause0x000x00
0x0FSpécifiez le dossier et le numéro de piste et lancez la lecture.
(Dossier: 01 - 99, piste: 01 - 255)
Numéro de dossierNuméro de piste
0x10Étendre la localisation du son. (Stéréo Enhancer)
(00: valeur initiale désactivée) (montant de l'effet 0 à 31) 0: petit,
00: effet OFF
01 :effet ON
Gain de 0 à 31
0x11Boucle pour toute la musique0x0000 (arrêter la mise en boucle)
01 (commencer la mise en boucle)
0x12Spécifier une chanson dans un dossier nommé MP3Numéro de piste octet hautNuméro de piste octet bas
0x13Insère un fichier de chanson nommé ADVERT
comme une autre piste en cours de lecture
Numéro de piste octet hautNuméro de piste octet bas
0x14Spécifiez un fichier pour la lecture en boucle de pistes
(jusqu'à 15 dossiers pris en charge et jusqu'à 3000 pistes prises en charge)
4bits dossier + 4bits haut piste8 bits piste bas
0x15Arrêtez la lecture des morceaux insérés et reprenez la lecture du morceau qui vous intéresse.0x000x00
0x16Arrête de jouer de la musique0x000x00
0x17Répéter la lecture des fichiers du dossier spécifié.0x00Numéro de dossier
0x18Mélangez et lisez tous les fichiers de l'appareil.0x000x00
0x19Répéter (une seule piste)0x000x00
0x1AON/OFF de la sortie DAC0x000:ON
1:OFF
0x28Mélangez les fichiers dans le dossier spécifié.0x00Numéro de dossier
0x2ALisez tous les fichiers du dossier spécifié.0x00Numéro de dossier
0x3A(Notification) Périphérique inséré.
- L'envoi de cette commande ne fonctionne pas -
 01: mémoire USB
02: carte SD
04 :PC (AUX)
0x3B(Notification) Périphérique inséré.
- L'envoi de cette commande ne fonctionne pas -
 01: mémoire USB
02: carte SD
04 :PC (AUX)
0x3C(Notification) Lecture de fichiers de la clé USB.
- L'envoi de cette commande ne fonctionne pas -
 01: mémoire USB
02: carte SD
04 :PC (AUX)
0x3CReste 
0x3DReste 
0x3EReste 
0x3FInterroge le type du périphérique actuellement sélectionné
(Notification) Type de périphérique sélectionné et initialisé.
0x000: Aucun
1: clef USB
2: carte SD (SDCARD)
4: PC (AUX)
8: Mémoire flash
0x40(Notification) Une erreur est survenue.
01: le système est dans l'état BUSY.
02: Erreur de sélection de périphérique en mode veille.
03: Erreur de réception en série.
04: erreur de somme de contrôle
05: au-delà de la plage de spécification de fichier
06: Le fichier spécifié est introuvable
07: erreur de commande
0x00Numéro d'erreur
0x41Réception acceptée de la commande (notification) normalement.
Sélectionné par "l'indicateur de retour" de la chaîne de commande.
0x000x00
0x42Interroger l'état actuel de l'opération.0: Aucun
1: clef USB
2: carte SD (SDCARD)
4: PC (AUX)
8: Mémoire flash
00: arrêt
01: jouer
02: en pause
0x43Interroger le volume actuel0x00Volume de 0x00 à 0x1E
0x44Interroger le réglage actuel de l'égaliseur.0x00Valeur de l'égaliseur
0x45Interroger le mode de lecture actuel
00: lecture normale. (Lecture indépendante)
01: Répétez la lecture dans le dossier.
02: Répétez la lecture d'une chanson.
03: Lecture aléatoire des pistes de l'appareil.
04: Lecture aléatoire des pistes du dossier.
05: Lire toutes les pistes du dossier.
0x00Mode de lecture
0x46Interroger la version du logiciel.Numéro de versionNuméro de version
0x47Interrogez le nombre total de fichiers dans la mémoire USBnombre de fichiers octet hautnombre de fichiers octet bas
0x48Interrogez le nombre total de fichiers sur la carte SD.nombre de fichiers octet hautnombre de fichiers octet bas
0x49Interrogez le nombre total de fichiers dans la mémoire flash.nombre de fichiers octet hautnombre de fichiers octet bas
0x4A- Réservé -  
0x4BInterroger la position actuelle du fichier de la clé USB4bits dossier + 4bits haut piste8 bits piste bas
0x4CInterroger la position actuelle du fichier de la carte SD4bits dossier + 4bits haut piste8 bits piste bas
0x4DInterroger la position actuelle du fichier de la mémoire flash4bits dossier + 4bits haut piste8 bits piste bas
0x4EInterroge le nombre total de pistes dans le dossier spécifié.
(Répondre) Nombre de pistes.
0x000x00
0x4FInterrogez le nombre de dossiers du périphérique. 0x000x00

Utilisation

Initialisation

Procédure d'opération de port série

Précautions pour l’utilisation du port série nécessitant un délai.

Les données d'initialisation du module, y compris les périphériques en ligne, telles que l'envoi 7E FF 06 3F 00 00 01 xx xx EF, DL = 0x01 décrivent uniquement le disque USB en ligne lors de la mise sous tension.
D'autres données figurent dans le tableau ci-dessous:
USB en ligne7E FF 06 3F 00 00 01 xx xx EF
SD Card en ligne7E FF 06 3F 00 00 02 xx xx EF
PC en ligne7E FF 06 3F 00 00 04 xx xx EF
FLASH en ligne7E FF 06 3F 00 00 08 xx xx EF
USB & SD Card en ligne7E FF 06 3F 00 00 03 xx xx EF
La MCU n’enverra pas les commandes de contrôle correspondantes avant l’initialisation des commandes d’envoi du module ou le module ne traitera pas les commandes envoyées par la MCU et affectera également l’initialisation normale du module.

Données renvoyées du fichier en cours de lecture

USB finish playback 1st track7E FF 06 3C 00 00 01 xx xx EF
USB finish playback 2nd track7E FF 06 3C 00 00 02 xx xx EF
SD card finish playback 1st track7E FF 06 3D 00 00 01 xx xx EF
SD card finish playback 2nd track7E FF 06 3D 00 00 02 xx xx EF
Flash finish playback 1st track7E FF 06 3E 00 00 01 xx xx EF
Flash finish playback 2nd track7E FF 06 3E 00 00 02 xx xx EF

La gestion des fichiers

L'index correspond au numéro du fichier dans la liste de tous les fichiers sur la carte SD (sous dossiers inclus), triés par date de création physique (le moment où vous copier / coller le fichier ou que vous le créer directement sur la carte).
Le premier fichier que vous copié sur la carte SD est le numéro 1, le second est le numéro 2, etc.

Pour la partie MP3 (Commande 0x12):

Le(s) fichier(s) dans le dossier MP3 DOIT être nommé par un identifiant numérique à quatre chiffres.
Pour les numéros de fichiers inférieurs à 1000, un, deux ou trois 0 doit être ajouté pour obtenir quatre chiffres.
Exemple : 0000.mp3, 0001.mp3, 0002.mp3, 0015.mp3, 0025.mp3, 0100.mp3, 0125.mp3, 1000.mp3, 9999.mp3.

N.B. Le numéro de fichier va de 0000 à 9999. Il n'est pas possible d'avoir plus de 10000 fichiers par dossier avec cette fonction, et c'est déjà pas mal

PS: vous pouvez ajouter du texte APRÈS le nombre. Exemple : 0042_smooth_criminal.mp3

C'est la solution la plus simple à mettre en œuvre. Il suffit de créer un dossier MP3 (ou mp3, peut importe) à la racine de la carte SD et de renommer chaque fichier avec un nombre à quatre chiffres en début de nom.
Pas d'index de fichier à gérer, pas de mauvaise surprise avec la convention de nommage, ça marche.

Exemples

Choisir microSD card 7E FF 06 09 00 00 02 EF

Spécifiez le nom du dossier 01 et le nom de fichier 001xxx.mp3  7E FF 06 0F 00 01 01 EF
Spécifiez le nom du dossier 11 et le nom de fichier 100xxx.mp3  7E FF 06 0F 00 0B 64 EF
Spécifiez le nom du dossier 99 et le nom de fichier 001xxx.mp3  7E FF 06 0F 00 63 01 EF

Lire le fichier 0001 (nom de le fichier) dans le dossier MP3  7E FF 06 12 00 00 01 FE E8 EF
Lire le fichier 0002 (nom de le fichier) dans le dossier MP3  7E FF 06 12 00 00 02 FE E7 EF
Lire le fichier 0255 (nom de le fichier) dans le dossier MP3  7E FF 06 12 00 00 FF FD EA EF
Lire le fichier 1999 (nom de le fichier) dans le dossier MP3  7E FF 06 12 00 07 CF FE 13 EF
Lire le fichier 3000 (nom de le fichier) dans le dossier MP3  7E FF 06 12 00 0B B8 FE 26 EF

Lire le fichier 0255 (nom de le fichier) dans le dossier 0001  7E FF 06 14 00 10 FF FD D8 EF   0x1 0FF 4bits+12bits
Lire le fichier 1999 (nom de le fichier) dans le dossier 0001  7E FF 06 14 00 17 CF FE 01 EF   0x1 4CF 4bits+12bits
Lire le fichier 0001 (nom de le fichier) dans le dossier 0012  7E FF 06 14 00 C0 01 FE 26 EF   0xC 001 4bits+12bits
Lire le fichier 0255 (nom de le fichier) dans le dossier 0012  7E FF 06 14 00 C0 FF FD 28 EF   0xC 0FF 4bits+12bits
Lire le fichier 1999 (nom de le fichier) dans le dossier 0012  7E FF 06 14 00 C7 CF FD 51 EF   0xC 7CF 4bits+12bits
Début de la boucle  7E FF 06 11 00 00 01 EF
Stop de la  boucle  7E FF 06 11 00 00 00 EF

Le minimum :

void send_mp3(byte command, byte data_h, byte data_l, unsigned long cmd_delay) {
  Serial.write((byte)0x7E);
  Serial.write((byte)0xFF);
  Serial.write((byte) 0x06);
  Serial.write(command);
  Serial.write((byte) 0x00);
  Serial.write((byte) data_h);
  Serial.write((byte) data_l);
  Serial.write((byte) 0xEF);
  delay(cmd_delay); //200ms
}
void setup() {
    send_mp3(0x0C, 0, 0, 1500);      //Reset module
    send_mp3(0x09, 0, 2, 200);      //0x02 SDCARD
    send_mp3(0x06, 0, 15, 20);      //Volume à 15
    send_mp3(0x03, 0, 1, 20);       //Lit le premier fichier 0x00 01
}
void loop() {
}