🛠 OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)

Teensy 3.2 · intermediaire · Schéma : IMG-teensy-32-intermediaire-5-teensy32-octows2811-mur-led.svg — Teensy 3.2 reliée par une nappe à un buffer 74HCT245 (OctoWS2811 Adaptor) d'où partent 8 rubans WS2812 parallèles ; broches 22, 14, 7, 8, 6, 20, 21, 5 annotées sur la carte ; en médaillon, un mur LED 64x64 animé et l'alimentation 5 V dédiée avec condensateur de découplage.

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

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

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels