Conception du motif phyllotactique
Le motif phyllotactique est généré en plaçant des points le long d’une ligne radiale et en les faisant tourner d’un multiple du nombre d’or (≈1.6180339887). Le code Processing fourni montre la boucle qui calcule la fraction f = i / float(total), l’angle a = i * 1.6180339887 et la distance proportionnelle au rayon extérieur. Cette approche produit une distribution de points similaire à celle d’un tournesol, ce qui constitue la base géométrique du dispositif.
Après génération, l’auteur applique une tessellation de Voronoi pour transformer chaque point en une cellule polygonale. La découpe de chaque cellule, puis la création d’un trou central pour accueillir un LED, sont réalisées avec CadQuery. Le script CadQuery montre la création d’un volume négatif, son extrusion, puis la soustraction du volume de chaque cellule et du trou LED. Cette méthode garantit que chaque LED est centré dans une cavité adaptée, tout en conservant la forme globale du motif.
float[][] points = new float[numCells + numOuter + numInner][2];
float outerRadius = width / 2;
final int total = numCells + numInner + numOuter;
for (int i = 0; i < total; i++) {
float f = i / float(total);
float a = i * 1.6180339887;
float distance = f * outerRadius;
float x = -cos(a * TWO_PI) * distance;
float y = sin(a * TWO_PI) * distance;
points[i][0] = x;
points[i][1] = y;
}Réalisation matérielle et chaîne de fabrication
Le dispositif final comporte 89 LEDs adressables RGB (NeoPixel) montées dans les cellules découpées. Le contrôleur choisi est une carte STM32 « blackpill », qui offre un support matériel du point flottant et des instructions DSP ARM, indispensables pour le traitement audio en temps réel. Un microphone numérique I2S INMP441 est intégré sur une breadboard, puis migré vers un circuit imprimé dédié afin de réduire le bruit de commutation.
Les modèles 3D générés par CadQuery sont exportés au format STEP, puis importés dans FreeCAD pour ajouter des trous de vis et créer une face fine en papier mulberry. Cette face diffuse la lumière de façon organique. La découpe en quatre quadrants permet l’impression sur un plateau d’imprimante 3D standard, chaque quadrant étant assemblé puis collé sur la face en papier. Le passage du prototype sur perfboard à un PCB dédié a éliminé les scintillements liés aux mouvements du boîtier.
Implémentation logicielle et réactivité audio
Le firmware utilise le driver NeoPixel via SPI et un tableau de positions pré‑calculées (led_positions) pour chaque LED, ce qui permet d’écrire des effets similaires à des shaders fragmentaires. Le fragment présenté calcule la distance radiale r et l’angle theta, puis applique une fonction sinusoïdale pour moduler la luminosité en fonction du temps (seconds).
void radial_spirals(LEDBuffer leds) {
for (int i = 0; i < NUM_LEDS; i++) {
float x = led_positions[i][0];
float y = led_positions[i][1];
float r = sqrtf(x*x + y*y);
float theta = atan2f(y, x);
float spiral = sinf(theta*2.0f + r*5.0f - seconds*2.0f);
float brightness = (spiral + 1.0f) * 0.5f;
uint8_t level = (uint8_t)(brightness * 255.0f);
leds[i] = rgb(level, 0, 0);
}
}Pour la réactivité audio, le micro INMP441 fournit un flux I2S numérique traité par la bibliothèque CMSIS‑DSP. Un FFT à plusieurs bandes extrait l’énergie dans différentes plages de fréquences, puis un contrôle de gain automatique ajuste la dynamique. Les valeurs spectrales alimentent les paramètres du shader, créant ainsi des motifs lumineux qui évoluent en fonction du contenu sonore. La solution reste sensible aux limites de la puissance de calcul du microcontrôleur : le nombre de bandes FFT et la résolution temporelle sont compromis pour maintenir un taux de rafraîchissement visuel fluide.