Skip to Content

How to control an RGB LED with Arduino

How to control an RGB LED with Arduino

Este artículo te guiará a través de los fundamentos del uso de un LED RGB en Arduino, para que puedas crear tus propios colores con la ayuda de los potenciómetros.

Le mostraré los diagramas de cableado paso a paso y le explicaré el código para que pueda entender completamente cómo utilizar este componente.

Después de este tutorial, deberías tener un circuito que ilumine una luz en el color que prefieras usando valores RGB, que son controlados por potenciómetros y mostrados en el Monitor Serial.

Suministros

Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.

Hardware

Software

  • Arduino IDE

También puede encontrar LEDs RGB en los módulos KY-016, que tienen el LED y las resistencias necesarias en una sola placa de circuito impreso. 

Estos módulos no permiten ninguna flexibilidad a la hora de construir el circuito, pero son más plug-and-play que sus alternativas. 

Yo no los recomendaría, prefiero la flexibilidad de usar resistencias, y algunas reseñas muestran una mala reproducción del color cuando se usan valores RGB.

Instrucciones

Paso 1 - Conexión del LED RGB

Este diagrama de cableado muestra cómo conectar un LED RGB a la placa Arduino.

Ten en cuenta que se trata de un LED de cátodo común, en el que la patilla más larga está conectada a tierra, más adelante explicaré qué significa cátodo común.

Wiring of RGB LED with Arduino
Wiring of RGB LED with Arduino

Las conexiones también se indican en la tabla siguiente.

ComponentePin de Arduino
LED - Rojo11
LED - CátodoGND
LED - Verde10
LED - Azul9

Make sure to include a 220Ω resistor between the red, green, and blue pins of the LED and the outputs to avoid damage to the LED and the Arduino.

Fundamentos de los LEDs RGB

Un LED RGB puede verse como tres LEDs -uno rojo, uno verde y uno azul- en un solo paquete, este único LED brilla en la combinación de las intensidades roja, verde y azul.

Los LEDs RGB tienen el mismo aspecto que los normales, con cuatro pines, siendo el más largo el común.

Detalle de un LED RGB de montaje superficial.
Detalle de un LED RGB de montaje superficial. Fuente: LEDsupply

LEDs RGB de cátodo común y ánodo común

Anteriormente mencioné los LEDs de cátodo común y de ánodo común. Los LEDs RGB son de dos tipos: de cátodo común y de ánodo común.

En los LEDs de cátodo común el pin más largo se conecta a GND y sus componentes se encienden por una señal de 5V, en los LEDs de ánodo común es lo contrario: el pin más largo va a 5V, una señal de 0V enciende los componentes.

En este ejemplo, usaremos LEDs de cátodo común, si tienes un LED RGB de ánodo común el cableado y las salidas tendrán que ser invertidas.

La única manera de saber si tu RGB es cátodo común o ánodo común es probando el LED, yo recomendaría probar con un multímetro usando la función de diodo.

Para comprobarlo lleva la sonda negativa al pin común y la positiva a cualquier otro pin, si el LED se ilumina es cátodo común.

Si no es así, lleva la sonda positiva a la patilla común y la negativa a cualquier otra patilla, el LED debería encenderse significando que es ánodo común.

Si no tienes un multímetro puedes hacerlo con los pines de 5V y GND del Arduino, sólo asegúrate de tener una resistencia de 220Ω en tu circuito.

Control del brillo del LED con PWM

El brillo de un LED es controlado por la cantidad de corriente que fluye a través de él, pero no podemos controlar directamente la corriente ya que el Arduino Uno carece de salidas totalmente analógicas, para controlar su brillo vamos a utilizar la modulación de ancho de pulso (PWM).

El PWM enciende y apaga la salida periódicamente, y el tiempo que la salida permanece encendida determina el brillo del LED.

El PWM enciende y apaga la salida periódicamente, y el tiempo que la salida permanece encendida determina el brillo del LED.

La intensidad del LED está determinada por el ciclo de trabajo PWM, es decir, el tiempo que la salida permanece encendida. Un ciclo de trabajo del 50% significa que la salida está alta el 50% del tiempo y baja el otro 50% del tiempo.

Este ciclo ocurre a 490 Hz, 490 veces por segundo, y puedes controlar este ciclo de trabajo con AnalogWrite.

El PWM enciende y apaga la salida periódicamente, y el tiempo que la salida permanece encendida determina el brillo del LED.

Ilustración de diferentes ciclos de trabajo
Ilustración de diferentes ciclos de trabajo. Fuente: Sparkfun

Paso 2 - Conexión de los tres potenciómetros

Para este paso, necesitas conectar tres potenciómetros a 5V, GND y los pines analógicos A0, A1 y A2.

Las patas exteriores se conectarán a 5V y GND, la pata del medio se conecta a los pines analógicos según esta figura:

Conexión de los potenciómetros para controlar los LEDs RGB
Conexión de los potenciómetros para controlar los LEDs RGB

En forma de tabla:

ComponentePin de Arduino
Clavija más a la derecha (cualquiera)5V
Clavija más a la izquierda (cualquiera)GND
Pin central (rojo)A0
Clavija central (verde)A1
Clavija central (azul)A2

Uso de un potenciómetro como entrada analógica

Para controlar los valores del LED RGB, utilizarás las salidas de los potenciómetros (pin central) como entradas analógicas.

Arduino Uno tiene 6 entradas analógicas, etiquetadas de A0 a A5; éstas implican un convertidor analógico-digital (ADC) de 10 bits con 6 canales.

Este convertidor analógico-digital devolverá un número de 0 a 1023 (1024 bits = 2¹⁰ = 10 bits), según la tensión que lea en un canal.

En función de este valor cambiaremos el ciclo de trabajo PWM de los componentes LED.

Puedes considerar un potenciómetro en este circuito como un divisor de tensión: al girar el mando, la resistencia de la patilla central cambiará, y también lo hará la tensión.

Esto "dividirá" la entrada de 5V en dos partes si se mide la tensión entre la salida y 5V, y entre la salida y GND.

Paso 3: Código de ejemplo de la pantalla LCD RGB de Arduino

Ahora que el cableado está hecho sólo queda conectar el Arduino a tu PC y cargar el sketch.

Puede cargar el siguiente código a través del IDE de Arduino, puede copiar el código haciendo clic en el botón en la esquina superior derecha del campo de código.

/*Example sketch to control an RGB LED with Arduino using potentiometers
More info: https://www.makerguides.com */

//Definition of pins: outputs
#define redPin 11
#define greenPin 10
#define bluePin 9 

//Definition of pins: analog inputs
#define redPot A0
#define greenPot A1
#define bluePot A2

int redVal, greenVal, blueVal; // RGB component values

void setup() {
  //Pin definitions
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  pinMode(redPot, INPUT);
  pinMode(greenPot, INPUT);
  pinMode(bluePot, INPUT);

  Serial.begin(9600);
}

void loop() {
  //Reading potentiometer values
  //When the pot is in the leftmost position, the voltage reading is 0
  redVal = analogRead(redPot)/4;
  greenVal = analogRead(greenPot)/4;
  blueVal = analogRead(bluePot)/4;

  //Sets the individual colors with the pot values
  analogWrite(redPin, redVal);
  analogWrite(greenPin, greenVal);
  analogWrite(bluePin, blueVal);

  delay(50);

  //Printing the values of Red, Green and Blue in a single line
  Serial.print("R: "); Serial.print(redVal);
  //The \t character creates a tab space between colors
  Serial.print("\tG: "); Serial.print(greenVal);
  //Final value is Serial.println to create a new line between readings  
  Serial.print("\tB: "); Serial.println(blueVal); 
}

Cómo funciona el código

El primer paso es definir los pines relevantes, esto se hace a través de la sentencia #define que reemplazará la palabra clave definida con nuestro valor deseado cuando el programa compila.

Con esto definimos las salidas de los LEDs rojo, verde y azul como pines 11, 10 y 9 respectivamente.

Luego hacemos el mismo procedimiento con las entradas del potenciómetro, utilizando los pines analógicos A0, A1 y A2.

También definí tres variables globales, una para cada pin RGB. Estos valores se definen como enteros, se desea utilizarlos cada vez que se trate de números enteros.

El valor de un entero puede ir de -2.147.483.648 a 2.147.483.647. Si quieres ser más eficiente con la memoria del Arduino puedes utilizar el tipo de datos byte, que va de 0 a 255.

Esto no es necesario en este sencillo ejemplo, pero es útil tenerlo en cuenta en bocetos más complejos.

//Definition of pins: outputs
#define redPin 11
#define greenPin 10
#define bluePin 9 

int redVal, greenVal, blueVal; //RGB component values

En la función setup() del sketch definimos los pines del LED como salidas, y los pines del potenciómetro como entradas utilizando la función pinMode().

Luego comenzamos el buffer Serial a 9600 baudios usando Serial.begin(9600), con esta función podrás leer los valores de color que imprimas en otra sección del sketch.

void setup() {
  //Pin definitions
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  pinMode(redPot, INPUT);
  pinMode(greenPot, INPUT);
  pinMode(bluePot, INPUT);

  Serial.begin(9600);

Ahora pasamos a la función loop(). En primer lugar, comenzamos leyendo los valores del potenciómetro.

Esto se hace mediante la función analogRead(), en la que se especifica el pin y devolverá un valor entre 0 y 1024, como se ha mencionado anteriormente.

Desgraciadamente, para controlar los LEDs con la función analogWrite() necesitamos alimentarla con valores entre 0 y 255, para ello dividimos el valor leído por 4 y lo asignamos a nuestros enteros.

//Reading potentiometer values
//When the pot is in the leftmost position, the voltage reading is 0V
redVal = analogRead(redPot)/4;
greenVal = analogRead(greenPot)/4;
blueVal = analogRead(bluePot)/4;

En este paso utilizo las salidas PWM del Arduino para iluminar los pines rojo, verde y azul del led RGB con los valores enteros obtenidos de los potenciómetros, sólo hay que especificar el pin y el número entre 0 y 255.

//Sets the individual colors with the pot values
  analogWrite(redPin, redVal);
  analogWrite(greenPin, greenVal);
  analogWrite(bluePin, blueVal);

A continuación introduzco un pequeño retardo en el código, lo hago para evitar que el monitor en serie se desplace demasiado rápido y al mismo tiempo dejar que el LED RGB responda a las entradas.

Este retraso dura 50 milisegundos: 50 milésimas de segundo o 0,05 segundos.

Puedes ajustar este retraso como quieras, sólo ten en cuenta que un retraso demasiado grande hará que los valores RGB se actualicen también más lentamente.

delay(50);

Por último, para comprobar qué valores RGB se están mostrando en el LED los imprimiremos en el monitor de serie.

Para mayor claridad, se imprimirán en una sola línea. Para ello utilizaremos la función Serial.print().

Aquí imprimo la letra correspondiente a cada componente del LED RGB y su valor escrito.Utilicé el carácter de escape \t para crear un espacio de tabulación entre cada uno de los colores, los caracteres de escape siguen a una barra invertida y no aparecen en la cadena impresa, ya que realizan funciones especiales.

Además, la última función serial es Serial.println(), esto asegura que el siguiente mensaje serial aparezca en una nueva línea.

Serial.print("R: "); Serial.print(redVal);
Serial.print("\tG: "); Serial.print(greenVal);
Serial.print("\tB: "); Serial.println(blueVal);

Para comprobar los mensajes en el monitor serie presione Ctrl+Mayús+M en el IDE de Arduino, o haga clic en el icono de la lupa. Asegúrese de que la tasa de baudios está ajustada a 9600 para leer correctamente los mensajes.

Debería ver algo similar a la siguiente imagen:

Output on Serial Monitor
Output on Serial Monitor

Ya está. Si has seguido los pasos correctamente deberías ser capaz de controlar el LED RGB y producir todo tipo de colores usando los potenciómetros.

Color aditivo

La propiedad de que luces de diferentes colores se combinen para crear un nuevo color se llama color aditivo.

Esta propiedad hace posible que las pantallas muestren alrededor de 16 millones de tonalidades de color: fijando las luces rojas, verdes y azules en un valor de 0 a 255 como en nuestro proyecto.

Puedes probar algunas de las combinaciones básicas que se muestran en la imagen de abajo, o ir a un selector de colores y crear los tuyos propios.

Sin embargo, los resultados pueden variar: algunos componentes de los LEDs RGB son más fuertes que otros y pueden requerir un ajuste.

Valores de ejemplo para los colores mediante el uso de los componentes RGB
Valores de ejemplo para los colores mediante el uso de los componentes RGB. Fuente: LEDSupply

Conclusión

En este artículo, he mostrado cómo utilizar un LED RGB con Arduino: su cableado, las salidas analógicas necesarias y un sencillo circuito que muestra cómo personalizar fácilmente el color del LED.

Si tienes alguna pregunta o sugerencia para este tutorial, deja un comentario abajo.

Me encantaría ayudarte.