Controlar un LED RGB desde Arduino

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:

Haz click para ver el vídeo en mi canal de Youtube