Tutorial: Música com Garagino ou Arduino (.WAV Player)

 

Este tutorial mostra como executar um arquivo .wav de um cartão SD com o Garagino e um conversor USB/Serial FTDI, sem a ajuda de nenhum shield! O arquivo .wav é uma extensão de arquivo de som das especificações RIFF (Resource Interchange File Format) da Microsoft. O arquivo .wav é mais simples de ser executado, uma vez que se trata basicamente de amostras de sons digitalizadas, diferentemente de outros formatos compactados, como o .mp3 por exemplo.

 

 

Para isto, serão necessários os seguintes componentes:

- 1 Garagino (ou Arduino)

- 1 Conversor USB/Serial

- 1 resistor de 82 Ohms (pode ser também 100 Ohms)

- 2 capacitores cerâmicos de 100 nF 

- Cartão SD 

- Jumpers para conexão

 

O cartão SD recebe um valor de tensão máxima igual a 3,3V nos seus terminais, sendo que nas saídas padrão do Arduino, há 5V. Por isso optou-se pelo Garagino Proto, que pode operar de 1,8V a 5,5V, dispensando a necessidade de divisores resistivos ou conversores de nível lógico para conexão ao cartão SD. O arquivo é lido byte a byte do cartão, e os valores obtidos são colocados em uma das portas PWM do Garagino, que conectados a um alto-falante ou amplificador, produzem o som.

 

A seguir, monte o circuito como mostrado abaixo (clique na imagem para ampliar):


No circuito acima, um dos capacitores tem a função de "Reset", e o outro de desacoplar o nível DC da saída para o alto falante. O resistor de 100 ou 82 Ohms aumenta a impedância da porta do microcontrolador e limita sua corrente para que não seja danificada.

 

Agora, faça o download de uma de nossas músicas preferidas (".wav")  pelo link abaixo:

http://www.4shared.com/music/o6XFq5zY/test.html

 

Está com o nome de "test.wav". Não modifique este nome por enquanto !!! Salve o arquivo no seu cartão micro SD e depois coloque-o no seu breakout. Abra a IDE do Arduino e digite o seguinte código:

 

// Firmware para leitura de arquivo .wav do cartão SD e reprodução em alto falante.

#include <SdFat.h>    // Inclui a biblioteca "Sdfat.h" para leitura de cartão SD. Se você não tiver a biblioteca, faça o download e extraia na pasta "libraries" do Arduino
#define sound 6    // Pino 6 com PWM, definido como "sound" (para saída analógica).
const int chipSelect = 10;    // Pino 10 como "chip select" do cartão SD.

SdFat sd;     // Definição para uso da biblioteca.
SdFile myFile;     // Definição para uso da biblioteca.

void setup() {

Serial.begin(9600);    // Inicia a comunicação Serial.
pinMode(sound, OUTPUT);     // Define o pino 6 como saída.

TCCR0B = 0x01;     // Configura a frequência do PWM nos pinos 5 e 6 para 64KHz.

if (!sd.init(SPI_FULL_SPEED, chipSelect)) sd.initErrorHalt();     // Inicia SdFat com máxima velocidade ou imprime mensagem de erro no "Serial Monitor".

if (!myFile.open("test.wav", O_READ)) {     // Abre o arquivo chamado "test.wav" (o nome pode ser mudado), se não, imprime mensagem de erro no "Serial Monitor".
sd.errorHalt("opening test.wav for read failed");
}

unsigned char data;     // Declara uma variável para armazenar os dados do arquivo.

for(int count=0; count<46; count++) {     // Pula o cabeçalho do arquivo test.wav para acessar os dados(depois de 129 leituras). Este número pode variar para cada arquivo.
data = myFile.read();     // Lê byte a byte até o final do cabeçalho.
}

while (data >=0) {     // Se o dado a ser lido for maior ou igual a zero (não nulo),

data = myFile.read();     // Lê um byte do arquivo e armazena-o em "data".
analogWrite(sound, data);     // Envia os dados para o pino 6 (pino ligado ao alto falante).
delayMicroseconds(40);     // Espera um certo intervalo (em microssegundos) para a próxima amostragem (de acordo com a do arquivo .wav).

// Este tempo de espera faz com que as amostragens sejam mais próximas à frequência de 8KHz do arquivo.
}

myFile.close();     // Fecha o arquivo.
}

void loop() {
// Nada acontece aqui.
}

 

Agora faça o upload para o seu Garagino. Se tudo correr bem, suas caixas de som reproduzirão a música ".wav". E o seu tocador de arquivos ".wav" sem shield está pronto !!! Esperamos que tenha gostado. Qualquer dúvida, poste no blog.

 

Obs: Se quiser executar qualquer outro arquivo ".wav", salve-o no seu cartão SD, vá até a linha marcada em azul no código, e altere o nome "test" pelo nome do seu arquivo. Então, abra ele usando um conversor de arquivos de áudio (este ou outro), converta-o para uma taxa de amostragem de 8KHz e 8 bits por amostra, mono:

 

 

O valor de 8 bits por amostra foi adotado porque uma porta de saída PWM deste microcontrolador tem até 10 bits de resolução. Porém, como nos conversores geralmente não se encontra este valor, escolheu-se 8 bits. Os 8KHz de frequência permite o microcontrolador processar com mais facilidade as amostras de som (considerando atrasos por ciclos de máquina, varredura, etc).

 

Agora, execute o arquivo convertido com um editor hexadecimal. Vá então à parte escrita do arquivo 4 bytes após "data" e observe o número em hexadecimal correspondente. Veja o exemplo abaixo: 

 

Converta este número (no caso 2E) para decimal. No exemplo, será 46 em decimal. Vá então à linha marcada em vermelho no código e modifique o número "46" para o do seu arquivo, esta é a posição onde começam os dados, após o cabeçalho do arquivo. Feche o editor hexa. Faça então o upload para o seu Garagino !!!

 

Links de Referência:

Garagino Proto

Arquivos ".wav"

PWM

 

 

 

 

 

 

                                  

 

Exibições: 25881

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 Ravel Telles em 12 abril 2013 às 17:37

se eu quiser colocar um led pra piscar no final da execução da musica, como faço?
ja tentei por digitalWrite porém da erro, alguma ideia?

Comentário de Junior Moya em 27 março 2013 às 16:26
Boa Tarde, estou tentando compilar o programa para testar.
O erro acontece na sexta linha: SDFile myFile; // Definição para uso da biblioteca.
Descrição:
sketch_mar27a:7: error: 'SDFile' does not name a type
sketch_mar27a.cpp: In function 'void setup()':
sketch_mar27a:18: error: 'myFile' was not declared in this scope
sketch_mar27a:25: error: 'myFile' was not declared in this scope
sketch_mar27a:30: error: 'myFile' was not declared in this scope
sketch_mar27a:37: error: 'myFile' was not declared in this scope

Estou utilizando o sd do ethernet shield.
Sera biblioteca é diferente?
Obrigado
Comentário de Laboratório de Garagem em 14 novembro 2012 às 12:21

Marcelo,

Você pode usar o Arduino, sem problemas. Nesse caso precisará apenas do capacitor ligado ao alto falante (o outro não) e de divisores resistivos no cartão, que trabalha em 3.3V.

Abraço!

Comentário de Marcelo Pizani em 13 novembro 2012 às 16:54

Se eu utilizar um Arduino no lugar do Garagino, vou precisar dos 2 capacitores cerâmicos?

Comentário de Marcelo Rodrigues em 15 outubro 2012 às 2:11

Vicinius,

O estoque da loja será reposto nesta semana. :)

Abraço!!

Comentário de Vinícius Fontes de Freitas em 15 outubro 2012 às 1:48

Teria o esquema montado com o Arduino? Pq estão sem estoque dos componentes? É fácil encontrar a breakout para o SD em lojas da cidade? Será que não seria mais fácil e rápido comprar o shield? Quando o shield MP3 estará disponível na loja? Abraço!!

Comentário de Marcelo Rodrigues em 14 outubro 2012 às 0:41

Pediu, tá lá... Hehehe...

Comentário de Diego Rodrigo Souza em 12 outubro 2012 às 13:27

Muito legal! Vou tentar implementar!

Seria legal se pudesse ser postado um vídeo dele em funcionamento.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço