🛠 Animer un ruban NeoPixel avec un PIO

Raspberry Pi Pico 2 · intermediaire · Schéma : IMG-pico-2-intermediaire-2-pico2-pio-ruban-led.svg — ruban de LED WS2812 connecté à GP3 de la Pico 2, bloc PIO interne générant le protocole, alimentation 5 V séparée

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales