Adquira estes componentes na Loja do Lab de Garagem
Neste tutorial veremos como utilizar o MP3 Player Shield junto com as biblioteca SFEMP3Shield e a SdFat para ler arquivos no formato MP3 armazenados no catão SD e reproduzi-los em uma caixa de som conectada a saída de audio do Shield. Tudo isto sendo controlado por comandos via Serial.
Lista de Materiais
1 x Caixa de som ou fones de ouvido com entrada P2
Bibliotecas
Você vai precisar da biblioteca SFEMP3Shield que implementa os comandos para controle do MP3 Player Shield e da SdFat (inclusa no pacote) para fazer a leitura do cartão de memória.
Abaixo você pode fazer o download das duas bibliotecas usadas no tutorial.
O MP3 Player Shield
Este Shield é baseado no chip VS1053B, fabricado pela VLSI Solution.
Com este chip você pode decodificar vários formatos de áudio como Ogg Vorbis, MP3, AAC, WMA e MIDI e envia tudo para um amplificador de saída (P2) estéreo de alta qualidade que esta conectado a um DAC de 18bits de resolução.
Ele também pode ser usado como encoder para o formato IMA ADPCM e Ogg Vorbis.
OBS: O MP3 Player Shield não suporta as funções de encoder
Veja mais informações sobre o chip no datasheet.
Compatibilidade com arquivos de Audio, tag ID3 e Plugins
No capitulo 8 do datasheet, é abordada a compatibilidade dele com diversos arquivos de audio.
No tutorial, utilizamos arquivos comprimidos no formato MP3 (MPEG-1/2 Audio Layer 3) e com bit rate de 192kbps.
Há também a compatibilidade do chip com as tag ID3 da versão 1.0 ou 1.1, com elas você pode visualizar o Nome da música, Artista e o Álbum apenas utilizando apenas comandos já implementados pela biblioteca. Para alterar a tag ID3 de suas músicas vocês podem utilizar o ID3 Tag Editor.
A VLSI Solutions também disponibiliza patch e plugins que são atualizados constantemente no neste link e você pode adicionar funcionalidades ao firmware do chip carregando estes patchs no cartão SD (A biblioteca traz eles para você).
O Sketch
Fizemos um Sketch baseado no exemplo que vem junto com a biblioteca SFEMP3Shield. Com ele através de comandos enviados via serial você pode controlar as músicas que serão tocadas.
// PLAYER MP3 LAB DE GARAGEM
// Baseado no exemplo MP3Shield_Library_Demo de Bill Porter e Michael P. Flaga criadores da biblioteca SFEMP3Shield
// Coloque as músicas no SD card para com o nome track00x.mp3 onde x é o numero da música
#include <SPI.h>
#include <SdFat.h>
#include <SFEMP3Shield.h>
SdFat sd;
SFEMP3Shield MP3player;
void setup()
{
//Variável usada para testar funções durante a programação
uint8_t resultado;
// Inicializa a Serial
Serial.begin(115200);
//Inicializando Cartao SD
if(!sd.begin(SD_SEL, SPI_HALF_SPEED)) sd.initErrorHalt();
if(!sd.chdir("/")) sd.errorHalt("sd.chdir");
//Inicializando MP3 Shield e checa por erros
resultado = MP3player.begin();
//Lista de código de Erros de inicialização
//0 OK
//1 Falha da SdFat para inicializar o contato físico com o Cartão SD
//2 Falha SdFat para iniciar o volume do Cartão SD
//3 Falha SdFat para montar o diretório raiz Cartão SD
//4 Valores fora do padrão no registrador SCI_MODE.
//5 Valores divergentes no na leitura do SCI_CLOCKF.
//6 Plugins não foram carregado. Copie eles para o Cartão SD isto pode causar erros na reprodução
if(resultado != 0)
{
Serial.print(F("Codigo de erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
if( resultado == 6 )
{
Serial.println(F("Atencao: Plugins não encontrados."));
Serial.println(F("Use a opção \"d\" para verificar se eles estão no cartao SD"));
}
}
comandos();
}
void loop()
{
if(Serial.available())
{
menu(Serial.read()); // Pega o comando da Serial e processa com a função menu();
}
delay(100);
}
// Função que processa o comando.
void menu(byte opcao)
{
uint8_t resultado; // Esta variavel vai armazenar o resultado dos funções que vamos usar
char titulo[30]; // Buffer para armazenas título da musica
char artista[30]; // Buffer para armazenas nome do Artista
char album[30]; // Buffer para armazenas nome do Album
Serial.print(F("Comando Recebido: "));
Serial.write(opcao);
Serial.println();
//Parar a música que esta tocando
if(opcao == 's')
{
Serial.println(F("Parar reproducao"));
MP3player.stopTrack();
}
//Seleciona a faixa de 1 a 9
else if(opcao >= '1' && opcao <= '9')
{
opcao = opcao - 48; //convertendo ASCII para um numero real
resultado = MP3player.playTrack(opcao);
//Lista de código de Erros da função playTrack
//0 OK
//1 Ocupado tocando música
//2 Arquivo não encontrado
//3 Indica que o Shield MP3 esta resetando
//Verifica esta executando
if(resultado != 0)
{
Serial.print(F("Codigo de Erro: "));
Serial.print(resultado);
Serial.println(F(" ao tentar tocar a musica"));
}
else
{
//Retira a Tag ID3 da música
MP3player.trackTitle((char*)&titulo);
MP3player.trackArtist((char*)&artista);
MP3player.trackAlbum((char*)&album);
//Imprime as informações na Serial
Serial.print(F("Titulo: "));
Serial.write((byte*)&titulo, 30);
Serial.println();
Serial.print(F("Artista: "));
Serial.write((byte*)&artista, 30);
Serial.println();
Serial.print(F("Album: "));
Serial.write((byte*)&album, 30);
Serial.println();
}
}
//Altera o Volume
else if((opcao == '-') || (opcao == '+'))
{
union twobyte mp3_vol; // Cria dois bytes um para cada lado
mp3_vol.word = MP3player.getVolume(); // Lê o valor atual do Volume
if(opcao == '-')
{
// O saida é negativa pois é dada em decibéis
if(mp3_vol.byte[1] >= 254)
{
mp3_vol.byte[1] = 254;
}
else {
mp3_vol.byte[1] += 2;
}
}
else
{
if(mp3_vol.byte[1] <= 2)
{
mp3_vol.byte[1] = 2;
}
else {
mp3_vol.byte[1] -= 2;
}
}
MP3player.setVolume(mp3_vol.byte[1], mp3_vol.byte[1]); // Altera o valor do volume nos dois lados (L e R)
Serial.print(F("Volume foi para -"));
Serial.print(mp3_vol.byte[1]>>1, 1);
Serial.println(F("[dB]"));
}
//Lista arquivos do SD card
else if(opcao == 'd') {
if(!MP3player.isPlaying())
{
Serial.println(F("Arquivos encontrados:"));
sd.ls(LS_R | LS_DATE | LS_SIZE);
}
else {
Serial.println(F("Player ocupado. Aguarde..."));
}
}
//Informacoes sobre o arquivo de audio
else if(opcao == 'i') {
MP3player.getAudioInfo();
}
//Modo Pause/Play
else if(opcao == 'p')
{
if( MP3player.getState() == playback)
{
MP3player.pauseMusic();
Serial.println(F("Pause"));
}
else if( MP3player.getState() == paused_playback)
{
MP3player.resumeMusic();
Serial.println(F("Play"));
}
else
{
Serial.println(F("Nao esta tocando!"));
}
}
// Reseta o módulo MP3
else if(opcao == 'r') {
MP3player.stopTrack();
MP3player.vs_init();
Serial.println(F("Resetando o chip do Player"));
}
// Seleciona modo Mono/Stereo
else if(opcao == 'm') {
uint16_t monostate = MP3player.getMonoMode();
if(monostate == 0) {
MP3player.setMonoMode(1);
Serial.println(F("Modo Mono"));
}
else {
MP3player.setMonoMode(0);
Serial.println(F("Modo Stereo"));
}
}
//Modo baixo consumo
else if(opcao == 'a') {
MP3player.end();
Serial.println(F("Modo de baixo consumo: Ativado"));
}
else if(opcao == 'd') {
MP3player.begin();
Serial.println(F("Modo de baixo consumo: Desativado"));
//Estado do Shield MP3
}
else if(opcao == 'S') {
Serial.println(F("Estado do Player:"));
switch (MP3player.getState()) {
case uninitialized:
Serial.print(F("Nao inicializado"));
break;
case initialized:
Serial.print(F("Inicializado"));
break;
case deactivated:
Serial.print(F("Desativado"));
break;
case loading:
Serial.print(F("Carregando"));
break;
case ready:
Serial.print(F("Pronto"));
break;
case playback:
Serial.print(F("Reproduzindo"));
break;
case paused_playback:
Serial.print(F("Pausado"));
break;
}
Serial.println();
}
// Lista comandos
else if(opcao == 'c')
{
comandos();
}
// print prompt after key stroke has been processed.
Serial.println(F("Digite uma das opcoes 1-9,s,d,+,-,i,p,r,m,a,d,S,c:"));
Serial.println();
}
//Imprime a lista de comandos
void comandos()
{
Serial.println(F("MP3 Player Shield:"));
Serial.println();
Serial.println(F("LAB DE GARAGEM "));
Serial.println();
Serial.println(F("Lista de comandos:"));
Serial.println(F(" [1-9] para tocar o arquivo track00x"));
Serial.println(F(" [s] Stop"));
Serial.println(F(" [d] Lista arquivos do SD card"));
Serial.println(F(" [+ ou -] Aumenta e diminui o Volume"));
Serial.println(F(" [i] Informacoes sobre o arquivo de audio"));
Serial.println(F(" [p] Pause/Play"));
Serial.println(F(" [r] Reseta MP3 Shield"));
Serial.println(F(" [m] Seleciona modo Mono/Stereo"));
Serial.println(F(" [a} Ativa modo de baixo consumo"));
Serial.println(F(" [d} Desativa modo de baixo consumo"));
Serial.println(F(" [S] Estado do Shield MP3"));
Serial.println(F(" [c] Mostra lista de comandos"));
Serial.println();
}
Conclusão
Com este tutorial você poderá tocar suas músicas através de um Arduino em qualquer projeto e de maneira simples, já que a biblioteca faz boa parte do trabalho para você. Esperamos que tenham gostado e se tiverem sugestões, dúvidas ou elogios comente abaixo.
\o/
Referências:
http://www.vlsi.fi/en/products/vs1053.html
https://www.sparkfun.com/products/10628
http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Dev/Arduino/Shields/MP3%20Shield-v13.pdf
http://www.billporter.info/2012/01/28/sparkfun-mp3-shield-arduino-library/
Comentar
Usando este mesmo shield VS1053 é possível criar um receptor para rádio online, isto seria muito bacana, alguém aqui já tentou ? Estou tentando a vários anos e ainda não consegui mas vejo que é um projeto muito comum na Europa e nos estados unidos, acho que brasileiro não curte rádio online não, mesmo assim gostaria de fazer o tal projeto, alguém me ajuda?
Olá, eu poderia utilizar este shield com a biblioteca SD em vez da SDFAT?
Pois a biblioteca SDFAT não é compatível com minha IDE, me recomendaram utilizar uma IDE mais antiga mas não deu certo.
Agradeço desde já.
Olá, Pessoal, tenho um módulo deste e tudo funcionou perfeitamente, porém somente ligado a USB, quando ligo uma fonte externa(bateria 9v(novas), pilhas, PowerBank) as vezes funciona, as vezes não. E percebi um chiado ao utilizar fontes de energia externa. Alguém pode me dar uma Luz? já tentei de tudo que vocês imaginarem... Desde Já, agradeço!
Olá! Alguem sabe se é possível alterar o MP3 Player Shield para tocar mais de 9 faixas?
Cara , comprei a shield da loja do Lab de Garagem.
Montei tudo conforme o exemplo aqui, mas no monitor serial me aparece esse erro:
Can't access SD card. Do not reformat.
SD errorCode: 0XF,0X7F
e esse outro de vez em quando:
Can't access SD card. Do not reformat.
No card, wrong chip select pin, or SPI problem?
SD errorCode: 0X1,0X0.
Algum conselho ?
Muito bom !
Eu estou com um projeto para fazer com esta shield, gostaria de saber se eu posso selecionar a faixa de audio que vai sair de acordo com uma entrada de um botão e um infravermelho. Por exemplo:
Botão1+infravermelho1= trackx01
Botão2+infravermelho2= trackx02
Botão3+infravermelho3= trackx03
.
.BotãoN+InfravermelhoN=trackx0N
Sendo que o esquema do botão seria semelhante aquele usado no projeto Tutorial: Como ler vários botões atraves de uma entrada analógica
e o esquema do infravermlho semelhante ao usado no projeto Tutorial: Tacômetro com Garanino, emissor e recpetor infravermelho
Agradeço muito pra quem carinhosamente olhar pra esta minha duvida
pra mim aparece o seguinte erro
Can't access SD card. Do not reformat.
No card, wrong chip select pin, or SPI problem?
SD errorCode: 0X1,0XFF
precisava de uma ajuda.
ao compilar o ex: aqui mostrado dá-me o erro "4 Valores fora do padrão no registrador SCI_MODE."
já estou cheio de tentar com este e outros explos:, já consegui ouvir som fiavel, mas depois com o mesmo codigo, já não saia o som igual.
só queria ouvir o som sempre direito. Alguem me ajuda por favor!!!!
Gostaria de saber qual patch devo baixar no site da VLSI, pois no vídeo explicativo parece que é só baixar um arquivo, mas não indica qual o certo. Se pudessem desponibilizar o link direto seria melhor.
Agradeço desde já
Coloque o serial monitor para funcionar com a velocidade de 115200
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)