enero 19, 2020

VARIOS-Tutorial de cadena LED WS2811

Written by

En Internet hay varios tutoriales para usar las tiras o cadenas de Neopixel como las WS2811, que están muy extendidas porque son baratas y muy versátiles. Sin embargo no hemos encontrado uno que lo explique todo con sumo detalle desde cero, así que a continuación exponemos lo que hay que hacer para poner en funcionamiento una cadena de LEDs con Arduino.

1 – Instalar la librería

Las cadenas WS2811 tienen los LED conectados internamente por registros de desplazamiento, de manera que hay que enviar un conjunto de 24 bits para conseguir el color adecuado en cada LED, multiplicado por el número de LED de la cadena. Esto se puede hacer directamente pero con una librería es más fácil. Hay varias librerías disponibles pero la que hemos encontrado más rápida y fácil de usar es FastLED.

Para instalarla, si se tiene un IDE actual, se puede hacer desde el gestor de librerías, buscándola desde el buscador y pulsando en el botón Instalar:

Gestor de librerías con FastLED

2 – Conectar los LED

Para la prueba vamos a usar un Arduino Mega, aunque se podía usar otro modelo. En caso de tener una cadena muy larga se necesita más memoria y puede que el modelo UNO no sea suficiente. En la cadena que tenemos los colores son:

  • Rojo – 5 V
  • Blanco – GND
  • Verde – datos

Teniendo en cuenta que para alimentar los LED se necesitan entre 20 y 60 mA de corriente para cada uno, hay que usar una fuente externa de tensión. Arduino no puede facilitar tanta potencia. Las conexiones son:

Conexiones de la cadena WS2811

3 – Cargar el programa

Cuando están hechas las conexiones, se carga el programa en Arduino. La librería FastLED cuenta con varios programas de demostración bastante buenos e ilustrativos. Por ejemplo, el programa DemoReel100, que abrimos en el IDE, modificamos el número de LEDs del programa, en nuestro caso son 50, y lo cargamos en la tarjeta Mega. El efecto es el que se ve en el vídeo.

4 – Control de varias cadenas

Cuando las cadenas de LED son largas, la capacidad de Arduino es insuficiente para manejar tantos LED. También puede ser aconsejable usar varias cadenas de LED en lugar de una solamente para que no tarde tanto la carga de los valores en una tan larga. Hacemos una prueba ahora con dos cadenas de 50 LED y usando un módulo ESP32 en lugar de Arduino, y así no tendremos problemas si el número de LED aumenta. Para ello usamos las patillas GPIO 3 y GPIO 1 del ESP32. El circuito ahora es:

Circuito con ESP32

Para probarlo usamos un ejemplo de la librería FastLED, que se puede acceder desde el menú de ejemplos en el IDE de Arduino, FastLED>Multiple. Hay varios ejemplos que usan varias cadenas de LED. Usamos el ejemplo ArrayOfLedArrays, modificado un poco para usar nuestras cadenas WS2811. El código concreto se puede ver:

// ArrayOfLedArrays - see https://github.com/FastLED/FastLED/wiki/Multiple-Controller-Examples for more info on
// using multiple controllers.  In this example, we're going to set up three NEOPIXEL strips on three
// different pins, each strip getting its own CRGB array to be played with, only this time they're going
// to be all parts of an array of arrays.

#include <FastLED.h>

#define NUM_STRIPS 2
#define NUM_LEDS_PER_STRIP 50
CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];

void setup() {
  FastLED.addLeds<WS2811, 3>(leds[0], NUM_LEDS_PER_STRIP);
  FastLED.addLeds<WS2811, 1>(leds[1], NUM_LEDS_PER_STRIP);
}

void loop() {
    for(int i = 0; i < NUM_LEDS_PER_STRIP; i++) {
      leds[0][i] = CRGB::Red;
      leds[1][i] = CRGB::Green;
      FastLED.show();
      leds[0][i] = CRGB::Black;
      leds[1][i] = CRGB::Black;
      delay(100);
    }
}

Y el ejemplo funcionando es:

5 – Control con conversor de niveles

El circuito anterior usa un controlador de la marca Espressif, ESP32, que usa lógica de 3,3 V en sus patillas. Sin embargo la cadena de LED usa lógica de 5 V en su entrada. En nuestra prueba anterior con el modelo de ESP32S que usamos el circuito ha funcionado pero podría ser que la tensión de salida no fuera suficiente para enviar los bits a la cadena de LED. En ese caso habría que usar un conversor de tensiones como éste:

Conversor de niveles lógicos

Hacemos una prueba usando uno de estos conversores y comprobamos que funciona correctamente:

MODIFICADO EL 22/2/2021

Hemos modificado el programa de control de los LED para comprobar su buen funcionamiento, encendiendo los LED en serie en colores rojo, verde y azul. El programa es el siguiente:

#include <FastLED.h>

// How many leds in your strip?
#define NUM_LEDS 50

// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 3
#define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
  FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);      
}

void loop() { 
  // Turn the LED on, then pause
  int ii;
for(ii=0;ii<NUM_LEDS;ii++)
{
  leds[ii] = CRGB::Red;
  FastLED.show();
  delay(100);
}
for(ii=0;ii<NUM_LEDS;ii++)
{
  leds[ii] = CRGB::Green;
  FastLED.show();
  delay(100);
}
for(ii=0;ii<NUM_LEDS;ii++)
{
  leds[ii] = CRGB::Blue;
  FastLED.show();
  delay(100);
}

  // Now turn the LED off, then pause
  for(ii=0;ii<NUM_LEDS;ii++)
  {
    leds[ii] = CRGB::Black;
  }
  FastLED.show();
  delay(500);
}

El esquema que hemos montado es:

Esquema de conexiones para la prueba de LEDs

El resultado se puede ver en el siguiente vídeo:

Añadido un programa para controlar 4 circuitos de LEDs.

El siguiente paso que hacemos es comprobar si funciona el microcontrolador ESP32 con cuatro circuitos independientes, de forma similar a como lo probamos con dos. El circuito será ahora:

Esquema del circuito con 4 tiras de LEDs

Y el programa que cargamos es una adaptación del ejemplo ArrayOfLedArrays:

#include <FastLED.h>

#define NUM_STRIPS 4
#define NUM_LEDS_PER_STRIP 50
CRGB leds[NUM_STRIPS][NUM_LEDS_PER_STRIP];

void setup() 
{
  FastLED.addLeds<WS2811, 3>(leds[0], NUM_LEDS_PER_STRIP);
  FastLED.addLeds<WS2811, 5>(leds[1], NUM_LEDS_PER_STRIP);
  FastLED.addLeds<WS2811, 4>(leds[2], NUM_LEDS_PER_STRIP);
  FastLED.addLeds<WS2811, 15>(leds[3], NUM_LEDS_PER_STRIP);
}

void loop() 
{
    for(int ii = 0; ii < NUM_LEDS_PER_STRIP; ii++) 
    {
      leds[0][ii] = CRGB::Red;
      leds[1][ii] = CRGB::Green;
      leds[2][ii] = CRGB::Blue;
      leds[3][ii] = CRGB::White;
      FastLED.show();
      leds[0][ii] = CRGB::Black;
      leds[1][ii] = CRGB::Black;
      leds[2][ii] = CRGB::Black;
      leds[3][ii] = CRGB::Black;
      delay(100);
    }
  }
}

Hemos cargado el programa en el ESP32 y aunque no disponemos ahora de cuatro tiras LED, comprobamos que los cuatro circuitos independientes, cada uno con un color distinto, funcionan:

Category : VARIOS

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Proudly powered by WordPress and Sweet Tech Theme