Controlar el LED RGB de Arduino Nano 33 BLE Sense

Arduino Nano 33 BLE Sense incorpora un LED RGB que permite mostrar distintos colores. Un LED RGB se compone de tres LED cada uno de un color: rojo (Red), verde (Green) y azul (Blue). Cada color se controla de forma independiente cambiando el estado de un pin digital, cada pin tiene asociada una constante:

Color Pin Constante
Rojo 22 LEDR
Verde 23 LEDG
Azul 24 LEDB

Combinando los tres distintos colores se pueden conseguir 8 combinaciones: rojo, verde, azul, amarillo, rosa, celeste y blanco y apagado. Para evitar volverse loco hay que tener en cuenta que los LED funcionan con lógica inversa, el estado LOW los enciende y el estado HIGH los apaga. En la siguiente tabla podemos ver como conseguir cada color:

Color LEDR LEDG LEDB
Apagado HIGH HIGH HIGH
Rojo LOW HIGH HIGH
Verde HIGH LOW HIGH
Azul HIGH HIGH LOW
Amarillo LOW LOW HIGH
Rosa LOW HIGH LOW
Celeste HIGH LOW LOW
Blanco LOW LOW LOW

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.

Una cosa a tener en cuenta, y que puede volverte loco, es que los leds funcionan con lógica inversa: el estado LOW los enciende y el estado HIGH los apaga.

Veamos todo esto en un ejemplo que cambia el color del LED cada dos segundos:

void setup() {
  // activar todos los pins del led RGB
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}

void loop() {
  //blanco
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //rojo
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //verde
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //azul
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //amarillo
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, HIGH);
  delay(2000);
  //rosa
  digitalWrite(LEDR, LOW);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, LOW);
  delay(2000);
  //celeste
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, LOW);
  digitalWrite(LEDB, LOW);
  delay(2000);  
  //apagado 
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  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. En este caso la lógica es inversa, 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 el LED del Arduino permite muchos menos colores distinguibles. Uno de los problemas que tiene el LED “desnudo” es que cuando hay mucha diferencia de brillo entre sus colores se puede perder el efecto de “color unificado”

En el siguiente ejemplo vamos como usar anologWrite en lugar de digitalWrite para obtener el color naranja.

//naranja
analogWrite(LEDR, 0); //maximo
analogWrite(LEDR, 128); //medio
analogWrite(LEDR, 255); //minimo

Otro ejemplo, el siguiente código recorre toda la gama de colores:

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 un LED RGB en el siguiente vídeo de mi canal de Youtube:

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