Vários projetos requerem reprodução de som para adicionar algum tipo de funcionalidade. Dentre esses projetos, destacamos: acessibilidade para deficientes visuais, tocadores de música MP3 Arduino e execução de sons de voz por robôs, por exemplo. Hoje o Projeto será “Dfplayer Mini Arduino: Projeto Construa seu MP3 Exclusivo!”
Em todos esses sistemas, precisamos de um dispositivo de reprodução de som MP3 para conectar ao Arduino.
Visto isso, o objetivo deste tutorial é demonstrar o uso desse módulo com o Arduino, usando 3 push buttons para instruir a plaquinha a enviar comandos seriais para o módulo e controlar o MP3:
- O primeiro botão servirá como “anterior” que nos permitirá tocar a anterior música;
- O segundo botão servirá como “próximo” que nos permitirá tocar a próxima música;
- O terceiro botão será usado para “reproduzir / pausar” o arquivo que está sendo reproduzido;
E com um detalhe: o projeto possui um Display LCD 16×2 interativo para lhe informar o estágio que a música se encontra e informar qual arquivo MP3 Arduino está tocando atualmente!
Incrível, não concorda?!
Você deve estar pensando que o reprodutor de MP3 Arduino pareça um tanto quanto desatualizado. De certa forma, smartphones possuem uma aplicabilidade bem maior!
Mas, ao analisarmos o módulo Dfplayer Mini Arduino, ele se mostra um módulo bastante completo com todos os seus recursos de áudio.
De controle de volume, amplificador de 3W, equalizador e muito mais.
Sendo assim, esse tutorial irá abordar muitos recursos deste módulo e colocá-los em bom uso em um único dispositivo.
Portanto, com ele você irá construir de vez sua própria estação de música com o Arduino!
Componentes utilizados no Projeto Dfplayer Mini Arduino
Utilizaremos os seguintes componentes para a construção deste projeto:
- 1 x Arduino Uno;
- 1 x Protoboard grande;
- 1 X Protoboard pequena;
- 3 x Botões Push Button;
- 2 x Mini alto-falantes;
- 1x Resistor de 330Ohms;
- 1 x Display LCD 16×2;
- 1 x Amplificador PAM8403 (opcional);
- 1x Módulo MP3 DFPlayer Mini;
- 1x Cartão Micro SD;
Projeto Dfplayer Mini Arduino
Como de costume, cada um desses componentes pode ser adquirido através do link anexado a eles na lista acima.
Ademais, como já foi dito na introdução, o DFplayer é um módulo MP3 Arduino pequeno e barato com uma saída simplificada que pode ser conectada diretamente a um alto-falante sem um amplificador.
Como dito na introdução, temos outros recursos do DFplayer utilizado no nosso MP3 Arduino que são:
- Suporte para taxa de amostragem de 8KHz, 11,025KHz, 12KHz, 16KHz, 22,05KHz, até 48KHz;
- Saída DAC de 24 bits, suporte de faixa dinâmica 90dB, SNR suporta 85dB;
- Suporta FAT16, sistema de arquivos FAT32, suporte máximo para cartão TF de 32GB;
- Uma variedade de modos de controle, modo serial, modo de controle de chave AD;
- O recurso de spots de idioma de transmissão, você pode pausar a música de fundo que está sendo reproduzida;
- Amplificador embutido de 3 W;
- Os dados de áudio são classificados por pasta; suporta até 100 pastas, cada pasta pode ser atribuída a cerca de 1000 músicas;
- 30 níveis de volume ajustáveis, 10 níveis de EQ ajustáveis.
Circuito do Dfplayer Mini MP3
O módulo pode ser usado como um módulo autônomo com bateria conectada, alto-falante e botões ou usado em combinação com um microcontrolador ou placa de desenvolvimento que no nosso caso é o Arduino, habilitado para comunicação RX / TX (Serial).
Sendo assim, para nosso MP3 Arduino, a montagem dos componentes deve ficar da seguinte maneira:
Montagem dos componentes do projeto
Montagem do esquema elétrico do projeto
Como visto acima, a conexão entre o Arduino e o DFPlayer Mini é muito simples, pois só precisamos conectar dois pinos no Arduino além do VCC e do GND.
Além disso, deve-se observar que o resistor de 330Ohms inserido entre o pino Rx do módulo e o Arduino foi adicionado para reduzir o ruído, mas não é necessário se a configuração do módulo não for acompanhada de ruído na linha Rx.
Já, as conexões com o módulo MP3 Arduino e o amplificador, estão melhor descritas abaixo:
DFplayer Mini – MP3 Arduino:
- Rx – D10;
- Tx – D9;
- VCC – 5v;
- Gnd – Gnd;
- L – L do amplificador PAM8403;
- R – R do amplificador PAM8403;
Já as conexões do LCD utilizado aqui segue o seguinte padrão:
- RS – D12;
- E – 11;
- D4 – 5;
- D5 – 4;
- D6 – 3;
- D7 – 2;
Veja a seguinte ilustração de utilização do Display LCD:
Pinout do Display LCD 16×2 utilizado no projeto
Sendo assim, para melhor compreensão, reuni em uma tabela as conexões dos componentes com a placa:
Tabela – Conexões dos componentes com o Arduino:
Pinos Arduino | Display LCD | MiniDFPlayer | BOTÕES |
D2 | D7 | – | – |
D3 | D6 | – | – |
D4 | D5 | – | – |
D5 | D4 | – | – |
D6 | – | – | Switch 1 |
D7 | – | – | Switch 2 |
D8 | – | – | Switch 3 |
D9 | – | TX | – |
D10 | – | RX | – |
D11 | E | – | – |
D12 | RS | – | – |
Uma outra montagem para caso você opte em não utilizar o amplificador de áudio PAM8403 está representada abaixo:
Montagem dos componentes sem o amplificador
Montagem do esquema elétrico sem o amplificador
Nesse sentido, você deve utilizar os pinos SPK1 e SPK2 da seguinte forma:
- SPK1 – positivo (+) dos autofalantes;
- SPK2 – negativo (-) dos autofalantes;
- Rx – D10;
- Tx – D9;
- VCC – 5v;
- Gnd – Gnd..
Revise as conexões mais uma vez para garantir que tudo está como deveria estar.
Já, nossos push buttons são conectados intencionalmente sem resistores pull up (ou down) porque vamos habilitar os resistores pull up internos do microcontrolador durante a programação na IDE do Arduino. Ademais, caso ainda não possui facilidade com a linguagem C/C++ ou com a placa microcontroladora, acesse o artigo o que é Arduino para finalmente se familiarizar com a programação de sistemas embarcados.
Caso gostaria de conhecer melhor a aplicação da plataforma em outros projetos, acesse aqui nosso artigo com 10 projetos com Arduino para criar ainda este ano.
O Código do Projeto Dfplayer Mini MP3
Para enviar comandos do Arduino para o mini DFplayer, a partir do botão pressionado, usaremos a biblioteca serial do software Arduino.
Embora pudéssemos ter usado o serial do hardware para enviar comandos do Arduino para o MiniDFplayer, os pinos seriais do hardware do Arduino (0 e 1) são os mesmos pinos usados pelo Arduino para se comunicar com o computador e podem impedir que o código seja carregado sem problemas se conectado para qualquer outro dispositivo.
Portanto, para nos comunicarmos sem estresse, usaremos a biblioteca serial do software com os pinos 9 e 10.
O código para este tutorial é simples, enquanto o MiniDFPlayer possui uma biblioteca que contém diferentes funções para controlar o MP3 Arduino Player, iremos escrever nossas próprias funções para nos divertir e ajudar a mostrar como o módulo realmente funciona.
A primeira coisa que fazemos no código, como de costume, é incluir as bibliotecas usadas: biblio do LCD, Arduino.h, SoftwareSerial.h e a biblio do nosso módulo DFPlayer e também, não devemos nos esquecer de criar um objeto da biblioteca ao declarar os pinos Rx e Tx (10 e 9 respectivamente) do módulo.
Veja só:
1 2 3 4 5 6 7 8 9 10 |
#include <LiquidCrystal.h> #include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" //Inicia a serial por software nos pinos 10 e 11 SoftwareSerial mySoftwareSerial(10, 9); // RX, TX // Crie um objeto para o DFPlayer DFRobotDFPlayerMini myDFPlayer; |
Para instalar as bibliotecas utilizadas siga o passo a passo:
Vá em Incluir Biblioteca > Gerenciar Bibliotecas…
Após, digite DFRobotDFPlayerMini e instale-a na sua IDE Padrão
Em seguida, defina os pinos do Arduino que estão conectados ao Display LCD da seguinte forma:
1 2 3 |
// Defina as portas utilizadas pelo LCD // LiquidCrystal(RS, E, D4, D5, D6, D7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); |
Feito isso, é hora de definir as variáveis utilizadas no nosso código que serão: variáveis para os Switches/Botões e variáveis para armazenar o tempo exibido no Display:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Variáveis utilizadas no código referentes aos botoes int pausa = 0; int equalizacao = 0; int estadoBotao1 = 0; int estadoBotao2 = 0; int estadoBotao3 = 0; // Variável para armazenar o tempo mostrado no display unsigned long time; // Variável criada para monitorar se a música está tocando int valor=0; // Variável para incrementar os segundos para o tempo de execução do áudio int segundos=0; // Variável para incrementar os minutos para o tempo de execução do áudio int minutos=0; |
Dentro do void setup (), você irá:
- iniciar a comunicação com a serial do Arduino e a comunicação com o LCD;
- definir as variáveis dos botões como INPUT (lembrando de habilitar os resistores PULLUP internos do Arduino), e;
- escrever um algoritmo para identificar se houver algum erro de leitura do módulo.
Veja só:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
void setup() { // Comunicacao serial com o modulo mySoftwareSerial.begin(9600); // Inicializa a serial do Arduino Serial.begin(115200); // Crie um laço e declare os botões como INPUT for(int i=6; i < 9; i++){ pinMode(i, INPUT_PULLUP); } // Inicializa comunicação com o LCD lcd.begin (16,2); // Limpa a tela e posiciona o cursor em 0,0 lcd.clear(); lcd.setCursor(0,0); // Prints iniciais no cursor lcd.print("Arduino MP3"); lcd.setCursor(0,1); lcd.print("Iniciando modulo"); delay(2500); lcd.clear(); // Se houver algum erro de leitura do módulo if (!myDFPlayer.begin(mySoftwareSerial)){ lcd.setCursor(0,0); lcd.print("Nao inicializado"); delay(2000); lcd.setCursor(0,0); lcd.print("1.Cheque a conexao"); lcd.setCursor(0,1); lcd.print("2.Insira um SD"); while (true); } // Caso for sucesso na inicialização lcd.clear(); lcd.setCursor(0,0); lcd.print("Modulo iniciado!"); // Definicoes iniciais do módulo myDFPlayer.setTimeOut(500); // Timeout serial de 500ms myDFPlayer.volume(5); // Volume incial a 5 myDFPlayer.EQ(0); // Equalizacao normal // Mostra o menu de comandos lcd.setCursor(0,1); lcd.print(myDFPlayer.readFileCounts(DFPLAYER_DEVICE_SD)); lcd.print(" músicas"); } |
Já no void loop (), você irá escrever toda a lógica de programação prevista para:
- pausar as músicas;
- mudar a equalização das mesmas, e;
- avançar/retroceder as faixas.
Veja o código abaixo completo e comentado para que você entenda a lógica construída dentro do loop de forma que você possa replicá-la em seu projeto:
Código Completo Utilizado
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
// Inclua as seguinte bibliotecas #include <LiquidCrystal.h> #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" // Inicie a serial por software nos pinos 10 e 11 SoftwareSerial mySoftwareSerial(10, 9); // RX, TX // Crie um objeto para o DFPlayer DFRobotDFPlayerMini myDFPlayer; // Defina as portas utilizadas pelo LCD // LiquidCrystal(RS, E, D4, D5, D6, D7) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Variáveis utilizadas no código referentes aos botoes int pausa = 0; int equalizacao = 0; int estadoBotao1 = 0; int estadoBotao2 = 0; int estadoBotao3 = 0; // Variável para armazenar o tempo mostrado no display unsigned long time; // Variável criada para monitorar se a música está tocando int valor=0; // Variável para incrementar os segundos para o tempo de execução do áudio int segundos=0; // Variável para incrementar os minutos para o tempo de execução do áudio int minutos=0; void setup() { // Comunicacao serial com o modulo mySoftwareSerial.begin(9600); // Inicializa a serial do Arduino Serial.begin(115200); // Crie um laço e declare os botões como INPUT for(int i=6; i < 9; i++){ pinMode(i, INPUT_PULLUP); } // Inicializa comunicação com o LCD lcd.begin (16,2); // Limpa a tela e posiciona o cursor em 0,0 lcd.clear(); lcd.setCursor(0,0); // Prints iniciais no cursor lcd.print("Arduino MP3"); lcd.setCursor(0,1); lcd.print("Iniciando modulo"); delay(2500); lcd.clear(); // Se houver algum erro de leitura do módulo if (!myDFPlayer.begin(mySoftwareSerial)){ lcd.setCursor(0,0); lcd.print("Nao inicializado"); delay(2000); lcd.setCursor(0,0); lcd.print("1.Cheque a conexao"); lcd.setCursor(0,1); lcd.print("2.Insira um SD"); while (true); } // Caso for sucesso na inicialização lcd.clear(); lcd.setCursor(0,0); lcd.print("Modulo iniciado!"); // Definicoes iniciais do módulo myDFPlayer.setTimeOut(500); // Timeout serial de 500ms myDFPlayer.volume(5); // Volume incial a 5 myDFPlayer.EQ(0); // Equalizacao normal // Mostra o menu de comandos lcd.setCursor(0,1); lcd.print(myDFPlayer.readFileCounts(DFPLAYER_DEVICE_SD)); lcd.print(" músicas"); } void loop() { // Algoritmo que representa o tempo de música no LCD if(valor==0){ segundos = ++time; delay(1000); lcd.clear(); lcd.setCursor(0,0); lcd.print("Arquivo "); lcd.print(myDFPlayer.readCurrentFileNumber()); // Insira 0 na frente quando os segundos forem menores que 10 if(segundos<10){ lcd.setCursor(3,1); lcd.print("0"); lcd.print(segundos);} else{ lcd.setCursor(3,1); lcd.print(segundos);} // Insira outro 0 na frente quando minutos forem menores que 10 if(minutos<10){ lcd.setCursor(0,1); lcd.print("0"); lcd.print(minutos); lcd.print(":");} else{ lcd.setCursor(0,1); lcd.print(minutos); lcd.print(":");} //Para aparecer 00 depois do 59 if(segundos==60){ lcd.setCursor(3,1); lcd.print("00");} if (time>59){ time=0; minutos=minutos+1;} } estadoBotao1 = digitalRead(6); if (estadoBotao1 == LOW ) { myDFPlayer.next(); lcd.print(myDFPlayer.readCurrentFileNumber()); delay(100); reproduzindo(); time=0; minutos=0;} estadoBotao2 = digitalRead(7); if (estadoBotao2 == LOW ) { myDFPlayer.previous(); lcd.print(myDFPlayer.readCurrentFileNumber()); delay(100); reproduzindo(); time=0; minutos=0;} estadoBotao3 = digitalRead(8); if (estadoBotao3 == LOW ) { pausa = !pausa; if (pausa == 0) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Continua musica"); myDFPlayer.start(); delay(2000); reproduzindo(); } if (pausa == 1) { lcd.clear(); lcd.setCursor(0,0); lcd.print("Musica pausada"); myDFPlayer.pause();} } if (myDFPlayer.available()) { printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Imprima a mensagem detalhada do DFPlayer para lidar com diferentes erros e estados. } } void printDetail(uint8_t type, int value) { switch (type) { case DFPlayerCardInserted: lcd.clear(); lcd.setCursor(0,0); lcd.print(F("Cartao SD ")); lcd.setCursor(0,1); lcd.print(F("inserido!")); break; case DFPlayerCardRemoved: lcd.clear(); lcd.setCursor(0,0); lcd.print(F("Cartao SD ")); lcd.setCursor(0,1); lcd.print(F("removido!")); break; case DFPlayerCardOnline: Serial.println(F("Card Online!")); break; case DFPlayerPlayFinished: lcd.clear(); lcd.setCursor(0,0); lcd.print(F("Faixa: ")); lcd.print(value); lcd.setCursor(0,1); lcd.print(F("fim!")); time=0; minutos=0; break; case !DFPlayerPlayFinished: lcd.clear(); lcd.setCursor(0,0); lcd.print(F("Faixa: ")); lcd.print(value); lcd.setCursor(0,1); lcd.print(F("random off!")); break; case DFPlayerError: lcd.print(F("DFPlayerError:")); switch (value) { case Busy: lcd.print(F("Cartão não encontrado")); break; } break; default: break; } } void reproduzindo(){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Reproduzindo"); lcd.setCursor(0,1); lcd.print("Faixa atual: "); lcd.print(myDFPlayer.readCurrentFileNumber()); } |
O código não se altera se você optou por não utilizar o amplificador de som.
Falando nisso, se você optar por não o utilizar esse componente, deverá alterar o volume manualmente dentro do código indo até o void setup () e alterando a seguinte linha:
1 2 3 4 |
// Definicoes iniciais do módulo myDFPlayer.setTimeOut(500); // Timeout serial de 500ms myDFPlayer.volume(5); // Volume incial a 5 myDFPlayer.EQ(0); // Equalizacao normal |
Separei algumas funções que são utilizadas com o MiniDFPlayer, além das funções presentes no código, para que você possa implementar no seu projeto, tais como:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
myDFPlayer.volumeUp(); // Aumenta o volume da música myDFPlayer.volumeDown(); // Diminui o volume da música myDFPlayer.stop(); // Para a reprodução e volta para o arquivo 1 myDFPlayer.enableLoop(); // Fornece um loop para determinada faixa myDFPlayer.disableLoop(); // Desativa o loop myDFPlayer.randomAll(); // Toca músicas aleatórias myDFPlayer.reset(); // Reseta o modulo |
Conclusão
Carregue um cartão SD somente com músicas e insira no Mini DFPlayer, depois carregue o código no seu Arduino e conecte os fios do alto-falante aos pinos do alto-falante do Mini DFPlayer.
Você deverá ouvir as músicas começarem a ser transmitidas pelo alto-falante conectado.
Então, se você aplicou todas as etapas apresentadas, você foi capaz de aprender:
- Circuito operacional básico do DFMini Player MP3;
- Organização e configuração de arquivos de som no cartão de memória;
- Controle musical com Arduino;
- Integração Arduino – LCD/MP3 Player.
A partir deste código, você é capaz de desenvolver outros projetos que precisam usar som como funcionalidade do sistema com alguns exemplos citados abaixo onde espero que isso lhe dê inspiração para construir algo realmente legal.
Projetos úteis:
- Comandos de voz de alarme de incêndio;
- Avisos de voz para postos de pedágio;
- Eletricidade, comunicações, avisos de voz em cômodos;
- Alarme por voz multicanal ou guia de operação do equipamento de voz.
Se você é um amante do mundo do Arduino, aposto que esses projetos foram feitos para você:
- Projeto sensor de umidade do solo arduino com alerta por sms
- Display 7 segmentos arduino: tutorial para projetos
- Projeto arduino vu meter com leds endereçados
- Projeto arduino matriz de led 8×8: construindo um letreiro luminoso
É isso aí pessoal, obrigado por acompanhar até aqui e se você ficar preso em algum lugar deste projeto, sinta-se à vontade para enviar suas perguntas através da seção de comentários.
Até a próxima!
Olá!
Eu somente li o conteúdo da página mas, ainda não experimentei o seu projeto mas que, com certeza, é um projeto convidativo a se fazer!
Parabéns, obrigado por compartilhar e, sucesso em sua carreira profissional.