Arduino – Capítulo 6 – Lámpara de colores

Bueno, ahora que ya sabemos como hacer parpadear unos leds, ¿que tal si aprendemos a atenuar su brillo o a mezclar colores? Pues esto es lo que vamos a aprender ahora y para ello, construiremos una lámpara de colores.

Tal vez estemos pensando: “Que fácil. Si quiero atenuar el brillo de un led, pues disminuyo la tensión que le suministro y ya está.” Pero nada más lejos de la realidad. Y ahora veremos por qué.

Arduino no puede variar el valor de la tensión de salida en sus pins, tan solo puede suministrar un voltaje de 5V. Por consiguiente, necesitaremos utilizar una técnica llamada Modulación del Ancho de Pulso (MAP) (Pulse Width Modulation en inglés) para poder disminuir el brillo de un led. La técnica MAP cambia rápidamente el valor del pin de salida entre High y Low en un lapso de tiempo determinado. Dicho cambio se produce más rápido de lo que el ojo humano puede detectar, tal y como funcionan las películas: mostrando al ojo una serie de imágenes fijas de forma tan rápida que da la sensación de haber movimiento. Cuando variamos rápidamente el valor del pin entre HIGH o LOW, estamos variando su tensión. El porcentaje de tiempo durante el cual el pin mantiene un valor HIGH se denomina ciclo de trabajo. Cuando el pin se encuentra la mitad del tiempo del ciclo de trabajo con un nivel alto (HIGH) y la otra mitad del tiempo en un nivel bajo (LOW), dicho ciclo del trabajo es del 50%. Un ciclo de trabajo corto proporciona un brillo más tenue que un ciclo más rápido.

Arduino Uno (la placa que estoy utilizando para estos proyectos) posee seis pines destinados al MAP (los pines 3, 5, 6, 9, 10, y 11), los cuales pueden ser fácilmente identificados por tener escrito el símbolo ˜ al lado del número de pin.

Pins PWM

Como elemento de entrada, para este proyecto utilizaremos fotorresistencias (sensores que cambian su valor de resistencia en función de la cantidad de luz que reciben). Si conectamos una fotorresistencia a uno de los pin de nuestro Arduino, podremos medir la variación de la misma comprobando la tensión existente en dicho pin.

Fotorresistencia

Fotografía de una fotorresistencia cualquiera

Montando el circuito

Para montar el circuito de este proyecto necesitamos los siguientes componentes:

– 1 led RGB.

– 3 resistencias de 220Ω.

– 3 resistencias de 10KΩ.

– 3 fotorresistencias.

– 3 tiras de papel o plástico transparente. Una roja, otra verde y otra azul. Cada una de ellas servirá para ponerlas sobre una fotorresistencia y que así sirva de filtro para detectar un color.

Una vez tenemos los componentes necesarios, debemos seguir los siguientes pasos:

1 – Conectamos la alimentación de 5v y la tierra de la placa Arduino a la protoboard.

2 – Colocamos las tres fotorresistencias en la protoboard a lo largo de la línea central de la misma, de manera que una patilla quede a un lado de dicha línea y la otra al otro lado.

3 – De las dos patillas que tiene cada fotorresistencia, una la conectamos a la alimentación y la otra, a una resistencia de 10KΩ que a su vez irá conectada a tierra. Como dicha resistencia de 10KΩ se encuentra en serie con la fotorresistencia, en conjunto forman un divisor de tensión. De acuerdo con la ley de Ohm, la tensión en el punto donde se conectan ambos componentes es proporcional al valor de sus respectivas resistencias. Cuando el valor de la fotorresistencia varíe a causa de la incidencia de la luz, así lo hará también el valor de la tensión entre ambas resistencias.

4 – A continuación, la patilla de cada fotorresistencia que se encuentra conectada a la resistencia de 10KΩ, la uniremos con un cable a los pins de entrada analógica 0, 1 y 2 (una fotorresistencia por cada pin).

5 – Seguidamente, cogemos los tres trozos de papel o plástico de colores y colocamos uno sobre cada fotorresistencia. Ponemos el de color rojo sobre la fotorresistencia conectada al pin A0, el verde sobre la que está conectada al pin A1 y el azul, sobre la fotorresistencia conectada al pin A2. Cada uno de estos plásticos solo deja pasar la luz de una determinada longitud de onda. El rojo solo deja pasar el rojo, el de color verde la luz verde y el azul solo la luz azul. De esta manera, cada fotorresistencia solo detectará un determinado tipo de luz.

6 – El siguiente componente que vamos a utilizar es el led RGB. Este tipo de led tiene cuatro patillas: una para el color rojo, una para el color verde, una para el color azul y otra que sirve de tierra para las otras tres (el cátodo). Cada una de las patillas estará conectada a una resistencia de 220Ω (a excepción del cátodo).

Led RGB

Haciendo que haya una tensión diferente entre el cátodo y el proveniente de los pins MAP del Arduino, conseguiremos que el led adquiera una tonalidad comprendida entre los tres colores nombrados anteriormente.

La patilla más larga del led RGB es el cátodo, el cual irá conectado a masa. Las otras tres patillas irán conectadas a los pins digitales 9, 10 y 11 con una resistencia en serie de 220Ω. Asegurémonos de conectar correctamente cada patilla a su correspondiente pin MAP, tal  y como se muestra en la figura de más abajo.

Terminado de montar el circuito, deberíamos de tener algo parecido al mostrado en la siguiente figura.

Diseño Protoboard

El esquema eléctrico correspondiente sería:

Esquema electrico

El código

Comencemos por comentar paso a paso el código fuente con el que vamos a programar nuestro Arduino.

Para empezar, estableceremos constantes para los pins que estamos utilizando como entradas y como salidas, de esta manera, sabremos que sensor está asociado a cada color del led. Dichas constantes serán de tipo int.

const int greenLEDPin = 9;
const int redLEDPin = 11;
const int blueLEDPin = 10;

const int redSensorPin = A0;
const int greenSensorPin = A1;
const int blueSensorPin = A2;

Añadimos variables de tipo int para los valores de entrada y para los de salida, que nos servirán para regular el brillo del led.

int redValue = 0;
int greenValue = 0;
int blueValue = 0;

int redSensorValue = 0;
int greenSensorValue = 0;
int blueSensorValue = 0;

En setup(), estableceremos la comunicación serie a 9600 bps. De esta manera, podremos ver los valores de los sensores en el monitor serie. También estableceremos que los leds sean las salidas mediante la función pinMode().

void setup() {
    Serial.begin(9600);

    pinMode(greenLEDPin, OUTPUT);
    pinMode(redLEDPin, OUTPUT);
    pinMode(blueLEDPin, OUTPUT);
} //Fin de la funcion setup.

En la función loop() leeremos los valores de los sensores en los pins A0, A1 y A2 mediante la función analogRead() y los guardamos en sus respectivas variables. Además, añadiremos un delay() entre cada analogRead() para que el ADC pueda hacer su trabajo.

void loop() {
    redSensorValue = analogRead(redSensorPin);
    delay(5);
    greenSensorValue = analogRead(greenSensorPin);
    delay(5);
    blueSensorValue = analogRead(blueSensorPin);

A continuación, mostraremos los valores de los sensores en una sola línea. El símbolo “\t” es el equivalente a pulsar el tabulador del teclado.

    Serial.print("Raw Sensor Values \t Red: ");
    Serial.print(redSensorValue);
    Serial.print("\t Green: ");
    Serial.print(greenSensorValue);
    Serial.print("\t Blue: ");
    Serial.println(blueSensorValue);

La función que nos facilita cambiar el brillo del led mediante la técnica MAP se denomina analogWrite(). Necesita dos argumentos: el pin al que enviar datos y un número comprendido entre el 0 y el 255. El segundo parámetro representa el ciclo de trabajo que Arduino indicará al pin especificado. El valor 255 le indicará al pin un valor HIGH de forma continua, de esta manera, el led permanecerá iluminado a su máximo nivel. Un valor de 127 mantendrá al pin en un valor HIGH la mitad del tiempo, haciendo que el led tenga un brillo más mortecino. Por otro lado, el valor 0, establecerá un valor LOW de forma continua, así el led se quedará apagado.

PWM

Como la función analogWrite() solo puede manipular valores comprendidos entre 0 y 255, deberemos dividir entre 4 el valor leído por el sensor, ya que este último estará comprendido entre 0 y 1023.

    redValue = redSensorValue/4;
    greenValue = greenSensorValue/4;
    blueValue = blueSensorValue/4;

La última parte del código es la que se encarga de mostrar los nuevos valores por el monitor serie y de ajustar el brillo del led según los mismos.

    Serial.print("Mapped Sensor Values \t Red: ");
    Serial.print(redValue);
    Serial.print("\t Green: ");
    Serial.print(greenValue);
    Serial.print("\t Blue: ");
    Serial.println(blueValue);

    analogWrite(redLEDPin, redValue);
    analogWrite(greenLEDPin, greenValue);
    analogWrite(blueLEDPin, blueValue);
} //Fin de la funcion loop.

Puesta en marcha

Una vez que hayamos cableado y programado nuestro Arduino, abriremos el monitor serie. El led probablemente esté de un color blanquecino, dependiendo del color predominante de la habitación. Observemos en el monitor serie los valores obtenidos por los sensores, si nos encontramos en un ambiente con un nivel estable de luz, dichos valores serán bastante constantes.

Apaguemos las luces de la habitación en la que nos encontramos y observemos que ocurre con los valores de los sensores. Iluminemos cada uno de los sensores de manera individual y veamos como varían los valores en el monitor serie, del mismo modo, podremos observar como cambia el color del led. Al cubrir cada sensor con un plástico, cada uno de ellos reaccionará a la longitud de onda perteneciente al color de dicho plástico. Esto nos permite cambiar cada color de manera independiente.

Probablemente percibamos que la atenuación del led no es lineal. Cuando el led se encuentra a la mitad de su brillo, parece que se detiene para volverse más brillante. Esto es porque nuestros ojos no perciben el brillo de forma lineal. El brillo de la luz depende no solo del nivel indicado por la función analogWrite() si no también, de la distancia entre el ojo y la luz y del brillo de la luz respecto a cualquier otra luz de la habitación.

Bien. En este proyecto hemos aprendido a utilizar una fotorresistencia como sensor que nos proporciona datos de entrada, un led RGB y la función analogWrite() junto con la técnica MAP para hacer que el led nos muestre la información obtenida por los sensores en el formato que a nosotros nos interesa. Pero… ¿que pasaría si en lugar de tres fotorresistencias utilizáramos el sensor de temperatura del proyecto anterior?

Espero que os haya gustado.

Un saludo y muchas gracias por leer este artículo.  ^_^

Referencias

– Artículo basado en el capítulo “Project 04 – Color Mixing Lamp” del libro “Arduino Projects Book” distribuido por Arduino.cc junto con su “The Arduino Starter Kit“.

– Tutorial sobre la función analogWrite().

– Tutorial sobre la técnica MAP (PWM en inglés).

Anuncios

3 pensamientos en “Arduino – Capítulo 6 – Lámpara de colores

  1. Pingback: Arduino – Capítulo 16 – Modificando el logo de Arduino | El gato inquieto

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s