🛠 Piloter un ruban WS2812 sans bloquer le CPU : WS2812Serial et OctoWS2811

Teensy 4.0 · intermediaire · Schéma : IMG-teensy-40-intermediaire-4-teensy40-ruban-ws2812-dma.svg — Teensy 4.0 alimentant un ruban de 60 WS2812B : data sur la broche 1 (TX de Serial1), résistance de données, condensateur 1000 µF sur la ligne 5 V du ruban ; encart « DMA : le CPU continue de tourner pendant l'envoi ».

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales