Manual

do

Maker

.

com

Módulo DFplayer standalone e microcontrolado

Módulo DFplayer standalone e microcontrolado

Nunca dei muita atenção para players; se fosse pra fazer a partir do CI, seria muito trabalhoso. Pegar pronto, trabalho nenhum, daí não achava interessante escrever a respeito. Até que apareceu um projeto que necessitava de áudio, daí tive que realmente pesquisar a respeito e, vejam só, é um bocado interessante.

Existem alguns poucos módulos de áudio, dentre os quais, o WTV020 e o DFplayer. O problema com o WTV020 é que ele toca arquivos AD4, um tipo de PCM meio específico e para prepará-lo é um trabalho extra. Fora isso, há discussões a respeito do micro SD, que dizem uns, precisa ser de 1GB; dizem outros, 2GB. Não sei se cartões maiores funcionam, mas não obtive êxito utilizando um WTV020, além de que não tenho conversores pra esse formato que rodem em Linux. E pelo que vi, não há muitas opções para Windows também. Converter direto pra um wav com 8MHz não deu certo, além de que eu olhei o cabeçalho do arquivo ad4 e não é o mesmo das conversões que teste. Daí que, pesquisando, encontrei esse DFplayer, da DFRobot, que considero a melhor opção em player.

Características do DFPlayer

Esse módulo DFplayer é um hardware de baixo custo e tamanho reduzido que permite tocar arquivos de áudio em formato MP3 sem processos intermediários. Possui saída direta para speaker e saída para fone de ouvido (não os conectores, mas os pinos para). Ele permite comunicação serial com microcontroladores ou funciona de forma autônoma, bastando ligá-lo a uma bateria. Funciona em 3v3 e 5v.

Especificações

  • Suporta diversos sample rates, até 48KHz.
  • Suporta faixas dinâmicas até 90dB, com controle de ruído até 85dB (SNR).
  • Suporta sistemas de arquivos FAT16 e FAT32, em cartões de até 32G.
  • Controle por serial ou standalone, através de botões.
  • Som de espera e suspensão do player.
  • Toca ordenada por diretório, suportando até 100 diretórios com até 255 áudios cada.
  • 30 níveis de ajuste de volume!

Pinout

Apesar de possuir 16 pinos, com apenas 5 já temos um player funcional.

dfplayer-pinout-300x170.webp

Esses pinos correspondem à seguinte tabela:

dfplayer-pinout_table.webp

Modo serial

Esse módulo MP3 da DFRobot funciona em modo de comunicação serial assíncrona, com os seguintes parâmetros:

  • 9600kbauds
  • data bit 1
  • checkout None
  • controle de fluxo None

Basicamente, precisamos nos ater à velocidade da comunicação serial.

Wiring

A conexão mais simples que podemos fazer é a seguinte:

dfplayer-simple_wiring.webp

Não devemos nos esquecer de conectar o GND, claro.

Um pressionamento simples nos botões toca o próximo ou o anterior. Pressionamento longo nos botões aumenta ou diminui o volume.

No wiring da DFRobot percebi um resistor de 1K entre o RX do módulo DFplayer e o TX do Arduino. Se está no wiring do fabricante, deve ser uma boa ideia fazer igual. Mas não quero utilizar uma microcontroladora tão grande para um módulo tão pequeno. Então, que tal colocarmos uma Digispark para fazer a comunicação serial? Foi por essa razão que escrevi esse artigo.

Biblioteca para o DFPlayer

Os hardwares da DFRobot não são os mais baratos, mas a qualidade do hardware também é diferenciada, como você pode ver no site deles. Fora isso, eles próprios disponibilizaram uma biblioteca para Arduino, que você pode baixar no github do projeto. Essa biblioteca tem a implementação completa, por isso é a melhor opção para o DFPlayer. Além disso, tem um sketch de exemplo de todas as funções, então não dá pra ser mais simples do que isso!

Entre no diretório Arduino/libraries e clone o repositório:

git clone https://github.com/DFRobot/DFRobotDFPlayerMini.git

Ou então, baixe diretamente o arquivo master do repositório:

wget -c https://github.com/DFRobot/DFRobotDFPlayerMini/archive/master.zip

Por fim, a biblioteca está disponível através do gerenciador de bibliotecas da IDE do Arduino:
DFRobotPlayerMinu

Wiring da comunicação serial

Como você vê no desenho mais acima, os pinos 2 e 3 são os pinos da comunicação serial. Além desses 2 pinos, é necessário tornar o GND comum a todos. Se estiver alimentando-o diretamente por um Arduino, mais simples ainda. Esse é um exemplo de wiring com um Arduino da DFRobot:

dfplayer-arduino-wiring.webp

 

Usando o DFPlayer no modo standalone

Não tem segredo, fazendo o wiring conforme citado mais acima, bastará copiar os arquivos MP3 para a raíz ou criar os diretórios com seus respectivos conteúdos, como anteriormente explicado. O primeiro pino superior direito é o Busy. Se colocar um LED com o catodo voltado para o pino (e alimentando-o em VCC no anôdo, claro), ele se acenderá quando estiver tocando. Pode ser interessante quando o player deve ficar escondido em seu projeto, mas se ficar exposto, sobre ele há um LED SMD azul que se acende quando tocando. Por isso, fiz a ligação ao contrário; quando não está tocando, o LED se acende (no pino Busy). A imagem de destaque mostra como ficou meu wiring.

Usando o DFPlayer com Digispark

A graça está em utilizar  o DFPlayer com uma controladora pequena, por isso escolhi o Digispark. Mas ele tem uma limitação de espaço considerável, por isso tive que eliminar um pouco dos recursos do sketch de exemplo. No final, o sketch ocupou 96% do espaço total. O Attiny85 tem 512Bytes de SRAM, dos quais foram utilizados 231 Bytes.

O sketch ficou assim:

#include "Arduino.h"
//#include "SoftwareSerial.h"
#include <SoftSerial.h>
#include "DFRobotDFPlayerMini.h"

#define SOFT_RX 2
#define SOFT_TX 3
SoftSerial mySoftwareSerial(SOFT_RX, SOFT_TX);

#define MY_DELAY 3000
DFRobotDFPlayerMini myDFPlayer;

void setup()
{
  mySoftwareSerial.begin(9600);
  /* Vai esperar o software serial iniciar, mas se não iniciar, não tem feedback porque não tem outra serial*/
  if (!myDFPlayer.begin(mySoftwareSerial)) {
    while(true);
  }

  myDFPlayer.setTimeOut(500); //Configura o tempo limite de resposta
  
  //----Set volume----
  myDFPlayer.volume(10);  //Ajuste de volume, entre 0 e 30
  myDFPlayer.volumeUp(); //Sobe o volume 1 nível
  myDFPlayer.volumeDown(); //Baixa o volume 1 nível

  //----Mp3 play----
  myDFPlayer.next();  //Toca o próximo
  delay(MY_DELAY);
  myDFPlayer.previous();  //Toca o anterior
  delay(MY_DELAY);
  myDFPlayer.play(1);  //Toca o primeiro
  delay(MY_DELAY);
  myDFPlayer.loop(1);  //Loop no primeiro
  delay(MY_DELAY);
  myDFPlayer.pause();  //pausa
  delay(MY_DELAY);
  myDFPlayer.start();  //retoma da pausa
  delay(MY_DELAY);
  myDFPlayer.playFolder(15, 4); //Toca um mp3 específico do diretório 15, arquivo 004.mp3. Diretórios de 1 a 99 e arquivo 1 a 255
  delay(MY_DELAY);
  myDFPlayer.enableLoopAll(); //toca tudo em loop
  delay(MY_DELAY);
  myDFPlayer.disableLoopAll(); //chega de loop.
  delay(MY_DELAY);
  myDFPlayer.playMp3Folder(4); //No diretório MP3, arquivo 0004 (0 a 65535)
  delay(MY_DELAY);
  myDFPlayer.advertise(3); //anuncia o mp3. Diretório de arquivos de anúncio: /ADVERT/0003.mp3, de 0 a 65535
  delay(MY_DELAY);
  myDFPlayer.stopAdvertise(); //interrompe o anúncio
  delay(MY_DELAY);
  myDFPlayer.loopFolder(5); //loop de mp3 do diretório 05
  delay(MY_DELAY);
  myDFPlayer.randomAll(); //Toca todos os arquivos randomicamente
  delay(MY_DELAY);
  myDFPlayer.enableLoop(); //ativa o loop
  delay(MY_DELAY);
  myDFPlayer.disableLoop(); //desativa o loop
  delay(MY_DELAY);
}

void loop()
{
  static unsigned long timer = millis();
  
  if (millis() - timer > 3000) {
    timer = millis();
    myDFPlayer.next();  //Play next mp3 every 3 second.
  } 
}

Destes, você pode testar apenas o que desejar. Eu coloquei um mp3 na raiz do cartão e dei play no modo standalone, sem problemas, mas não montar a estrutura corretamente para utilização via comunicação serial pode ser um problema. Depois eu coloco um video no canal DobitAoByteBrasil, se inscreva lá pra dar uma moral!

Alimentação do circuito

Podemos colocar o Digispark a um power bank e tira 5V para o DFPlayer através do pino 5V. Ou podemos alimentar ambos externamente, mas aí vai complicar um pouco, porque se desejar utilizar o VIN para alimentar o Digisprk, deverá entrar com uma tensão entre 7V e 35V, pois o VIN passa pelo regulador de tensão. O GND continuará sendo comum a todo o circuito, mas a alimentação do DFPlayer não poderá ser pela mesma origem que alimenta o Digispark. Ou seja, ainda alimente-o pelo 5V ou então coloque uma alimentação à parte (o que ocupará mais espaço e perde-se o sentido fazer o projeto com um Digispark).

O falante para o DFPlayer é de 3W, é fácil encontrar no Mercado Livre a um preço bem acessível.

Se desejar incluir um Display OLED ao projeto, pode-se utilizar um Arduino Nano invés do Digispark. Utilizando software serial teremos a serial por hardware livre para fazer uns prints no monitor serial, então não é uma má ideia. Dá pra usar um ESP também invés de Arduino, vou escrever um artigo bacana a respeito utilizando um ESP32.

Onde comprar

O DFPlayer você encontra na MASUGUX. Espero que realmente mantenham em estoque como me informaram, porque vou usar muito em um projeto em andamento. Eles também tem o Digispark, do qual já escrevi diversos artigos.

A fonte da protoboard pode ser jumpeada para 3v3 ou 5v, encontrada aí nos parceiros do carrossel, no início do artigo.

Se desejar seguir a sugestão e utilizar um Nano para colocar um display, você pode pegar o Nano com a MASUGUX também. Nesse caso, o display OLED referido é esse aqui.

No final, você vai gastar uma mixaria pra montar esse projeto.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.