Tutorial #6 de Raspberry Pi Pico: LED RGB WS2812

Anuncio
RaspberryPi

El chip WS2812 es uno de los más fáciles de usar para añadir LEDs RGB a tu proyecto. Los LED también se conocen como Neopixel y son muy utilizados en proyectos de wearables y anuncios luminosos. Para controlarlos se usa un protocolo especial definido por el fabricante y se le envía a cada LED individual el color que debe tener, por lo que se pueden tener más 10 LEDs en un mismo pin, encendiendo de un distinto color.

Diagrama de Conexión

Para controlar la tira de LEDs solo necesitas un pin de datos. En el código vamos a crear el protocolo que le manda la información a la tira de LEDs, por lo que no importa si no es I2C o SPI.

Vía: Raspberry Pi Foundation

Código

Este código permite crear el protocolo que maneja los 10 LEDS de tu tira RGB WS2812. Para compilarlo con la versión mas reciente de Thonny vas a necesitar copiar el bootloader de la página de Raspberry, ya que el que genera el IDE puede darte problemas para compilar. Una vez hayas descargado y copiado el archivo a tu Pico, puedes proceder a cargar el código.

import array, utime
from machine import Pin
import rp2
from rp2 import PIO, StateMachine, asm_pio

# Configure the number of WS2812 LEDs.
NUM_LEDS = 10

@asm_pio(sideset_init=PIO.OUT_LOW, out_shiftdir=PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)
def ws2812():
    T1 = 2
    T2 = 5
    T3 = 3
    label("bitloop")
    out(x, 1) .side(0) [T3 -1]
    jmp(not_x, "do_zero") .side(1) [T1 -1]
    jmp("bitloop") .side(1) [T2 - 1]
    label("do_zero")
    nop() .side(0) [T2 - 1]
    
# Create the StateMachine with the ws2812 program
sm = StateMachine(0, ws2812,freq=8000000, sideset_base=Pin(0))

#Start the StateMachine, it will wait for data on its FIFO
sm.active(1)

ar = array.array("I", [0 for _ in range (NUM_LEDS)])

print("blue")
for j in range (0,255):
    for i in range (NUM_LEDS):
        ar[i] = j
    sm.put(ar,8)
    utime.sleep_ms(10)

print("red")
for j in range (0,255):
    for i in range (NUM_LEDS):
        ar[i] = j<<8
    sm.put(ar,8)
    utime.sleep_ms(10)

print("green")
for j in range (0,255):
    for i in range (NUM_LEDS):
        ar[i] = j<<16
    sm.put(ar,8)
    utime.sleep_ms(10)

print("white")
for j in range (0,255):
    for i in range (NUM_LEDS):
        ar[i] = (j<<16) + (j<<8) + j
    sm.put(ar,8)
    utime.sleep_ms(10)
Vía: 330ohms

Conclusiones:

Anuncio
RaspberryPi

Con este código puedes mandar la secuencia de colores que quieras a tu tira de LEDs RGB WS2812. Solo necesitas configurar que color quieres mostrar en el código. ¡Sigue el blog de 330ohms para más tutoriales de Raspberry Pico!

Para seguir leyendo…

Referencias:

Appendix C – Programmable I/O – Get started with MicroPython on Raspberry Pi Pico

How to use WS2812B RGB LEDs with Raspberry Pi Pico