Arduino y fotosensores LDRs

Objetivos

 

  • Un componente simpático, el LDR.
  • Los divisores de tensión.
  • Un theremin sensible a la luz.
  •  

    Material requerido.

     

    Kit Arduino Uno  Kit inicio UNO
    Kit Arduino MEGA 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.

  • Recordad que los convertidores ADC como los de Arduino uno no pueden leer resistencia sino tensión.
  • Los LDR no son precisamente rápidos en reaccionar a la luz, y puedan tardar hasta algunas décimas de segundo en reaccionar. Esto no es importante para una alarma de luz, pero hace imposible que se puedan utilizar para enviar información mediante la luz.
  •  

    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
    Suma de resitencias Resitencias en paralelo 

    Cuando ponemos las dos resistencias en serie, la resistencia resultante es la suma de ambas:

    Resistencias en serie

    Y cuando las ponemos en paralelo, podemos calcular la resitencia equivalente así:

    Calculo de resitencias en paralelo

    Imaginemos ahora un circuito como este:

    [one-third]

    Adaptando la tension

    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á: Intensidad con resistencias en serie

    La pregunta del millón ahora es ¿Si medimos entre las dos resistencias cuanto es Vout? Pues igual de fácil :

    Voltaje

    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:

    Divisor de tensionFí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:

    Divisor de tension

     

    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) ;
            }

  • Para probar el circuito os recomiendo que pongáis un foco potente a 50 cm por encima del LDR y probéis a mover la mano por delante y especialmente de arriba abajo y viceversa.
  • Escuchareis un tono continuo más o menos agudo, que ira variando su frecuencia en función de la luz que incida en el LDR.
  • Se acepta que el oído humano se mueve ente 20 Hz y 20Khz (aunque esto es para algún adolescente de oído muy fino) para los que peinan canas entre 40Hz y 10Khz ya es un rango optimista. Por eso, mapeamos los valores del potenciómetro, que van de 0 a 1024, entre 20 y 5Khz, pero os recomiendo que cambiéis estos valores y veáis lo que pasa.
  •  

    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);
            }

    ¡Accede al contenido!

    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:

     

  • Hemos presentado las fotorresistencias o LDRs.
  • Presentamos los divisores de tensión.
  • Que utilizaréis más de una vez en vuestros circuitos.
  • Los usamos para rebajar niveles de tensión en señales de entrada y como adaptadores para leer caídas de tensión resistencias variables .
  • Vimos como montar un theremin óptico
  •   

    Deja una respuesta