Système Embarqué & Asservissement

Robot Segway Auto-Équilibré

Conception mécanique, électronique et algorithmique d'un robot pendule inversé auto-équilibré à deux roues coaxiales motorisées.

Matériel : Arduino, MPU6050
Fréquence : 200 Hz (Kalman)
Consigne : \(7{,}73^{\circ}\) (offset gravitaire)
Contrôle : PID + Kalman 1D

1. Présentation & Objectifs du Projet

Un robot pendule inversé à deux roues est un système physiquement instable et sous-actionné. Sans asservissement actif, toute déviation par rapport à la verticale entraîne immédiatement le basculement et la chute du robot.

L'objectif de ce projet est de concevoir un prototype fonctionnel capable de mesurer son angle d'inclinaison en temps réel, de filtrer le bruit des capteurs via un Filtre de Kalman 1D tournant à 200 Hz, et de commander la vitesse des moteurs à l'aide d'un régulateur PID afin de maintenir le robot en équilibre parfait autour de son point d'équilibre dynamique.

2. Démonstrations & Visualisations

Démonstration du robot Segway en équilibre, GIF original

Auto-équilibrage actif & stabilisation dynamique en position debout.

Télémétrie & Comparaison : Angle Brut vs Angle Filtré Kalman

Télémétrie source comparant l'angle brut et l'angle filtré par Kalman

Le graphique de télémétrie ci-dessus illustre la mesure brute provenant de l'accéléromètre MPU6050 (fortement bruitée en bleu) et la courbe estimée par le Filtre de Kalman 1D (courbe lissée en orange). Le filtre élimine l'intégralité des vibrations sans introduire le moindre retard de phase dommageable.

3. Outils & Technologies Utilisés

Microcontrôleur : Arduino / C++
Capteur Inertiel : IMU MPU6050 (I2C)
Actionneurs : Moteurs CC + Drivers PWM
Fusion Capteurs : Filtre de Kalman 1D (200 Hz)
Asservissement : Régulateur PID
Architecture : Machine à états temps réel

4. Compétences Mobilisées

5. Étude Technique & Algorithmique

Équations du Filtre de Kalman 1D

Le code source prédit l'angle avec le gyroscope, puis le recale à l'aide de l'angle mesuré par l'accéléromètre :

\[\theta_{a,k}=\operatorname{atan2}(a_{x,k},a_{y,k}),\qquad \theta_k^{-}=\theta_{k-1}+\Delta t\,(\omega_k-b_{k-1})\]
\[r_k=\operatorname{wrap}(\theta_{a,k}-\theta_k^{-}),\quad S_k=P_{00,k}^{-}+R,\quad K_k=\begin{bmatrix}P_{00,k}^{-}/S_k\\P_{10,k}^{-}/S_k\end{bmatrix}\]
\[\theta_k=\operatorname{wrap}(\theta_k^{-}+K_{0,k}r_k),\qquad b_k=b_{k-1}+K_{1,k}r_k\]

Algorithme d'Asservissement & Offset Physique

En raison de l'asymétrie de la répartition des masses, l'angle d'équilibre a été réglé expérimentalement à \(\theta_{\mathrm{ref}}=7{,}73^{\circ}\).

Le correcteur utilise la vitesse gyroscopique filtrée pour le terme dérivé et limite la commande PWM :

\[e_k=\operatorname{wrap}(\theta_{\mathrm{ref}}-\theta_k),\qquad u_k=\operatorname{sat}\!\left(K_p e_k-K_d\dot{\theta}_k+I_k\right)\]
\[I_{k+1}=\operatorname{sat}\!\left(I_k+K_i e_k\Delta t\right),\qquad (K_p,K_i,K_d)=(125,2000,2)\]

L'échantillonnage nominal est \(200\,\mathrm{Hz}\), soit \(\Delta t\approx5\,\mathrm{ms}\). L'intégrale est bornée pour éviter son emballement lorsque la commande sature ; la coupure de sécurité intervient au-delà de \(45^{\circ}\).

Consulter le code source Arduino