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
Olá, uma coisa
no terminal só aparece um negocio assim
ò¼¨iÀ
e nao funciona a musica
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)