🛠 OctoWS2811 : piloter 8 rubans WS2812 en parallèle par DMA (presque zéro CPU)
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
- 1 Teensy 3.2
- 8 tiras WS2812 (pines fijos en Teensy 3.2: 22, 14, 7, 8, 6, 20, 21, 5) — para empezar, 1 sola tira en el pin 22 funciona
- 1 buffer 74HCT245 (p. ej. OctoWS2811 Adaptor PJRC) — obligatorio: las tiras WS2812B recientes exigen un nivel HIGH de aproximadamente 0,7×VDD; la salida de 3,3 V de la Teensy es poco fiable en conexión directa
- Fuente de alimentación de 5 V dimensionada (3 tiras de 64 LED en blanco pleno ≈ 30 A de pico) — los picos de la fuente ATX en la línea de 5 V ya han destruido tarjetas (página OctoWS2811)
- Condensador electrolítico (p. ej. 1000 µF) cerca del primer píxel de cada tira
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
- WS2812Serial (GitHub PaulStoffregen): hasta 5 instancias DMA no bloqueantes en puertos serie de hardware — cuando los 8 pines de OctoWS2811 ya están ocupados.
- SmartMatrix + SmartLED Shield v4 (Pixelmatix): control directo de paneles RGB HUB75 de 32x16 a 64x64, lectura de GIF, integración con FastLED.
Errores frecuentes
- Alimentar las tiras desde los 3,3 V o los 5 V USB de la tarjeta: el USB de un PC proporciona ~500 mA, una tira en blanco pleno consume decenas de amperios — fuente de alimentación de 5 V dedicada obligatoria, masas conectadas.
- Omitir el 74HCT245: píxeles que parpadean o permanecen apagados con las tiras recientes (nivel HIGH insuficiente a 3,3 V).
- Picos de una fuente ATX mal filtrada: destrucción de tarjetas documentada — condensador a la cabecera de la tira, cables de 5 V cortos y gruesos.
- Olvidar DMAMEM en displayMemory: el DMA no puede leer cualquier zona de RAM — la variable debe estar en la memoria DMA.
- Escribir en drawingMemory durante una transferencia sin esperar busy: imágenes rotas.
- Confundir el orden de los colores: WS2811_GRB vs WS2811_RGB — LED azules en lugar de rojas vienen de ahí, no de un cableado invertido.
Otros tutoriales para esta placa
- 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
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino