Fork me on GitHub

Cómo hacer una lámpara RGB con Arduino

May 27, 2013

Traducción de un post que escribí para Olxers.

Esta es una guía para hacer una lámpara RGB usando un LED RGB, tres resistencias, un pequeño protoboard y un Arduino Nano. Este es el trabajo final:

Como esta es una guía desde cero, empecemos por el principio: ¿Qué es Arduino?

Arduino es una plataforma de hardware libre, basada en una placa con un microcontrolador y un entorno de desarrollo, diseñada para facilitar el uso de la electrónica en proyectos multidisciplinares. Está dirigido a artistas, diseñadores, aficionados y cualquier persona interesada en la creación de objetos o entornos interactivos.

El hardware

Existen varios modelos de Arduino y el más popular es el Arduino UNO. En la guía usaremos un Arduino Nano que es muy similar al Uno pero más chico e ideal para nuestra lámpara.

Todas las placas Arduino tienen pines para comunicarse con el mundo, específicamente con otros componentes electrónicos como LEDs, motores, sensores, etc. A continuación se puede ver una referencia de los pines de Arduino Nano:

Arduino Nano pines

Para nuestra lámpara necesitamos controlar un LED RGB, el cual tiene cuatro patas:

Esquema de patas de un LED RGB

El mayor es el cátodo (-) y debe ser conectado a algún pin Ground. El resto son los ánodos (+) para cada color RGB y deben ser conectados a pines del tipo Digital. Pero no es recomendable conectar los ánodos del LED directamente a los pines del Arduino porque la corriente que entrega cada pin es más alta que la necesaria. Para bajar la corriente tenemos que usar resistencias.

Una resistencia es un componente que resiste el flujo de la corriente eléctrica, es decir que está diseñado para bajar la intensidad de corriente que fluye de un terminal a otro. Para el LED RGB necesitamos tres resistencias: una de 150-200 ohm para el ánodo Red y dos de 100 ohm para los ánodos Blue y Green. El valor de las resistencias está codificado en bandas de colores. Más info aquí.

Ya tenemos todos los componentes para armar el circuito, pero ¿cómo los conectamos entre sí? Como no queremos usar estaño y un soldador usaremos un protoboard.

Protoboard

Un protoboard es un tablero con orificios conectados eléctricamente entre sí. Se trata de una placa de pruebas para hacer prototipos de circuitos electrónicos. Es reusable y por lo tanto ideal para experimentar. El modelo de arriba tiene el siguiente esquema de conexiones:

Esquema de conexiones del protoboard

Ahora si, mediante la ayuda de algunos cables podemos conectar todos los componentes de acuerdo al siguiente esquema:

Esquema conexiones lampara rgb con Arduino

Notar que el cátodo (+) está conectado al pin GND y los ánodos (-) RGB a los pines Digital 9, 10 y 11 respectivamente.

El Software

Escribamos algo de código. Primero tenemos que saber que los pines Digital pueden ser configurados como entrada o salida. Si quisiéramos, por ejemplo, encender la luz roja del LED primero tendríamos que setear el pin 9 en OUTPUT y luego poner su salida en HIGH (5 volts):

void setup() {
    pinMode(9, OUTPUT);
    digitalWrite(9, HIGH);
}

void loop() {
}

Este es un completo programa para Arduino escrito en C. Todos los programas de Arduino tienen las mismas funciones básicas: setup() y loop(). Como seguro imaginarás setup() se ejecuta una sola vez al principio y luego loop() se ejecuta por siempre.

Fácil! pero, ¿dónde escribo el códido y cómo se lo envío a Arduino? Para eso existe el IDE de Arduino, el cual nos facilita la tarea de enviar el binario a Arduino y tiene algunas herramientas interesantes como el monitor serial. Si tenés Ubuntu o algún derivado de Debian podés instalarlo fácilmente:

sudo apt-get install arduino

Luego sólo resta meter a tu usuario dentro del grupo dialup para tener permisos de escritura en el puerto USB:

sudo usermod -aG dialout

Ejecutamos arduino y escribimos el código de arriba:

Ventana del IDE de Arduino

Debajo del menu file hay dos botones: Verify y Uplodad. Verify intenta compilar el código y si al hacerlo se produce algún error lo veremos en la ventana debajo del editor. Upload manda el binario al Arduino, pero antes de hacerlo hay que verificar que tengamos correctamente seteado el modelo de Arduino al que le enviaremos el código. Esto se hace mediante Tools > Boards > Arduino Nano board. Una vez hecho esto el LED debería prenderse de color rojo.

Bien, en este punto ya sabemos cómo mandar nuestro código al Arduino y también hemos testeado parte del circuito. Hagamos ahora algo más interesante: prendamos una a una las luces del LED y luego apaguémoslas también una a una en el mismo orden en que las encendimos. Con esto testearemos el circuito completo. Para esperar un segundo entre cada cambio usaremos la función delay():

#define RED 9
#define GREEN 10
#define BLUE 11

int pins[] = {RED, GREEN, BLUE};

void setup() {
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);
}

void loop() {
    int i;
    for (i = 0; i <= 2; i++) {
        digitalWrite(pins[i], HIGH);
        delay(1000);
    }
    for (i = 0; i <= 2; i++) {
        digitalWrite(pins[i], LOW);
        delay(1000);
    }
}

Compilamos y mandamos el binario a Arduino. Ahora deberíamos ver que la secuencia de colores se repite una y otra vez.

Ya tenemos una versión básica de la lámpara RGB pero la secuencia de colores es siempre la misma y la transición entre los colores es muy abrupta. Para obtener una secuencia aleatoria usaremos la función random() y para una suave transición entre cambios de colores usaremos la función analogWrite() la cual usa PWM.

PWM

Hasta aquí hemos visto cómo poner un pin en alguno de los estados HIGH (prendido, 5v) o LOW (apagado, 0v). Con PWM (Pulse With Modulation) podemos simular voltajes entre 5v y 0v cambiando la porción de tiempo que la señal está en HIGH o LOW. Veamos el siguiente gráfico:

pwm

Arduino maneja una frecuencia de 500Hz para PWM, por lo que cada ciclo (espacio entre dos líneas verdes) dura 2 milisegundos. analogWrite() recibe como parámetro un entero entre 0 y 255, donde 255 es 100% del ciclo en HIGH, 127% es 50% del ciclo en HIGH y 0 es 100% del ciclo en LOW.

Ahora sí podemos hacer la versión final del programa para la lámpara:

#define T_STEP 25
#define T_CHANGE 20000

#define RED 9
#define GREEN 10
#define BLUE 11

int pins[] = {RED, GREEN, BLUE};
int valuePins[] = {0, 0, 0};

void setup() {
    pinMode(RED, OUTPUT);
    pinMode(GREEN, OUTPUT);
    pinMode(BLUE, OUTPUT);

    // Initialize the pseudo-random number generator
    randomSeed(analogRead(0));
}

void changeColor(int i, int value) {
    int j;
    if (value > valuePins[i]) {
        for (j = valuePins[i]; j <= value; j++) {
            analogWrite(pins[i], j);
            delay(T_STEP);
        }
    }
    if (value < valuePins[i]) {
        for (j = valuePins[i]; j >= value; j--) {
            analogWrite(pins[i], j);
            delay(T_STEP);
        }
    }
}

void loop() {
    int i, value;
    for (i = 0; i <= 2; i++) {
        value = random(256);
        changeColor(i, value);
        valuePins[i] = value;
    }
    delay(T_CHANGE);
}

El último paso es hacer la tulipa de la lámpara, para lo cual se puede usar cartulina blanca. Con un poco de imaginación podemos hacer algo lindo y simple como un cilindro, un cubo, etc.

Lampara RGB terminada

Arduino Trabajos