Composants · 17 min de lecture

DFPlayer Mini Arduino : lire des MP3, carte SD et haut-parleur

Utiliser le DFPlayer Mini avec Arduino : résistance de 1k sur RX, carte SD et noms 0001.mp3, code de la bibliothèque, boutons, haut-parleur, ESP32 et Pico.

Le DFPlayer Mini est le moyen le moins cher et le plus simple de lire des MP3 avec Arduino : il décode tout seul les fichiers audio d'une carte microSD, alimente directement un haut-parleur grâce à son petit amplificateur intégré et reçoit les commandes de l'Arduino par une liaison série à deux fils seulement. Contrairement aux bips d'un buzzer, il peut jouer des chansons, de la voix, des mélodies de sonnette ou des messages parlés comme "La porte est restée ouverte". Presque tous ceux qui le branchent pour la première fois rencontrent les mêmes problèmes : pas de son, un haut-parleur qui grésille, des fichiers lus dans le désordre ou le message "Unable to begin" dans le moniteur série. Ce guide résout chacun d'eux et explique d'où il vient.

Tu vas d'abord découvrir les broches du module et pourquoi on place une résistance de 1 kΩ sur la ligne RX. Ensuite, tu verras comment préparer la carte SD en FAT32, nommer les fichiers selon le schéma 0001.mp3 et dossiers 01, jouer ton premier son avec la bibliothèque DFRobotDFPlayerMini, régler le volume et l'égaliseur, changer de piste avec des boutons et choisir le bon haut-parleur ou un ampli externe. Les dernières sections présentent la solution pas à pas à l'erreur "Unable to begin", un lecteur MP3 avec ESP32 piloté depuis une page web et un exemple MicroPython sans bibliothèque pour le Raspberry Pi Pico. Si un bip ou une mélodie simple te suffit, un buzzer est l'option la plus simple.

Module lecteur MP3 DFPlayer Mini
DFPlayer Mini : seulement 20 × 20 mm, avec un lecteur de carte microSD, une puce de décodage MP3 et un petit amplificateur capable d'alimenter un haut-parleur jusqu'à 3 W.

Qu'est-ce que le DFPlayer Mini et comment fonctionne-t-il ?

Le DFPlayer Mini est un lecteur MP3 autonome composé d'une puce de décodage MP3, d'un DAC 24 bits, d'un lecteur de carte microSD et d'un petit amplificateur mono. L'Arduino n'a qu'à envoyer de courtes commandes comme "joue la piste 3" ou "règle le volume sur 20" ; lire le fichier sur la carte, décoder le son compressé et alimenter le haut-parleur, c'est le travail du module. C'est pourquoi même un Arduino Uno avec 2 Ko de RAM peut lire de la musique sans effort. Les commandes sont envoyées à 9600 bauds par paquets de 10 octets, et le module répond dans le même format quand une piste se termine, qu'une carte est insérée ou retirée ou qu'une erreur survient. La puce de la carte dépend du fabricant (YX5200-24SS, MH2024K-24SS, GD3200B et d'autres). Toutes comprennent les mêmes commandes, mais leurs temps de réponse peuvent varier, un détail qui comptera plus loin avec l'erreur "Unable to begin". Le module se pilote de trois façons : par le port série (UART), avec les boutons IO ou avec une échelle de résistances ADKEY.

CaractéristiqueValeur
Fichiers pris en chargeMP3, WAV, WMA
Fréquences d'échantillonnage8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz
DAC24 bits ; 90 dB de dynamique, 85 dB de rapport signal/bruit
StockageCarte microSD (TF) jusqu'à 32 Go, FAT16 ou FAT32 ; les clés USB sont aussi prises en charge
Capacité en dossiersJusqu'à 100 dossiers, 255 fichiers par dossier
Volume30 niveaux (0–30)
Égaliseur (EQ)6 modes : Normal, Pop, Rock, Jazz, Classic, Bass
Sortie haut-parleurAmplificateur mono intégré, haut-parleurs de moins de 3 W
Sortie ligneDAC_L et DAC_R : stéréo, pour casque ou ampli externe
Alimentation3,2–5,0 V (typique 4,2 V)
Courant au reposEnviron 20 mA
CommunicationUART, 9600 bauds, 8N1
Dimensions20 × 20 mm

Brochage du DFPlayer Mini

BrocheNomRôle
1VCCEntrée d'alimentation, 3,2–5,0 V
2RXEntrée série : reliée à la broche TX de la carte via une résistance de 1 kΩ
3TXSortie série : va vers la broche RX de la carte
4DAC_RSortie ligne canal droit (casque ou ampli)
5DAC_LSortie ligne canal gauche (casque ou ampli)
6 et 8SPK_1, SPK_2Sortie haut-parleur : les deux bornes d'un haut-parleur de moins de 3 W se branchent ici
7GNDMasse
9IO_1Appui court vers GND : piste précédente ; appui long : volume moins
10GNDMasse
11IO_2Appui court vers GND : piste suivante ; appui long : volume plus
12ADKEY1Entrée multi-boutons par échelle de résistances
13ADKEY2Deuxième entrée d'échelle de résistances
14USB+D+ pour une clé USB
15USB−D− pour une clé USB
16BUSYLOW pendant la lecture, HIGH au repos

En pilotage par le port série, seules les broches VCC, GND, RX, TX et celles du haut-parleur sont nécessaires. La broche BUSY t'indique si une piste est terminée sans aucune communication série, et la petite LED de la carte s'allume elle aussi pendant la lecture. Les broches IO_1 et IO_2 permettent même d'utiliser le module sans Arduino : avec un bouton entre chaque broche et GND, un appui court change de piste et un appui long règle le volume. Des boutons reliés aux broches ADKEY par des résistances de valeurs différentes peuvent aussi lancer des pistes précises. Une pile, un haut-parleur et deux boutons suffisent donc pour une sonnette ou un jouet parlant sans microcontrôleur. Les broches USB+ et USB− servent à lire depuis une clé USB au lieu de la carte SD et restent libres dans la plupart des projets.

Câblage du DFPlayer Mini avec Arduino et résistance de 1k sur RX

Broche DFPlayerArduino UnoESP32Raspberry Pi Pico
VCC5V5V (VIN)VBUS (USB 5 V, broche 40)
GNDGNDGNDGND
RXD11 via une résistance de 1 kΩGPIO 17 (TX2) via une résistance de 1 kΩGP0 (UART0 TX) via une résistance de 1 kΩ
TXD10GPIO 16 (RX2)GP1 (UART0 RX)
SPK_1 et SPK_2Les deux bornes du haut-parleurLes deux bornes du haut-parleurLes deux bornes du haut-parleur
BUSY (facultatif)D5Non utiliséeNon utilisée
Arduino Uno
Arduino Uno
ESP32
ESP32
Raspberry Pi Pico
Raspberry Pi Pico

Les lignes de données se croisent : le TX du module va au RX de la carte, et son RX au TX de la carte. Le port série matériel de l'Uno sur D0 et D1 sert au téléversement par USB et au moniteur série, donc on relie le module à D10 (RX) et D11 (TX) avec SoftwareSerial. La résistance de 1 kΩ en série avec l'entrée RX du module n'est pas un détail. La puce du DFPlayer fonctionne en logique 3,3 V, alors que la broche TX de l'Uno délivre 5 V. Sans résistance, cette différence fait circuler un courant dans les diodes de protection de l'entrée de la puce ; ce courant fatigue la puce et provoque les grésillements et les clics qu'on entend dans le haut-parleur pendant la communication série. Si tu fais le calcul avec la loi d'Ohm, tu verras que 1 kΩ limite ce courant à environ 1–2 mA, sans gêner le signal à 9600 bauds. Une résistance beaucoup plus grande, comme 10 kΩ, peut affaiblir le signal au point de couper la communication. La sortie TX du module se branche directement sur l'Uno, car l'Uno lit 3,3 V comme un HIGH (le seuil est d'environ 3,0 V).

Ne relie jamais SPK_1 ni SPK_2 à GND. L'amplificateur de la carte a une sortie en pont (BTL) : les deux bornes transportent le signal audio, et si l'une d'elles est mise à la masse, l'ampli est en court-circuit et peut griller. Pour la même raison, ne branche pas les broches SPK sur l'entrée d'un ampli externe ; utilise pour cela les sorties ligne DAC_L et DAC_R. Ne branche pas non plus de haut-parleur de moins de 4 Ω.

Préparer la carte SD : FAT32, dossiers et noms 0001.mp3

Le DFPlayer Mini lit les cartes microSD jusqu'à 32 Go formatées en FAT16 ou FAT32. Les cartes de 64 Go et plus sont livrées en exFAT, un format que le module ne lit pas ; pour quelques centaines de pistes, une carte de 1 à 16 Go suffit largement. Encoder les MP3 en 128–192 kbit/s et 44,1 kHz est le choix le plus sûr pour la compatibilité et la vitesse de lecture. Le module reconnaît les fichiers à leur numéro, pas à leur nom ; selon la fonction utilisée pour les lire, les noms de dossiers et de fichiers doivent suivre un schéma précis :

Emplacement sur la carteExempleFonction de la bibliothèqueRègle
Racine/0001.mp3, /0002.mp3play(1)Lit dans l'ordre de copie des fichiers sur la carte, pas selon leur nom
Dossiers numérotés/01/001.mp3 … /99/255.mp3playFolder(1, 1)Nom de dossier à 2 chiffres (01–99), nom de fichier à 3 chiffres (001–255)
Dossier mp3/mp3/0001.mp3playMp3Folder(1)Nom de fichier à 4 chiffres ; le fichier est trouvé grâce au numéro de son nom
Dossier advert/advert/0001.mp3advertise(1)Interrompt la piste en cours et la reprend à la fin de l'annonce
Grands dossiers/01/0001.mp3 … /15/3000.mp3playLargeFolder(1, 1)15 dossiers au maximum, 3000 fichiers par dossier, noms à 4 chiffres
  1. Formate la carte en FAT32 sur ton ordinateur (sous Windows : clic droit > Formater ; sous macOS : Utilitaire de disque > Effacer > MS-DOS (FAT)).
  2. Crée à la racine un dossier nommé mp3 et, si besoin, des dossiers numérotés comme 01 et 02.
  3. Renomme les fichiers en 0001.mp3, 0002.mp3 (dans les dossiers numérotés : 001.mp3). Tu peux ajouter une description après le numéro, comme 0001_bonjour.mp3 ; le module ne regarde que les chiffres du début.
  4. Si tu lis les fichiers de la racine avec play(), copie-les un par un et dans l'ordre ; une copie groupée peut mélanger l'ordre.
  5. Éjecte la carte proprement et insère-la dans le module hors tension ; l'insérer ou la retirer en fonctionnement peut abîmer les fichiers.
macOS crée pour chaque fichier des copies cachées comme ._0001.mp3, ainsi que des dossiers cachés comme .Spotlight-V100 et .fseventsd. Le DFPlayer les compte aussi comme des fichiers : la mauvaise piste est lue, rien ne sort ou readFileCounts() annonce plus de fichiers que prévu. Si tu as préparé la carte sur Mac, lance dot_clean -m /Volumes/NOM_CARTE dans le Terminal ou supprime les fichiers cachés à la main. Le dossier System Volume Information créé par Windows ne pose généralement pas de problème.

La bibliothèque DFRobotDFPlayerMini et un premier programme de test

  1. Dans l'Arduino IDE, ouvre le gestionnaire de bibliothèques, tape DFRobotDFPlayerMini et installe la bibliothèque de DFRobot. L'installation est expliquée en détail dans Ajouter une bibliothèque à Arduino.
  2. Copie au moins un MP3 à la racine de la carte SD, insère la carte dans le module et monte le circuit comme dans le tableau.
  3. Téléverse le programme ci-dessous et ouvre le moniteur série à 115200 bauds.
  4. Au bout de quelques secondes, tu dois voir "DFPlayer Mini online." et le nombre de fichiers de la carte, puis entendre la première piste.
Arduino (C++)
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11);   // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6
7void setup() {
8  Serial.begin(115200);
9  dfSerial.begin(9600);                       // DFPlayer her zaman 9600 baud / DFPlayer always uses 9600 baud
10  Serial.println(F("DFPlayer baslatiliyor / Starting DFPlayer..."));
11
12  if (!player.begin(dfSerial)) {              // reset gönderir, kartı bekler / sends a reset, waits for the card
13    Serial.println(F("Unable to begin: kablolari ve SD karti kontrol et / check wiring and SD card"));
14    while (true) {}                           // burada dur / stop here
15  }
16  Serial.println(F("DFPlayer Mini online."));
17  Serial.print(F("Karttaki dosya / Files on card: "));
18  Serial.println(player.readFileCounts());    // gizli dosyalar da sayılır / hidden files are counted too
19
20  player.volume(20);                          // ses seviyesi 0-30 / volume 0-30
21  player.EQ(DFPLAYER_EQ_NORMAL);              // ekolayzır: normal / equalizer: normal
22  player.play(1);                             // kökteki ilk dosya / first file in the root
23}
24
25void loop() {
26  if (player.available()) {                   // modülden bildirim geldi / a message arrived from the module
27    uint8_t type = player.readType();
28    int value = player.read();
29    if (type == DFPlayerPlayFinished) {
30      Serial.print(F("Parca bitti / Track finished: "));
31      Serial.println(value);
32    } else if (type == DFPlayerError) {
33      Serial.print(F("Hata kodu / Error code: "));
34      Serial.println(value);                  // kodların anlamı tabloda / meanings are in the table
35    } else if (type == DFPlayerCardRemoved) {
36      Serial.println(F("SD kart cikarildi / SD card removed"));
37    }
38  }
39}
40
FonctionCe qu'elle fait
begin(série, isACK, doReset)Démarre le module ; par défaut, envoie un reset et attend le message indiquant que la carte est prête
volume(0–30)Règle le volume ; volumeUp() et volumeDown() le changent d'un cran
EQ(DFPLAYER_EQ_POP)Égaliseur : NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS
play(n)Lit le n-ième fichier de la racine (selon l'ordre de copie)
next() / previous()Piste suivante / précédente
pause() / start()Met en pause / reprend là où la lecture s'était arrêtée
stop()Arrête la lecture
loop(n)Répète la piste n en boucle
enableLoopAll() / randomAll()Lit toutes les pistes en boucle / dans un ordre aléatoire
readState() / readVolume() / readFileCounts()Interroge l'état, le volume et le nombre de fichiers de la carte
available() / readType() / read()Lit les messages du module (piste terminée, erreur, carte retirée)
begin() envoie un reset au module et attend jusqu'à 2 secondes le message indiquant que la carte est prête ; il est donc normal que le démarrage prenne quelques secondes. Par défaut, la bibliothèque attend l'accusé de réception du module après chaque commande, pour que les commandes ne se chevauchent pas. Malgré tout, n'envoie pas volume() ou play() à chaque tour de loop() : un module qui reçoit des commandes sans arrêt peut se bloquer, et le haut-parleur fait des clics. N'envoie une commande que lorsque quelque chose a changé.

Volume, égaliseur et annonces enchaînées avec la broche BUSY

Le volume va de 0 à 30. Avec un petit haut-parleur, 15 à 20 suffit pour la plupart des pièces ; au-delà de 25, surtout avec une alimentation faible, le son peut saturer (clipping) et le module redémarrer. L'égaliseur modifie l'équilibre entre graves et aigus ; sur les petits haut-parleurs, le mode BASS rend vite le son étouffé, alors commence avec NORMAL. Les dossiers numérotés sont très pratiques pour les projets qui parlent : mets les mots "Température" et "degrés" dans le dossier 01 et les nombres de 001.mp3 à 100.mp3 dans le dossier 02, et l'Arduino pourra prononcer des nombres dans une phrase. Le moyen le plus fiable de savoir qu'un fichier est terminé est la broche BUSY : elle est à LOW pendant la lecture et à HIGH au repos. Le programme suivant lit BUSY sur D5 et joue les fichiers les uns après les autres sans qu'ils se chevauchent :

Arduino (C++)
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11);            // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6const byte BUSY_PIN = 5;                    // DFPlayer BUSY: çalarken LOW / LOW while playing
7
8// Klasör 01: 001.mp3 "Sıcaklık", 002.mp3 "derece" / folder 01: 001.mp3 "Temperature", 002.mp3 "degrees"
9// Klasör 02: 001.mp3 ... 100.mp3 = 1 ... 100 sayıları / folder 02: 001.mp3 ... 100.mp3 = numbers 1 ... 100
10
11void playAndWait(uint8_t folder, uint8_t file) {
12  player.playFolder(folder, file);          // /01/001.mp3 gibi / e.g. /01/001.mp3
13  unsigned long start = millis();
14  while (digitalRead(BUSY_PIN) == HIGH && millis() - start < 1000) {}  // çalma başlasın / wait for playback to start
15  while (digitalRead(BUSY_PIN) == LOW) {}                              // parça bitsin / wait for the track to end
16  delay(50);
17}
18
19void sayTemperature(int degrees) {
20  playAndWait(1, 1);                        // "Sıcaklık" / "Temperature"
21  if (degrees >= 1 && degrees <= 100) {
22    playAndWait(2, degrees);                // sayıyı söyle / say the number
23  }
24  playAndWait(1, 2);                        // "derece" / "degrees"
25}
26
27void setup() {
28  pinMode(BUSY_PIN, INPUT);
29  Serial.begin(115200);
30  dfSerial.begin(9600);
31  if (!player.begin(dfSerial)) {
32    Serial.println(F("Unable to begin"));
33    while (true) {}
34  }
35  player.volume(22);
36  sayTemperature(23);                       // değer bir sensörden de gelebilir / the value can come from a sensor
37}
38
39void loop() {
40}
41

playAndWait() envoie d'abord la commande, attend jusqu'à 1 seconde que BUSY passe à LOW (le module met quelques centaines de millisecondes à démarrer la lecture), puis attend la fin de la piste. Tu peux enregistrer les fichiers audio avec ta propre voix ou les générer avec un outil de synthèse vocale (TTS) ; couper le silence au début et à la fin de chaque fichier rend l'annonce plus naturelle. Pour interrompre la musique le temps d'un court message, utilise advertise(n) : le module joue l'annonce du dossier /advert, puis reprend la musique là où elle s'était arrêtée. Cette commande ne fonctionne que pendant la lecture d'une piste ; appelée quand le module est au repos, elle renvoie une erreur.

Changer de piste avec des boutons et régler le volume avec un potentiomètre

Construisons maintenant notre propre lecteur MP3 : trois boutons servent de piste précédente, lecture/pause et piste suivante, et un potentiomètre règle le volume. Branche les boutons entre D2, D3 et D4 et GND ; comme on utilise les résistances de pull-up internes, aucune résistance externe n'est nécessaire (la raison est expliquée dans Comment brancher un bouton poussoir). Les broches extérieures du potentiomètre vont à 5V et GND, celle du milieu à A0. Quand une piste se termine, le programme passe automatiquement à la suivante.

Arduino (C++)
1#include <SoftwareSerial.h>
2#include <DFRobotDFPlayerMini.h>
3
4SoftwareSerial dfSerial(10, 11);            // RX = D10 ← DFPlayer TX, TX = D11 → 1 kΩ → DFPlayer RX
5DFRobotDFPlayerMini player;
6
7const byte BTN[3] = {2, 3, 4};              // önceki, oynat/duraklat, sonraki / previous, play/pause, next
8const byte POT_PIN = A0;                    // ses ayarı potu / volume potentiometer
9bool lastState[3] = {HIGH, HIGH, HIGH};
10unsigned long lastChange[3] = {0, 0, 0};
11bool paused = false;
12int lastRaw = -100;                         // ilk turda sesi mutlaka ayarla / always set the volume on the first pass
13unsigned long lastPotRead = 0;
14unsigned long lastFinish = 0;
15
16// Butona yeni basıldıysa true döner (50 ms sıçrama filtresi) / true on a new press (50 ms debounce)
17bool pressed(byte i) {
18  bool s = digitalRead(BTN[i]);
19  if (s != lastState[i] && millis() - lastChange[i] > 50) {
20    lastState[i] = s;
21    lastChange[i] = millis();
22    return s == LOW;                        // INPUT_PULLUP: basınca LOW / LOW when pressed
23  }
24  return false;
25}
26
27void setup() {
28  for (byte i = 0; i < 3; i++) pinMode(BTN[i], INPUT_PULLUP);
29  Serial.begin(115200);
30  dfSerial.begin(9600);
31  if (!player.begin(dfSerial)) {
32    Serial.println(F("Unable to begin"));
33    while (true) {}
34  }
35  player.play(1);
36}
37
38void loop() {
39  if (pressed(0)) { player.previous(); paused = false; }
40  if (pressed(2)) { player.next(); paused = false; }
41  if (pressed(1)) {
42    if (paused) player.start();             // kaldığı yerden devam / resume
43    else player.pause();                    // duraklat / pause
44    paused = !paused;
45  }
46
47  if (millis() - lastPotRead > 100) {       // potu saniyede 10 kez oku / read the pot 10 times per second
48    lastPotRead = millis();
49    int raw = analogRead(POT_PIN);
50    if (abs(raw - lastRaw) > 20) {          // titremeyi yok say / ignore jitter
51      lastRaw = raw;
52      player.volume(map(raw, 0, 1023, 0, 30));
53    }
54  }
55
56  if (player.available() && player.readType() == DFPlayerPlayFinished) {
57    if (millis() - lastFinish > 1000) player.next();   // parça bitince sonrakine geç / go to the next track
58    lastFinish = millis();                  // bazı modüller bitişi iki kez bildirir / some modules report the end twice
59  }
60}
61
Partie du codeÀ quoi elle sert
pressed()Ne détecte que le moment de l'appui et ignore les rebonds de moins de 50 ms ; même si le bouton reste enfoncé, une seule commande part
abs(raw - lastRaw) > 20Ne met à jour le volume qu'en cas de changement net, pour que les petites fluctuations du potentiomètre n'inondent pas le module de commandes et ne provoquent pas de clics
map(raw, 0, 1023, 0, 30)Convertit la valeur analogique 0–1023 dans la plage de volume 0–30 du DFPlayer
pausedMémorise l'état de lecture pour que le même bouton mette en pause et reprenne
DFPlayerPlayFinishedLe message reçu à la fin d'une piste ; le programme passe à la suivante
millis() - lastFinish > 1000Certains modules clones signalent deux fois la fin d'une piste ; ce test évite de sauter une piste

Choisir le haut-parleur (3 W) et un ampli externe

L'amplificateur du DFPlayer (une puce de type 8002 sur la plupart des cartes) alimente directement un haut-parleur de moins de 3 W et d'une impédance de 4 Ω ou 8 Ω. Le meilleur équilibre s'obtient avec un haut-parleur de 8 Ω et 1 à 3 W ; les petits modèles de 0,5 W fonctionnent aussi, mais peinent à fort volume. Les 3 W sont la limite haute de l'ampli sous 5 V et sur une charge de 4 Ω, au point où la distorsion devient nette ; la puissance propre que tu obtiendras au quotidien est inférieure. Monter le haut-parleur dans un boîtier, ou au moins sur un panneau, renforce nettement les graves, car le son émis à l'avant et à l'arrière de la membrane ne s'annule plus. À fort volume, le module peut tirer brièvement quelques centaines de milliampères ; sur un Arduino alimenté par le port USB d'un ordinateur, cela peut provoquer des chutes de tension, du souffle et des redémarrages. Pour plus de puissance ou un son stéréo, relie les sorties ligne DAC_L et DAC_R à un ampli externe :

SortieBranchementQuand ?
Ampli intégréSPK_1 et SPK_2 → haut-parleur de 4–8 Ω jusqu'à 3 WPetits projets comme une sonnette, un jouet ou des alertes vocales
CasqueDAC_L, DAC_R et GND → prise jack 3,5 mmÉcoute personnelle ; commence avec un volume faible
Module ampli PAM8403DAC_L, DAC_R et GND → entrées L, R et GND de l'ampli ; ampli alimenté en 5 V2 × 3 W stéréo, enceinte portable sur batterie
Ampli PAM8610 ou TPA3116Sorties DAC → entrée de l'ampli ; ampli alimenté en 12 VPlus de puissance : 2 × 10 W et plus
Enceinte active (AUX)DAC_L, DAC_R et GND → entrée AUX de l'enceinteRéutiliser une enceinte d'ordinateur existante
Ajoute un condensateur électrolytique de 100–470 µF entre les broches VCC et GND du DFPlayer, aussi près que possible du module ; il absorbe les pointes de courant soudaines à fort volume et évite les redémarrages. Si tu utilises un ampli externe, relie l'ampli, le DFPlayer et l'Arduino au même point de GND ; des circuits alimentés par des adaptateurs différents avec des masses séparées sont la cause la plus fréquente de ronflement. On explique pourquoi c'est important dans Masse commune (GND). Garde les fils du haut-parleur courts et ne les fais pas passer le long des fils de la liaison série.

Comment éliminer grésillements, parasites et clics

  • Grésillements et clics pendant l'envoi des commandes : La résistance de 1 kΩ sur la ligne RX manque. Place-la entre la broche TX de l'Arduino et la broche RX du module.
  • Souffle ou ronflement permanent : L'alimentation est bruitée ou trop faible. Alimente le DFPlayer avec une source 5 V séparée, ajoute un condensateur entre VCC et GND et relie toutes les masses.
  • Un "pop" au démarrage : Il vient de la commande de reset envoyée par begin(). S'il te gêne, saute le reset avec player.begin(dfSerial, true, false).
  • Bourdonnement avec l'ESP32 : Les pointes de courant lors des émissions Wi-Fi passent dans l'alimentation, puis dans le son. Ajoute un condensateur sur l'alimentation du DFPlayer et, si possible, utilise une source séparée.
  • Son craquant ou saturé à fort volume : Le haut-parleur ou l'ampli travaille à sa limite. Baisse le volume vers 20–25, choisis un haut-parleur plus efficace ou passe à un ampli externe.
  • Léger souffle sans lecture : C'est le bruit propre de l'ampli de la carte, qui ne disparaît jamais complètement sur les petits modules. Pour les projets où le silence compte, brancher la sortie DAC sur un bon ampli externe donne le meilleur résultat.

L'erreur "Unable to begin" et sa solution

Si le moniteur série affiche Unable to begin: suivi des lignes 1.Please recheck the connection! et 2.Please insert the SD card!, c'est que le test de begin() dans l'exemple de la bibliothèque a échoué. begin() envoie une commande de reset au module et attend 2 secondes le message "carte prête" (card online) ; si ce message n'arrive pas, la fonction renvoie false. La cause peut donc venir du câblage, de la carte SD, de l'alimentation ou de la façon dont le module répond. Vérifie les points dans cet ordre :

Cause possibleVérification et solution
TX et RX non croisésLe TX du module doit aller sur D10 (RX de SoftwareSerial) et son RX, via 1 kΩ, sur D11 (TX de SoftwareSerial) ; cela doit correspondre à l'ordre (RX, TX) de SoftwareSerial(10, 11)
Pas de masse communeLe GND du module doit être relié au GND de l'Arduino ; avec une alimentation séparée, relie aussi les masses
Carte SD non lueLa carte est-elle insérée, en FAT32, de moins de 32 Go, avec au moins un fichier audio ? Reformate-la ou essaie une autre carte
Mauvaise résistanceIl faut 1 kΩ sur la ligne RX ; des valeurs élevées comme 10 kΩ affaiblissent le signal
Alimentation insuffisanteVCC doit être à 4–5 V ; débranche le haut-parleur temporairement, mesure la tension au multimètre et ajoute un condensateur
Mauvaise vitesse en baudsIl faut dfSerial.begin(9600) ; ne la confonds pas avec la vitesse du moniteur série (115200)
D0 et D1 utiliséesSur l'Uno, le port série matériel est partagé avec l'USB ; déplace le module sur les broches SoftwareSerial
La puce clone répond en retardAjoute delay(1000) avant begin() ; si cela ne suffit pas, utilise begin(dfSerial, true, false) pour sauter l'attente après le reset
Code DFPlayerErrorNom dans la bibliothèqueSignification
1BusyModule occupé ou carte introuvable (initialisation non terminée)
2SleepingLe module est en veille
3SerialWrongStackDonnées série reçues corrompues
4CheckSumNotMatchLa somme de contrôle du paquet ne correspond pas
5FileIndexOutLe numéro de piste demandé est hors de la plage de la carte
6FileMismatchLe fichier demandé est introuvable ; vérifie le nommage
7AdvertiseErreur d'annonce (advert), par exemple advertise() appelée sans lecture en cours
Certaines cartes clones bon marché n'envoient jamais le message attendu après un reset, ou l'envoient trop tard ; begin() renvoie alors false alors que le câblage est bon. player.begin(dfSerial, true, false) saute l'étape du reset et passe le test ; si le module produit du son avec ce réglage, c'était bien le problème. Mais ce réglage masque aussi une vraie erreur de câblage, alors vérifie d'abord les points du tableau. Pour savoir si le module répond, regarde la valeur de player.readFileCounts() : si elle vaut -1, aucune réponse ne vient du module.

DFPlayer Mini avec l'ESP32 : piloter les MP3 depuis une page web

Sur l'ESP32, pas besoin de SoftwareSerial : chacun de ses trois UART matériels peut être affecté aux broches de ton choix. Dans le programme ci-dessous, l'UART2 utilise GPIO 16 (RX) et GPIO 17 (TX), et le DFPlayer est alimenté par la broche 5V (VIN) de la carte ESP32. Le signal TX en 3,3 V de l'ESP32 est directement compatible avec le module, mais garde quand même la résistance de 1 kΩ contre les parasites. Dans l'autre sens, DFRobot indique que le niveau logique du module est de 3,3 V ; pourtant, sur certaines cartes clones alimentées en 5 V, une tension plus élevée a été mesurée sur la ligne TX. Avant de brancher, mesure entre TX et GND avec un multimètre ; au-delà de 3,6 V, intercale un pont diviseur de tension de 1 kΩ + 2 kΩ. Le programme se connecte à ton réseau domestique et propose une page que tu peux ouvrir sur ton téléphone ; ses boutons changent de piste, mettent en pause et règlent le volume.

Arduino (C++)
1#include <WiFi.h>
2#include <WebServer.h>
3#include <DFRobotDFPlayerMini.h>
4
5const char *WIFI_SSID = "WIFI_ADI";         // kendi ağ adın / your network name
6const char *WIFI_PASS = "WIFI_SIFRESI";     // kendi şifren / your password
7
8HardwareSerial dfSerial(2);                 // UART2
9DFRobotDFPlayerMini player;
10WebServer server(80);
11int volumeLevel = 15;
12
13const char PAGE[] = R"rawliteral(<!DOCTYPE html><html><head>
14<meta name="viewport" content="width=device-width,initial-scale=1"><title>ESP32 MP3</title>
15<style>body{font-family:sans-serif;text-align:center}button{font-size:22px;margin:6px;padding:10px 18px}</style>
16</head><body><h2>DFPlayer Mini</h2>
17<button onclick="c('prev')">Prev</button><button onclick="c('pause')">Pause</button>
18<button onclick="c('play')">Play</button><button onclick="c('next')">Next</button><br>
19<button onclick="c('down')">Vol -</button><button onclick="c('up')">Vol +</button>
20<p id="s"></p>
21<script>function c(x){fetch('/cmd?c='+x).then(r=>r.text()).then(t=>document.getElementById('s').innerText=t)}</script>
22</body></html>)rawliteral";
23
24void handleCmd() {
25  String c = server.arg("c");
26  if (c == "next") player.next();
27  else if (c == "prev") player.previous();
28  else if (c == "pause") player.pause();
29  else if (c == "play") player.start();
30  else if (c == "up" && volumeLevel < 30) player.volume(++volumeLevel);
31  else if (c == "down" && volumeLevel > 0) player.volume(--volumeLevel);
32  server.send(200, "text/plain", "Ses / Volume: " + String(volumeLevel));
33}
34
35void setup() {
36  Serial.begin(115200);
37  dfSerial.begin(9600, SERIAL_8N1, 16, 17); // RX = GPIO16 ← DFPlayer TX, TX = GPIO17 → 1 kΩ → DFPlayer RX
38  delay(1000);                              // modül kartı okusun / let the module read the card
39  if (!player.begin(dfSerial)) {
40    Serial.println("Unable to begin");
41    while (true) delay(10);
42  }
43  player.volume(volumeLevel);
44
45  WiFi.begin(WIFI_SSID, WIFI_PASS);
46  while (WiFi.status() != WL_CONNECTED) {   // ağa bağlanana kadar bekle / wait for the network
47    delay(500);
48    Serial.print(".");
49  }
50  Serial.print("\nAdres / Address: http://");
51  Serial.println(WiFi.localIP());
52
53  server.on("/", []() { server.send(200, "text/html", PAGE); });
54  server.on("/cmd", handleCmd);
55  server.begin();
56  player.play(1);
57}
58
59void loop() {
60  server.handleClient();                    // tarayıcı isteklerini işle / handle browser requests
61}
62

Après le téléversement, saisis dans le navigateur de ton téléphone l'adresse affichée dans le moniteur série (par exemple 192.168.1.42) ; le téléphone et l'ESP32 doivent être sur le même réseau Wi-Fi. Si la connexion échoue, suis les étapes de L'ESP32 ne se connecte pas au Wi-Fi. Sur les cartes à module ESP32-WROVER, GPIO 16 et 17 sont réservés à la PSRAM interne : déplace alors l'UART sur d'autres broches comme 26 et 27, en changeant simplement les numéros de broches dans la ligne dfSerial.begin(). Si l'ESP32 redémarre tout seul quand le haut-parleur joue fort, le problème vient de l'alimentation ; les détails sont dans Brownout de l'ESP32.

DFPlayer Mini avec le Raspberry Pi Pico et MicroPython (UART)

Sur le Raspberry Pi Pico, utiliser directement le protocole série du module plutôt que chercher une bibliothèque toute faite est à la fois simple et très formateur. Chaque commande est un paquet de 10 octets : l'octet de début 0x7E, la version 0xFF, la longueur 0x06, le code de commande, l'indicateur de retour (0 = pas d'accusé de réception), un paramètre sur deux octets, une somme de contrôle sur deux octets et l'octet de fin 0xEF. La somme de contrôle est l'opposé sur 16 bits de la somme des six octets allant de la version au dernier octet du paramètre. Par exemple, le paquet qui lit la première piste de la racine est 7E FF 06 03 00 00 01 FE F7 EF. De son côté, le module envoie des messages de code 0x3D quand une piste se termine, 0x3F quand la carte est prête et 0x40 en cas d'erreur. L'UART 3,3 V du Pico convient directement au module ; l'avertissement sur la tension de TX de la partie ESP32 vaut aussi ici, car les broches du Pico ne tolèrent pas non plus le 5 V. Alimente le module par la broche VBUS (USB 5 V) du Pico.

CommandeCodeParamètre
Piste suivante / précédente0x01 / 0x02Aucun
Lire la n-ième piste de la racine0x031–2999
Volume0x060–30
Égaliseur0x070–5
Reset0x0CAucun
Reprise / pause0x0D / 0x0EAucun
Lire depuis un dossier0x0FOctet haut dossier (1–99), octet bas fichier (1–255)
Lire depuis le dossier mp30x12Numéro de fichier (1 pour 0001.mp3)
Annonce (advert)0x13Numéro de fichier
Arrêt0x16Aucun
Piste terminée (envoyé par le module)0x3DNuméro de la piste terminée
MicroPython
1from machine import UART, Pin
2import time
3
4# GP0 (UART0 TX) → 1 kΩ → DFPlayer RX, GP1 (UART0 RX) ← DFPlayer TX
5uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
6btn_next = Pin(14, Pin.IN, Pin.PULL_UP)     # sonraki parça / next track
7btn_play = Pin(15, Pin.IN, Pin.PULL_UP)     # oynat-duraklat / play-pause
8TRACKS = 5                                  # /mp3 klasöründeki dosya sayısı / number of files in /mp3
9
10def send(cmd, param=0):
11    # 10 baytlık komut paketi, onay istemeden / 10-byte command frame without ACK
12    frame = bytearray([0x7E, 0xFF, 0x06, cmd, 0x00, param >> 8, param & 0xFF, 0, 0, 0xEF])
13    checksum = -sum(frame[1:7]) & 0xFFFF    # sağlama toplamı / checksum
14    frame[7] = checksum >> 8
15    frame[8] = checksum & 0xFF
16    uart.write(frame)
17    time.sleep_ms(30)
18
19buf = b""
20
21def events():
22    # gelen 10 baytlık bildirimlerin komut kodlarını döndür / return command codes of incoming messages
23    global buf
24    if uart.any():
25        buf += uart.read()
26    codes = []
27    while True:
28        start = buf.find(b"\x7e")
29        if start < 0:
30            buf = b""
31            break
32        if len(buf) - start < 10:
33            buf = buf[start:]
34            break
35        frame = buf[start:start + 10]
36        if frame[9] == 0xEF:
37            codes.append(frame[3])
38            buf = buf[start + 10:]
39        else:
40            buf = buf[start + 1:]
41    return codes
42
43def play_track(n):
44    send(0x12, n)                           # /mp3/000n.mp3 dosyasını çal / play /mp3/000n.mp3
45
46time.sleep(2)                               # modül kartı okusun / let the module read the card
47send(0x06, 18)                              # ses 18/30 / volume 18 of 30
48track = 1
49play_track(track)
50playing = True
51last_end = 0
52
53while True:
54    if btn_next.value() == 0:
55        track = track % TRACKS + 1          # son parçadan sonra başa dön / wrap after the last track
56        play_track(track)
57        playing = True
58        time.sleep_ms(300)                  # basit sıçrama önleme / simple debounce
59    if btn_play.value() == 0:
60        send(0x0E if playing else 0x0D)     # 0x0E duraklat, 0x0D devam / 0x0E pause, 0x0D resume
61        playing = not playing
62        time.sleep_ms(300)
63    for code in events():
64        # 0x3D: SD karttaki parça bitti / 0x3D: track on the SD card finished
65        if code == 0x3D and time.ticks_diff(time.ticks_ms(), last_end) > 1000:
66            last_end = time.ticks_ms()      # çift bildirimi yok say / ignore the duplicate message
67            track = track % TRACKS + 1
68            play_track(track)
69

Si tu enregistres le code sur le Pico sous le nom main.py avec Thonny, le Pico se comporte comme un lecteur MP3 à chaque mise sous tension ; si tu débutes en MicroPython, jette un œil à Les bases de MicroPython. Le bouton sur GP14 passe à la piste suivante, celui sur GP15 met en pause et reprend ; l'autre borne de chaque bouton va à GND. La fonction events() accumule les octets reçus dans un tampon et en extrait les paquets qui commencent par 0x7E et finissent par 0xEF. Quand le message de fin de piste (0x3D) arrive, le code passe au fichier suivant et revient au premier après le dernier. N'oublie pas d'adapter la variable TRACKS au nombre de fichiers de ton dossier /mp3.

Idées de projets avec le DFPlayer Mini

  • Sonnette mélodique : Une sonnette qui joue une mélodie au hasard quand on appuie et baisse le volume la nuit.
  • Système d'accueil : Un détecteur de mouvement PIR déclenche un message de bienvenue quand quelqu'un arrive.
  • Boîte à musique à cartes : Chaque carte RFID lance un dossier différent ; un lecteur de musique sans écran pour les enfants.
  • Horloge parlante : Avec un module horloge RTC, une horloge qui annonce l'heure à voix haute ou à chaque heure pile.
  • Lecteur MP3 télécommandé : Piste et volume pilotés avec un récepteur IR et une télécommande.
  • Décor d'Halloween ou boîte à farces : Un HC-SR04 joue un son effrayant quand il détecte que quelqu'un s'approche.
  • Alarmes et alertes parlées : Des phrases claires comme "Gaz détecté dans la cuisine" au lieu d'un bip en cas de gaz, d'inondation ou de porte restée ouverte.
  • Lecteur MP3 avec écran : Affiche le numéro de piste et le volume sur un écran OLED.

Avec une carte SD bien nommée, la résistance de 1 kΩ sur la ligne RX et une alimentation 5 V solide, le DFPlayer Mini donne un vrai son à tes projets Arduino en quelques minutes. En cas de souci, vérifie d'abord la carte et le câblage, puis l'alimentation ; presque toutes les pannes viennent de l'un de ces trois points. Si les bases de la communication série t'intéressent, La communication série UART est une bonne étape suivante. Dans l'application BlueGrays, tu trouveras des projets sonores comme des mélodies au buzzer, un piano simple, une sonnette avec détecteur de mouvement et des mélodies sur ESP32, chacun avec son schéma de câblage et son code pas à pas, auxquels tu pourras ensuite donner un vrai son avec le DFPlayer Mini.

Questions fréquentes

Quelle taille de carte SD le DFPlayer Mini accepte-t-il ?

Le DFPlayer Mini lit les cartes microSD jusqu'à 32 Go en FAT16 ou FAT32. Les cartes de 64 Go et plus sont formatées en exFAT, et le module ne les voit pas. Pour quelques centaines de MP3, une carte de 1 à 16 Go suffit largement.

Pourquoi mon DFPlayer Mini ne fait-il aucun son ?

Vérifie d'abord que le moniteur série affiche "online" ; sinon, le problème vient du câblage ou de la carte SD. Si le module démarre mais reste muet, vérifie que le volume n'est pas à 0, que le haut-parleur est branché sur SPK_1 et SPK_2 et que les noms de fichiers correspondent à la fonction appelée. Si la LED de la carte s'allume, le module est bien en train de lire.

Pourquoi met-on une résistance de 1k sur la broche RX du DFPlayer Mini ?

La puce du module fonctionne en 3,3 V, alors que la broche TX de l'Arduino Uno délivre 5 V. Une résistance de 1 kΩ en série sur la ligne RX limite le courant qui entre dans la puce et réduit le grésillement du haut-parleur pendant la communication série. Elle est aussi conseillée sur les cartes 3,3 V comme l'ESP32 et le Pico, pour se protéger des parasites.

Le DFPlayer Mini fonctionne-t-il sans Arduino ?

Oui. Si tu relies les broches IO_1 et IO_2 à GND par des boutons, un appui court change de piste et un appui long règle le volume. Des boutons reliés aux broches ADKEY par des résistances peuvent aussi lancer des pistes précises. Tu peux ainsi fabriquer un lecteur MP3 ou une sonnette avec une pile, un haut-parleur et quelques boutons, sans microcontrôleur.

Quel haut-parleur brancher sur le DFPlayer Mini ?

Un haut-parleur de 4 Ω ou 8 Ω et de moins de 3 W se branche directement sur SPK_1 et SPK_2 ; les modèles de 8 Ω et 1 à 3 W donnent le meilleur équilibre. Ne relie aucune des bornes du haut-parleur à GND. Pour plus de volume ou du stéréo, branche les sorties DAC_L et DAC_R sur un ampli comme le PAM8403.

Pourquoi le DFPlayer Mini lit-il les fichiers dans le désordre ?

La fonction play(n) ne regarde pas le nom du fichier mais l'ordre dans lequel les fichiers ont été copiés sur la carte. Pour lire selon le nom, nomme les fichiers /mp3/0001.mp3 et utilise playMp3Folder(), ou /01/001.mp3 et utilise playFolder(). Si tu as préparé la carte sur Mac, supprime aussi les fichiers cachés ._.

Voir tous les projets
Utilisation du buzzer
#13Débutant

Utilisation du buzzer

Tu t'es déjà demandé comment une sonnette ou une alarme produit son son ? L'Arduino fait biper un petit buzzer à intervalles courts : bip, silence, bip, silence. Tu vois comment l'électricité devient

4.7(89)
158
Hymne national turc avec un buzzer
#15Intermédiaire

Hymne national turc avec un buzzer

Appuie sur le bouton et un petit buzzer se met à jouer l'hymne national turc, note après note. L'Arduino joue chaque note à la bonne hauteur et pendant la bonne durée, interprète deux strophes de l'hy

4.9(100)
183
Réglage de la fréquence avec buzzer
#14Intermédiaire

Réglage de la fréquence avec buzzer

Tu contrôles le son d'un buzzer avec quatre boutons : l'un lance le son, l'autre le coupe, et les deux derniers le rendent plus aigu ou plus grave. Garde le bouton plus ou moins enfoncé et la note cha

4.6(68)
115
ESP32 Lecture de mélodies avec buzzer
#114Débutant
Premium

ESP32 Lecture de mélodies avec buzzer

Jouer une mélodie simple (Twinkle Twinkle Little Star) avec un buzzer passif. Nous jouons les notes avec les fonctions tone() et noTone() comme dans Arduino - la même syntaxe fonctionne avec ESP32 Arduino Core 3.0+. Un buzzer passif doit être utilisé (un buzzer actif ne joue pas la mélodie).

4.8(30)
55
Jouer des mélodies avec une télécommande IR et un buzzer
#18Débutant
Premium

Jouer des mélodies avec une télécommande IR et un buzzer

Fabrique une boîte à musique qui joue des airs avec les touches d'une télécommande de télé. Un récepteur infrarouge capte le signal ; une touche fait jouer au buzzer un air de jeu vidéo entraînant, un

4.8(57)
74
Piano simple avec buzzer et bouton
#26Avancé
Premium

Piano simple avec buzzer et bouton

Construis ton propre petit piano avec huit boutons. Chaque bouton est une note, de la plus grave à la plus aiguë : do, ré, mi, fa, sol, la, si et le do aigu. La note sonne dans le buzzer tant que tu g

4.9(66)
88
Marche Mehter avec Arduino
#100Débutant
Premium

Marche Mehter avec Arduino

Ce projet vous permet de jouer l'hymne de Mehter avec une boucle infinie en utilisant seulement Arduino Uno, un buzzer et des câbles de connexion. Il suffit de faire les connexions et de coller le code.

4.0(24)
36
Sonnette et lumière avec détecteur de mouvement
#25Intermédiaire
Premium

Sonnette et lumière avec détecteur de mouvement

Quand quelqu'un approche de ta porte, tu le sais avant même qu'il sonne. Dès que le détecteur de mouvement repère quelqu'un, la LED s'allume et le buzzer joue un carillon de trois notes, de l'aigu au

4.7(54)
71