banner

MP3 Player com Arduino Uno



Nesta montagem utilizamos um MP3 player com Arduino Uno, um mini amplificador de som PAM8403 com ajuste de volume, um módulo MP3 DFPlayer Mini e um par de alto-falantes 3 Watts.

O esquema serve não só para o tocador de música, mas para dar voz a um aparelho de cancela de estacionamento, um robô, entre outros, por exemplo. Essa montagem vai permitir colocar nos aparelhos uma voz gravada, natural, e não a sintetizada, que muitas pessoas não gostam.
Pra essa montagem especificamente estamos utilizando o Arduino Uno, mas dá para ligar também no ESP8266 ou ESP32. Obviamente que será necessário um ajustamento nos pinos.

Datasheet


Módulo do DFPlayer



O módulo do DFPlayer utiliza a comunicação serial RX TX, VCC, GND. Ele tem saída para dois alto-falantes e entrada de áudio.

Mini amplificador PAM8403


Montagem



Bibliotecas


Adicione a seguinte biblioteca “DFRobotDFPlayerMini” para comunicação com o módulo mp3.

Basta acessar “Sketch >> Incluir Bibliotecas >> Gerenciar Bibliotecas...”


Código fonte
Começaremos definindo as bibliotecas e constantes que utilizaremos durante nosso código.
Inicio criando um objeto, o software serial, outro, que é o myDFPlayer. 
A variável buf, que é do tipo String, servirá para armazenar os dados vindos da Serial do arduino, que serão os comandos para o módulo MP3. A variável "pausa" servirá como indicativo para sabermos se a música está tocando ou em pausa (pausa = true, indica que está pausado, caso contrário está tocando).

#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
 //Inicia a serial por software nos pinos 10 e 11
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
 //Objeto responsável pela comunicação com o módulo MP3 (DFPlayer Mini)
DFRobotDFPlayerMini myDFPlayer;
 //variável responsável por armazenar os comandos enviados para controlar o player
String buf;
//variável responsável por armazenar o estado do player (0: tocando ; 1: pausado)
boolean pausa = false;
//variável responsável por armazenar o estado da equalização
//varia de 0 a 5
int equalizacao = 0; // (0 = Normal, 1 = Pop, 2 = Rock, 3 = Jazz, 4 = Classic, 5 = Bass)"
//variável responsável por armazenar o total de músicas presentes no SD card.
int maxSongs = 0;

Setup
Nesta etapa colocamos opções de prints para dar indicações para você que está montando o circuito, com avaliações de falsas condições, por exemplo.
void setup()
{
//Comunicacao serial com o modulo
mySoftwareSerial.begin(9600);
//Inicializa a serial do Arduino
Serial.begin(115200); //Verifica se o modulo esta respondendo e se o
//cartao SD foi encontrado
Serial.println();
Serial.println("DFRobot DFPlayer Mini");
Serial.println("Inicializando modulo DFPlayer... (3~5 segundos)");
if (!myDFPlayer.begin(mySoftwareSerial))
{
Serial.println("Nao inicializado:");
Serial.println("1.Cheque as conexoes do DFPlayer Mini");
Serial.println("2.Insira um cartao SD");
while (true);
}
Serial.println();
Serial.println("Modulo DFPlayer Mini inicializado!");

//Definicoes iniciais
myDFPlayer.setTimeOut(500); //Timeout serial 500ms
myDFPlayer.volume(10); //Volume 10     vai de 0 a 30
myDFPlayer.EQ(0); //Equalizacao normal
 //recupera o numero de Músicas encontradas no SD.
maxSongs = myDFPlayer.readFileCounts(DFPLAYER_DEVICE_SD);
Serial.println();
Serial.print("Numero de arquivos no cartao SD: ");
Serial.println(maxSongs);
//Mostra o menu de comandos
menu_opcoes();

Menu Opções
Você controla essa montagem toda pelo monitor serial. Então, toda vez o esquema vai ficar imprimindo o Menu de Opções que você tem, com comandos, direcionamentos.
void menu_opcoes()
{
Serial.println();
Serial.println("Comandos:");
Serial.print(" [1-");
Serial.print(maxSongs);
Serial.println("] Para selecionar o arquivo MP3");
Serial.println(" [s] parar reproducao");
Serial.println(" [p] pausa/continua a musica");
Serial.println(" [e] seleciona equalizacao");
Serial.println(" [+ or -] aumenta ou diminui o volume");
Serial.println();
}

Loop
void loop()
{
//Aguarda a entrada de dados pela serial
while (Serial.available() > 0)
{
//recupera os dados de entrada
buf = Serial.readStringUntil('\n');
//Reproducao (índice da música)
if ((buf.toInt() >= 1) && (buf.toInt() <= maxSongs))
{
Serial.print("Reproduzindo musica: ");
Serial.println(buf.toInt());
myDFPlayer.play(buf.toInt()); // dá play na música
menu_opcoes();
 }
//Pausa/Continua a musica
if (buf == "p")
{
if (pausa)
{
Serial.println("Continua musica...");
myDFPlayer.start();
}
else
{
Serial.println("Musica pausada...");
myDFPlayer.pause();
}
pausa = !pausa;

    menu_opcoes();
}

//Parada
if (buf == "s")
{
myDFPlayer.stop();
Serial.println("Musica parada!");
menu_opcoes();
}

//Seleciona equalizacao
if (buf == "e")
{
equalizacao++;
if (equalizacao == 6)
{
 equalizacao = 0;
}
myDFPlayer.EQ(equalizacao);
Serial.print("Equalizacao: ");
Serial.print(equalizacao);
Serial.println(" (0 = Normal, 1 = Pop, 2 = Rock, 3 = Jazz, 4 = Classic, 5 = Bass)");
menu_opcoes();
}

//Aumenta volume
if (buf == "+")
{
myDFPlayer.volumeUp();
Serial.print("Volume atual:");
Serial.println(myDFPlayer.readVolume());
menu_opcoes();
}
//Diminui volume
if (buf == "-")
{
myDFPlayer.volumeDown();
Serial.print("Volume atual:");
Serial.println(myDFPlayer.readVolume());
menu_opcoes();
}
  } //while
} //loop

Arquivos para download:


9 comentários:

  1. Parabens pela qualidade e também pelo cuidado de fazer as aulas

    ResponderExcluir
  2. Eu fiz más quando a musica acaba ele para eu queria que continua-se para a próxima musica.

    ResponderExcluir
  3. Excelente trabalho!
    Preciso saber se é possível e como reproduzir uma música toda vez que um sensor ligado a uma entrada digital ficar acionado...qualquer dica é válida

    ResponderExcluir
    Respostas
    1. Boa pergunta, também tenho esse mesmo questionamento, preciso acionar uma musica quando um switch (sensor fim de curso) for acionado. Agradecemos qualquer dica.

      Excluir
  4. Olá. Tentei utilizar o DFPlayer mas simplesmente não funciona. Já testei 3 placas em modo stand alone porém não funcionam. Estou utilizando um cartão de memória com algumas músicas mp3 porém o módulo só esquenta e não toca nada. Usei inclusive fonte externa, porém sem resultado.

    ResponderExcluir
  5. Seria possivel eu variar o bpm da musica? aumentar ou diminuir a velocidade da batida? obrigado

    ResponderExcluir
  6. Olá. Estou tendo um probleminha com o módulo. Testei o módulo DFPlayer no modo standalone e funcionou perfeitamente mas no modo microcontrolado não funciona. Já verifiquei as ligações e esta tudo okay. Parece haver um problema com a comunicação UART entre o arduino e o módulo. Como saio dessa?

    ResponderExcluir
  7. Para a utilização de bateria externa recarregável, qual recomendaria?

    ResponderExcluir
  8. Bom dia, tem como programar o dfplayer? gostaria de ao apertar o botão 1 tocar música da pasta 001 e ao apertar o botão 2 tocar música da pasta 002

    ResponderExcluir

Tecnologia do Blogger.