🛠 Piloter un ruban WS2812 sans bloquer le CPU : WS2812Serial et OctoWS2811
Objetivos
El Teensy es LA referencia en instalaciones de iluminación. Dos bibliotecas de PJRC compiten ventajosamente: WS2812Serial (hasta 8 instancias no bloqueantes, cada una en un puerto UART utilizado como generador de forma de onda DMA) y OctoWS2811 (refresco DMA a ritmo de vídeo de 30 Hz — y en Teensy 4.0, « supports use of any number of digital pins », ya no se limita a los 8 pines de los Teensy 3.x). Este tutorial utiliza WS2812Serial: tu sketch sigue ejecutándose a plena velocidad mientras el DMA envía los fotogramas.
Material
- 1 Teensy 4.0 + cinta WS2812B (por ejemplo, 60 LED/m)
- Fuente de alimentación de 5 V DEDICADA para la cinta (60 LED blancas al máximo ≈ 3,6 A: el USB no es suficiente) — masas comunes con el Teensy
- Resistencia de 300–470 Ω en serie en la línea de datos, condensador de 1000 µF / 6,3 V en los bornes de la cinta
- Biblioteca: https://github.com/PaulStoffregen/WS2812Serial
Código completo
// Arc-en-ciel défilant, envoi par DMA non bloquant.
#include <WS2812Serial.h>
const uint32_t NUM_LEDS = 60;
byte drawingBuffer[NUM_LEDS * 3]; // RGB, un octet par canal
// Broche 1 sur T4 = TX de Serial1. Serial1/3/4/6/7/8 → jusqu'à 8 instances.
WS2812Serial myLEDs(NUM_LEDS, drawingBuffer, 1, 20, WS2812_SERIAL_DEFAULT);
void setup { myLEDs.begin; }
void loop {
static uint8_t hue = 0;
for (uint32_t i = 0; i < NUM_LEDS; i++) { // remplissage du buffer
uint8_t h = hue + (i * 256 / NUM_LEDS);
uint8_t r = (h < 85) ? 255 - h * 3 : (h < 170) ? (h - 85) * 3 : 0;
uint8_t g = (h < 85) ? h * 3 : (h < 170) ? 255 : 255 - (h - 170) * 3;
uint8_t b = (h < 85) ? 0 : (h < 170) ? 255 - (h - 85) * 3 : (h - 170) * 3;
drawingBuffer[i * 3 + 0] = g; // le WS2812 veut de l'ordre GRB
drawingBuffer[i * 3 + 1] = r;
drawingBuffer[i * 3 + 2] = b;
}
myLEDs.show(false); // false = retour immédiat : le DMA envoie
hue += 4; // l'animation tourne à pleine vitesse CPU
delay(20);
}
Verificación esperada
El arcoíris se desplaza a 50 imágenes/s. Prueba de no bloqueo: añade un contador Serial.println(millis) en loop — se desplaza normalmente DURANTE el envío de los fotogramas LED, prueba de que el DMA trabaja solo. Para una instalación masiva (paneles HUB75 RGB 32x16 hasta 128x64), mira mejor SmartMatrix + el shield SmartLED v5; para cintas controladas a ritmo de vídeo de 30 Hz, OctoWS2811.
Errores frecuentes
- Alimentar la cinta desde el 5 V del Teensy: unas pocas LED funcionan, una cinta entera hace caer la tensión y reinicia la placa — usa una fuente de alimentación externa dedicada, con las masas conectadas.
- Olvidar el orden GRB: el búfer dibuja en RGB, pero el fotograma WS2812 es GRB — rojo y verde invertidos, esa es la trampa.
- Confundir las bibliotecas: WS2812Serial ocupa un UART por instancia (máx. 8); OctoWS2811 utiliza pines GPIO dedicados con un refresco DMA continuo a ritmo de vídeo.
- Datos en un pin que no es el TX de un UART elegible: verifica la correspondencia pin/UART (Serial1/3/4/6/7/8 en el 4.0).
- Fotograma cortado por código bloqueante en otro lugar: con
show(false), no reescribas eldrawingBuffermientras el DMA lee — espera o usa doble búfer. - Cable de datos demasiado largo sin resistencia: glitches aleatorios en las primeras LED — la resistencia en serie del lado del Teensy es tu amiga.
Otros tutoriales para esta placa
- Premiers pas sur le Teensy 4.0 : Teensyduino, Loader et premier Blink
- GPIO et PWM sous 3,3 V : les règles d'or du Teensy 4.0
- Entrées analogiques et capteur de température interne : le ADC et ses limites
- Contrôleur MIDI USB : un potard qui joue du piano (MIDIx4/MIDIx16)
- Comprendre la mémoire : 2 Mo de flash, 1 Mo de RAM TCM/DMA, EEPROM émulée et LittleFS
- Deux ports USB simultanés : périphérique 480 Mbit/s ET hôte USB sur les pastilles
Ejemplos de código para esta placa
clignotante.inoArduinotouche-capacitive.inoArduinoanalogique-12-bits.inoArduinomidi-piano.inoArduinopwm-respiration.inoArduinoservo-angle.inoArduino