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 HugoOliveiraSoares em 12 maio 2016 às 21:39

Boa noite garagistas,

Eu estava implementando o projeto de vocês porem a biblioteca SDfat deu errado porque não era compativel com a IDE, por isso troquei pela biblioteca SD.

Porem o projeto não funcionou, sai da caixa de som uns ruídos qual será o meu erro?

Segue abaixo o código fonte:

 

  #include <SD.h> // Inclui a biblioteca "Sdfat.h" para leitura de cartão SD.
  #define sound 6  // Pino 6 com PWM, definido como "sound" (para saída analógica).
  const int chipSelect = 53;    // Pino 10 como "chip select" do cartão SD. Pino 53 no Mega.
  Sd2Card card;    // Definição para uso da biblioteca.
  File  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 (!card.init(SPI_FULL_SPEED, chipSelect))
   
   myFile = SD.open("test.wav", File_READ));
  if (!SD.begin(53)) {
        Serial.println("falha na leitura!");
      }    
 
  unsigned char data; // Declara uma variável para armazenar dados
    
    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() {
    
  }

Estou utilizando o Arduino Mega

Agradeço desde já.

Comentário de Pedro Luis em 17 agosto 2015 às 16:11

Boa tarde galera,

Eu gostaria de fazer exatamente isso, mas a musica ou a voz, so seria emitida se um sensor fosse acionado, alguem pode me ajudar? sou iniciante e esse sera um projeto para meu semestre na facul. notei tambem que nao tem o esquema de ligação entre o modulo SD e o Arduino, alguem pode me ajudar ??

Comentário de Glaucio Miranda em 20 novembro 2014 às 9:20

Obrigado Marcelo!!

Comentário de Marcelo Rodrigues em 20 novembro 2014 às 9:17

Glaucio,

Corrigi o link no texto. Você encontra a SdFat nesse link: https://github.com/greiman?tab=repositories

Se ficar dúvida sobre acesso ao cartão SD, tem outros tutoriais sobre isso aqui no LdG.

Boa sorte!

Comentário de Glaucio Miranda em 19 novembro 2014 às 22:57

Alguem tem a biblioteca para me passar? o link não funciona mais

Comentário de rodrigo bonadia Fraga em 28 junho 2014 às 1:18

error: 'class SdFat' has no member named 'init'

Comentário de João Neto em 17 outubro 2013 às 15:58

Como vocês conectaram a Breakout Board para microSD na Protoboard? Soldando pinos nela ou essa Breakout Board que vocês utilizaram já veio com pinos? Vocês pensam em repor, na loja, a SD Card Shield V4.0 (http://www.labdegaragem.org/loja/sd-card-shield-v4-0.html)? Se sim, tem data prevista para essa reposição?

Comentário de Vitor Aoki em 17 outubro 2013 às 14:54

Utilizando um Arduino UNO, como ficariam as ligações?? Seria necessário o conversor USB/serial?

Obrigado.

Comentário de Cláudio "Patola" Sampaio em 15 julho 2013 às 22:04

Esse tempo de 40us foi achado por tentativa e erro, até chegar perto de 8 KHz?

Comentário de Rafael Rodrigues Costa em 13 junho 2013 às 18:45

Boa Tarde, também estou tentando compilar o código, mas, aparece o seguinte erro:

Som_chato2.ino: In function 'void setup()':
Som_chato2:11: error: call to 'SdFat::init' declared with attribute error: use sd.begin(chipSelect, sckRate)

O que quer dizer?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço