Objetivos
Material requerido.
Kit inicio UNO | |
Kit Inicio Mega |
Los fotosensores
Una fotorresistencia o LDR (Light Depending Resistor, o resistencia dependiente de la luz) es un componente fotoelectrónico cuya resistencia varía en función de la luz que incide en él. Esta resistencia es muy baja, de unos pocos Ωs con una luz intensa incide en él y va creciendo fuertemente a medida que esa luz decrece.
Se les suele utilizar como sensores de luz, para arrancar luces automáticamente cuando la oscuridad sobrepasa un cierto umbral, o como detectores de movimiento próximo ( Cuando algo se interpone).
Vamos a utilizar en esta sesión un típico LDR, que es bastante fácil de conseguir y es sensible a los cambios de luz ambiente. Montaremos un circuito con un LDR y el zumbador que vimos en la última sesión, para construir un theremin rudimentario, que espero que os haga pasar un rato entretenido.
Un theremin es un sintetizador rudimentario que genera audio variable de espectro continuo, analógico, en función de una señal de control (No os asustéis, que es una tontería).
El circuito utiliza un LDR como señal de control y calcularemos una frecuencia en función de la caída de tensión que leamos en nuestra fotorresistencia.
Pero antes de entrar en materia necesitamos hacer un inciso para conocer lo que es un divisor de tensión.
Divisores de tensión
Hablamos en su momento de la ley e Ohm:
V = R * I
Pero no hablamos de cómo se combinan las resistencias y ha llegado el momento de hacerlo, para desesperación de los que odian las mates.
Podemos combinar un par de resistencias R1 y R2 de dos maneras. En serie y en paralelo:
En serie | En Paralelo |
---|---|
Cuando ponemos las dos resistencias en serie, la resistencia resultante es la suma de ambas:
Y cuando las ponemos en paralelo, podemos calcular la resitencia equivalente así:
Imaginemos ahora un circuito como este:
[one-third]
Como las resistencias están en serie el valor total es R1 + R2. Si Vin es de 5V la intensidad que circulará por el circuito será:
La pregunta del millón ahora es ¿Si medimos entre las dos resistencias cuanto es Vout? Pues igual de fácil :
Si todavía queda alguien despierto, se habrá dado cuenta que si R1 y R2 son iguales Vout será exactamente la mitad de Vin pero si R1 o R2, fuese un potenciómetro (o un LDR) cualquier variación en el ajuste, causaría una modificación en el valor de salida de tensión Vout.
Esto es lo que se conoce como un divisor de tensión y es un circuito de lo más práctico para rebajar una señal de entrada, y podéis apostar a que lo usareis mas de una vez.
Por ejemplo, los convertidores analógicos de Arduino aceptan un máximo de 5V, pero muchas señales industriales son de entre 0 y 12V.Si lo conectas sin más al A0, por ejemplo, freirás el chip de largo.
Pero con el truco del divisor de tensión y calculando adecuadamente las resistencias (Que sí, que tú puedes con lo que hay en la página anterior) puedes adaptarlo tranquilamente para que tu Arduino viva feliz con una señal que originalmente le hubiera chamuscado.
Los divisores de tensión son un circuito muy sencillo y que conviene que sea parte de vuestro arsenal electrónico. Resuelven cantidad de problemas con una resistencia y un potenciómetro y son ideales para tratar señales, que por exceso de tensión, quedarían fuera del alcance de tu Arduino.
De hecho en esta práctica vamos a montar un divisor de tensión con una resistencia y un LDR y leeremos la caída de tensión en él. Nos va a servir como ejemplo de los divisores de tensión y además nos servirá como señal de control para calcular la frecuencia a la que haremos vibrar el buzzer.
El circuito para un theremin óptico
Aunque el titulo impresiona, lo reconozco, el circuito no es para tanto:
Fíjate que el LDR R1, junto con R2 forma un divisor de tensión. La lectura de A0 dependerá de la luz que incida en el LDR. El esquema de protoboard es igual de fácil:
Vamos con el programa.
El programa es muy sencillo. Leemos la caída de tensión en A0 y lo usamos para mapear una frecuencia entre 20 y 5.000 Hz para llamar a la función tone() y eso es todo.
const int pinBuzzer = 13 ; void setup() { pinMode (pinBuzzer , OUTPUT) ; } void loop() { int p = analogRead(A0) ; int n = map (p, 0,1024, 20, 5000) ; tone ( pinBuzzer, n) ; }
Aqui teneis un pequeño video con el resultado
Creo que convendréis conmigo, en que ha sido tan fácil, que no puedo dejaros marchar, sin poneros antes algún otro problema. Veamos.
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, como veíamos en el programa de las sesión 20. ¿Cómo haríais para conseguir que el resultado de este theremin, produjera, las notas que definimos allí?
Podrá ser algo así:
const int pinBuzzer = 13 ; int tono[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494}; // mid C C# D D# E F F# G G# A void setup() { pinMode (pinBuzzer , OUTPUT) ; } void loop() { int p = analogRead(A0) ; int n = map (p, 500,1024, 0, 12) ; // Ell array solo tiene 12 notas tone(pinBuzzer, tono[n]); delay(300); }
He usado un array con las frecuencias temperadas de una octava. Después, mapeamos las lectura de la puerta A0 a un entero entre 0 y 12, porque el array e arriba solo tiene 12 notas, y usamos su valor para leer la frecuencia correspondiente.
En mi caso, además, A0 solo daba valores entre 500 y 1024, así que por eso he corregido la escala. Por último el delay impide que el cambio de notas sea instantáneo, porque de lo contrario no notaríamos mucho cambio el programa anterior.
Resumen de la sesión
Hoy hemos aprendido en este curso de arduino lo siguiente: