🛠 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.

Objetivos

Comprender por qué la Teensy 3.2 es la reina de los muros LED: la biblioteca OctoWS2811 controla 8 tiras WS2811/WS2812 en paralelo mediante DMA — hasta 8800 LED refrescadas a 30 Hz, ~4000 LED recomendadas por Teensy 3.2, 1000 LED actualizadas en 3,8 ms (teóricamente 240 Hz) — con una ocupación de CPU casi nula: show retorna en 2 µs. Cableará 8 tiras (o una sola para empezar) con el buffer 74HCT245 indispensable, y luego verá las alternativas WS2812Serial y SmartMatrix.

Material

Código completo

API verificada en la página oficial de 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 + debit

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 precedent
  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);
}

Verificación esperada

Las 8 tiras se encienden en rojo sincronizadas. Mida la ocupación de CPU: es marginal — la síntesis de la señal WS2812 la realiza el DMA, no su bucle. El while (leds.busy) { } evita sobrescribir un buffer durante una transferencia. Para un muro de vídeo completo, el ejemplo VideoDisplay de la biblioteca difunde el vídeo del PC hacia redes multi-Teensy con sincronización de fotogramas (1920 LED mostradas en dos tarjetas en la demo PJRC, ampliable a varios miles).

Alternativas según el proyecto

Errores frecuentes

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales