Componentes · 17 min de lectura

DFPlayer Mini con Arduino: reproducir MP3, tarjeta SD y altavoz

Cómo usar el DFPlayer Mini con Arduino: resistencia de 1k en RX, tarjeta SD y nombres 0001.mp3, código de la librería, botones, altavoz, ESP32 y Pico.

El DFPlayer Mini es la forma más barata y sencilla de reproducir MP3 con Arduino: decodifica por sí mismo los archivos de audio de una tarjeta microSD, mueve directamente un altavoz con su pequeño amplificador integrado y recibe las órdenes del Arduino por una conexión serie de solo dos cables. A diferencia de los pitidos de un zumbador, puede reproducir canciones, voz, melodías de timbre o avisos hablados como "La puerta sigue abierta". Casi todos los que lo conectan por primera vez se encuentran con los mismos problemas: no suena, el altavoz chisporrotea, los archivos suenan en otro orden o el Monitor Serie muestra "Unable to begin". Esta guía resuelve cada uno de ellos y explica por qué ocurre.

Primero conocerás los pines del módulo y por qué se pone una resistencia de 1 kΩ en la línea RX. Después verás cómo preparar la tarjeta SD en FAT32, nombrar los archivos con el esquema 0001.mp3 y carpetas 01, reproducir el primer sonido con la librería DFRobotDFPlayerMini, ajustar el volumen y el ecualizador, cambiar de pista con botones y elegir el altavoz o el amplificador externo adecuado. Las últimas secciones incluyen la solución paso a paso del error "Unable to begin", un reproductor MP3 con ESP32 controlado desde una página web y un ejemplo en MicroPython sin librerías para la Raspberry Pi Pico. Si solo necesitas un pitido o una melodía sencilla, un zumbador (buzzer) es la opción más simple.

Módulo reproductor MP3 DFPlayer Mini
DFPlayer Mini: mide solo 20 × 20 mm e incluye una ranura para tarjeta microSD, un chip decodificador de MP3 y un pequeño amplificador capaz de mover un altavoz de hasta 3 W.

¿Qué es el DFPlayer Mini y cómo funciona?

El DFPlayer Mini es un reproductor MP3 autónomo formado por un chip decodificador de MP3, un DAC de 24 bits, una ranura para tarjeta microSD y un pequeño amplificador mono. El Arduino solo tiene que enviar órdenes cortas como "reproduce la pista 3" o "pon el volumen en 20"; leer el archivo de la tarjeta, decodificar el audio comprimido y mover el altavoz es trabajo del módulo. Por eso hasta un Arduino Uno con 2 KB de RAM puede reproducir música sin esfuerzo. Las órdenes se envían a 9600 baudios en paquetes de 10 bytes, y el módulo responde con el mismo formato cuando termina una pista, se inserta o se retira la tarjeta o se produce un error. El chip de la placa depende del fabricante (YX5200-24SS, MH2024K-24SS, GD3200B y otros). Todos entienden las mismas órdenes, pero pueden tardar distinto en responder, un detalle que será importante más adelante con el error "Unable to begin". El módulo se puede controlar de tres maneras: por el puerto serie (UART), con los botones IO o con una escalera de resistencias ADKEY.

CaracterísticaValor
Archivos compatiblesMP3, WAV, WMA
Frecuencias de muestreo8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz
DAC24 bits; 90 dB de rango dinámico, 85 dB de relación señal/ruido
AlmacenamientoTarjeta microSD (TF) de hasta 32 GB, FAT16 o FAT32; también admite memorias USB
Capacidad de carpetasHasta 100 carpetas, 255 archivos por carpeta
Volumen30 niveles (0–30)
Ecualizador (EQ)6 modos: Normal, Pop, Rock, Jazz, Classic, Bass
Salida de altavozAmplificador mono integrado, altavoces de menos de 3 W
Salida de líneaDAC_L y DAC_R: estéreo, para auriculares o un amplificador externo
Alimentación3,2–5,0 V (típico 4,2 V)
Corriente en reposoUnos 20 mA
ComunicaciónUART, 9600 baudios, 8N1
Tamaño20 × 20 mm

Pines del DFPlayer Mini

PinNombreFunción
1VCCEntrada de alimentación, 3,2–5,0 V
2RXEntrada serie: va al pin TX de la placa a través de una resistencia de 1 kΩ
3TXSalida serie: va al pin RX de la placa
4DAC_RSalida de línea del canal derecho (auriculares o amplificador)
5DAC_LSalida de línea del canal izquierdo (auriculares o amplificador)
6 y 8SPK_1, SPK_2Salida de altavoz: aquí van los dos terminales de un altavoz de menos de 3 W
7GNDTierra
9IO_1Pulsación corta a GND: pista anterior; pulsación larga: baja el volumen
10GNDTierra
11IO_2Pulsación corta a GND: pista siguiente; pulsación larga: sube el volumen
12ADKEY1Entrada para varios botones mediante una escalera de resistencias
13ADKEY2Segunda entrada de escalera de resistencias
14USB+D+ para una memoria USB
15USB−D− para una memoria USB
16BUSYLOW mientras reproduce, HIGH en reposo

Si lo usas por el puerto serie, solo necesitas los pines VCC, GND, RX, TX y los del altavoz. El pin BUSY te dice si una pista ha terminado sin necesidad de comunicación serie, y el pequeño LED de la placa también se enciende durante la reproducción. Los pines IO_1 e IO_2 permiten que el módulo funcione incluso sin Arduino: con un botón entre cada pin y GND, una pulsación corta cambia de pista y una larga ajusta el volumen. Los botones conectados a los pines ADKEY mediante resistencias de distintos valores también pueden reproducir pistas concretas. Así, con una pila, un altavoz y dos botones puedes montar un timbre o un juguete que habla sin ningún microcontrolador. Los pines USB+ y USB− sirven para reproducir desde una memoria USB en lugar de la tarjeta SD y quedan libres en la mayoría de los proyectos.

Conexión del DFPlayer Mini con Arduino y la resistencia de 1k en RX

Pin del DFPlayerArduino UnoESP32Raspberry Pi Pico
VCC5V5V (VIN)VBUS (USB 5 V, pin 40)
GNDGNDGNDGND
RXD11 a través de una resistencia de 1 kΩGPIO 17 (TX2) a través de una resistencia de 1 kΩGP0 (UART0 TX) a través de una resistencia de 1 kΩ
TXD10GPIO 16 (RX2)GP1 (UART0 RX)
SPK_1 y SPK_2Los dos terminales del altavozLos dos terminales del altavozLos dos terminales del altavoz
BUSY (opcional)D5No se usaNo se usa
Arduino Uno
Arduino Uno
ESP32
ESP32
Raspberry Pi Pico
Raspberry Pi Pico

Las líneas de datos se cruzan: el TX del módulo va al RX de la placa y su RX va al TX de la placa. El puerto serie por hardware del Uno en D0 y D1 se usa para cargar programas por USB y para el Monitor Serie, así que conectamos el módulo a D10 (RX) y D11 (TX) con SoftwareSerial. La resistencia de 1 kΩ en serie con la entrada RX del módulo no es un detalle sin importancia. El chip del DFPlayer trabaja con lógica de 3,3 V, mientras que el pin TX del Uno entrega 5 V. Sin la resistencia, la diferencia hace circular corriente por los diodos de protección de la entrada del chip; esa corriente fuerza el chip y provoca el chisporroteo y los clics que se oyen en el altavoz durante la comunicación serie. Si lo calculas con la ley de Ohm, verás que 1 kΩ limita esa corriente a unos 1–2 mA, mientras que la señal de 9600 baudios no se ve afectada. Una resistencia mucho mayor, como 10 kΩ, puede debilitar la señal y cortar la comunicación. La salida TX del módulo se conecta directamente al Uno, porque el Uno lee 3,3 V como HIGH (el umbral está en unos 3,0 V).

No conectes nunca SPK_1 ni SPK_2 a GND. El amplificador de la placa tiene salida en puente (BTL): los dos terminales llevan señal de audio y, si uno se conecta a tierra, el amplificador queda en cortocircuito y puede estropearse. Por la misma razón, no conectes los pines SPK a la entrada de un amplificador externo; para eso usa las salidas de línea DAC_L y DAC_R. Tampoco conectes altavoces de menos de 4 Ω de impedancia.

Preparar la tarjeta SD: FAT32, carpetas y nombres 0001.mp3

El DFPlayer Mini lee tarjetas microSD de hasta 32 GB con sistema de archivos FAT16 o FAT32. Las tarjetas de 64 GB o más vienen de fábrica en exFAT y el módulo no puede leer ese formato; para unos cientos de pistas, una tarjeta de 1–16 GB es más que suficiente. Codificar los MP3 a 128–192 kbps y 44,1 kHz es la opción más segura en compatibilidad y velocidad de lectura. El módulo reconoce los archivos por su número, no por su nombre, así que los nombres de carpetas y archivos deben seguir un esquema concreto según la función con la que los reproduzcas:

Ubicación en la tarjetaEjemploFunción de la libreríaRegla
Raíz/0001.mp3, /0002.mp3play(1)Reproduce en el orden en que se copiaron los archivos a la tarjeta, no por nombre
Carpetas numeradas/01/001.mp3 … /99/255.mp3playFolder(1, 1)Carpeta de 2 cifras (01–99), archivo de 3 cifras (001–255)
Carpeta mp3/mp3/0001.mp3playMp3Folder(1)Nombre de archivo de 4 cifras; el archivo se encuentra por el número de su nombre
Carpeta advert/advert/0001.mp3advertise(1)Interrumpe la pista actual y la reanuda cuando termina el anuncio
Carpetas grandes/01/0001.mp3 … /15/3000.mp3playLargeFolder(1, 1)Hasta 15 carpetas, 3000 archivos por carpeta, nombres de 4 cifras
  1. Formatea la tarjeta en el ordenador como FAT32 (en Windows: clic derecho > Formatear; en macOS: Utilidad de Discos > Borrar > MS-DOS (FAT)).
  2. Crea en la raíz una carpeta llamada mp3 y, si hace falta, carpetas numeradas como 01 y 02.
  3. Renombra los archivos como 0001.mp3, 0002.mp3 (en las carpetas numeradas, 001.mp3). Puedes añadir una descripción después del número, como 0001_hola.mp3; el módulo solo mira las cifras iniciales.
  4. Si vas a reproducir los archivos de la raíz con play(), cópialos de uno en uno y en orden; al copiarlos todos a la vez el orden puede mezclarse.
  5. Expulsa la tarjeta de forma segura e insértala en el módulo sin alimentación; meterla o sacarla en funcionamiento puede dañar los archivos.
macOS crea copias ocultas como ._0001.mp3 de cada archivo y carpetas ocultas como .Spotlight-V100 y .fseventsd. El DFPlayer también las cuenta como archivos, así que suena la pista equivocada, hay silencio o readFileCounts() indica más archivos de los que debería. Si preparaste la tarjeta en un Mac, ejecuta dot_clean -m /Volumes/NOMBRE_TARJETA en el Terminal o borra los archivos ocultos a mano. La carpeta System Volume Information que crea Windows no suele dar problemas.

La librería DFRobotDFPlayerMini y un primer programa de prueba

  1. En el Arduino IDE abre el Gestor de bibliotecas, escribe DFRobotDFPlayerMini e instala la librería de DFRobot. Los pasos de instalación se explican en detalle en Cómo añadir una librería en Arduino.
  2. Copia al menos un MP3 en la raíz de la tarjeta SD, inserta la tarjeta en el módulo y monta el circuito como en la tabla.
  3. Carga el programa de abajo y abre el Monitor Serie a 115200 baudios.
  4. En unos segundos deberías ver "DFPlayer Mini online." y el número de archivos de la tarjeta, y luego oír la primera pista.
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
FunciónQué hace
begin(serie, isACK, doReset)Inicia el módulo; por defecto envía un reset y espera el mensaje que indica que la tarjeta está lista
volume(0–30)Ajusta el volumen; volumeUp() y volumeDown() lo cambian un nivel
EQ(DFPLAYER_EQ_POP)Ecualizador: NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS
play(n)Reproduce el archivo n de la raíz (según el orden de copia)
next() / previous()Pista siguiente / anterior
pause() / start()Pausa / reanuda desde donde se quedó
stop()Detiene la reproducción
loop(n)Repite la pista n sin parar
enableLoopAll() / randomAll()Reproduce todas las pistas en bucle / en orden aleatorio
readState() / readVolume() / readFileCounts()Consulta el estado, el volumen y el número de archivos de la tarjeta
available() / readType() / read()Lee los mensajes del módulo (pista terminada, error, tarjeta retirada)
begin() envía un reset al módulo y espera hasta 2 segundos el mensaje de que la tarjeta está lista, así que es normal que el arranque tarde unos segundos. Por defecto la librería espera la confirmación del módulo después de cada orden, de modo que las órdenes no se pisan. Aun así, no envíes volume() ni play() en cada vuelta de loop(): un módulo que recibe órdenes sin parar puede bloquearse y el altavoz hará clics. Envía una orden solo cuando algo haya cambiado.

Volumen, ecualizador y anuncios encadenados con el pin BUSY

El volumen va de 0 a 30. Con un altavoz pequeño, entre 15 y 20 basta para la mayoría de las habitaciones; por encima de 25, sobre todo con una alimentación débil, el sonido puede empezar a distorsionarse (clipping) y el módulo a reiniciarse. El ecualizador cambia el equilibrio entre graves y agudos; en altavoces pequeños el modo BASS puede volver el sonido apagado, así que empieza con NORMAL. Las carpetas numeradas son muy útiles para proyectos que hablan: si pones las palabras "Temperatura" y "grados" en la carpeta 01 y los números de 001.mp3 a 100.mp3 en la carpeta 02, el Arduino puede decir números formando una frase. La forma más fiable de saber que un archivo ha terminado es el pin BUSY: está en LOW mientras el módulo reproduce y en HIGH cuando está en reposo. El programa siguiente lee BUSY en D5 y reproduce los archivos uno tras otro sin que se solapen:

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() primero envía la orden, espera hasta 1 segundo a que BUSY pase a LOW (el módulo tarda unos cientos de milisegundos en empezar a sonar) y luego espera a que termine la pista. Puedes grabar los archivos de audio con tu propia voz o generarlos con una herramienta de texto a voz (TTS); recortar el silencio al principio y al final de cada archivo hace que el anuncio fluya con más naturalidad. Si quieres interrumpir la música para un aviso breve, usa advertise(n): el módulo reproduce el anuncio de la carpeta /advert y después reanuda la música donde se quedó. Esta orden solo funciona mientras suena una pista; si se llama con el módulo en reposo, devuelve un error.

Cambiar de pista con botones y ajustar el volumen con un potenciómetro

Ahora vamos a montar nuestro propio reproductor MP3: tres botones harán de pista anterior, reproducir/pausa y pista siguiente, y un potenciómetro ajustará el volumen. Conecta los botones entre D2, D3 y D4 y GND; como usamos las resistencias pull-up internas, no hacen falta resistencias externas (el motivo se explica en Cómo conectar un pulsador). Los extremos del potenciómetro van a 5V y GND, y el terminal central a A0. Cuando termina una pista, el programa pasa automáticamente a la siguiente.

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
Parte del códigoPara qué sirve
pressed()Detecta solo el momento de la pulsación e ignora los rebotes de menos de 50 ms; aunque mantengas el botón, se envía una sola orden
abs(raw - lastRaw) > 20Actualiza el volumen solo con cambios claros, para que el pequeño temblor de la lectura del potenciómetro no inunde el módulo de órdenes ni provoque clics
map(raw, 0, 1023, 0, 30)Convierte el valor analógico 0–1023 al rango de volumen 0–30 del DFPlayer
pausedGuarda el estado de reproducción para que el mismo botón pause y reanude
DFPlayerPlayFinishedEl mensaje que llega al terminar una pista; el programa pasa a la siguiente
millis() - lastFinish > 1000Algunos módulos clónicos avisan dos veces del final de la pista; esta comprobación evita que se salte una pista

Elegir el altavoz (3 W) y un amplificador externo

El amplificador propio del DFPlayer (en la mayoría de las placas, un chip tipo 8002) mueve directamente un altavoz de menos de 3 W con una impedancia de 4 Ω u 8 Ω. El mejor equilibrio se consigue con un altavoz de 8 Ω y 1–3 W; los altavoces pequeños de 0,5 W también funcionan, pero sufren a volumen alto. Los 3 W son el límite superior del amplificador con 5 V de alimentación y una carga de 4 Ω, en el punto en que la distorsión ya se nota; la potencia limpia que obtendrás en el uso diario es menor. Montar el altavoz en una caja, o al menos en un panel, mejora claramente los graves, porque el sonido de la parte delantera y trasera del cono deja de anularse. A volumen alto el módulo puede consumir momentáneamente unos cientos de miliamperios; en un Arduino alimentado desde el USB del ordenador esto puede causar caídas de tensión, ruido y reinicios. Si quieres más potencia o sonido estéreo, conecta las salidas de línea DAC_L y DAC_R a un amplificador externo:

Vía de salidaConexión¿Cuándo?
Amplificador integradoSPK_1 y SPK_2 → altavoz de 4–8 Ω hasta 3 WProyectos pequeños como timbres, juguetes o avisos hablados
AuricularesDAC_L, DAC_R y GND → jack de 3,5 mmEscucha personal; empieza con el volumen bajo
Módulo amplificador PAM8403DAC_L, DAC_R y GND → entradas L, R y GND del amplificador; el amplificador se alimenta con 5 V2 × 3 W estéreo, altavoz portátil con batería
Amplificador PAM8610 o TPA3116Salidas DAC → entrada del amplificador; el amplificador se alimenta con 12 VMás potencia: 2 × 10 W o más
Altavoz autoamplificado (AUX)DAC_L, DAC_R y GND → entrada AUX del altavozAprovechar un altavoz de ordenador que ya tengas
Añade un condensador electrolítico de 100–470 µF entre los pines VCC y GND del DFPlayer, lo más cerca posible del módulo; cubre los picos de corriente repentinos a volumen alto y evita reinicios. Si usas un amplificador externo, une el amplificador, el DFPlayer y el Arduino en el mismo punto de GND; los circuitos alimentados con adaptadores distintos y tierras separadas son la causa más habitual del zumbido. Explicamos por qué es importante en Tierra común (GND). Mantén cortos los cables del altavoz y no los pases junto a los cables de la comunicación serie.

Cómo eliminar el chisporroteo, el ruido y los clics

  • Chisporroteo y clics al enviar órdenes: Falta la resistencia de 1 kΩ en la línea RX. Colócala entre el pin TX del Arduino y el pin RX del módulo.
  • Siseo o zumbido constante: La alimentación es ruidosa o insuficiente. Alimenta el DFPlayer con una fuente de 5 V aparte, añade un condensador entre VCC y GND y une todas las tierras.
  • Un "pop" al arrancar: Lo provoca la orden de reset que envía begin(). Si te molesta, sáltate el reset con player.begin(dfSerial, true, false).
  • Zumbido con el ESP32: Los pulsos de corriente al transmitir por Wi-Fi se cuelan en la alimentación y de ahí al sonido. Añade un condensador a la alimentación del DFPlayer y, si puedes, usa una fuente separada.
  • Sonido rasposo o distorsionado a volumen alto: El altavoz o el amplificador trabajan al límite. Baja el volumen a 20–25, elige un altavoz más eficiente o pasa a un amplificador externo.
  • Leve siseo cuando no suena nada: Es el ruido propio del amplificador de la placa y en los módulos pequeños nunca desaparece del todo. En proyectos donde el silencio importa, conectar la salida DAC a un buen amplificador externo da el mejor resultado.

El error "Unable to begin" y cómo solucionarlo

Si el Monitor Serie muestra Unable to begin: seguido de las líneas 1.Please recheck the connection! y 2.Please insert the SD card!, ha fallado la comprobación de begin() del ejemplo de la librería. begin() envía al módulo una orden de reset y espera 2 segundos el mensaje "tarjeta lista" (card online); si no llega, devuelve false. Así que la causa puede estar en el cableado, la tarjeta SD, la alimentación o la forma en que responde el módulo. Revísalo en este orden:

Posible causaComprobación y solución
TX y RX sin cruzarEl TX del módulo debe ir a D10 (RX de SoftwareSerial) y su RX, a través de 1 kΩ, a D11 (TX de SoftwareSerial); debe coincidir con el orden (RX, TX) de SoftwareSerial(10, 11)
Sin GND comúnEl GND del módulo debe estar unido al GND del Arduino; si usas otra fuente, une también las tierras
No lee la tarjeta SD¿Está insertada, en FAT32, es de menos de 32 GB y contiene al menos un archivo de audio? Vuelve a formatearla o prueba otra tarjeta
Resistencia equivocadaEn la línea RX va 1 kΩ; valores grandes como 10 kΩ debilitan la señal
Alimentación insuficienteEn VCC debe haber 4–5 V; desconecta el altavoz temporalmente, mide la tensión con el multímetro y añade un condensador
Velocidad en baudios incorrectaDebe ser dfSerial.begin(9600); no la confundas con la velocidad del Monitor Serie (115200)
D0 y D1 ocupadosEn el Uno el puerto serie por hardware se comparte con el USB; pasa el módulo a los pines de SoftwareSerial
El chip clónico responde tardeAñade delay(1000) antes de begin(); si no basta, usa begin(dfSerial, true, false) para saltarte la espera tras el reset
Código DFPlayerErrorNombre en la libreríaSignificado
1BusyMódulo ocupado o tarjeta no encontrada (inicialización sin terminar)
2SleepingEl módulo está en modo de reposo
3SerialWrongStackDatos serie recibidos con errores
4CheckSumNotMatchLa suma de verificación del paquete no coincide
5FileIndexOutEl número de pista pedido está fuera del rango de la tarjeta
6FileMismatchNo se encontró el archivo pedido; revisa los nombres
7AdvertiseError de anuncio (advert), por ejemplo advertise() llamado sin reproducción en curso
Algunas placas clónicas baratas no envían nunca el mensaje esperado después del reset, o lo envían tarde; en ese caso begin() devuelve false aunque el cableado esté bien. player.begin(dfSerial, true, false) se salta el reset y supera la comprobación; si con este ajuste el módulo suena, ese era el problema. Pero este ajuste también oculta un fallo real de cableado, así que revisa primero los puntos de la tabla. Para saber si el módulo responde, mira el valor de player.readFileCounts(): si devuelve -1, no llega ninguna respuesta del módulo.

DFPlayer Mini con ESP32: control de MP3 desde una página web

En el ESP32 no necesitas SoftwareSerial; cualquiera de sus tres UART por hardware se puede asignar a los pines que elijas. En el programa siguiente la UART2 funciona en GPIO 16 (RX) y GPIO 17 (TX), y el DFPlayer se alimenta desde el pin 5V (VIN) de la placa ESP32. La señal TX de 3,3 V del ESP32 es directamente compatible con el módulo, pero mantén igualmente la resistencia de 1 kΩ como protección contra el ruido. En sentido contrario, DFRobot indica que el nivel lógico del módulo es de 3,3 V; aun así, en algunas placas clónicas alimentadas a 5 V se ha medido una tensión mayor en la línea TX. Antes de conectarlo, mide entre TX y GND con un multímetro; si supera 3,6 V, intercala un divisor de tensión de 1 kΩ + 2 kΩ. El programa se conecta a la red de casa y ofrece una página que puedes abrir en el móvil; sus botones cambian de pista, pausan y ajustan el volumen.

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

Después de cargar el programa, escribe en el navegador del móvil la dirección que aparece en el Monitor Serie (por ejemplo, 192.168.1.42); el móvil y el ESP32 deben estar en la misma red Wi-Fi. Si no conecta, sigue los pasos de El ESP32 no se conecta al Wi-Fi. En las placas con módulo ESP32-WROVER, GPIO 16 y 17 están reservados para la PSRAM interna, así que pasa la UART a otros pines como 26 y 27; solo tienes que cambiar los números de pin en la línea dfSerial.begin(). Si el ESP32 se reinicia solo mientras el altavoz suena fuerte, el problema es la alimentación; encontrarás los detalles en Brownout en el ESP32.

DFPlayer Mini con Raspberry Pi Pico y MicroPython (UART)

En la Raspberry Pi Pico, usar directamente el protocolo serie del módulo en lugar de buscar una librería hecha es fácil y además muy didáctico. Cada orden es un paquete de 10 bytes: el byte de inicio 0x7E, la versión 0xFF, la longitud 0x06, el código de orden, el indicador de respuesta (0 = sin confirmación), un parámetro de dos bytes, una suma de verificación de dos bytes y el byte final 0xEF. La suma de verificación es el valor negativo de 16 bits de la suma de los seis bytes que van de la versión al último byte del parámetro. Por ejemplo, el paquete que reproduce la primera pista de la raíz es 7E FF 06 03 00 00 01 FE F7 EF. El módulo, a su vez, envía mensajes con el código 0x3D cuando termina una pista, 0x3F cuando la tarjeta está lista y 0x40 cuando hay un error. La UART de 3,3 V de la Pico encaja directamente con el módulo; el aviso sobre la tensión de TX de la sección del ESP32 también vale aquí, porque los pines de la Pico tampoco toleran 5 V. Alimenta el módulo desde el pin VBUS (USB 5 V) de la Pico.

OrdenCódigoParámetro
Pista siguiente / anterior0x01 / 0x02Ninguno
Reproducir la pista n de la raíz0x031–2999
Volumen0x060–30
Ecualizador0x070–5
Reset0x0CNinguno
Reanudar / pausa0x0D / 0x0ENinguno
Reproducir desde una carpeta0x0FByte alto carpeta (1–99), byte bajo archivo (1–255)
Reproducir desde la carpeta mp30x12Número de archivo (1 para 0001.mp3)
Anuncio (advert)0x13Número de archivo
Detener0x16Ninguno
Pista terminada (lo envía el módulo)0x3DNúmero de la pista terminada
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 guardas el código en la Pico como main.py con Thonny, la Pico funcionará como un reproductor MP3 cada vez que se encienda; si empiezas con MicroPython, echa un vistazo a Fundamentos de MicroPython. El botón de GP14 pasa a la pista siguiente y el de GP15 pausa y reanuda; el otro terminal de cada botón va a GND. La función events() acumula los bytes recibidos en un búfer y extrae los paquetes que empiezan por 0x7E y terminan en 0xEF. Cuando llega el mensaje de pista terminada (0x3D), el código pasa al archivo siguiente y, después del último, vuelve al primero. No olvides ajustar la variable TRACKS al número de archivos de tu carpeta /mp3.

Ideas de proyectos con el DFPlayer Mini

  • Timbre con melodías: Un timbre que toca una melodía al azar al pulsar el botón y baja el volumen por la noche.
  • Sistema de bienvenida: Un sensor de movimiento PIR lanza un saludo cuando llega alguien.
  • Caja de música con tarjetas: Cada tarjeta RFID reproduce una carpeta distinta; un reproductor sin pantalla para niños.
  • Reloj parlante: Con un módulo de reloj RTC, un reloj que dice la hora en voz alta o avisa cada hora en punto.
  • Reproductor MP3 con mando a distancia: Control de pista y volumen con un receptor IR y un mando.
  • Decoración de Halloween o caja de bromas: Un HC-SR04 reproduce un sonido aterrador cuando detecta que alguien se acerca.
  • Alarmas y avisos hablados: Frases claras como "Gas detectado en la cocina" en lugar de un pitido ante gas, una inundación o una puerta abierta.
  • Reproductor MP3 con pantalla: Muestra el número de pista y el volumen en una pantalla OLED.

Con una tarjeta SD bien nombrada, la resistencia de 1 kΩ en la línea RX y una alimentación de 5 V sólida, el DFPlayer Mini da sonido de verdad a tus proyectos con Arduino en cuestión de minutos. Si algo falla, revisa primero la tarjeta y el cableado, y después la alimentación; casi todos los problemas salen de uno de esos tres puntos. Si te interesan los fundamentos de la comunicación serie, Comunicación serie UART es un buen siguiente paso. En la app BlueGrays encontrarás proyectos de sonido como melodías con un zumbador, un piano sencillo, un timbre con sensor de movimiento y melodías con ESP32, todos con esquema del circuito y código paso a paso, y después podrás darles sonido real con el DFPlayer Mini.

Preguntas frecuentes

¿Qué tamaño de tarjeta SD admite el DFPlayer Mini?

El DFPlayer Mini lee tarjetas microSD de hasta 32 GB con FAT16 o FAT32. Las tarjetas de 64 GB o más vienen en exFAT, por lo que el módulo no las reconoce. Para unos cientos de MP3, una tarjeta de 1–16 GB es más que suficiente.

¿Por qué mi DFPlayer Mini no suena?

Primero asegúrate de que el Monitor Serie muestra "online"; si no aparece, el problema está en el cableado o en la tarjeta SD. Si el módulo arranca pero no suena, comprueba que el volumen no esté en 0, que el altavoz esté conectado a SPK_1 y SPK_2 y que los nombres de los archivos encajen con la función que llamas. Si el LED de la placa se enciende, el módulo realmente está reproduciendo.

¿Por qué se pone una resistencia de 1k en el pin RX del DFPlayer Mini?

El chip del módulo funciona a 3,3 V, mientras que el pin TX del Arduino Uno entrega 5 V. Una resistencia de 1 kΩ en serie con la línea RX limita la corriente que entra en el chip y reduce el chisporroteo del altavoz durante la comunicación serie. También se recomienda en placas de 3,3 V como el ESP32 y la Pico, como protección contra el ruido.

¿Funciona el DFPlayer Mini sin Arduino?

Sí. Si conectas los pines IO_1 e IO_2 a GND mediante botones, una pulsación corta cambia de pista y una larga ajusta el volumen. Los botones conectados a los pines ADKEY con resistencias también pueden reproducir pistas concretas. Así puedes montar un reproductor MP3 o un timbre solo con una pila, un altavoz y unos botones, sin microcontrolador.

¿Qué altavoz se puede conectar al DFPlayer Mini?

A los pines SPK_1 y SPK_2 se conecta directamente un altavoz de 4 Ω u 8 Ω y menos de 3 W; los de 8 Ω y 1–3 W dan el mejor equilibrio. No conectes ninguno de los terminales del altavoz a GND. Para más volumen o sonido estéreo, conecta las salidas DAC_L y DAC_R a un amplificador como el PAM8403.

¿Por qué el DFPlayer Mini reproduce los archivos en otro orden?

La función play(n) no mira el nombre del archivo, sino el orden en que se copiaron los archivos a la tarjeta. Para reproducir por nombre, nombra los archivos como /mp3/0001.mp3 y usa playMp3Folder(), o como /01/001.mp3 y usa playFolder(). Si preparaste la tarjeta en un Mac, elimina también los archivos ocultos ._.

Ver todos los proyectos
Uso del zumbador
#13Principiante

Uso del zumbador

¿Alguna vez te has preguntado cómo suena un timbre o una alarma? El Arduino hace pitar un pequeño zumbador a intervalos cortos: pip, silencio, pip, silencio. Ves cómo se crea sonido con electricidad y

4.7(89)
158
Himno nacional turco con zumbador
#15Intermedio

Himno nacional turco con zumbador

Pulsas el botón y un pequeño zumbador empieza a tocar el himno nacional de Turquía, nota a nota. El Arduino toca cada nota con la altura y la duración justas, interpreta dos estrofas del himno de prin

4.9(100)
183
Ajuste de frecuencia con zumbador
#14Intermedio

Ajuste de frecuencia con zumbador

Controlas el sonido de un zumbador con cuatro botones: uno lo enciende, otro lo calla y los otros dos lo hacen más agudo o más grave. Si mantienes pulsado el botón de subir o bajar, el tono cambia pas

4.6(68)
115
ESP32 Reproducción de melodías con zumbador
#114Principiante
Premium

ESP32 Reproducción de melodías con zumbador

Tocando una melodía simple (Twinkle Twinkle Little Star) con un zumbador pasivo. Tocamos las notas con las funciones tone() y noTone() como en Arduino - la misma sintaxis funciona con ESP32 Arduino Core 3.0+. Se debe utilizar un zumbador pasivo (el zumbador activo no reproduce la melodía).

4.8(30)
55
Reproducir melodías con mando IR y zumbador
#18Principiante
Premium

Reproducir melodías con mando IR y zumbador

Construye una caja de música que toca melodías con los botones del mando de la tele. Un receptor de infrarrojos capta la señal del mando; un botón hace sonar en el zumbador una melodía animada de vide

4.8(57)
74
Piano sencillo con zumbador y botón
#26Avanzado
Premium

Piano sencillo con zumbador y botón

Monta tu propio pequeño piano con ocho botones. Cada botón es una nota, de grave a agudo: do, re, mi, fa, sol, la, si y el do agudo. La nota suena en el zumbador mientras mantienes el botón pulsado y

4.9(66)
88
Marcha Mehter con Arduino
#100Principiante
Premium

Marcha Mehter con Arduino

Este proyecto te permite tocar el Himno de Mehter con un bucle infinito usando solo Arduino Uno, Buzzer y Cables Jumper. Sólo tienes que hacer las conexiones, y pegar el código.

4.0(24)
36
Timbre y luz con sensor de movimiento
#25Intermedio
Premium

Timbre y luz con sensor de movimiento

Cuando alguien se acerca a tu puerta, te enteras antes de que llame. En cuanto el sensor de movimiento detecta a alguien, se enciende el LED y el zumbador toca un timbre de tres notas de agudo a grave

4.7(54)
71