ruban-neopixel.ino
Les WS2812 exigent des microsecondes précises : le core Mbed les génère proprement sur la Portenta. Une tête cyan qui tourne sur 16 LED sert de premier banc d'essai, pendant que le M7 fait autre chose.
Matériel requis
Une Arduino Portenta H7 (module ST STM32H747 double cœur Cortex-M7 @ 480 MHz + M4 @ 240 MHz, 8 Mo SDRAM, connecteur haut-density), alimentée par USB-C ou 5 V. 1 ruban 16 LED NeoPixel + alimentation 5 V externe.
Câblage
Data sur D4 via 330 Ω, VCC sur 5 V externe, GND commun avec la Portenta (logique 3,3 V acceptée par les WS2812).
Fonctionnement
setPixelColor remplit le tampon, show() envoie la trame par timer/DMA. Le modulo fait tourner la tête à ~16 Hz.
Exécution
Arduino IDE avec le core « Arduino Mbed OS Portenta Boards » : choisir « Portenta H7 » (cœur M7), le port USB-C puis Téléverser. Le sélecteur M7/M4 du mode DFU permet de charger aussi le cœur M4.
Variantes
Synchroniser l'animation avec une mesure (pression BMP280) ou la commande depuis le cœur M4 par RPC.
ruban-neopixel.ino
// Ruban NeoPixel 16 LED sur D4 (Adafruit_NeoPixel sur core Mbed).
#include <Adafruit_NeoPixel.h>
Adafruit_NeoPixel ruban(16, 4, NEO_GRB + NEO_KHZ800);
unsigned long t0 = 0;
int tete = 0;
void setup() {
ruban.begin();
ruban.setBrightness(60);
Serial.begin(9600);
}
void loop() {
if (millis() - t0 < 60) return;
t0 = millis();
ruban.clear();
ruban.setPixelColor(tete, ruban.Color(0, 255, 120));
ruban.setPixelColor((tete + 1) % 16, ruban.Color(0, 90, 40));
ruban.show();
tete = (tete + 1) % 16;
}
// Les timing WS2812 sont generes par timers/DMA Mbed :
// fiables meme quand le M7 est charge ailleurs.