11 novembro 2013

Sensor de som Arduino

O assunto hoje do Arduino e Cia é som. Mais precisamente, Sensor de Som.

Já vimos aqui no site como gerar sons a partir do Arduino usando o comando tone. O que eu vou utilizar hoje é esta pequena mas eficiente placa com microfone embutido, que você encontra na FILIPEFLOP, o Sensor de Som Arduino. Com ela, vou mostrar como detectar o som ambiente e como tratar o sinal gerado por esse módulo.

Esta placa, além do microfone, tem um pequeno amplificador embutido (o circuito integrado LM386), pois apenas o microfone não seria capaz de enviar os dados para o Arduino. O esquema de conexão é bem enxuto, composto por apenas 3 pinos : Vcc, GND e S (sinal). No meio da placa, há um potenciômetro para ajuste da sensibilidade.

Sensor de Som Arduino

A placa trabalha com tensão de 5v, e o pino de sinal deve ser ligado de preferência à uma porta analógica do Arduino, já que o sinal gerado é variável, e com isso podemos observar os diferentes níveis de ruído captados pelo microfone.

O circuito de testes será composto pelo módulo Sensor de Som, mais o display LCD Winstar WH1602A, que já abordamos aqui no site, neste artigo. Se você não tem esse display, não se preocupe, pois o programa é facilmente adaptável à outros modelos de displays LCD.

O display, na sua parte superior, vai mostrar o nível do som (Baixo, Médio e Alto), e na parte inferior, será mostrada uma barra que vai acompanhar em tempo real o nível do som detectado pelo microfone :

Sensor de Som - Circuito em funcionamento

O circuito :

Sensor de Som Arduino - Circuito
O programa não utiliza nenhuma biblioteca própria para o módulo sensor de som, já que vamos apenas efetuar a leitura do sinal variável recebido pelo Arduino na porta analógica. Para o display LCD, é utilizada a já conhecida LiquidCrystal.

Para melhorar a precisão do programa, optei por fazer a leitura do sinal 128 vezes, utilizando a variável NUM_LEITURA. Depois, calculo o valor médio e uso este valor para gerar no LCD a indicação de nível de som. O gráfico na linha inferior do display utiliza as informações do sinal em tempo real. Caso você opte por não utilizar o display, os dados também são mostrados no Serial Monitor.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Programa : Niveis de ruido com Sensor de Som  
// Autor : Arduino e Cia  
   
int num_leitura = 128; //Define o numero de medicoes  
int pinosinal = A0; //Pino ligado ao pino S do modulo sensor de som  
long sinal;   //Armazena o valor lido do Sensor de Som  
long soma = 0; //Armazena o valor total das n medicoes  
long nivel =0; //Armazena o valor medio  
int mostranivel = 0; //Utilizado para gerar o grafico inferior  
int apaga = 0; //Variavel auxiliar para gerar o grafico inferior  
   
#include <LiquidCrystal.h> //Carrega a biblioteca LCD  
   
//Define os pinos que serao ligados ao LCD  
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); 
   
//Array para montar o simbolo grafico  
byte a[8]=   
{B10000, B11000, B11100, B11110, B11110, B11100, B11000, B10000,};   
   
void setup()  
{   
  pinMode(pinosinal, INPUT); //Define o pino de sinal como Entrada  
  Serial.begin(9600);  
  lcd.begin(16,2); //Inicializa LCD  
  lcd.clear();   //Limpa o LCD  
  lcd.setCursor(0,0); //Posiciona o cursor na coluna 0, linha 0  
  lcd.print("Nivel : ");  
  lcd.createChar(1, a); //Atribui a "1" o valor do array "A",   
                        //que desenha o simbolo grafico  
}  
   
void loop()  
{  
  //Efetua 128 leituras do sinal  
  for (int i=0; i<num_leitura ; i++)  
  {  
    sinal = analogRead(pinosinal);  
    soma = soma + sinal;  
  }  

  nivel = soma/num_leitura; //Calcula o valor medio  
  //Converte o valor lido para um valor entre 0 e 15  
  mostranivel = map(sinal, 0, 500, 0, 15);    
    
  //Gera o grafico inferior  
  for (int i = 0; i<mostranivel; i++)  
  {  
    lcd.setCursor(i,1);  
    lcd.write(1);  
    apaga = 15 - i;  
    for (int x = i; x<15;x++)  
    {  
      lcd.setCursor(x+1,1);  
      lcd.write(" ");  
    }  
  }  
     
  //Verifica o nivel de sinal e exibe na tela    
  if (nivel >0 && nivel < 100)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Baixo");  
    Serial.print("Nivel Baixo");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  if (nivel >100 && nivel < 200)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Medio ");  
    Serial.print("Nivel Medio");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  if (nivel > 200)  
  {  
    lcd.setCursor(8,0);  
    lcd.print("Alto  ");  
    Serial.print("Nivel alto");  
    Serial.print(" - Media : ");  
    Serial.println(nivel);  
  }  

  soma = 0; //Reinicia a soma dos valores das medicoes  
}  

Lembrando que os valores utilizados como comparação  podem ser ajustados de acordo com o nível de sensibilidade definido pelo potenciômetro.

35 comentários:

  1. Não estou conseguindo nenhum resultado com esta placa. A tensão de saída fica constante independente do nível de ruído ambiente. Atuações no POT fazem somente variar o nível da tensão de saída. Alguma sugestão??

    ResponderExcluir
    Respostas
    1. Boa tarde,

      Esse módulo é bem simples, não tem muito o que mexer. Tente ligar apenas o módulo, e verificar a saída no serial monitor para ver se há alguma alteração. Se não funcionar, recomendo testar com outro sensor.

      Abraço !

      Excluir
    2. Vocês conhecem algum módulo quem tenha melhor qualidade para detecar o som?

      Excluir
    3. Vocês conhecem algum módulo que tenha melhor qualidade para detectar o som?

      Excluir
  2. boa tarde , gostaria de saber qual e a biblioteca que uso pra fazer o sensor funcionar , eu quero ele para ligar leds de acordo com a musica e n no lcd ???

    ResponderExcluir
    Respostas
    1. Boa tarde Junior,

      Este sensor não precisa de biblioteca para funcionar. Para o seu caso, acho mais recomendado um módulo MP3.

      Abraço !

      Excluir
  3. map(sinal, 0, 500, 0, 15); pq de 0 a 500 e 0 a 15 ????

    ResponderExcluir
    Respostas
    1. Bom dia Yuri,

      Os valores iniciais poderiam ser de 0 a 1024 ao invés de 0 a 500, mas eu coloquei esse valor pq, se não me engano, 500 foi o valor máximo que eu consegui ler do sensor.

      Quanto ao 0 à 15, eu fiz isso para calcular o número de caracteres que serão mostrados no LCD (que tem 16 posições.

      Abraço !

      Excluir
  4. Estou com um problema. Irei colocar três microfones em uma sala. A media deste som definirá quanto será o som do microfone do locutor, para que o som do locutor atraves do microfone principal sejá sempre maior que o som das amostras obtidas nos microfones de coleta....não sei se fui claro. Peço ajuda dos colegas de como posso fazer isto. Obrigado
    Por favor, se puderem me auxiliem como devo cologar o programa e qual e o adequado para atender meu problema.Obrigado

    ResponderExcluir
    Respostas
    1. Bom dia Rony,

      Penso que o mais adequado seja colocar um sensor perto de cada microfone, e efetuar comunicação com o Arduino via rede sem fio, ou mesmo com fio, se a distância permitir.

      Mas tudo vai depender do seu projeto, do tempo de resposta que você precisa e também do nível de som que você precisa detectar.

      Abraço !

      Excluir
  5. Esse sensor de som Arduíno consegui medir até quantos decibéis ? qual sua capacidade máxima ? tem algum site informando os detalhes dessa maneira dele ?

    ResponderExcluir
    Respostas
    1. Boa noite Igor,

      Não tenho essa informação. Esse sensor é bem simples, só tem um microfone, o LM386 e alguns outros componentes, não sei se você vai conseguir esse nível de precisão.

      Abraço !

      Excluir
  6. Olá,
    Tem como transformar o sinal, recebido pelo módulo, em frequência, a fim de plotar o gráfico da frequência recebida?
    Obrigado!

    ResponderExcluir
    Respostas
    1. Bom dia Angelo,

      Não sei se com esse módulo você terá esse nível de precisão, mas é uma boa sugestão de post. :)

      Abraço !

      Excluir
  7. Olá, eu posso amostrar na tela lcd a frequencia captada pelo microfone de eletrodo da placa?? Preciso criar um projeto para identificar frequencias de 1hz ate 10khz para identificar ruidos no rotor de motores eletricos . Se alguem puder me ajudar

    ResponderExcluir
  8. Ola bacana o modulo, preciso realizar um projeto para captar a frequencia que o rotor de um motor eletrico gera queria saber se consigo fazer isso atravez desde modulo utilizando o microfone perto do rotor eu conseguiria captar a frequencia?? Estou procurando como fazer isso a meses ...
    Esperando resposta hehe!!!!

    ResponderExcluir
    Respostas
    1. Boa tarde Leonardo,

      Não sei se é possível, a não ser que você consiga "calibrar" esse módulo. Apesar de bem sensível, ele gera na saída apenas uma variação de sinal, creio que não seja suficiente para o que você precisa.

      Abraço !

      Excluir
    2. Este comentário foi removido pelo autor.

      Excluir
  9. Olá , teria como conseguir o esquematico deste modulo microfone?

    ResponderExcluir
    Respostas
    1. Oi Leonardo,

      Vou ficar te devendo, não achei. E esse sensor já é meio antigo também, agora nas lojas você encontra esse modelo aqui: http://www.filipeflop.com/pd-b473d-sensor-de-som-ky-038-microfone.html

      Abraço!

      Excluir
  10. Boa noite. Tem como vocês me ajudar. Um cliente quer que eu monte um projeto para ele. o seguinte, uma fita de led rgb e que ela fica alternando as cores conforme a batida da musica.

    ResponderExcluir
  11. Já comprei a placa arduino uno e a fita de led rgb

    ResponderExcluir
  12. Olá,

    Gostaria de saber se é possível montar um sistema para acender um holofote atraves da detecção de ruídos tipo vozes e carros com som alto, utilizando este sensor de som arduino.
    Grato,
    Kimura

    ResponderExcluir
    Respostas
    1. Boa noite Kimura,

      É possível sim. Você terá que usar algum sistema de acionamento do holofote por relé, provavelmente. Tenho alguns posts aqui no site falando sobre relés.

      Abraço!

      Excluir
  13. Boa noite, como ficaria o código para esse novo sensor com uma saída analógica e a outra digital ?

    ResponderExcluir
    Respostas
    1. Bom dia Phablo,

      É o KY-038 ? eu tenho um artigo sobre ele: http://www.arduinoecia.com.br/2015/07/sensor-de-som-ky-038-microfone-arduino.html

      Abraço!

      Excluir
  14. bom dia!
    consigo utilizar apenas o sensor como uma chave para ativar um alarme quando o som do ambiente estiver muito alto?

    ResponderExcluir
    Respostas
    1. Boa noite,

      Consegue sim. Faça um IF (condição), para que o alarme seja acionado quando o sensor detectar, por exemplo, o nível 200.

      Abraço!

      Excluir
  15. Boa tarde por favor qual o sensor devo utilizar para detectar voz de comando para um arduino em por exemplo 4 ambiente diferentes.

    ResponderExcluir
    Respostas
    1. Oi Sérgio,

      Provavelmente o que você precisa é de um sensor de reconhecimento de voz, como o utilizado neste post:

      http://www.instructables.com/id/Arduino-voice-control/

      Abraço!

      Excluir
  16. Olá, estou fazendo uma babá eletrônica para um trabalho da faculdade. Como utilizo esse sensor para detectar o choro do bebe? Necessito mexer no pontenciometro?

    ResponderExcluir
    Respostas
    1. boa tarde,

      Sim, você precisa ajustar a sensibilidade do microfone mexendo no potenciômetro da placa.

      Abraço!

      Excluir
  17. Tem como o sensor de som ficar mais sensível no meu projeto tenho que bater palma em cima dele para acender a led e queria maid ou menos 1 metro de distancia

    ResponderExcluir
  18. Tem como deixar esse sensor mais sensivel a fim de um estalar de dedos ele acione ?

    ResponderExcluir
    Respostas
    1. Boa noite,

      O ajuste de sensibilidade pode ser feito no potenciômetro do módulo.

      Abraço!

      Excluir