Par Matthieu POUPIN & Marceau GUIGUI – Option Culture Maker, Eirlab / ENSEIRB-MATMECA, 2025
Contenus de la page
Introduction
L’inspiration de ce projet vient de La Ruche, l’association de lights et DJing de l’école. On voulait quelque chose d’original, interactif, que le public peut contrôler lui-même depuis son téléphone pendant une soirée. On a finalement atterri sur quelque chose qu’on n’avait jamais vu suspendu à un pont de lumière : un panneau LED matriciel contrôlé par Wi-Fi.
Le principe est simple : 1 024 LEDs RGB organisées en 4 dalles 16×16, accrochées à une structure motorisée fixée sur le pont de lumière, et un ESP32-S3 qui gère tout via un réseau Wi-Fi local : on se connecte au panneau comme à une box, on ouvre un navigateur, et on peut afficher du texte, choisir parmi 31 animations ou dessiner pixel par pixel en temps réel.
Le projet a été réalisé dans le cadre de l’option Culture Maker à l’Eirlab. Budget total : environ 150-160 €, dont une bonne moitié part dans la mécanique.
Étape 1 : Le matériel
Électronique
| Composant | Qté | Notes |
|---|---|---|
| ESP32-S3-N16R8 | 1 | Le cerveau du projet. Wi-Fi intégré, USB natif, 16 Mo de flash. |
| Dalles LED WS2812B 16×16 | 4 | LEDs adressables individuellement, format carré. |
| Carte Megatronics v3.3 | 1 | Récupération : gère les moteurs via Marlin. Trouvable sur les imprimantes 3D. |
| Alimentation 19,5 V (transfo PC modifié) | 1 | Récupération : Embout modifié pour s’adapter à la Megatronics. |
| Régulateur buck XL1509 (module step-down) | 1 | 19,5 V -> 5 V, alimente le pin 5V IN de l’ESP32. |
| Level shifter BSS138 4 canaux | 1 | Conversion logique 3,3 V <-> 5 V entre l’ESP32 et la Megatronics. ~2 €. |
| Fils, connecteurs, Perfboard | — |
Mécanique
La structure s’inspire d’une imprimante 3D cartésienne. Elle permet deux mouvements indépendants pour repositionner le panneau dans l’espace.
| Composant | Qté | Prix unitaire |
|---|---|---|
| Supports d’arbre SH16/SK16 | 4 | 6,11 € |
| Supports d’arbre SH8/SK8 | 4 | 4,26 € |
| Roulements linéaires SC16UU (∅16 mm) | 4 | 15,27 € |
| Roulements linéaires SC8UU (∅8 mm) | 2 | 4,95 € |
| Arbre de précision 16 mm h6 — 500 mm | 2 | 9,64 € |
| Arbre de précision 8 mm h6 — 500 mm | 2 | 5,91 € |
| Tige filetée trapézoïdale TR10×4P2 — 500 mm | 2 | 5,85 € |
| Écrou trapézoïdal 10×4P2 bronze/alu | 2 | 31,63 € |
| Accouplement flexible D20L25 (5/10 mm) | 2 | 6,60 € |
| Courroie GT2 ouverte 6 mm (~1 000 mm) | 4 | 7,15 € |
| Poulie GT2 20 dents (alésage 5 mm) | 2 | 2,27 € |
| Moteurs pas-à-pas 42SH0034D (NEMA 17) | 2 | Récupération (~10 € sinon) |
| Pièces imprimées PLA | — | Fichiers STL dans le dépôt GitHub |
| Profilés aluminium + visserie | — | Renforcement de la structure |
Outils nécessaires
- Imprimante 3D (PLA)
- Fer à souder
- Multimètre
- VSCode + extension PlatformIO
Étape 2 : La structure mécanique
La structure est pensée pour s’accrocher à un pont de lumière standard. Elle reprend le principe d’une imprimante 3D : deux axes de déplacement indépendants permettent de repositionner le panneau sans rien décrocher.
Axe vertical (Y) : un moteur NEMA 17 entraîne une tige filetée trapézoïdale TR10×4P2. Une deuxième tige, entraînée par courroie, assure la synchronisation. L’écrou bronze solidaire du chariot monte ou descend quand la tige tourne. C’est lent, précis, et irréversible sans moteur, ce qui permet de maintenir une position sans consommer de courant.
Axe horizontal (X) : le deuxième moteur déplace un chariot sur des arbres de précision 16 mm via courroie GT2. Le panneau peut translater latéralement sur toute la largeur de la structure.
Les pièces de liaison sont imprimées en PLA (BambuLab X1 Carbon ou Prusa Core One à Eirlab). Les fichiers OnShape et STL sont disponibles dans le dépôt GitHub.


Étape 3 — Le câblage
Le 19,5 V alimente un régulateur buck XL1509 qui abaisse la tension à 5 V. Ce 5 V est injecté sur le pin 5V IN de l’ESP32-S3, qui régule lui-même en interne vers 3,3 V. Les quatre panneaux WS2812B sont alimentés depuis ce 3,3 V de l’ESP : ils tolèrent cette tension en pratique, et FastLED, la bibliothèque utilisée dans le code pour la gestion des LEDs utilisées limite le courant total à 500 mA (au cas où). Les moteurs sont alimentés directement en 19,5 V par la Megatronics.


Les quatre panneaux WS2812B sont chaînés en série : un seul fil de données part du GPIO 5 de l’ESP, traverse les panneaux un par un. Il est important d’avoir un masse commune entre l’ESP, les panneaux et la Megatronics (sans ça, le signal data est interprété de manière aléatoire).
Étape 4 — Le firmware
Installation en 5 minutes
- Installer VSCode + l’extension PlatformIO
- Cloner le dépôt :
git clone https://github.com/LaRuche-ENSEIRB/la-ruche-matrix - Ouvrir le dossier dans VSCode
- Brancher l’ESP32-S3 en USB-C (modèle N16R8 recommandé pour la RAM)
- Dans PlatformIO : cliquer sur Upload (environnement
esp32dev)
PlatformIO télécharge les dépendances, compile et flashe automatiquement.
Comment c’est organisé
Le code tient en deux fichiers principaux. src/main.cpp gère l’infrastructure : serveur web embarqué, rendu du texte défilant, persistance des réglages, et deux tâches qui tournent en parallèle sur les deux cœurs de l’ESP32. include/effects.h contient les 31 animations : chaque effet est une fonction indépendante qui écrit dans un tableau de pixels. Ajouter un effet revient à écrire une nouvelle fonction et l’enregistrer dans un tableau.
Deux cœurs, deux tâches
L’ESP32 a deux cœurs : le Wi-Fi répond aux requêtes sur le cœur 0, pendant que les LEDs calculent et s’affichent sur le cœur 1. Un mutex (verrou logiciel) protège les buffers partagés. Sans ça, on aurait des corruptions visuelles aléatoires.
Le pipeline d’image
Entre le calcul d’un effet et l’affichage physique, le signal passe par trois étapes. Cette séparation permet de changer un effet sans toucher au rendu du texte, et de gérer le câblage en serpentin des panneaux sans que les effets aient à s’en préoccuper.
Les topologies
Sans recompiler, depuis l’interface web, on peut passer entre quatre configurations. C’est possible parce que la résolution (matW, matH) et le nombre de LEDs actives sont des variables globales recalculées à la volée quand les effets, le site web, ou autre en a besoin. Le choix est mémorisé dans la flash de l’ESP et restauré au prochain démarrage.
| Topologie | Résolution | Panneaux |
|---|---|---|
| 1×1 | 16×16 px | 1 panneau |
| 1×2 | 32×16 px | 2 panneaux côte à côte |
| 1×4 | 64×16 px | 4 panneaux en bande |
| 2×2 | 32×32 px | 4 panneaux en carré |
Étape 5 : Première utilisation
Connexion
- Allumer le panneau
- Sur le téléphone : Wi-Fi → se connecter à La-Ruche-Matrix (il y’a un mot de passe qui ne sera pas divulguée ici)
- Ouvrir un navigateur et aller sur
192.168.4.1
L’interface s’affiche. Elle fonctionne sur tous les navigateurs mobile.

Ce qu’on peut faire
- Texte défilant : on tape un message, on choisit une police parmi 7 (du pixel art minuscule au grand sans-serif), on envoie. La couleur du texte s’ajuste automatiquement selon la teinte choisie.
- Dessin libre : un canvas tactile permet de dessiner pixel par pixel directement sur le panneau, avec un crayon, une gomme et un bouton pour afficher le logo de La Ruche.
- 31 animations : de la pluie Matrix au couloir de Doom, en passant par Pac-Man, le Jeu de la Vie, Pong, un cube 3D en rotation, un visualiseur audio. Chaque animation réagit à la teinte, la vitesse et la luminosité choisies. Certaines réagissent aussi au son via un microphone MAX9814.
- Déplacement du panneau : un D-pad tactile envoie des commandes de mouvement, avec un bouton d’arrêt d’urgence.
- Mode automatique : le panneau change d’animation et de police toutes les 15 secondes tout seul.
- Visualisation live : un toggle affiche dans le navigateur ce qui est actuellement affiché sur le panneau, en temps réel. C’est surtout pratique pour les régisseurs qui se situent généralement derrière le panneau.
Étape 6 : Aller plus loin
Ajouter ses propres animations
C’est la modification la plus accessible. Dans effects.h, toutes les animations suivent le même modèle :
void monEffet() {
for (uint8_t y = 0; y < MATRIX_H; y++)
for (uint8_t x = 0; x < MATRIX_W; x++)
_px(x, y) = CHSV(COULEUR_HUE + x * 4, 255, 200);
}
_px(x, y) écrit un pixel en coordonnées logiques. COULEUR_HUE est la teinte choisie par l’utilisateur. Comme dit précédemment, MATRIX_W et MATRIX_H s’adaptent automatiquement à la topologie active. Il suffit ensuite d’ajouter la fonction dans _table[], son nom dans _names[], et d’incrémenter COUNT, ce qui fait en sorte que l’interface l’affiche automatiquement.
Contrôle des moteurs via la Megatronics
La Megatronics v3.3 embarque un ATmega2560 et des drivers DRV8825. On y flashe Marlin, et l’ESP32 lui envoie du G-code (des codes géométrique où l’on spécifie sur le port receveur de la carte le mode de déplacement, et la direction dans la plan spatial 3D, ainsi que la vitesse) en UART. Marlin gère nativement l’accélération et les profils de mouvement. On délègue alors complètement au firmware Marlin nativement, via le fichier de configuration disponible sur le site de Marlin (marlinfw.org)

L’ESP32-S3 communique en 3,3 V et l’ATmega2560 en 5 V : un module level shifter BSS138 4 canaux est indispensable entre les deux pour qu’entre les deux, un niveau logique haut ou bas soit compris de la même manière, et sans griller complètement l’ESP.
Dans Configuration.h de Marlin, on active le second port série :
#define SERIAL_PORT 0 // USB natif ATmega
#define SERIAL_PORT_2 3 // Serial3 → ESP32
#define BAUDRATE_2 115200
Les déplacements se font en mode relatif (G91) pour ne jamais avoir à connaître la position absolue. Un bouton ARRÊT D’URGENCE envoie M410 pour couper le mouvement immédiatement.
snprintf(buf, sizeof(buf), "G91\nG1 Z%.1f X%.1f F%d\nG90", dz, dx, feedrate);
Serial1.println(buf);
Remarque : pour les yeux les plus attentifs, on peut voir que le G-code contrôle l’axe Z et non Y : Le driver et le moteur de l’axe Y sont sur le slot Z de la carte, par le fait que cette carte de récupération (comme beaucoup qu’on a pu testé) présentait des emplacements défectueux.
Résultat
Le projet est open source. Le code, les fichiers CAO et la BOM complète sont disponibles sur GitHub.
Matthieu POUPIN & Marceau GUIGUI — La Ruche @ ENSEIRB-MATMECA, Eirlab, 2025