Control de LEDs WS2812B con Arduino – Guía Paso a Paso
En este tutorial aprenderemos a controlar LEDs RGB direccionables individualmente o una tira de LEDs WS2812B usando Arduino. Puedes ver el siguiente video o leer el tutorial escrito a continuación para más detalles. Primero explicaremos el principio de funcionamiento mediante algunos ejemplos básicos y luego veremos un proyecto realmente interesante con Arduino usando estos LEDs: una mesa de café interactiva DIY. La mesa incluye LEDs WS2812B, sensores de proximidad infrarrojos para detectar objetos y un módulo Bluetooth HC-05 para controlar los colores mediante una aplicación Android personalizada. Este proyecto es una colaboración entre yo y Marija del canal de YouTube Creativity Hero. Comencemos examinando la tira de LEDs. Consiste en LEDs RGB tipo 5050 en los que el controlador IC WS2812B, muy compacto, está integrado. Dependiendo de la intensidad de los tres LEDs individuales (Rojo, Verde y Azul) podemos simular cualquier color que deseemos. Lo genial de estos LEDs es que podemos controlar toda la tira con un solo pin de nuestra placa Arduino. Cada LED tiene tres conectores en cada extremo: dos para la alimentación y uno para los datos. La flecha indica la dirección del flujo de datos. La salida de datos del LED anterior se conecta a la entrada de datos del siguiente LED. Podemos cortar la tira al tamaño que queramos, así como separar los LEDs usando cables. En cuanto a la alimentación, funcionan a 5V y cada LED Rojo, Verde y Azul consume alrededor de 20mA, es decir, un total de 60mA por LED a brillo máximo. Ten en cuenta que cuando el Arduino se alimenta por USB, el pin de 5V solo puede manejar alrededor de 400 mA, y cuando se alimenta mediante el conector de barril, el pin de 5V puede manejar alrededor de 900 mA. Si usas más LEDs y la corriente que consumirían supera los límites mencionados, debes usar una fuente de alimentación separada de 5V. En ese caso también necesitas conectar las dos líneas de tierra entre sí. Además, se recomienda usar una resistencia de alrededor de 330 Ohmios entre el Arduino y el pin de datos de la tira LED para reducir el ruido en esa línea, así como un condensador de alrededor de 100uF entre los 5V y la tierra para suavizar la fuente de alimentación. Como ejemplo usaré una tira de 20 LEDs, conectada al Arduino a través de una resistencia de 330 Ohmios y alimentada con una fuente de 5V separada, como se explicó anteriormente. Para programar el Arduino usaremos la librería FastLED. Es una librería excelente y bien documentada que permite un control fácil de los LEDs WS2812B. Puedes conseguir los componentes necesarios para este ejemplo en los enlaces a continuación: Código fuente de Arduino para el primer ejemplo: Descripción: Primero necesitamos incluir la librería FastLED, definir el pin al que está conectada la tira de datos, definir el número de LEDs y definir un array de tipo CRGB. Este tipo contiene los LEDs, con tres miembros de datos de un byte para cada uno de los tres canales de color: Rojo, Verde y Azul. En la sección setup solo necesitamos inicializar FastLED con los parámetros definidos anteriormente. En el loop principal podemos controlar nuestros LEDs como queramos. Usando la función CRGB podemos establecer cualquier LED a cualquier color usando tres parámetros de color Rojo, Verde y Azul. Para que el cambio surta efecto en los LEDs necesitamos llamar a la función FastLED.show(). Usando algunos bucles "for" podemos crear fácilmente animaciones. Código fuente de Arduino para el segundo ejemplo: Aquí el primer bucle "for" enciende los 20 LEDs en azul, del primero al último con 40 milisegundos de retraso. El siguiente bucle "for" enciende de nuevo los 20 LEDs, pero esta vez en rojo y en orden inverso, del último al primero. La librería FastLED ofrece muchas otras funciones que pueden usarse para crear animaciones y espectáculos de luz realmente interesantes, así que solo depende de tu imaginación hacer brillar tu próximo proyecto LED. Ahora veamos el proyecto de mesa de café interactiva LED DIY que mencioné al principio. Fue un proyecto colaborativo entre yo y Marija de Creativity Hero. Puedes consultar su artículo web donde explica todo el proceso de construcción de la mesa, desde el corte y ensamblaje de la estructura de madera hasta el soldado y conexión de todas las partes electrónicas. Aquí explicaré cómo funciona la parte electrónica, cómo construir la aplicación Android personalizada y programar la placa Arduino. Esquema completo del circuito de este proyecto: La mesa consta de 45 LEDs direccionables, 45 sensores de proximidad infrarrojos y un módulo Bluetooth HC-05, todos conectados a una placa Arduino Mega. El circuito se alimenta con una fuente de 5V 6A. Componentes necesarios: Relacionado: Cómo usar un LED RGB con Arduino | Tutorial Aquí está el código de Arduino para este proyecto. Si excluimos la función de control de color por Bluetooth, notaremos que el código es en realidad muy simple. Descripción: Primero definimos los parámetros básicos como se explicó anteriormente y configuramos los 45 pines de los sensores de proximidad como entradas. En el loop principal, usando un solo bucle "for", establecemos todos los LEDs a un color particular y también verificamos si el sensor de proximidad ha detectado un objeto. Si es cierto, o un estado lógico LOW en este caso, el color reactivo particular se establecerá en el LED particular. Al final, usando la función FastLED.show() actualizamos los colores de los LEDs. Para incluir la función de control de color por Bluetooth necesitamos agregar más líneas de código y crear la aplicación Android. Ya tengo tutoriales separados sobre cómo usar el módulo Bluetooth HC-05 con Arduino y cómo crear tu propia aplicación Android usando MIT App Inventor, así que puedes consultarlos para más detalles. Así funciona la aplicación Android. Consiste en una imagen de paleta de colores de donde podemos seleccionar colores, dos botones de verificación para elegir si el color elegido se aplicará a los LEDs reactivos o de fondo, y un control deslizante para ajustar el brillo. Si observamos los bloques de la app, vemos qué ocurre al tocar el canvas donde está la imagen de la paleta. Usando los bloques .GetPixelColor obtenemos los valores Rojo, Verde y Azul del color seleccionado y usando el bloque Bluetooth SendText enviamos esta información al Arduino en forma de texto. Dependiendo del checkbox seleccionado, enviamos un carácter inicial o marcador diferente que ayuda al recibir el texto en el Arduino. Lo mismo ocurre al cambiar la posición del deslizador: se envía un valor de 10 a 100 al Arduino en forma de texto, con el marcador "3" al frente. Puedes descargar la aplicación Android y el archivo de proyecto de MIT App Inventor a continuación: Código de Arduino con Bluetooth: Descripción: Primero definimos la comunicación serial entre el Arduino y el módulo Bluetooth HC-05, es decir, los pines a los que está conectado el módulo. En el setup configuramos la velocidad (baud rate) a la que trabaja este módulo. Luego en el loop principal, usando la función Bluetooth.available() verificamos si hay datos entrantes desde el smartphone. Si es así, usando Bluetooth.readString() recibimos los datos como cadena. Luego con .startsWith() comprobamos el primer carácter o marcador y así sabemos si queremos cambiar el color reactivo, el de fondo o el brillo. Usando .substring() extraemos los valores Rojo, Verde y Azul del texto recibido y los convertimos a enteros. Estos valores se usan en el bucle "for" siguiente que establece el color y enciende los LEDs como se explicó antes. De la misma forma ajustamos el brillo de los LEDs. Eso es todo por este tutorial. Siéntete libre de hacer cualquier pregunta en la sección de comentarios.Resumen

Cómo funcionan los LEDs WS2812B



Ejemplos con Arduino y LEDs WS2812B
Ejemplo 1

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
leds[0] = CRGB(255, 0, 0);
FastLED.show();
delay(500);
leds[1] = CRGB(0, 255, 0);
FastLED.show();
delay(500);
leds[2] = CRGB(0, 0, 255);
FastLED.show();
delay(500);
leds[5] = CRGB(150, 0, 255);
FastLED.show();
delay(500);
leds[9] = CRGB(255, 200, 20);
FastLED.show();
delay(500);
leds[14] = CRGB(85, 60, 180);
FastLED.show();
delay(500);
leds[19] = CRGB(50, 255, 20);
FastLED.show();
delay(500);
}Ejemplo 2

#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 19; i++) {
leds[i] = CRGB(0, 0, 255);
FastLED.show();
delay(40);
}
for (int i = 19; i >= 0; i--) {
leds[i] = CRGB(255, 0, 0);
FastLED.show();
delay(40);
}
}Mesa de café interactiva LED usando LEDs WS2812B


Códigos fuente
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
// Configurar los 45 pines de sensores de proximidad como entradas, desde el pin digital 3 al 48
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(0, 255, 0); // Establecer los 45 LEDs en color verde
// Si se detecta un objeto sobre el sensor particular, encender el LED particular
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(0, 0, 255); // Establecer el LED reactivo en azul
}
}
FastLED.show(); // Actualizar los LEDs
delay(20);
}

DIY_Reactive_LED_Table_Control
1 archivo(s) 0.00 KB Descargar
DIY_Reactive_LED_Table_Control Archivo de proyecto MIT App Inventor
1 archivo(s) 208.06 KB Descargar
#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino(RX, TX) - Bluetooth (TX, RX)
// Color de fondo inicial
int backR = 100;
int backG = 50;
int backB = 10;
// Color reactivo inicial
int reactiveR = 10;
int reactiveG = 50;
int reactiveB = 100;
int brightness = 50; // Brillo inicial
String dataIn = "";
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(38400);
Bluetooth.begin(38400); // Velocidad por defecto del módulo Bluetooth
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString();
delay(20);
if (dataIn.startsWith("1")) {
delay(10);
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
reactiveR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
reactiveG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
reactiveB = stringB.toInt();
} else if (dataIn.startsWith("2")) {
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
backR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
backG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
backB = stringB.toInt();
} else if (dataIn.startsWith("3")) {
String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length());
brightness = stringBrightness.toInt();
FastLED.setBrightness(brightness);
}
}
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(backR, backG, backB);
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
}
}
FastLED.show();
delay(20);
}
Proceso de manufactura
- Construya un mando a distancia IR universal con Arduino: Guía paso a paso
- Mando universal Android con Arduino, 1Sheeld y control IR
- Centro de Control de Potencia Arduino: N-FET, P-FET, Relé y RTC
- Control Remoto IoT de Brazo Robótico Personalizado con Arduino MKR1000 y ThingSpeak
- Controla un LED por Bluetooth con Arduino – Guía DIY paso a paso
- Controla un Rover Arduino con Firmata y Mando Xbox One - Guía Completa
- Mide la masa de la Tierra con Arduino: Guía paso a paso DIY
- Construye un Robot Cuadrúpedo Inteligente con Arduino: Guía Paso a Paso
- Control de brillo LED sin interrupciones con Bolt IoT y Arduino UNO
- Controla tu TV con Alexa mediante Arduino IoT Cloud: Guía Paso a Paso
- Construye una Brújula Digital en Tiempo Real con Arduino y Processing