Componentes · 17 min de leitura

DFPlayer Mini com Arduino: tocar MP3, cartão SD e alto-falante

Como usar o DFPlayer Mini com Arduino: o resistor de 1k no RX, cartão SD e nomes 0001.mp3, código com biblioteca, botões, alto-falante e exemplos para ESP32 e Pico.

O DFPlayer Mini é o jeito mais barato e fácil de tocar MP3 com Arduino: ele decodifica sozinho os arquivos de áudio de um cartão microSD, aciona um alto-falante diretamente com seu pequeno amplificador embutido e recebe comandos do Arduino por uma ligação serial de dois fios. Diferente dos bipes de um buzzer, ele toca músicas, falas, toques de campainha ou avisos falados como “A porta ainda está aberta”. A maioria das pessoas que o ligam pela primeira vez esbarra nos mesmos problemas: não sai som, o alto-falante chia, os arquivos tocam na ordem errada ou o Monitor Serial diz “Unable to begin”. Este guia resolve cada um deles e explica por que acontecem.

Primeiro você vai conhecer os pinos do módulo e por que um resistor de 1 kΩ vai na linha RX. Depois vai ver como preparar o cartão SD em FAT32, nomear os arquivos no esquema 0001.mp3 e de pastas 01, tocar seu primeiro som com a biblioteca DFRobotDFPlayerMini, ajustar o volume e o EQ, trocar de faixa com botões e escolher o alto-falante ou o amplificador externo certo. As últimas seções trazem a solução passo a passo do erro “Unable to begin”, um tocador de MP3 controlado por uma página web com o ESP32 e um exemplo em MicroPython sem biblioteca para o Raspberry Pi Pico. Se você só precisa de um bipe ou de uma melodia simples, um buzzer é a opção mais simples.

Módulo tocador de MP3 DFPlayer Mini
DFPlayer Mini: só 20 × 20 mm, com slot para cartão microSD, chip decodificador de MP3 e um pequeno amplificador que aciona um alto-falante de até 3 W.

O que é o DFPlayer Mini e como ele funciona?

O DFPlayer Mini é um tocador de MP3 completo, formado por um chip decodificador de MP3, um DAC de 24 bits, um slot para cartão microSD e um pequeno amplificador mono. O Arduino só precisa enviar comandos curtos como “toque a faixa 3” ou “coloque o volume em 20”; ler o arquivo do cartão, decodificar o áudio comprimido e acionar o alto-falante são tarefas do módulo. É por isso que até um Arduino Uno com 2 KB de RAM consegue tocar música sem esforço. Os comandos são enviados a 9600 baud em pacotes de 10 bytes cada, e o módulo responde no mesmo formato quando uma faixa termina, quando um cartão é inserido ou retirado ou quando ocorre um erro. O chip da placa varia conforme o fabricante (YX5200-24SS, MH2024K-24SS, GD3200B e outros). Todos entendem os mesmos comandos, mas podem levar tempos diferentes para responder, um detalhe que vai importar mais adiante com o erro “Unable to begin”. O módulo pode ser controlado de três jeitos: pela porta serial (UART), pelos botões IO ou por uma escada de resistores ADKEY.

CaracterísticaValor
Arquivos suportadosMP3, WAV, WMA
Taxas de amostragem8 / 11,025 / 12 / 16 / 22,05 / 24 / 32 / 44,1 / 48 kHz
DAC24 bits; faixa dinâmica de 90 dB, relação sinal-ruído de 85 dB
ArmazenamentoCartão microSD (TF) de até 32 GB, FAT16 ou FAT32; pen drives USB também são suportados
Capacidade de pastasAté 100 pastas, 255 arquivos por pasta
Volume30 níveis (0–30)
Equalizador (EQ)6 modos: Normal, Pop, Rock, Jazz, Classic, Bass
Saída de alto-falanteAmplificador mono embutido, alto-falantes abaixo de 3 W
Saída de linhaDAC_L e DAC_R: estéreo, para fones ou amplificador externo
Alimentação3,2–5,0 V (tipicamente 4,2 V)
Corrente em esperaCerca de 20 mA
InterfaceUART, 9600 baud, 8N1
Tamanho20 × 20 mm

Pinagem do DFPlayer Mini

PinoNomeFunção
1VCCEntrada de alimentação, 3,2–5,0 V
2RXEntrada serial: vai no pino TX da placa por um resistor de 1 kΩ
3TXSaída serial: vai no pino RX da placa
4DAC_RSaída de linha do canal direito (fones ou amplificador)
5DAC_LSaída de linha do canal esquerdo (fones ou amplificador)
6 e 8SPK_1, SPK_2Saída de alto-falante: os dois fios de um alto-falante abaixo de 3 W vão aqui
7GNDTerra
9IO_1Toque curto no GND: faixa anterior; toque longo: abaixa o volume
10GNDTerra
11IO_2Toque curto no GND: próxima faixa; toque longo: aumenta o volume
12ADKEY1Entrada para vários botões por escada de resistores
13ADKEY2Segunda entrada de escada de resistores
14USB+D+ para pen drive USB
15USB−D− para pen drive USB
16BUSYLOW enquanto toca, HIGH quando parado

Quando você usa a porta serial, só precisa dos pinos VCC, GND, RX, TX e de alto-falante. O pino BUSY diz se uma faixa terminou sem nenhum tráfego serial, e o pequeno LED da placa também acende durante a reprodução. Os pinos IO_1 e IO_2 permitem que o módulo funcione sem Arduino nenhum: com um botão entre cada pino e o GND, um toque curto muda a faixa e um toque longo ajusta o volume. Botões ligados aos pinos ADKEY por resistores de valores diferentes também podem tocar faixas específicas. Isso significa que uma bateria, um alto-falante e dois botões bastam para montar uma campainha ou um brinquedo falante sem microcontrolador. Os pinos USB+ e USB− servem para tocar de um pen drive em vez do cartão SD e ficam desconectados na maioria dos projetos.

Ligação do DFPlayer Mini com Arduino e o resistor de 1k no RX

Pino do DFPlayerArduino UnoESP32Raspberry Pi Pico
VCC5V5V (VIN)VBUS (5 V da USB, pino 40)
GNDGNDGNDGND
RXD11 por um resistor de 1 kΩGPIO 17 (TX2) por um resistor de 1 kΩGP0 (TX da UART0) por um resistor de 1 kΩ
TXD10GPIO 16 (RX2)GP1 (RX da UART0)
SPK_1 e SPK_2Os dois fios do alto-falanteOs dois fios do alto-falanteOs dois fios do alto-falante
BUSY (opcional)D5Não usadoNão usado
Arduino Uno
Arduino Uno
Placa ESP32
Placa ESP32
Raspberry Pi Pico
Raspberry Pi Pico

As linhas de dados são cruzadas: o TX do módulo vai no RX da placa, e o RX dele vai no TX da placa. A porta serial de hardware do Uno, em D0 e D1, é usada para carregar o código pela USB e para o Monitor Serial, então ligamos o módulo em D10 (RX) e D11 (TX) com SoftwareSerial. O resistor de 1 kΩ em série com a entrada RX do módulo não é um detalhe menor. O chip do DFPlayer trabalha com lógica de 3,3 V, enquanto o pino TX do Uno fornece 5 V. Sem o resistor, a diferença empurra corrente pelos diodos de proteção da entrada do chip; essa corrente força o chip e causa o chiado e os cliques que você ouve no alto-falante durante a comunicação serial. Se você fizer a conta com a lei de Ohm, verá que 1 kΩ limita essa corrente a cerca de 1–2 mA, enquanto o sinal de 9600 baud não é afetado. Um resistor muito maior, como 10 kΩ, pode enfraquecer o sinal e quebrar a comunicação. A saída TX do módulo vai direto no Uno, porque o Uno lê 3,3 V como HIGH (o limite é de cerca de 3,0 V).

Nunca ligue o SPK_1 ou o SPK_2 no GND. O amplificador da placa tem saída em ponte (BTL): os dois fios levam o sinal de áudio e, se um deles for aterrado, o amplificador entra em curto e pode ser destruído. Pelo mesmo motivo, não ligue os pinos SPK na entrada de um amplificador externo; use para isso as saídas de linha DAC_L e DAC_R. Também não ligue um alto-falante com impedância abaixo de 4 Ω.

Preparando o cartão SD: FAT32, pastas e nomes 0001.mp3

O DFPlayer Mini lê cartões microSD de até 32 GB formatados em FAT16 ou FAT32. Cartões de 64 GB ou mais vêm formatados em exFAT, que o módulo não lê; um cartão de 1–16 GB é mais que suficiente para algumas centenas de faixas. Codificar os seus MP3 a 128–192 kbps e 44,1 kHz é a escolha mais segura tanto para compatibilidade quanto para a velocidade de leitura do cartão. O módulo identifica os arquivos por número, não por nome, então os nomes de pastas e arquivos precisam seguir um esquema específico conforme a função que você usar para tocá-los:

Local no cartãoExemploFunção da bibliotecaRegra
Pasta raiz/0001.mp3, /0002.mp3play(1)Toca na ordem em que os arquivos foram copiados para o cartão, não pelo nome
Pastas numeradas/01/001.mp3 … /99/255.mp3playFolder(1, 1)Nome da pasta com 2 dígitos (01–99), nome do arquivo com 3 dígitos (001–255)
Pasta mp3/mp3/0001.mp3playMp3Folder(1)Nome do arquivo com 4 dígitos; o arquivo é encontrado pelo número no nome
Pasta advert/advert/0001.mp3advertise(1)Interrompe a faixa atual e a retoma quando o anúncio termina
Pastas grandes/01/0001.mp3 … /15/3000.mp3playLargeFolder(1, 1)Até 15 pastas, 3000 arquivos por pasta, nomes com 4 dígitos
  1. Formate o cartão em FAT32 no computador (no Windows: botão direito > Formatar; no macOS: Utilitário de Disco > Apagar > MS-DOS (FAT)).
  2. Crie na raiz uma pasta chamada mp3 e, se precisar, pastas numeradas como 01 e 02.
  3. Renomeie os arquivos como 0001.mp3, 0002.mp3 (nas pastas numeradas: 001.mp3). Você pode acrescentar uma descrição depois do número, como 0001_hello.mp3; o módulo só olha os dígitos iniciais.
  4. Se for tocar os arquivos da raiz com play(), copie-os um de cada vez, em ordem; uma cópia em lote pode bagunçar a ordem.
  5. Ejete o cartão com segurança e coloque-o no módulo com a alimentação desligada; colocar ou tirar com o módulo funcionando pode corromper os arquivos.
O macOS cria cópias ocultas como ._0001.mp3 para cada arquivo, além de pastas ocultas como .Spotlight-V100 e .fseventsd. O DFPlayer conta essas cópias como arquivos também, então toca a faixa errada, fica em silêncio ou o readFileCounts() informa mais arquivos do que deveria. Se você preparou o cartão em um Mac, rode dot_clean -m /Volumes/CARD_NAME no Terminal ou apague os arquivos ocultos à mão. A pasta System Volume Information que o Windows cria normalmente não causa problema.

A biblioteca DFRobotDFPlayerMini e um primeiro sketch de teste

  1. No Arduino IDE, abra o Gerenciador de Bibliotecas, digite DFRobotDFPlayerMini e instale a biblioteca da DFRobot. Os passos de instalação estão explicados em detalhes em Como instalar uma biblioteca no Arduino.
  2. Copie pelo menos um MP3 para a raiz do cartão SD, coloque o cartão no módulo e monte o circuito como mostra a tabela.
  3. Carregue o sketch abaixo e abra o Monitor Serial a 115200 baud.
  4. Em poucos segundos você deve ver “DFPlayer Mini online.” e o número de arquivos do cartão e, em seguida, ouvir a primeira faixa.
C++ (Arduino IDE)
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
FunçãoO que faz
begin(serial, isACK, doReset)Inicia o módulo; por padrão, envia um reset e espera a mensagem de que o cartão está pronto
volume(0–30)Ajusta o volume; volumeUp() e volumeDown() mudam um nível
EQ(DFPLAYER_EQ_POP)Equalizador: NORMAL, POP, ROCK, JAZZ, CLASSIC, BASS
play(n)Toca o n-ésimo arquivo da raiz (na ordem de cópia)
next() / previous()Próxima / faixa anterior
pause() / start()Pausa / retoma de onde parou
stop()Para a reprodução
loop(n)Repete a faixa n sem parar
enableLoopAll() / randomAll()Toca todas as faixas em loop / em ordem aleatória
readState() / readVolume() / readFileCounts()Consulta o status, o volume e o número de arquivos no cartão
available() / readType() / read()Lê as mensagens do módulo (faixa terminou, erro, cartão retirado)
O begin() envia um reset ao módulo e espera até 2 segundos pela mensagem de que o cartão está pronto, então é normal a inicialização levar alguns segundos. Por padrão, a biblioteca espera a confirmação do módulo depois de cada comando, para os comandos não se acumularem. Mesmo assim, não envie volume() nem play() a cada passagem do loop(): um módulo que recebe comandos sem parar pode travar, e o alto-falante vai dar cliques. Só envie um comando quando algo tiver mudado.

Volume, EQ e anúncios em sequência com o pino BUSY

O volume vai de 0 a 30. Com um alto-falante pequeno, 15–20 basta para a maioria dos cômodos; acima de 25, principalmente com uma fonte fraca, o som pode começar a distorcer (clipping) e o módulo pode reiniciar. A configuração de EQ muda o equilíbrio entre graves e agudos; em alto-falantes pequenos, o modo BASS pode deixar o som embolado, então comece pelo NORMAL. As pastas numeradas são muito práticas para projetos falantes: coloque as palavras “Temperatura” e “graus” na pasta 01 e os números de 001.mp3 a 100.mp3 na pasta 02, e o Arduino consegue falar números como uma frase. O jeito mais confiável de saber que um arquivo terminou é o pino BUSY: ele fica em LOW enquanto o módulo toca e em HIGH quando está parado. O sketch abaixo lê o BUSY no D5 e toca os arquivos um depois do outro, sem sobreposição:

C++ (Arduino IDE)
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

O playAndWait() primeiro envia o comando, espera até 1 segundo o BUSY ir para LOW (o módulo leva algumas centenas de milissegundos para começar a tocar) e depois espera até a faixa terminar. Você pode gravar os arquivos de áudio com a própria voz ou gerá-los com uma ferramenta de texto para fala (TTS); cortar o silêncio do começo e do fim de cada arquivo deixa o anúncio mais natural. Se você quer interromper a música para um aviso curto, use advertise(n): o módulo toca o anúncio da pasta /advert e depois retoma a música de onde parou. Esse comando só funciona enquanto uma faixa está tocando; chamado com o módulo parado, ele retorna um erro.

Trocando de faixa com botões e ajustando o volume com um potenciômetro

Agora vamos montar nosso próprio tocador de MP3: três botões fazem faixa anterior, tocar/pausar e próxima faixa, e um potenciômetro ajusta o volume. Ligue os botões entre D2, D3 e D4 e o GND; como usamos os resistores de pull-up internos, não é preciso resistor externo (o motivo está explicado em Como ligar um botão). Os pinos das pontas do potenciômetro vão no 5V e no GND, e o pino do meio vai no A0. Quando uma faixa termina, o sketch passa automaticamente para a próxima.

C++ (Arduino IDE)
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 do códigoPara que serve
pressed()Pega só o momento em que um botão é apertado e ignora repiques em 50 ms; segurar o botão continua enviando um único comando
abs(raw - lastRaw) > 20Só atualiza o volume em mudanças claras, para que pequenas variações na leitura do potenciômetro não inundem o módulo de comandos e causem cliques
map(raw, 0, 1023, 0, 30)Converte o valor analógico de 0–1023 para a faixa de volume de 0–30 do DFPlayer
pausedLembra o estado da reprodução para que o mesmo botão possa pausar e retomar
DFPlayerPlayFinishedA mensagem enviada quando uma faixa termina; o sketch passa para a próxima faixa
millis() - lastFinish > 1000Alguns módulos clone informam o fim de uma faixa duas vezes; essa verificação impede que uma faixa seja pulada

Escolhendo um alto-falante (3 W) e um amplificador externo

O amplificador do próprio DFPlayer (um chip do tipo 8002 na maioria das placas) aciona diretamente um alto-falante abaixo de 3 W com impedância de 4 Ω ou 8 Ω. O melhor equilíbrio vem de um alto-falante de 8 Ω e 1–3 W; alto-falantes pequenos de 0,5 W também funcionam, mas sofrem com volume alto. O número de 3 W é o limite superior do amplificador com alimentação de 5 V e carga de 4 Ω, no ponto em que a distorção fica evidente; a potência limpa que você obtém no uso do dia a dia é menor. Montar o alto-falante em uma caixa, ou pelo menos em um painel, melhora bastante os graves, porque o som da frente e o de trás do cone deixam de se anular. Com volume alto, o módulo pode puxar por um instante algumas centenas de miliampères; em um Arduino alimentado pela porta USB de um computador, isso pode causar quedas de tensão, chiado e reinícios. Se você quer mais potência ou som estéreo, ligue as saídas de linha DAC_L e DAC_R a um amplificador externo:

Caminho de saídaLigaçãoQuando?
Amplificador embutidoSPK_1 e SPK_2 → alto-falante de 4–8 Ω de até 3 WProjetos pequenos como campainhas, brinquedos e avisos falados
Fones de ouvidoDAC_L, DAC_R e GND → conector P2 de 3,5 mmEscuta individual; comece com volume baixo
Módulo amplificador PAM8403DAC_L, DAC_R e GND → entradas L, R e GND do amplificador; o amplificador funciona com 5 VCaixa de som portátil estéreo de 2 × 3 W alimentada por bateria
Amplificador PAM8610 ou TPA3116Saídas DAC → entrada do amplificador; o amplificador funciona com 12 VMais potência: 2 × 10 W ou mais
Caixa de som amplificada (AUX)DAC_L, DAC_R e GND → entrada AUX da caixa amplificadaAproveitar uma caixa de som de computador que você já tem
Coloque um capacitor eletrolítico de 100–470 µF entre os pinos VCC e GND do DFPlayer, o mais perto possível do módulo; ele fornece os picos súbitos de corrente com volume alto e evita reinícios. Se você usar um amplificador externo, una o amplificador, o DFPlayer e o Arduino no mesmo ponto de GND; circuitos alimentados por fontes diferentes com terras separados são a causa mais comum de zumbido. Explicamos por que isso importa em GND comum (terra). Mantenha os fios do alto-falante curtos e não os passe junto com os fios da serial.

Como se livrar de chiado, ruído e cliques

  • Chiado e cliques ao enviar comandos: falta o resistor de 1 kΩ na linha RX. Coloque-o entre o pino TX do Arduino e o pino RX do módulo.
  • Chiado ou zumbido constante: a fonte tem ruído ou é fraca demais. Alimente o DFPlayer com uma fonte de 5 V separada, coloque um capacitor entre VCC e GND e ligue todos os GNDs juntos.
  • Um “pop” ao ligar: vem do comando de reset enviado pelo begin(). Se incomodar, pule o reset com player.begin(dfSerial, true, false).
  • Zumbido com o ESP32: os pulsos de corrente durante a transmissão Wi-Fi entram na alimentação e, dali, no áudio. Coloque um capacitor na alimentação do DFPlayer e, se puder, use uma fonte separada.
  • Som rachado e distorcido com volume alto: o alto-falante ou o amplificador está trabalhando no limite. Baixe o volume para cerca de 20–25, escolha um alto-falante mais eficiente ou passe para um amplificador externo.
  • Chiado fraco quando nada está tocando: é o ruído do próprio amplificador da placa e nunca some por completo em módulos pequenos. Em projetos em que o silêncio importa, ligar a saída DAC a um bom amplificador externo dá o melhor resultado.

O erro “Unable to begin” e como resolvê-lo

Se o Monitor Serial mostrar Unable to begin: seguido de 1.Please recheck the connection! e 2.Please insert the SD card!, a verificação do begin() no sketch de exemplo da biblioteca falhou. O begin() envia ao módulo um comando de reset e espera 2 segundos pela mensagem de “cartão on-line”; se a mensagem não chegar, ele retorna false. Então a causa pode ser a ligação, o cartão SD, a alimentação ou o jeito como o módulo responde. Vá investigando nesta ordem:

Causa possívelVerificação e solução
TX e RX não cruzadosO TX do módulo precisa ir no D10 (RX da SoftwareSerial) e o RX dele no D11 (TX da SoftwareSerial) por 1 kΩ; isso tem que combinar com a ordem (RX, TX) de SoftwareSerial(10, 11)
Sem GND comumO GND do módulo precisa estar ligado ao GND do Arduino; se você usa uma fonte separada, una os GNDs também
Cartão SD não lidoO cartão está inserido, em FAT32, menor que 32 GB e tem pelo menos um arquivo de áudio? Formate de novo ou teste outro cartão
Resistor erradoA linha RX precisa de 1 kΩ; valores grandes como 10 kΩ enfraquecem o sinal
Alimentação insuficienteO VCC deve ter 4–5 V; desconecte o alto-falante temporariamente, meça a tensão com um multímetro e coloque um capacitor
Baud rate erradoTem que ser dfSerial.begin(9600); não confunda com a velocidade do Monitor Serial (115200)
D0 e D1 usadosNo Uno, a porta serial de hardware é compartilhada com a USB; mude o módulo para os pinos da SoftwareSerial
Chip clone responde tardeColoque um delay(1000) antes do begin(); se não ajudar, use begin(dfSerial, true, false) para pular a espera depois do reset
Código de DFPlayerErrorNome na bibliotecaSignificado
1BusyMódulo ocupado ou cartão não encontrado (inicialização não concluída)
2SleepingO módulo está em modo sleep
3SerialWrongStackDados seriais corrompidos recebidos
4CheckSumNotMatchO checksum do pacote não bateu
5FileIndexOutO número de faixa pedido está fora da faixa existente no cartão
6FileMismatchO arquivo pedido não foi encontrado; confira os nomes
7AdvertiseErro de anúncio, por exemplo advertise() chamado quando nada está tocando
Algumas placas clone baratas nunca enviam a mensagem esperada depois de um reset, ou a enviam tarde; nesse caso, o begin() retorna false mesmo com a ligação correta. player.begin(dfSerial, true, false) pula a etapa de reset e passa na verificação; se o módulo der som com essa configuração, o problema era esse. Essa configuração, porém, também esconde um defeito real de ligação, então confira antes os itens da tabela. Para saber se o módulo responde de alguma forma, veja o player.readFileCounts(): se ele retornar -1, nenhuma resposta está vindo do módulo.

DFPlayer Mini com ESP32: controlando MP3 por uma página web

No ESP32 você não precisa de SoftwareSerial; qualquer uma das três UARTs de hardware dele pode ser atribuída aos pinos que você escolher. No sketch abaixo, a UART2 funciona no GPIO 16 (RX) e no GPIO 17 (TX), e o DFPlayer é alimentado pelo pino 5V (VIN) da placa ESP32. O sinal TX de 3,3 V do ESP32 é diretamente compatível com o módulo, mas mantenha o resistor de 1 kΩ mesmo assim, como proteção contra ruído. No sentido contrário, a DFRobot informa que o nível lógico do módulo é de 3,3 V; mesmo assim, já foi medida uma tensão maior na linha TX de algumas placas clone funcionando com 5 V. Antes de ligar, meça entre TX e GND com um multímetro; se passar de 3,6 V, acrescente um divisor de tensão de 1 kΩ + 2 kΩ. O sketch entra na rede da sua casa e serve uma página que você pode abrir no celular; os botões dela trocam de faixa, pausam e ajustam o volume.

C++ (Arduino IDE)
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

Depois de carregar, digite no navegador do celular o endereço mostrado no Monitor Serial (por exemplo, 192.168.1.42); o celular e o ESP32 precisam estar na mesma rede Wi-Fi. Se não conectar, siga os passos de ESP32 não conecta ao Wi-Fi. Nas placas com módulo ESP32-WROVER, os GPIO 16 e 17 são reservados para a PSRAM interna, então mude a UART para outros pinos, como o 26 e o 27; você só precisa mudar os números dos pinos na linha dfSerial.begin(). Se o ESP32 reiniciar sozinho enquanto o alto-falante toca alto, o problema é a alimentação; veja brownout no ESP32 para os detalhes.

DFPlayer Mini com Raspberry Pi Pico e MicroPython (UART)

No Raspberry Pi Pico, usar diretamente o protocolo serial do módulo, em vez de caçar uma biblioteca pronta, é fácil e didático. Cada comando é um pacote de 10 bytes: o byte de início 0x7E, a versão 0xFF, o comprimento 0x06, o código do comando, a flag de retorno (0 = sem confirmação), um parâmetro de dois bytes, um checksum de dois bytes e o byte de fim 0xEF. O checksum é o negativo de 16 bits da soma dos seis bytes da versão até o último byte do parâmetro. Por exemplo, o pacote que toca a primeira faixa da raiz é 7E FF 06 03 00 00 01 FE F7 EF. O módulo, por sua vez, envia mensagens com o código 0x3D quando uma faixa termina, 0x3F quando o cartão está pronto e 0x40 quando ocorre um erro. A UART de 3,3 V do Pico combina diretamente com o módulo; o aviso sobre a tensão do TX da seção do ESP32 vale aqui também, porque os pinos do Pico também não toleram 5 V. Alimente o módulo pelo pino VBUS (5 V da USB) do Pico.

ComandoCódigoParâmetro
Próxima / faixa anterior0x01 / 0x02Nenhum
Tocar a n-ésima faixa da raiz0x031–2999
Volume0x060–30
EQ0x070–5
Reset0x0CNenhum
Retomar / pausar0x0D / 0x0ENenhum
Tocar de uma pasta0x0FByte alto: pasta (1–99), byte baixo: arquivo (1–255)
Tocar da pasta mp30x12Número do arquivo (1 para 0001.mp3)
Anúncio (advert)0x13Número do arquivo
Parar0x16Nenhum
Faixa terminou (enviado pelo módulo)0x3DNúmero da faixa que terminou
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

Se você salvar o código no Pico como main.py com o Thonny, o Pico se comporta como um tocador de MP3 toda vez que é ligado; se está começando no MicroPython, dê uma olhada em fundamentos do MicroPython. O botão no GP14 pula para a próxima faixa e o botão no GP15 pausa e retoma; o outro lado de cada botão vai no GND. A função events() junta os bytes que chegam em um buffer e extrai os pacotes que começam com 0x7E e terminam com 0xEF. Quando chega uma mensagem de faixa terminada (0x3D), o código passa para o próximo arquivo e volta ao primeiro depois do último. Não se esqueça de ajustar a variável TRACKS para o número de arquivos da sua pasta /mp3.

Ideias de projetos com o DFPlayer Mini

  • Campainha com melodia: uma campainha que toca uma música aleatória quando o botão é apertado e abaixa o volume à noite.
  • Sistema de boas-vindas: um sensor de movimento PIR dispara uma saudação quando alguém chega.
  • Caixa de música com cartões: cada cartão RFID toca uma pasta diferente; um tocador de música sem tela para crianças.
  • Relógio falante: com um módulo de relógio RTC, um relógio que fala a hora ou avisa a cada hora cheia.
  • Tocador de MP3 com controle remoto: controle de faixa e de volume com um receptor IR + controle remoto.
  • Decoração de Halloween ou caixa de pegadinha: um HC-SR04 toca um som assustador quando detecta alguém se aproximando.
  • Alarmes e alertas falados: frases claras como “Gás detectado na cozinha” em vez de um bipe quando há gás, vazamento de água ou uma porta aberta.
  • Tocador de MP3 com display: mostre o número da faixa e o volume em um display OLED de 0,96 polegada.

Com um cartão SD com os nomes certos, o resistor de 1 kΩ na linha RX e uma fonte de 5 V firme, o DFPlayer Mini acrescenta som de verdade aos seus projetos com Arduino em minutos. Se algo der errado, confira primeiro o cartão e a ligação, depois a alimentação; quase todo problema vem de um desses três. Se você tem curiosidade sobre o básico da comunicação serial, comunicação serial UART é um bom próximo passo. No app BlueGrays você encontra projetos de som como tocar melodias com buzzer, um piano simples, uma campainha com sensor de movimento e melodias com ESP32, cada um com esquemas do circuito e código passo a passo, e depois pode dar a eles som de verdade com o DFPlayer Mini.

Perguntas frequentes

Qual tamanho de cartão SD o DFPlayer Mini suporta?

O DFPlayer Mini lê cartões microSD de até 32 GB formatados em FAT16 ou FAT32. Cartões de 64 GB ou mais vêm formatados em exFAT, então o módulo não os enxerga. Um cartão de 1–16 GB é mais que suficiente para algumas centenas de MP3.

Por que meu DFPlayer Mini não toca nenhum som?

Primeiro confira se aparece “online” no Monitor Serial; se não aparecer, o problema é a ligação ou o cartão SD. Se o módulo inicia, mas não há som, confira se o volume não está em 0, se o alto-falante está ligado no SPK_1 e no SPK_2 e se os nomes dos arquivos combinam com a função que você chama. Quando o LED da placa acende, o módulo está mesmo tocando.

Por que se coloca um resistor de 1k no pino RX do DFPlayer Mini?

O chip do módulo trabalha em 3,3 V, enquanto o pino TX do Arduino Uno fornece 5 V. Um resistor de 1 kΩ em série com a linha RX limita a corrente que entra no chip e reduz o chiado ouvido no alto-falante durante a comunicação serial. Ele também é recomendado em placas de 3,3 V como o ESP32 e o Pico, como proteção contra ruído.

O DFPlayer Mini funciona sem Arduino?

Sim. Se você ligar os pinos IO_1 e IO_2 ao GND por botões, um toque curto muda a faixa e um toque longo ajusta o volume. Botões ligados aos pinos ADKEY por resistores também podem tocar faixas específicas. Assim, dá para montar um tocador de MP3 ou uma campainha só com uma bateria, um alto-falante e alguns botões, sem precisar de microcontrolador.

Que alto-falante posso ligar no DFPlayer Mini?

Um alto-falante de 4 Ω ou 8 Ω abaixo de 3 W se liga direto nos pinos SPK_1 e SPK_2; alto-falantes de 8 Ω e 1–3 W dão o melhor equilíbrio. Nunca ligue nenhum dos fios do alto-falante no GND. Para som mais alto ou estéreo, ligue as saídas DAC_L e DAC_R a um amplificador como o PAM8403.

Por que o DFPlayer Mini toca os arquivos na ordem errada?

A função play(n) não olha o nome do arquivo, e sim a ordem em que os arquivos foram copiados para o cartão. Para tocar pelo nome, nomeie os arquivos como /mp3/0001.mp3 e use playMp3Folder(), ou como /01/001.mp3 e use playFolder(). Se você preparou o cartão em um Mac, remova também os arquivos ocultos ._.

Ver todos os projetos
Uso do buzzer
#13Iniciante

Uso do buzzer

Já se perguntou como uma campainha ou um alarme produz som? O Arduino faz um pequeno buzzer emitir bipes em intervalos curtos: bipe, pausa, bipe, pausa. Você vê como a eletricidade produz som e dá o p

4.7(89)
161
Hino nacional da Turquia com buzzer
#15Intermediário

Hino nacional da Turquia com buzzer

Pressione o botão e um pequeno buzzer começa a tocar o hino nacional da Turquia, nota por nota. O Arduino toca cada nota na altura e na duração certas, executando duas estrofes do hino do início ao fi

4.9(106)
213
Ajuste de frequência com buzzer
#14Intermediário

Ajuste de frequência com buzzer

Você controla o som de um buzzer com quatro botões: um inicia o som, outro o interrompe e os outros dois o deixam mais agudo ou mais grave. Mantenha pressionado o botão de aumentar ou diminuir, e o to

4.6(69)
118
Melodia com buzzer e ESP32
#114Iniciante
Premium

Melodia com buzzer e ESP32

Toque uma melodia simples (Brilha, brilha, estrelinha) com um buzzer passivo. Usamos as funções tone() e noTone() para tocar as notas, como no Arduino. A mesma sintaxe funciona com ESP32 Arduino Core 3.0+. É preciso usar um buzzer passivo, pois o ativo não toca melodias.

4.8(30)
55
Tocar melodias com receptor IR, controle remoto e buzzer
#18Iniciante
Premium

Tocar melodias com receptor IR, controle remoto e buzzer

Monte uma caixinha de música que toca melodias com os botões de um controle de TV. Um receptor infravermelho capta o sinal do controle; um botão faz o buzzer tocar uma música animada de videogame, out

4.8(57)
74
Piano simples com buzzer e botões
#26Avançado
Premium

Piano simples com buzzer e botões

Monte seu próprio piano com oito botões. Cada botão corresponde a uma nota, da mais grave à mais aguda: dó, ré, mi, fá, sol, lá, si e dó agudo. A nota toca no buzzer enquanto você mantém o botão press

4.9(66)
88
Campainha e luz com sensor de movimento
#25Intermediário
Premium

Campainha e luz com sensor de movimento

Quando alguém se aproxima da sua porta, você fica sabendo antes mesmo de a pessoa tocar a campainha. Assim que o sensor detecta alguém, o LED acende e o buzzer toca uma melodia de três notas, da mais

4.7(54)
71