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: 7423

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 Alvaro Rausell em 15 agosto 2013 às 19:53

Olá, uma coisa

no terminal só aparece um negocio assim

򼙨i
e nao funciona a musica

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço