🛠 Piloter la LED RGB embarquée WS2812 d'une carte RP2040 générique
Objectifs
Les cartes RP2040 « génériques » (Waveshare RP2040 Zero, Adafruit Feather/QT Py RP2040, SparkFun Micro RP2040…) n'ont souvent pas de LED simple comme la Pico : elles embarquent une LED adressable WS2812 (« NeoPixel ») pilotée par un protocole mono-fil à 800 kHz que MicroPython génère via les PIO du RP2040. À la fin de ce tutoriel, tu sauras retrouver la broche de la LED de TA carte et lui donner n'importe quelle couleur.
Matériel
- 1 × carte RP2040 générique. Brochages courants : GP16 sur Waveshare RP2040 Zero (page constructeur), GP17 sur Adafruit Feather RP2040 (page constructeur) — vérifie la fiche de ton fabricant, c'est LA donnée à chercher
- 1 × câble USB (data !) : beaucoup de Zero sont en USB-C
- Firmware MicroPython rp2 flashé en mode BOOTSEL (maintiens BOOT pendant le branchement, la carte apparaît comme lecteur
RPI-RP2)
Code complet
# main.py — LED WS2812 embarquée (GP16 Waveshare Zero, GP17 Feather)
import neopixel
from machine import Pin
import time
PIN = 16 # à adapter à ta carte !
led = neopixel.NeoPixel(Pin(PIN), 1) # chaîne d'une seule LED
for r, g, b in [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 64, 0)]:
led[0] = (r, g, b) # tuple (R, G, B) 0..255
led.write # la PIO envoie la trame, le CPU est libre
time.sleep_ms(500)
while True: # « arc-en-ciel » rapide
for i in range(256):
led[0] = (i, 255 - i, 128)
led.write
time.sleep_ms(5)
Vérification attendue
La LED passe en rouge, vert, bleu, orange à 500 ms, puis dégradé continu. Contrairement à une LED classique, rien ne clignote « éteint » entre deux couleurs : la LED garde sa dernière trame, car le WS2812 mémorise sa consigne. Si ta carte a plusieurs WS2812 (certains badges, QT Py avec strobe), passe la longueur réelle à NeoPixel(..., n).
Erreurs fréquentes
- Coder GP25 par réflexe « Pico » : les cartes génériques n'ont presque jamais de LED sur GP25 — la WS2812 est sur GP16, GP17 ou ailleurs selon le fabricant.
- Oublier
led.write: le tuple est modifié en mémoire mais rien n'est envoyé sur le bus. - Chercher un module
rp2pour la LED : la WS2812 passe par le module standardneopixel(inclus dans le firmware rp2), pas parrp2.StateMachinedirectement. - Alimenter une longue bande depuis le régulateur de la carte : la Zero embarque un LDO 800 mA (fiche Waveshare), mais une bande de 100 LED blanches tire ~6 A — alimentation séparée obligatoire.
- LED qui s'allume blanc/rosa aléatoire au boot : les broches du RP2040 sont reconfigurées au reset ; ajoute
led.fill((0,0,0)); led.writeen début de script.
Autres tutoriels pour cette carte
- Avoir une console série sur une carte sans pont USB (UART0)
- Jouer une mélodie avec un buzzer passif et le PWM
- Afficher sur un OLED I2C SSD1306 et déboguer le bus
- Logger sur carte microSD en SPI (mode carte)
- Interruptions GPIO et alarmes matérielles avec le Pico SDK
- Transformer la carte en clavier USB HID avec TinyUSB
Exemples de code pour cette carte
clignotante.pyPythonbouton-interruption.pyPythonpwm-servo.pyPythonlecture-adc.pyPythonneopixel.pyPythonoled-i2c.pyPython