Cómo conectar LED RGB Neopixel/WS2812 a Raspberry Pi

En este pequeño tutorial veremos cómo conectar LEDs RGB Neopixel a una tarjeta Raspberry Pi, también encontrarás un código de programación para tus primeras pruebas.

Neopixel es una marca creada por Adafruit Industries para referirse a algunos LEDs RGB direccionables individualmente, es decir LEDs que cuentan con un circuito lógico integrado dentro de si mismos, circuito que hace posible controlar con un solo pin digital el color de cada LED en una secuencia de LEDs encadenados. No todos los LEDs direccionables individualmente son Neopixel, solo los basados en alguno de estos controladores: WS2812WS2811 o SK6812. 

Cada LED cuenta con 4 pines:

  • GND – Alimentación nivel bajo
  • 5V – Alimentación nivel alto
  • DIN – Pin que recibe la información del color
  • DO – Pin que entrega la información del color

El circuito integrado de cada LED puede almacenar 3 bytes, un byte para cada color. Debido a que se encuentran encadenados solo el primer LED está conectado al Pin de control, en este caso, un pin digital de la tarjeta Raspberry Pi. La tarjeta enviará la cadena de todos los colores según el número de pixeles que estén conectados y a su vez el primer LED recibirá la información todos los colores uno de tras de el otro. Pero ¿Cómo logran recibir la información todos los pixeles? Muy sencillo, cuando un LED recibe 3 bytes nuevos de información entrega al siguiente LED los 3 bytes que contenía anteriormente, de esta manera cuando la tarjeta Raspberry Pi termina de mandar todos los colores por el pin de datos el primer LED habría recibido y enviado todos los colores para quedarse finalmente con el color que le corresponde y así los demás LEDs.

De esta forma una cadena de LEDs Neopixel es un dispositivo digital de salida, es decir su funcionamiento consiste en recibir ila información del color mostrar y mostrarlo.

Componentes Necesarios

  • Arreglo de LED Neopixel
  • Raspberry Pi
  • Resistor 470 ohms
  • Condensador electrolítico de 1000uF de 6.3V(mínimo)
  • Jack de 2.1mm Terminal de Barril a Terminal de Tornillo
  • Eliminador 5V, mínimo 1A – Terminal de Barril 2.1mm
  • Protoboard chica
  • Cables para conexión M-M
  • Convertidor de nivel lógico bidireccional – 3.3V <-> 5V TTL

Diagrama de Conexiones

Raspberry Pi – NeoPixel – 1000uF – Resistor 470 ohms – Jack 2.1mm terminal de tornillo

Pasos previos a cargar el código

Como mencionamos anteriormente, para controlar una cadena de LEDs Neopixel desde Raspberry Pi es necesario implementar el protocolo de comunicación específico en un pin digital. En este caso utilizaremos la paquetería Adafruit_CircuitPython_NeoPixel, para realizar dicho control de manera sencilla y con muy pocas líneas de código.

Para instalar dicho paquete ejecuta el siguiente comando en la terminal:

sudo pip3 install adafruit-circuitpython-neopixel

Código de Python3

Copiamos el siguiente código ejemplo de Adafruit a un script de Python y lo ejecutamos con Python3 para observar como se modifican los colores de los pixeles.



# Simple test for NeoPixels on Raspberry Pi
import time
import board
import neopixel
 
 
# Choose an open pin connected to the Data In of the NeoPixel strip, i.e. board.D18
# NeoPixels must be connected to D10, D12, D18 or D21 to work.
pixel_pin = board.D18
 
# The number of NeoPixels
num_pixels = 10
 
# The order of the pixel colors - RGB or GRB. Some NeoPixels have red and green reversed!
# For RGBW NeoPixels, simply change the ORDER to RGBW or GRBW.
ORDER = neopixel.GRB
 
pixels = neopixel.NeoPixel(
    pixel_pin, num_pixels, brightness=0.2, auto_write=False, pixel_order=ORDER
)
 
 
def wheel(pos):
    # Input a value 0 to 255 to get a color value.
    # The colours are a transition r - g - b - back to r.
    if pos < 0 or pos > 255:
        r = g = b = 0
    elif pos < 85:
        r = int(pos * 3)
        g = int(255 - pos * 3)
        b = 0
    elif pos < 170:
        pos -= 85
        r = int(255 - pos * 3)
        g = 0
        b = int(pos * 3)
    else:
        pos -= 170
        r = 0
        g = int(pos * 3)
        b = int(255 - pos * 3)
    return (r, g, b) if ORDER in (neopixel.RGB, neopixel.GRB) else (r, g, b, 0)
 
 
def rainbow_cycle(wait):
    for j in range(255):
        for i in range(num_pixels):
            pixel_index = (i * 256 // num_pixels) + j
            pixels[i] = wheel(pixel_index & 255)
        pixels.show()
        time.sleep(wait)
 
 
while True:
    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((255, 0, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((255, 0, 0, 0))
    pixels.show()
    time.sleep(1)
 
    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 255, 0))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 255, 0, 0))
    pixels.show()
    time.sleep(1)
 
    # Comment this line out if you have RGBW/GRBW NeoPixels
    pixels.fill((0, 0, 255))
    # Uncomment this line if you have RGBW/GRBW NeoPixels
    # pixels.fill((0, 0, 255, 0))
    pixels.show()
    time.sleep(1)
 
    rainbow_cycle(0.001)  # rainbow cycle with 1ms delay per step

¡Sigue explorando!