🛠 OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)
Objectifs
Comprendre pourquoi la Teensy 3.2 est la reine des murs LED : la bibliothèque OctoWS2811 pilote 8 rubans WS2811/WS2812 en parallèle via DMA — jusqu'à 8800 LED rafraîchies à 30 Hz, ~4000 LED recommandées par Teensy 3.2, 1000 LED mises à jour en 3,8 ms (théoriquement 240 Hz) — avec une occupation CPU quasi nulle : show retourne en 2 µs. Vous câblerez 8 rubans (ou un seul pour débuter) avec le buffer 74HCT245 indispensable, puis vous regarderez les alternatives WS2812Serial et SmartMatrix.
Matériel
- 1 Teensy 3.2
- 8 rubans WS2812 (broches fixes sur Teensy 3.2 : 22, 14, 7, 8, 6, 20, 21, 5) — pour débuter, 1 seul ruban sur la broche 22 fonctionne
- 1 buffer 74HCT245 (ex. OctoWS2811 Adaptor PJRC) — obligatoire : les rubans WS2812B récents exigent un niveau HIGH d'environ 0,7×VDD ; la sortie 3,3 V de la Teensy est peu fiable en direct
- Alimentation 5 V dimensionnée (3 rubans de 64 LED pleine blanche ≈ 30 A de crête !) — les pics de l'alimentation ATX sur la ligne 5 V ont déjà détruit des cartes (page OctoWS2811)
- Condensateur électrolytique (ex. 1000 µF) près du premier pixel de chaque ruban
Code complet
API vérifiée sur la page officielle OctoWS2811 :
#include <OctoWS2811.h>
// 8 rubans de 256 WS2812B sur les broches 22,14,7,8,6,20,21,5 (fixes)
const int ledsPerStrip = 256;
DMAMEM int displayMemory[ledsPerStrip * 6]; // double buffer DMA (6 int/LED)
int drawingMemory[ledsPerStrip * 6]; // back buffer que votre code dessine
const int config = WS2811_GRB | WS2811_800kHz; // ordre des couleurs + débit
OctoWS2811 leds(ledsPerStrip, displayMemory, drawingMemory, config);
void setup {
leds.begin;
leds.show; // efface toutes les LED
}
void loop {
while (leds.busy) { } // attend la fin du transfert DMA précédent
for (int i = 0; i < ledsPerStrip * 8; i++) {
leds.setPixel(i, 120, 0, 0); // rouge ; setPixel(num, r, g, b)
}
leds.show; // lance la MAJ DMA, revient en ~2 us
// Le CPU est libre ici : 1000 LED prennent 3,8 ms au total
delay(16);
}
Vérification attendue
Les 8 rubans s'allument en rouge synchrones. Mesurez l'occupation CPU : elle est marginale — la synthèse du signal WS2812 est faite par le DMA, pas par votre boucle. Le while (leds.busy) { } empêche d'écraser un buffer pendant un transfert. Pour un mur vidéo complet, l'exemple VideoDisplay du library diffuse la vidéo du PC vers des réseaux multi-Teensy avec synchronisation de trames (1920 LED montrées sur deux cartes dans la démo PJRC, extensible à plusieurs milliers).
Alternatives selon le projet
- WS2812Serial (GitHub PaulStoffregen) : jusqu'à 5 instances DMA non bloquantes sur ports série matériels — quand les 8 broches OctoWS2811 sont déjà prises.
- SmartMatrix + SmartLED Shield v4 (Pixelmatix) : pilotage direct de panneaux RGB HUB75 de 32x16 à 64x64, lecture de GIF, intégration FastLED.
Erreurs fréquentes
- Alimenter les rubans par le 3,3 V ou le 5 V USB de la carte : l'USB d'un PC fournit ~500 mA, un ruban pleine blanche en dévore des dizaines d'amperes — alimentation 5 V dédiée obligatoire, masses reliées.
- Zapper le 74HCT245 : pixels qui scintillent ou restent éteints avec les rubans récents (niveau HIGH insuffisant à 3,3 V).
- Pics d'une alim ATX mal filtrée : destruction de cartes documentée — condensateur en tête de ruban, câbles 5 V courts et gros.
- Oublier DMAMEM sur displayMemory : le DMA ne peut pas lire n'importe quelle zone RAM — la variable doit être dans la mémoire DMA.
- Écrire dans drawingMemory pendant un transfert sans attendre busy : images déchirées.
- Confondre l'ordre des couleurs : WS2811_GRB vs WS2811_RGB — des LED bleues à la place des rouges viennent de là, pas d'un câblage inversé.
Autres tutoriels pour cette carte
- Premiers pas sur la Teensy 3.2 : Teensyduino, HalfKay et premier Blink
- Broches, ADC 13 bits, DAC 12 bits et PWM : dompter les E/S de la Teensy 3.2
- Un instrument MIDI USB en 10 minutes : Bounce, boutons et règle d'or du drain
- Audio Shield SGTL5000 : boucle stéréo 44,1 kHz et outil de conception graphique
- Timers matériels, interruptions imbriquées et FASTRUN : la vitesse Cortex-M4
- Intégration produit : alimentation VIN/VUSB, régulateur 250 mA, RTC à quartz et EEPROM
Exemples de code pour cette carte
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino