domingo, 15 de abril de 2012

VU Meter com Arduino

Arduino by my Self
Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);


Neste projeto veremos como executar um simples VU Meter medindo analogicamente a intensidade de sinal proveniente de um microfone de eletreto, e mostrando esta intensidade em um conjunto de 10 LEDs.

ELETRETO COMO SENSOR DE SOM:

Extraído do Wikipedia http://pt.wikipedia.org/wiki/Eletreto.

Eletreto é um tipo de microfone com tamanho bastante reduzido, sendo frequentemente utilizado em circuítos eletrônicos que tem por finalidade, entre outras, de servir de escuta.

Também conhecido como microfone de condensador. Este microfone, para funcionar, requer uma tensão entre 2 e 3 Volts, necessária apenas para funcionamento do transistor interno, e tem um consumo de aproximadamente 1mA. Sua sensibilidade é extremamente boa sendo preferido como ideal para diversos projetos. Sua saída fica em torno de 9 a 18mV podendo chegar aos 20mV.




É considerado o mais adequado para mini circuito e pode ser usado como eficiente pré-amplificador para entrada de microfone. A voz (som) entra no microfone de eletreto através de uma abertura na parte de cima do mesmo e movimenta a folha fina de mylar carregada permanentemente (eletreto) em relação à armadura fixa. Este movimento altera a indução elétrica na armadura fixa deste capacitor, que está conectada no terminal "gate" do transistor interno. Este transistor, um FET (Field Effect Transistor ou Transistor de Efeito de Campo), amplifica o sinal e o entrega em seu dreno (terminal de saida do FET).
Os microfones de eletreto são da família dos eletrostáticos e sua principal diferença a outros microfones, como os dinâmicos, é que eles necessitam de alimentação exterior (ex: fonte de energia elétrica).

Obs: Os Microfones de eletreto são polarizados.




O HARDWARE:
1 x Arduino UNO ou Duemilanove
1 x bread Board
1 x Microfone de Eletreto
1 x Transistor 2N2222
1 x Capacitor de 100 nF
1 x Resistor de 100KO
10 x Resistores de 220O
3 x Resistores de 10KO
10 x LEDs retangulares vermelhos
1 x Push-botton Dactilar
Fios e Cabos


O CIRCUITO:

Para amplificar o pequeno sinal gerado pelo microfone de eletreto, necessitamos de um sismples circuito amplificador de sinal, elaborado com apenas um transistor.

Circuito típico de Ligação


O sinal captado pelo eletreto é enviado à base do transistor, que com uma polarização direta amplifica o sinal e o sinal amplificado pode ser retirado diretamente do Coletor do Transistor
Como transistor de amplificação foi usado o 2N2222 de uso geral (veja a pinagem e características).


O sinal é entregue ao pino analógico 0 do Arduino.

Um push-botton (com um resistor de 10KO de pull-down) é ligado ao pino digital 2 do Arduino, ele será o seletor para mostrar valor de pico ou não.

Os 10 x LEDs serão ligados aos pinos digitais 3 a 12 do Arduino, tendo cada um deles um resistor de 220O ligado em série.




Detalhes do Circuito


Circuito completo



O SOFTWARE:


/*
  Este exemplo é um código de domínio público.
 */

// definições
int ledPins[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // matriz contendo os pinos dos LEDs
int switchPin = 2; // pino do pushbotton
int soundPin = 0; // pino analógico 0, é o pino onde será ligado o Microfone
boolean showPeak = false; // variável para armazenar o estado do botão
                                          // mostrar ou não valor de pico
int peakValue = 0; // variável que armazena o valor de pico

// Definições do Arduino
void setup()
{
  for (int i = 0; i < 10; i++)
  {
    pinMode(ledPins[i], OUTPUT); // loop para fazer os pinos dos LEDs como saída
  }
  pinMode(switchPin, INPUT); // define pino do pushbotton como entrada
}

// loop principal do programa
void loop()
{
  if (digitalRead(switchPin)) // verifica entrada digital do pushbotton
  {
    showPeak = ! showPeak; // inverte o estado, ou seja se estava ligado, então desliga
                                            // e vice-versa
    peakValue = 0; // fa vlor de pico inicilamente como 0
    delay(200); // tempo para o deboucing do pushbotton
  }
  int value = analogRead(soundPin); // leitura analógica do valor de intensidade de som
  int topLED = map(value, 0, 1023, 0, 11) - 1; // mapeamento do valor analógico de 0 a 1023
                                                                       // para 0 a 11 menos 1, acendimento dos LEDs
                                                                       // o menos 1 impede que o VU inicie em
                                                                       // maior que zero se não tem som 
  if (topLED > peakValue) // se valor lido maior que o valor de pico
    {
      peakValue = topLED; // faz valor de pico igual ao LED de pico lido
    }
  for (int i = 0; i < 10; i++) // loop para acender os LEDS conforme intensidade do sinal
  {
    digitalWrite(ledPins[i], (i <= topLED || (showPeak && i == peakValue)));
                                          // enquanto i menor ou igual ao LED de pico 
                                          // ou i igual ao valor de pico e mostrar valor de pico ativado
                                          // acende o LED i até valor de pico
  }
}
// FIM DA COMPILAÇÃO


O VÍDEO:

Vejamos os resultados:

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com