Projet
Fabriquer une lumière de vélo qui réagit au freinage
AUTHOR

DATE
2026-10-07MIS À JOUR LE 08/10/2026
TYPE
ProjetSTATUS
EN COURSTECH_STACK
ESP32-C3, MPU-6500, Arduino, Node.js
Fabriquer une lumière de vélo qui réagit au freinage
J'ai commencé à travailler sur une lumière de vélo qui s'allume lorsque je freine, sans avoir besoin de la relier aux leviers de frein. Pour ça, j'utilise un capteur qui mesure les mouvements du vélo et un ESP32 qui pilote un anneau de LED en fonction de la décélération. Les petits ralentissements restent sous le seuil de détection et ne sont donc pas pris en compte.
Je voulais éviter d'ajouter un contact sur les leviers ou de tirer des fils jusqu'aux freins, donc tout le montage tient dans un boîtier fixé au vélo, avec sa propre batterie. Le principe paraît assez simple, mais le capteur ne mesure pas uniquement les freinages. Il récupère aussi les vibrations, le pédalage, les chocs et les mouvements du boîtier, qu'il faut réussir à distinguer pour éviter que la lumière réagisse n'importe quand.
Anneau de LED rouges allumé sur le boîtier du prototype
Le prototype avec l'anneau de LED allumé.
Le montage
J'utilise un ESP32-C3 Supermini pour lire les mesures d'un MPU-6500 et commander les LED. Ce capteur regroupe un accéléromètre, qui mesure les accélérations, et un gyroscope, qui permet de repérer les rotations et certains mouvements brusques.
La lumière est composée d'un anneau de 8 LED WS2812B que je commande en rouge. Pour l'alimentation, j'ai une batterie LiPo de 500 mAh, un module de charge TP4056 protégé, un survolteur TPS61023 pour obtenir du 5 V et un interrupteur.
Le firmware est développé avec Arduino et lit le capteur à 100 Hz, avec un test des LED au démarrage pour vérifier qu'elles fonctionnent.
Circuit du prototype dans son boîtier, relié à la batterie et à l'anneau de LED
Le boîtier ouvert avec l'ESP32, le capteur et les modules d'alimentation.
Enregistrer les trajets pour pouvoir les rejouer
Pour régler la détection, je ne voulais pas devoir refaire une sortie à chaque modification du filtre ou du seuil. J'ai donc prévu un mode acquisition dans lequel l'ESP32 crée son propre réseau WiFi, auquel je peux me connecter pour ouvrir une page web et démarrer ou arrêter l'enregistrement.
Les mesures sont sauvegardées directement dans la mémoire de l'ESP32, qui permet de conserver environ 25 minutes de trajet. Je peux ensuite les récupérer sur mon ordinateur et tester différents réglages sur les mêmes données.
C'est pour ça que j'ai développé BrakeLab, une application locale en Node.js qui permet d'importer les enregistrements depuis l'ESP32 ou depuis un fichier, puis de les afficher sur des graphes. Comme les courbes ne suffisent pas toujours à comprendre ce qui s'est passé pendant la sortie, j'y ajoute aussi un enregistrement audio que je cale sur les données pour retrouver les vrais freinages et les marquer manuellement. Dans cet enregistrement j'ai indiqué à l'oral les passages où je freinais.
Vue d'ensemble de l'application de calibration BrakeLab
L'interface de BrakeLab pour consulter les enregistrements et régler la détection.
Une fois ces repères placés, l'application peut comparer les réglages en comptant les freinages détectés, les fausses alarmes et le délai avant que la lumière réagisse. Cela me permet de voir ce qu'une modification améliore ou dégrade sans comparer deux sorties qui n'auraient pas eu les mêmes freinages ni les mêmes vibrations.
Distinguer un freinage d'une vibration
Au démarrage, le firmware mesure le zéro du capteur pour avoir une référence, puis le recale lentement pendant le trajet. Je filtre ensuite les mesures pour atténuer les vibrations et éviter de déclencher la lumière sur un mouvement qui n'a rien à voir avec un freinage.
Dans BrakeLab, je peux comparer le signal sans filtre avec une moyenne glissante, une moyenne exponentielle (EMA) ou un filtre Butterworth. Pour le moment, j'ai retenu le Butterworth à 2 Hz, qui atténue les vibrations et le pédalage tout en conservant les freinages sur le premier enregistrement.
Réponse fréquentielle normalisée d'un filtre passe-bas Butterworth du premier ordre
Cette courbe illustre le principe d'un filtre passe-bas Butterworth, qui atténue progressivement les fréquences au-delà de sa fréquence de coupure. Il s'agit d'un exemple normalisé du premier ordre, pas de la courbe exacte du filtre à 2 Hz utilisé ici ni de mesures du vélo. « Gain » indique l'atténuation et « Cutoff frequency » la fréquence de coupure. Image d'Omegatron, Wikimedia Commons, sous licence CC BY-SA 3.0, sans modification de contenu.
Après le filtrage, la décélération doit dépasser un seuil pendant une durée minimale pour que la lumière réagisse. Les petites décélérations restent en dessous et sont ignorées, tandis qu'un freinage suffisamment fort fait augmenter la luminosité. La durée minimale évite également qu'une variation très courte soit prise pour un freinage, comme un nid de poule ou autre.
J'ai aussi ajouté un recalage forcé du zéro si un prétendu freinage dure anormalement longtemps. Pour les chocs, comme une bordure ou un trou, je m'appuie sur le gyroscope afin de rejeter les mouvements brusques qui pourraient déclencher la lumière à tort.
Ce que la première sortie a montré
Le premier enregistrement dure 11 minutes et m'a déjà permis de retrouver l'orientation du capteur. Dans mon montage, l'avant du vélo correspond à l'axe −Z, ce qu'il fallait vérifier avant de régler le reste pour être sûr de regarder les mouvements dans la bonne direction.
À l'aide de l'audio, j'ai marqué 4 freinages sur ce trajet. Ils sont détectés avec les différentes versions testées, mais le nombre de fausses alarmes varie énormément. Au départ, j'en avais 78, ce qui aurait fait réagir la lumière bien trop souvent, puis 20 avec les réglages par défaut. Après correction du zéro et ajustement des paramètres, il en restait 4.
Sur ce trajet, j'ai donc pu conserver la détection des quatre freinages tout en supprimant une grande partie des déclenchements inutiles.
Zoom BrakeLab sur un freinage avec décélération brute, décélération filtrée et seuil
Le signal brut est en gris et le signal filtré en bleu. La zone verte marque le freinage tagué, tandis que la ligne rouge pointillée indique le seuil de détection.
Les réglages actuels sont un filtre Butterworth à 2 Hz, un seuil de 0,11 g, une durée minimale de 300 ms et un rejet des chocs à 80 °/s. Ils restent provisoires, car quatre freinages sur une seule sortie ne suffisent pas à dire que le système est fiable dans toutes les situations.
Tester les réglages dans BrakeLab
L'application peut tester automatiquement des centaines de combinaisons de filtre, de seuil et de durée, puis comparer leurs scores avant d'exporter le fichier de réglages utilisé par le firmware. Je peux ainsi faire les ajustements sur l'ordinateur et transférer les paramètres retenus vers l'ESP32.
Le filtre intégré au capteur reste fixe, tandis que les réglages que je fais varier sont numériques pour que BrakeLab puisse rejouer le traitement du firmware. Un test automatique vérifie que les deux calculent exactement la même chose, sinon je risquerais de choisir des réglages qui donnent un bon résultat dans l'application mais se comportent différemment sur le vélo.