Manual
do
Maker
.
com
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.
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.
Apesar de possuir 16 pinos, com apenas 5 já temos um player funcional.
Esses pinos correspondem à seguinte tabela:
Esse módulo MP3 da DFRobot funciona em modo de comunicação serial assíncrona, com os seguintes parâmetros:
Basicamente, precisamos nos ater à velocidade da comunicação serial.
A conexão mais simples que podemos fazer é a seguinte:
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.
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
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:
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.
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!
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.
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.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.