domingo, 26 de junho de 2011

Projeto: Usando microfone com o Arduino

Seguindo a série de projetos resolvemos estudar o CI LM386. O LM386 é um amplificador de aúdio de baixa potência. Ele é um CI com oito pinos e a função de cada pino está descrito abaixo. O funcionamento é simples, basicamente, você liga um microfone de eletreto nas portas 2 e 3 e tem o sinal amplificado na porta 5. Lembrando que na porta 2 devemos ligar o GND e na 6 o +5V do arduino.

Para aumentar a amplificação, podemos adicionar um capacitor ligando as portas 1 (+) e 8 (-). Para melhorar a qualidade do sinal, podemos adicionar alguns capacitores e resistores. Na rede há diversos circuitos que mostram como fazer a ligação com o arduino. O que achei mais simples foi esse aqui. Para seguir o padrão do nosso site, fiz o diagrama fritzing do circuito que montamos.


Os capacitores C1, C2 e C3 são capacitores de 10microF e o C4 é de 100nF. O resistor de 10K pode ser substituído por um potenciômetro, o potenciômetro funcionará como um botão de volume.

Este é o esquema para um microfone, o que nós fizemos foi montar dois circuitos iguais a esse e ligar no mesmo arduino. Um microfone foi ligado na porta analógica 0 (como mostrado no diagrama) e o outro ligamos na porta 2.






Abaixo segue o código arduino para enviar o sinal dos microfones para o computador. Enviamos uma string com os valores lido nas duas portas analógicas, separados por ";".

int A0 = 0;
int A1 = 2;
int var0, var1;
int passo=1;
void setup(){
Serial.begin(9600);
}
void loop(){
var0=var1=0;
for(int i=0; i
var0+=analogRead(0);
var1+=analogRead(2);
}
Serial.print(int(var0/passo));
Serial.print(";");
Serial.println(int(var1/passo));
}

Agora que o computador está recebendo os dados do arduino, usamos o Processing para pegar este sinal e fazer um gráfico do sinal do microfone em função do tempo.


// Importa a biblioteca de comunicação serial
import processing.serial.*;
// Cria um objeto para comunicação
Serial myPort;
float xPos = 1;
float yPos0 = 1;
float yPos1 = 1;
float dt=1;
int i=0;
float inY0, inY1;
void setup () {
// Define o tamanho da janela
size(800, 300);
//Conecta-se com o primeiro dispositivo da lista
myPort = new Serial(this, Serial.list()[0], 9600);
// Espera receber o primeiro sinal da usb
myPort.bufferUntil('\n');
// Define a cor de fundo da janela
background(255);
}
void draw () {
// Nada será feito aqui
}
void serialEvent (Serial myPort) {
// Pega a primeira linha recebida na porta serial
String inString = myPort.readStringUntil('\n');
// Se a linha não estiver em branco
if (inString != null) {
// remove os espaços em branco
inString = trim(inString);
// Divide a string num vetor separado por ;
String[] vector = split(inString,';');
// converte para int e muda os limites (map):
inY0 = map(float(vector[0]), 0, 1023, 0, 350);
inY1 = map(float(vector[1]), 0, 1023, 0, 350);
// Desenha as linhas:
stroke(255,0,0);
line(xPos,yPos0, xPos+dt, height - inY0);
yPos0=height-inY0;
stroke(0,0,0);
line(xPos,yPos1, xPos+dt, height - inY1);
yPos1=height-inY1;
// Se chegar no final da janela, volta para o início
if (xPos >= width) {
xPos = 0;
background(255);
}else {
xPos+=dt;
}
}
}




O resultado desse código é um gráfico como este abaixo.




17 comentários:

  1. Excelente tutorial... também estou metendo a cara nesta área.. a principio foi melhor escolha que fiz ...

    Bom, obrigado, este tutorial me ajudou e acredito ter ajudado muita gente.

    muito organizado e bem explicado!

    Vi que o grupo é novo então se precisarem de ajuda estou ai..

    meu contato: rob.thiede.n@gmail.com

    abração

    ResponderExcluir
  2. Parabens pelo blogger, duas observações.
    1° no código do arduino as tags de html comerão o comando "for(int i=0; i<passo;i++)"
    2° coisa, como conseguiram copilar esse projeto ? int A0 = 0; ?
    Testei aqui e da erro o código já que A0 é uma porta analógico e acho q não pode ser usada como váriavel.

    ResponderExcluir
  3. Tonny, realmente o html comeu parte do for, logo irei corrigir o código. Sobre o A0 e A1, de fato elas são duas definições feitas pelo próprio wiring. Dependendo da versão do arduino, essa definição pode ser refeita. De qualquer modo, vou remover as duas primeiras linhas, já que depois não usei as variáveis.
    Obrigado pelas dicas.

    ResponderExcluir
  4. tem como gerar uma matriz em vez de um gráfico?

    ResponderExcluir
  5. Não entendi o que você quer, gerar uma matriz do que e onde?

    ResponderExcluir
  6. Olá, muito interessante o projeto.
    Gostaría de saber como posso estar entrando em contato com vocês para ingressar no grupo. Também resido em Volta Redonda.

    Agradeço a colaboração
    Gabriel Arantes
    (24) 998216670

    ResponderExcluir
  7. Este comentário foi removido pelo autor.

    ResponderExcluir
  8. Bom dia Daniel,
    você pode postar o código atualizado, estão aparacendo vários erros de compilação.
    Se possível um vídeo do projeto seria interessante.
    Desde já agradeço e lhe parabenizo pelo projeto.

    ResponderExcluir
  9. olá tudo bem? parabéns pelo tutorial.

    Cheguei aqui procurando alguma referencia em como fazer uma comunicação entre duas pessoas viajando de moto, cada qual com seu capacete contendo microfone e fones. pois as viagens dos motocicletas, mesmo acompanhadas, são muito solitárias.

    Como estou iniciando no mundo de hardware livre não compreendi bem o tutorial.

    Será que da pra fazer essa comunicação entre os capacetes usando microfone e alto falantes mais ou menos da forma citada neste tutorial?

    é que vi que da pra gerar um gráfico tipo aqueles de gravação de áudio.

    grato pela atenção e animado com as possibilidades de comunicação que já tenho encontrado.


    muito massa: https://www.youtube.com/watch?v=2ZK6dcBTeT0

    assim como esse tutorial é d+. vlw

    ResponderExcluir
  10. Este comentário foi removido pelo autor.

    ResponderExcluir
  11. Olá, você saberia me informar como faço para ver o valor da frequência em Hz captado pelo microfone?

    ResponderExcluir
    Respostas
    1. Com o Arduino eu acho que tu não vai conseguir. O melhor seria usar um app de celular chamado Phyphox.

      Excluir
    2. Mas será que é possível fazer alguma ação dependendo da frequencia obtida do microfone? Sei que com decibéis é possível mas frequência ainda nao vi.Ou com outro microcontrolador?
      De qualquer forma obrigado e parabéns pela aula

      Excluir
    3. Certeza que dá com outros microcontroladores ou talvez já exista um ci próprio pra fazer isso. Procura por analisador de espectro sonoro arduino. O que vc gostaria de fazer baseado na frequência? Pode ser algo comandado pelo celular?

      Excluir
    4. Eu mandaria um nível logico alto ou baixo para um porta digital dependendo do valor da frequencia.

      Excluir
  12. poderia me ajudar estou fazendo um sistema para funcionar uma maquina por voz porem preciso que ele não funcione se o som for agudo estou usando um sensor de som. preciso que ele funcione com sons mais graves
    segue a programação
    const int pinoRele = 7;
    const int pinoSom = 4;
    int val = 1;

    void setup() {
     pinMode(pinoRele, OUTPUT);
     pinMode(pinoSom, INPUT);

    }

    void loop () {

     val = digitalRead(pinoSom);
     //digitalWrite(pinoRele, LOW);

     
     if (val == LOW) {
       digitalWrite(pinoRele, LOW);
       delay(300);
       digitalWrite(pinoRele, HIGH);
       delay(4000);

     }
    }

    ResponderExcluir