🛠 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

Objectifs

Comprendre le bloc PIO du RP2350 — 3 blocs et 12 machines d'état, contre 2/8 sur le RP2040 — en implémentant le protocole WS2812 (NeoPixel) sans consommer de temps CPU. Le PIO génère seul les créneaux de ~1,25 µs par bit, pendant que les deux cœurs M33 font autre chose.

Matériel

Code complet

# 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)

Vérification attendue

Les LED s'animent en boucle. Point clé : le CPU reste disponible — ajoutez un clignotement GP25 dans la boucle, il reste synchrone même pendant show, car le PIO pilote seul le timing. C'est la grande force des 12 SM du RP2350.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels