G017 Uso de una LDR con arduino.

Descripción                                                                           ADM
Vamos a utilizar una LDR que es bastante sensible a la luz ambiente para variar el tono audible que obtendremos a través del buzzer.   Para ello solo tendremos que acercar la mano a la LDR y el tono audible irá variando según vamos acercando la mano.

Materiales
Placa de arduino
1 Buzzer piezoeléctrico
1 Resistencia LDR
1 Resistencia 330
Protoboard, cables para conexiones y cable USB para conectar arduino al PC y sirve además de alimentación.

Esquema

El circuito utilizar una LDR como señal de control y calcularemos una frecuencia  en función de la caída de tensión presente en cada momento en la LDR, ya que las entrada ADC de arduino, no pueden leer resistencia, sino tensión.  Vamos a montar un divisor de tensión con una resistencia R1 y una LDR (R2) y el punto intermedio entre ambos irá conectado a la entrada analógica A0, de esta manera la lectura de A0 dependerá de la cantidad de luz que incida sobre la LDR. El buzzer irá conectado entre la masa y la entrada 13.

Montaje

Código
const int pinBuzzer = 13;
void setup(){
  pinMode (pinBuzzer, OUTPUT);
  }

void loop(){
  int p = analogRead(A0);
  int n = map(p, 0,1023,20,2000);
  tone(pinBuzzer,n);
}

Este código es sencillo, se declara una constante global tipo entero llamada pinBuzzer y se le asigna el pin 13 de arduino. En el setup se establece que pinBuzzer, es decir el pin 13 es una salida.


En el loop, se declara una variable local llamada p, de tipo entero que se le asigna lo que lea en la entrada analógica A0 cuyo valor varía entre 0 y 1024.

Se declara a continuación la variable local de tipo entero n, a la que se le asigna la instrucción map, que crea una proporción con los datos de p, de 0 a 1024, y en función a este el resultado estará entre 20 y 5000, que son los hz del PMW para que suene el buzzer, es decir  Leemo en A0 y lo usamos para mapear una frecuencia entre 20 Hz y 5000 Hz.

Para probar este circuito hay dos formas de hacerlo, o pones un foco potente encima de la LDR y según va pasando la mano modificas la frecuencia del tono de salida, variando así su sonido, o pones la habitación en penumbras, y vas acercando la luz de una linterna, obteniendo así la misma variación del tono.

El sonido que obtenemos es de espectro continuo, es decir, que reproduce frecuencias continuas en el margen que es capaz. Pero nuestro oído está acostumbrado a escuchar las notas en tonos y semitonos de frecuencia dada, vamos a ver como modificar el código para obtener variaciones de notas musicales.
const int pinLDR = 0;
const int pinBuzzer = 13;
int tono[] = {261,277,294,311,330,349,370,392,415,440,466,494};
void setup(){
  pinMode (pinBuzzer, OUTPUT);
  }

void loop(){
  int p = analogRead(A0);
  int n = map(p, 500,1023,0,12);
  tone(pinBuzzer, tono[n]);
  delay(300);
}
Para empezar declaramos una constante global tipo entero llamada pinLDR y le asignamos el valor 0, ya que es en A0 donde hemos conectado la señal procedente de la LDR.

Creamos una segunda constante global de tipo entero llamada pinBuzzer y le asignamos el 13, que es el pin donde hemos conectado el positivo de buzzer. 

A continuación hemos creado un arrays tipo entero con las 12 frecuencias correspondiente a las nota musicales, incluyendo los semitonos.


En el setup hemos designado el pin correspondiente a la variable pinBuzzer como una salida. 

Ya en el loop, creamos una variable p que lee los valores en la entrada analógica.  Luego hemos creado una variable n que mapea los datos recibido en P que estarán entre 500 y 1024 y los mapeará entre 0 y 12 que son las notas disponibles en el array.  La función tone enviará al pin que se corresponde con el pin de la variable pinBuzzer es decir el 13 el tono que se corresponda con la posición que devuelva el valor de la variable n, y por último hará una pausa de 300 ms, este delay es para que el cambio de nota no sea instantaneo, ya que sino sería muy parecido al resultado del código anterior.