Hay dos tipos de leds RGB de ánodo común y de cátodo común. En los de ánodo común la pata en común (suele ser más larga) va conectada a 5v, mientras que en las de cátodo común va conectada a GND. Hay que tener en cuenta que los LED de ánodo común usan lógica inversa y cada color se enciende cuando el pin conectado a su patilla se pone a LOW y se apaga a HIGH. Para evitar confusiones usaremos ON y OFF y definiremos su valor usando macros
Podemos conectar cada patilla RGB a cualquier pin digital, colocando un resistencia de 220Ω entre cada patilla y su pin, pero nosotros usaremos pines que posibiliten salidas PWM, luego veremos el porqué. En nuestro caso usaremos los pines 9,10,11 de la placa Arduino UNO, asignaremos a cada pin una macro usadnos #define, la correspondencia será la siguiente:
Color | Pin | Constante |
---|---|---|
Rojo | 9 | LEDR |
Verde | 10 | LEDG |
Azul | 11 | LEDB |
Combinando los tres distintos colores se pueden conseguir 8 combinaciones: rojo, verde, azul, amarillo, rosa, celeste y blanco y apagado. En la siguiente tabla podemos ver como conseguir cada color:
Color | LEDR | LEDG | LEDB |
---|---|---|---|
Apagado | OFF | OFF | OFF |
Rojo | ON | OFF | OFF |
Verde | OFF | ON | OFF |
Azul | OFF | OFF | ON |
Amarillo | ON | ON | OFF |
Rosa | ON | OFF | ON |
Celeste | OFF | ON | ON |
Blanco | ON | ON | ON |
El primer paso es configurar el pin de cada LED como escritura. Cada pin tiene asociada una constante: LEDR, LEDG, LEDB.
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
Una vez hecho eso podemos controlar el estado de cada color con digitalWrite.
Veamos todo esto en un ejemplo que cambia el color del LED cada dos segundos:
#define LEDR 9
#define LEDG 10
#define LEDB 11
//logica directa
#define ON HIGH
#define OFF LOW
//logica inversa
//#define ON LOW
//#define OFF HIGH
void setup() {
// activar todos los pins del led RGB
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
//blanco
digitalWrite(LEDR, ON);
digitalWrite(LEDG, ON);
digitalWrite(LEDB, ON);
delay(2000);
//rojo
digitalWrite(LEDR, ON);
digitalWrite(LEDG, OFF);
digitalWrite(LEDB, OFF);
delay(2000);
//verde
digitalWrite(LEDR, OFF);
digitalWrite(LEDG, ON);
digitalWrite(LEDB, OFF);
delay(2000);
//azul
digitalWrite(LEDR, OFF);
digitalWrite(LEDG, OFF);
digitalWrite(LEDB, ON);
delay(2000);
//amarillo
digitalWrite(LEDR, ON);
digitalWrite(LEDG, ON);
digitalWrite(LEDB, OFF);
delay(2000);
//rosa
digitalWrite(LEDR, ON);
digitalWrite(LEDG, OFF);
digitalWrite(LEDB, ON);
delay(2000);
//celeste
digitalWrite(LEDR, OFF);
digitalWrite(LEDG, ON);
digitalWrite(LEDB, ON);
delay(2000);
//apagado
digitalWrite(LEDR, OFF);
digitalWrite(LEDG, OFF);
digitalWrite(LEDB, OFF);
delay(2000);
}
Regular el brillo del LED para conseguir más colores
Aunque lo habitual es usar los LED como si fueran una salida digital se puede usar como si fuera una salida analógica PWM. Con esto podemos conseguir regular la luminosidad de los distintos LED. Cuando usemos lógica inversa, recuerda que 0 es el mayor valor de luminosidad y 255 el menor. Podemos ajustar cada uno de los tres colores de forma diferente. Regulando la intensidad de cada uno de los tres canales podemos conseguir otros colores. En teoría más de 16 millones (256*256*256) aunque en realidad suelen permitir muchos menos colores distinguibles.
En el siguiente ejemplo vamos como usar anologWrite en lugar de digitalWrite para obtener el color naranja.
//naranja logica directa
analogWrite(LEDR, 255); //maximo
analogWrite(LEDG, 128) ;//medio
analogWrite(LEDB, 0); //minimo
//naranja logica inversa
analogWrite(LEDR, 0); //maximo
analogWrite(LEDG, 128); //medio
analogWrite(LEDB, 255); //minimo
Otro ejemplo, el siguiente código recorre toda la gama de colores:
#define LEDR 9
#define LEDG 10
#define LEDB 11
void setup() {
pinMode(LEDR, OUTPUT);
pinMode(LEDG, OUTPUT);
pinMode(LEDB, OUTPUT);
}
void loop() {
for(byte r = 0; r < 255; r+=5){
for(byte g = 0; g < 255; g+=5){
for(byte b = 0; b < 255; b+=5){
analogWrite(LEDR, r);
analogWrite(LEDG, g);
analogWrite(LEDB, b);
delay(5);
}
}
}
}
Puedes ver como funciona en el siguiente vídeo de mi canal de Youtube: