Tous les projets

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

TimerRôleRéglage
TIM1PWM des deux moteursenviron 10 kHz, rapport cyclique de 0 à 99 %
TIM2Déclenche la conversion ADC du capteur infrarougeenviron 10 fois par seconde, sans intervention du processeur
TIM3Base de temps pour chronométrer l'écho ultrasonenviron 1 µs par pas
TIM4Interruption périodique : mesure ultrason puis décisionenviron 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 cm
c

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;
c

Limites

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

CoucheTechnologie
CibleSTM32F4, 84 MHz
LangageC, HAL STM32
PériphériquesTIM1 (PWM), TIM2 (déclenchement ADC), TIM3 (chronométrage), TIM4 (interruption périodique), ADC 12 bits
CapteursCapteur à ultrasons (Trig et Echo), capteur infrarouge analogique
OutilsSTM32CubeIDE, STM32CubeMX

Projets proches

Systèmes embarquésCybersécurité

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

Systèmes embarqués

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

Systèmes embarqués

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é