Tutorial: Controlando o MP3 Player Shield por comandos via Serial

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  Arduino Uno Rev 3

1 x MP3 Player Shield

1 x Cartão miniSd

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.

Link para download

 

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/

Exibições: 7407

Comentar

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)

Comentário de Vinicius Ferreira de Oliveira em 1 junho 2021 às 11:36

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?

Comentário de HugoOliveiraSoares em 10 junho 2016 às 21:36

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á.

Comentário de Alan Santos em 11 março 2016 às 20:00

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!

Comentário de Ricardo de Paula em 22 julho 2015 às 18:17

Olá! Alguem sabe se é possível alterar o MP3 Player Shield para tocar mais de 9 faixas?

Comentário de Erick Maia dos Santos em 14 setembro 2014 às 18:50

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 ?

Comentário de Erick Maia dos Santos em 9 julho 2014 às 13:49

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

Comentário de Alex Sandro em 6 junho 2014 às 18:55

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

Comentário de alberto carlos abreu silva em 14 outubro 2013 às 15:19

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!!!!

Comentário de Carlos Leandro de Oliveira em 26 setembro 2013 às 16:35

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á

Comentário de Laboratório de Garagem em 16 agosto 2013 às 10:26

Coloque o serial monitor para funcionar com a velocidade de 115200

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço