🛠 Animer un ruban NeoPixel avec un PIO
Objetivos
Comprender el bloque PIO del RP2350 — 3 bloques y 12 máquinas de estado, frente a 2/8 en el RP2040 — implementando el protocolo WS2812 (NeoPixel) sin consumir tiempo de CPU. El PIO genera por sí solo los intervalos de ~1,25 µs por bit, mientras los dos núcleos M33 realizan otras tareas.
Material
- 1 × Raspberry Pi Pico 2
- 1 × tira o anillo WS2812B (8 LED son suficientes)
- Alimentación externa de 5 V para la tira
- Pin de datos: GP3 (> NO VERIFICADO: cualquier pin PIO sirve, GP3 elegido por convención)
- MicroPython ≥ 1.24.0 (firmware RPI_PICO2)
Código completo
# neopixel_pio.py — pilote WS2812 minimal via rp2.StateMachine (MicroPython)
import array, time
from machine import Pin
import rp2
@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT,
autopull=True, pull_thresh=24)
def ws2812:
T1 = 2; T2 = 5; T3 = 3
wrap_target
mov(x, st) .side(1)
jmp(x <= 1) .side(0) # bit 0 : impulsion courte
jmp(1) .side(0) # bit 1 : impulsion longue
nop .side(0)
wrap
PIN, N = 3, 8
sm = rp2.StateMachine(0, ws2812, freq=3_000_000, jmppin=Pin(PIN))
pix = array.array("I", [0] * N)
def show:
sm.put(0)
for g, r, b in pix: # format GRB 0xGGRRBB
sm.put((g << 16) | (r << 8) | b)
time.sleep_us(50); sm.active(1)
i = 0
while True: # arc-en-ciel tournant
for n in range(N):
pix[n] = ((n + i) * 32 & 255, 255 - ((n + i) * 32 & 255), 64)
show; i += 1; time.sleep_ms(80)
Verificación esperada
Los LED se animan en bucle. Punto clave: la CPU sigue disponible — añade un parpadeo en GP25 dentro del bucle, permanece sincronizado incluso durante show, porque el PIO gestiona solo el temporizado. Esta es la gran ventaja de las 12 SM del RP2350.
Errores frecuentes
- Firmware MicroPython RP2040 (≤ 1.23): imposible flashear en Pico 2, se necesita ≥ 1.24.0 con la compilación RPI_PICO2.
- Tira alimentada desde 3V3: los WS2812 requieren ~5 V en DIN; un nivel de 3,3 V está en el límite del umbral y provoca LED fantasma.
- Olvidar la pausa > 50 µs sin impulso: el trama no se bloquea y los LED parpadean aleatoriamente.
- Utilizar una máquina de estado ya ocupada: verificar las SM libres, MicroPython o un programa anterior puede reservarlas.
- El código MicroPython oficial rp2 de referencia está documentado para RP2040; en RP2350, prueba la frecuencia si los tiempos parecen desviarse.
Otros tutoriales para esta placa
Ejemplos de código para esta placa
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython