Neopixel - Leds rgb con arduino y errores frecuentes

 Siguiendo un poco con lo que es el desarrollo en arduino, quizá uno de los elementos mas frecuentes a la hora comenzar a probar o de realizar un proyecto con arduino sea la utilización de leds rgb. 

Uno de los mas conocidos son los Neopixels, leds direccionables individualmente con un circuito integrado que permite controlar mediante solo un pin digital el color de cada uno de los leds (también llamados pixel). A su vez vienen en múltiples presentaciones desde aros de diversos tamaños, individuales, tiras led y matrices. 


Para evitar cualquier error o si no están pudiendo hacer funcionar correctamente los leds les dejo varios puntos a tener en cuenta. *En los siguientes ejemplos voy a utilizar un aro de 16 leds.

Circuito:

El primer paso es conectar los leds correctamente, y para eso es necesario tener en cuenta la resistencia limitadora, un capacitor de filtro y una fuente de alimentación acorde. Si bien arduino ya consta de unas resistencias internas para protección, siempre es recomendable utilizar una resistencia que limite la corriente ya que un solo led puede consumir mas o menos corriente si se encuentra según su intensidad de iluminación y el color que se desee (un led con sus 3 colores encendido a máxima intensidad estará en el máximo de su consumo, alrededor de unos 60mA). 


- Resistencia de 470ohm (La recomendación del fabricante va desde 300 a 500ohm)
- Capacitor electrolítico de 1000mf 16v (16v o mayor)

Los neopixel como se puede apreciar en la primer foto constan de 4 pines de conexión, DI la señal digital de entrada, GND tierra, 5V de alimentación y DO salida en caso de querer conectar otro neopixel en cadena.
El circuito es bastante sencillo, la resistencia se conecta entre un pin digital de arduino a el DI de neopixel. El pin GND de arduino, la alimentación, el neopixel y el del capacitor se conectan entre si. Finalmente la alimentación de 5v al positivo del capacitor y del neopixel.

Alimentación: 

Para un correcto funcionamiento, tanto para protección del arduino como para una correcta visualización de los colores es necesario utilizar la alimentación adecuada. 
Como comentaba anteriormente un pixel (led) puede llegar a tener un consumo máximo de unos 60mA y en promedio su consumo llega a unos 20mA. A simple vista no parece mucho considerando que la alimentación máxima que provee arduino es de unos 500mA, pero si hacemos los cálculos del consumo máximo para el aro de 16 pixels nos da unos 960mA (16 * 60mA), casi el doble de lo que entrega arduino. Por eso es necesario una fuente externa, en mi caso con un cargador de celular de 2A está sobrado y son fáciles de conseguir.  

Fíjense en este ejemplo de neopixel conectado al usb luego de ser programado para mostrar los colores rojo, verde, azul, amarillo, cyan y magenta. El neopixel funciona sin embargo los últimos colores no se muestran correctamente, inclusive puede a llegar a mostrar otro color y con menor intensidad. 


Ahora el mismo circuito con la alimentación adecuada se puede observar los colores programados, correctamente.

Configuración:

Otro punto a tener en cuenta es la correcta configuración a la hora de programarlo.
Primero, antes que nada agregar la librería importándola desde el gestor del IDE:



Una vez importada hace falta seleccionar la configuración correcta

#include <Adafruit_NeoPixel.h>
#define PIN    0
#define NUMPIXELS 16
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

El parámetro NEO_GRB hace referencia a un flujo de bit GRB (verde, rojo y azul), a diferencia de lo que se cree es bastante común en los productos de neopixel. Pero también puede ser NEO_RGB en las primeras versiones de Flora y NEO_RGBW en caso de que cuenten con color blanco independiente de las otras los demás colores.
Por otro lado el parametro NEO_KHZ800 indica la frecuencia de 800KHz que se utiliza en la mayoria de los neopixel con driver WS2812. Las versiones mas viejas con driver WS2811 utilizan NEO_KHZ400.

Array de colores:

Supongamos que queremos cambiar de colores que están almacenados en un array, deberíamos declarar algo así:

uint32_t mi_arreglo[] = {
    pixels.Color(255, 000, 000),
    pixels.Color(000, 255, 000),
    pixels.Color(000, 000, 255)
};

Entonces si quisiéramos recorrerlo se podría hacer un bucle obteniendo la cantidad de elementos:

// Esto no funciona
for (int i = 0; i < sizeof(mi_arreglo); i++) {
    // código para encender leds
}


El problema con este código es que el operador sizeof devuelve el tamaño total de bytes, es por esto que al intentar extraer y encender los leds, se va a ejecutar un numero de veces diferente a la cantidad de colores, extrayendo valores incorrectos y mostrando colores que no queremos.

Veamos este ejemplo:


Fíjense que cuando hacemos sizeof del arreglo de 3 elementos nos devuelve 12. Para solucionar eso, la documentación de arduino nos dice que debemos dividirlo por uno de sus elementos y de esta forma tener el tamaño correcto.


En este último ejemplo se puede ver el resultado, obteniendo correctamente el tamaño del arreglo.


----
Finalmente si han tenido en cuenta cada paso no deberían tener ningún problema. Les dejo un código de ejemplo completo para que puedan probar y modificar a gusto. 

#include <Adafruit_NeoPixel.h>
#define PIN    0
#define NUMPIXELS 16
#define DELAYVAL 500
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

uint32_t mi_arreglo[] = {
  pixels.Color(255, 000, 000),
  pixels.Color(000, 255, 000),
  pixels.Color(000, 000, 255)
};

void setup() {
  pixels.begin(); 
}

void loop() {
  pixels.clear();

  for (int i = 0; i < sizeof(mi_arreglo) / sizeof(mi_arreglo[0]); i++) {
    for(int j=0; j<NUMPIXELS; j++) {
      pixels.setPixelColor(j, mi_arreglo[i]);
      pixels.show();
    }
    delay(DELAYVAL);
  }
}

Comentarios

Entradas populares