Rover autonome sur STM32 : évitement d'obstacles en bare-metal
Rover à deux moteurs piloté par un STM32F4, sans RTOS. Des timers matériels cadencent la mesure des distances (ultrason et infrarouge) et une machine à états décide d'avancer, de ralentir ou de tourner.
Contexte
Projet de Licence à l'UBS Lorient (L3 Systèmes Numériques, Informatique Embarquée et Objets Connectés), en mars 2025. Le rover a deux moteurs à courant continu et doit avancer seul en évitant les obstacles, à l'aide d'un capteur à ultrasons et d'un capteur infrarouge.
Le programme est écrit en C sur un STM32F4, en bare-metal : pas de système d'exploitation temps réel. La boucle principale est vide. Tout le travail est fait dans des interruptions, déclenchées par des timers matériels.
Quatre timers, quatre rôles
| Timer | Rôle | Réglage |
|---|---|---|
| TIM1 | PWM des deux moteurs | environ 10 kHz, rapport cyclique de 0 à 99 % |
| TIM2 | Déclenche la conversion ADC du capteur infrarouge | environ 10 fois par seconde, sans intervention du processeur |
| TIM3 | Base de temps pour chronométrer l'écho ultrason | environ 1 µs par pas |
| TIM4 | Interruption périodique : mesure ultrason puis décision | environ 1 fois par seconde |
Le capteur infrarouge est lu par l'ADC 12 bits, déclenché par TIM2. Le callback de fin de conversion convertit la tension en distance. Le processeur ne fait donc aucune attente active pour ce capteur.
Mesurer une distance par ultrason
Le programme envoie une impulsion de 15 µs sur la broche Trig, puis chronomètre la durée de l'écho avec TIM3. La distance vient de la vitesse du son : 0,0343 cm par microseconde, divisée par deux pour l'aller-retour.
dist = (fin - debut) * 0.0343 / 2; // durée de l'écho en µs, distance en cmc
La décision : une machine à états non bloquante
À chaque interruption de TIM4, le programme mesure la distance et choisit une action :
- au-delà de 80 cm, le rover avance vite ;
- entre 15 et 80 cm, il ralentit proportionnellement à la distance, avec une vitesse minimale pour ne pas caler ;
- sous 15 cm à l'ultrason, ou sous 10 cm à l'infrarouge, il s'arrête, attend 500 ms, puis tourne à droite pendant une seconde.
La manœuvre d'évitement est une machine à états. Elle ne contient aucun HAL_Delay : chaque étape compare le temps écoulé avec HAL_GetTick() et passe à l'étape suivante lors d'une interruption ultérieure. Une attente dans une interruption bloquerait tout le reste du programme.
case 0: arreter(); timenow = HAL_GetTick(); etat = 1; break;
case 1: if (HAL_GetTick() - timenow > 500) etat = 2; break;
case 2: tourner(15);
if (HAL_GetTick() - timenow > 1500) etat = 0; break;cLimites
En relisant le code, trois points seraient à reprendre :
- La mesure ultrason attend l'écho à l'intérieur de l'interruption, jusqu'à 40 ms d'attente active. Une capture d'entrée (input capture) sur un timer mesurerait l'écho sans bloquer.
- Avec le réglage de TIM4, la décision n'est prise qu'environ une fois par seconde. C'est lent pour éviter un obstacle, et les délais de 500 ms de la machine à états sont en pratique arrondis à la seconde.
- La liaison UART est configurée à 115 200 bauds mais n'est pas utilisée : il n'y a aucune remontée de mesures pour le débogage.
Stack
| Couche | Technologie |
|---|---|
| Cible | STM32F4, 84 MHz |
| Langage | C, HAL STM32 |
| Périphériques | TIM1 (PWM), TIM2 (déclenchement ADC), TIM3 (chronométrage), TIM4 (interruption périodique), ADC 12 bits |
| Capteurs | Capteur à ultrasons (Trig et Echo), capteur infrarouge analogique |
| Outils | STM32CubeIDE, STM32CubeMX |
Projets proches
Analyse et injection sur bus CAN automobile
Reverse engineering des trames CAN d'une maquette véhicule, cartographie des bus, décodage des signaux moteur/éclairage/confort, base DBC et DLL d'injection en C simulant un système ADAS.
2026Bus CANReverse EngineeringAutomotiveMuxTrace
Conception numérique en VHDL, de la simulation au FPGA Basys 3
En licence, une boîte à musique et le jeu de la vie décrits en VHDL et simulés sous ModelSim. En master, le passage sur FPGA Xilinx avec Vivado et une carte Basys 3, jusqu'à la conception complète d'un processeur 16 bits.
2026VHDLFPGAVivadoBasys 3
Distribution Linux embarquée avec Yocto pour une box domotique
Construction d'une distribution Linux sur mesure avec Yocto (Poky) pour la carte STM32MP135F-DK, avec une layer dédiée, une recette image systemd, un SDK et une application C qui lit un capteur I²C.
2026YoctoPokyBitBakeLinux embarqué