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

Objectifs

Le Teensy est LA référence des installations lumineuses. Deux bibliothèques PJRC s'affrontent avantageusement : WS2812Serial (jusqu'à 8 instances non bloquantes, chacune sur un port UART utilisé comme générateur de forme d'onde DMA) et OctoWS2811 (rafraîchissement DMA au rythme vidéo de 30 Hz — et sur Teensy 4.0, « supports use of any number of digital pins », on n'est plus limité aux 8 broches des Teensy 3.x). Ce tutoriel utilise WS2812Serial : votre sketch continue de tourner à pleine vitesse pendant que le DMA envoie les trames.

Matériel

Code complet

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

Vérification attendue

L'arc-en-ciel défile à 50 images/s. Test de non-blocage : ajoutez un compteur Serial.println(millis) dans loop — il défile normalement PENDANT l'envoi des trames LED, preuve que le DMA travaille seul. Pour une installation massive (panneaux HUB75 RGB 32x16 jusqu'à 128x64), regardez plutôt SmartMatrix + le shield SmartLED v5 ; pour des rubans pilotés au rythme vidéo 30 Hz, OctoWS2811.

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels