domingo, 19 de octubre de 2014

Encender y apagar un LED con un sonido

En suma, lo que les voy a describir no es ni más ni menos que un biestable activado con un sonido. El circuito está compuesto principalmente por un micrófono electret, un diodo LED y una plataforma de hardware libre llamada Arduino Uno. Uso también una resistencia ajustable para poder establecer de forma tradicional el umbral de sensibilidad del micrófono.
En el software hay tres variables importantes: valorMicro, valorAdj y biestable. La variable entera “valorMicro” recoge el valor de la entrada analógica A0. Esta entrada tiene una resolución de 10 bits, y la tensión de referencia por defecto es de 5V; sabiendo esto, la sensibilidad de la entrada analógica es de 5v/1024, es decir, 4,9 mV, de sobra para que nuestro electret pueda disponer de un ajuste de sensibilidad extraordinario. Comparando esta variable con la variable de ajuste “valorAdj”, que recoge el valor de la entrada analógica A1, podremos establecer  la sensibilidad del micrófono entre un rango muy fino para umbrales de ruido muy bajo y otro rango más grueso para umbrales de ruido mucho mayores. No es necesario usar como resistencia ajustable la que yo usé de precisión, podremos usar cualquier otra de 4K7 o 10K, por ejemplo, ya que es un resistor que establece una tensión de referencia en la entrada analógica A1. Con una palabra o una palmada podremos activar y desactivar el diodo LED.
Cambiando oportunamente el valor de la variable “biestable” entre 0 y 1 conseguimos encender y apagar el LED cuando el sonido emitido supera el umbral establecido para el micrófono.

El programa está suficientemente comentado para que pueda ser entendible por cualquier entusiasta de Arduino.
 Este ejercicio puede dar pie a ser usado como sensor de alarma, y modificando ligeramente el programa podemos usarlo como LED que se enciende al ritmo de la música o, por ejemplo, como monoestable para encender una luz de un portal. Son libres, pueden pensar qué hacer con él. En el siguiente vídeo podemos apreciar su funcionamiento.


El código fuente del programa es el siguiente:
 // ***************************************
// Biestable activado por la voz
// ARDUINO UNO
// por Nacho
// Cotidiana Place
// ***************************************

// Declaracinde variables
int microPin=A0;
int adjPin=A1;
int valorMicro;
int valorAdj;
int led=12;     // LED, pin 12
int biestable=0;// Variable para conmutar

// Configurar

void setup()
{
  pinMode(led, OUTPUT);     // LED como salida
}

// Programa

void loop()
{
  valorMicro=analogRead(microPin);
  valorAdj=analogRead(adjPin);
// Enciende el LED ante un sonido y si la variable biestable es igal a cero
  if ((valorMicro > (valorAdj + 2)) && biestable==0)
  {
  biestable=1; // Cambiamos valor de biestable a 1
  digitalWrite(led, HIGH);
  tempo();
}
// Apagar LED ante un sonido y si la variable biestable es igal a uno
  else if ((valorMicro > valorAdj) && biestable==1)
{
  biestable=0; // Cambiamos valor de variable a 0
  digitalWrite(led, LOW);
  tempo();
}

} // Fin de programa

// Subprograma de retardo
void tempo()
{
delay(600);
}

13 comentarios:

  1. lo probare que tal estará saludos

    ResponderEliminar
  2. Nacho carnal cuales son los materiales que necesito para hacer esta programación? jaja saludos

    ResponderEliminar
    Respuestas
    1. La verdad es que no entiendo muy bien la pregunta, los materiales son los que están representados en el esquema: UN Arduino UNO, una R de 15K, otra de 220 Ohm, una ajustable de 5K, uncondensador electrolítico de 10 microF y otro de 2,2 microF, un LED y un micro electret. Saludos

      Eliminar
  3. ¿no es necesario un transistor para amplificar la señal?

    ResponderEliminar
    Respuestas
    1. No, cuando la intensidad de carga sea inferior a unos 40 mA por Pin de salida, y en total un máximo de 150 mA la suma de todas ellas, puedes conectar LEDs a través de una Resistencia limitadora. En este caso la corriente de salida en ese Pin es de unos 12 mA, corriente limitado por una resistencia de 220 Ohms, así no precisa de ningún elemento amplificador de corriente. Gracias por leer este blog. Saludos.

      Eliminar
  4. muchas gracias ya me sale : )

    ResponderEliminar
  5. Buenos dias

    Muy bueno el tema, tengo una pregunta tempo(); es una variable o que es se debe declarar como int o como que ??

    Muchas gracias

    ResponderEliminar
    Respuestas
    1. Buenas tardes Ragde, gracias por leer este.
      tempo(); es una llamada a una función (subrutina de retardo), que está declarada después del final del programa con void: // Subprograma de retardo
      void tempo()
      {
      delay(600);
      }
      Es decir, si quieres llamar a un subprograma, función o subrutina, y que te devuelva un resultado o realice una acción, por ejemplo un retardo, se solicita con su nombre y (), tempo();

      Espero que te sirva. Gracias. Un saludo

      Eliminar
  6. excelente programa y video. tengo una pregunta ahora quiero que se apague con dos aplausos ?

    ResponderEliminar
  7. Muchas gracias, Nacho. funciona muy bien.

    ResponderEliminar
    Respuestas
    1. Gracias a ti Germán por interesarte por este blog. Espero pronto ponerme de nuevo a crear alguna entrada más que pueda ser del interés de todos. Un saludo

      Eliminar