quarta-feira, novembro 13, 2013

Um Sensor Simples de Som

O sensor que examinaremos pode ser usado para medir, bem grosseiramente, a intensidade de som ambiente. Isto pode ser usado em um "medidor de aplausos", ou outras aplicações em que o comportamento tenha que ser diferente conforme a intensidade do som ambiente.


O circuito que vou usar vem do artigo "Little electret mic preamp":

Os valores dos componentes não são críticos. Por exemplo, usei um resistor de 470K no lugar do de 560K (simplesmente porque era o que tinha em mãos). No lugar do 2N3904 pode ser usado qualquer transistor NPN de baixa potência de uso geral; experimentei com sucesso um BC549.

A captação do som é feita por um microfone de eletreto. O modelo que usei é bem pequeno, foi escolhido por ser o que estava disponível com terminais. A wikipedia explica o funcionamento deste tipo de microfone. No momento interessa apenas que ele possui dois terminais e é alimentado pelo mesmo terminal que serve de saída. Isto resulta na saída ter uma componente DC (em outras palavras, o sinal varia em torno de uma tensão diferente de zero). Apesar do microfone possuir internamente um transistor para amplificar o sinal, a sua saída é ainda muito baixa para ser lida pelo conversor analógico digital  (ADC) do Arduino. Daí o transistor no nosso circuito. A saída obtida ainda tem uma componente DC, mas o sinal está amplificado o suficiente para poder ser medido pelo ADC.


O sinal colocado no Arduino estará variando continuamente, conforme o momento em que o sinal for amostrado. Existem várias formas, algumas mais sofisticadas e outras mais simples, de processar os valores lidos para determinar a intensidade do som captado. Neste teste eu simplesmente calculei a média de 100 leituras e acendo ou apago o LED do Arduino conforme o resultado:

void setup() {                
  pinMode(13, OUTPUT);     
}

void loop() {
  long soma = 0;
  int valor;
  for (int i = 0; i < 100; i++)
    soma += analogRead (A0);
  valor =  (int) (soma / 100L);
  if (valor > 600)
    digitalWrite(13, HIGH);   // liga o LED
  else
    digitalWrite(13, LOW);    // apaga o LED
}



Um comentário:

André de Souza Medeiros Leal disse...

Tudo o que eu precisava. Simples, direto, eficaz.
Muito facil de adaptar ao que precisei.

Parabéns e muito obrigado. Sou seu fã agora.