Approved Reseller
Approved Reseller
En este pequeño tutorial veremos cómo conectar LEDs RGB Neopixel WS2812 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: WS2812, WS2811 o SK6812.
Cada LED cuenta con 4 pines:
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? Es 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 la información del color mostrar y mostrarlo.
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.
Por lo tanto, para instalar dicho paquete ejecuta el siguiente comando en la terminal:
sudo pip3 install adafruit-circuitpython-neopixel
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
Referencias:
Para seguir leyendo…