Aller au contenu
← Tous les projets

Robot mobile line tracker

Programmer en C++ un robot à quatre roues piloté par une Raspberry Pi : il suit une ligne tout seul, ou se conduit au clavier avec cinq vitesses et un mode « nitro ».

Cadre
SAÉ Pilotage robot mobile · S1
Période
Déc. 2025 – janv. 2026
Équipe
Binôme avec Mathéo Rouquier
Mon rôle
Conception, code et tests
Robot mobile avec sa Raspberry Pi et son Sense Hat, posé près d'une ligne noire

En une phraseNous avons écrit le programme qui fait rouler un petit robot, soit en suivant automatiquement une ligne noire au sol, soit en le conduisant avec les touches Z, Q, S, D du clavier.

01L'objectif

Le programme devait gérer deux scénarios :

  • Mode automatique : suivre une ligne grâce à deux capteurs infrarouges et corriger la trajectoire à gauche ou à droite.
  • Mode manuel : piloter au clavier, choisir une vitesse parmi cinq, faire demi-tour automatiquement en cas de ligne noire, et activer un mode « nitro » qui double la vitesse.

Contraintes : affichage sur la matrice de LED du Sense Hat, interaction uniquement par le terminal, bibliothèques vues en TP.

⌁ Architecture
FonctionRôle
choixscenario()Menu : mode automatique, manuel ou quitter
modeautomatique()Boucle de suivi de ligne, vitesse régulée à 70
modemanuel()Lecture clavier non bloquante, sécurité capteurs, boîte de vitesses
avancer(v) / tournergauche(v) / tournerdroite(v) / arreter()Commande PWM des deux moteurs
demitour(v)Moteur gauche à v, droit à v/4 pendant 2,5 s
nitro(v, vBase, touche)Double appui sur Z : vitesse × 2, non cumulable

02Ma contribution, étape par étape

  1. 01Analyse

    Découpage en fonctions et planning

    Nous avons découpé le besoin en fonctions et réparti le travail sur quatre semaines, avec un rendu intermédiaire.

    Tableau du planning des séances sur quatre semaines
    Planning : scénario 1, puis scénario 2, puis validation et rendu final.
  2. 02Conception

    Des algorigrammes avant le code

    J'ai dessiné le fonctionnement de chaque mode sous forme d'algorigramme. Cela nous a permis de nous mettre d'accord sur la logique et de repérer les cas oubliés, par exemple : que faire si les deux capteurs voient du noir ?

    Algorigramme du mode automatique de suivi de ligne
    Mode automatique : lire les capteurs, puis avancer, tourner ou s'arrêter.
    Algorigramme du mode manuel avec gestion des touches
    Mode manuel : sécurité demi-tour, puis traitement de chaque touche.
  3. 03Réalisation

    Programmation en C++

    J'ai codé les fonctions de déplacement (moteurs commandés en PWM), la boîte de vitesses (touches 1 à 5) et l'affichage de la touche pressée sur la matrice de LED.

    ⌁ Extrait – fonction nitro
    void nitro(unsigned int &vitesse, unsigned int vitesseBase, char touche)
    {
      static char derniereTouche = '\0';   // mémorisées d'un appel à l'autre
      static bool dejaDouble = false;
    
      if (touche == 'z') {
        if (derniereTouche != 'z') {        // 1er appui : vitesse normale
          vitesse = vitesseBase;
          dejaDouble = false;
        } else if (!dejaDouble) {           // 2e appui consécutif : nitro
          vitesse = vitesseBase * 2;
          dejaDouble = true;
        }                                     // 3e appui : pas de cumul
      } else {
        dejaDouble = false;                 // autre touche : nitro désactivé
      }
      derniereTouche = touche;
    }
  4. 04Tests

    Tests unitaires puis validation

    Pour chacune des quatre fonctions principales, j'ai écrit cinq cas de test, par exemple « 3e appui sur Z : la vitesse ne doit plus changer », puis nous les avons tous validés sur le robot réel.

    ⌁ Validation de demitour()
    VitesseMoteur gaucheMoteur droitDurée
    1102,52,5 s ✓
    3307,52,5 s ✓
    55012,52,5 s ✓
2modes de pilotage
20cas de test validés
×2vitesse en mode nitro

03Pilotez le robot

Ce simulateur reprend exactement la logique de notre programme. Choisissez une vitesse, avancez avec Z… puis appuyez deux fois sur Z pour déclencher le nitro.

Simulateur · mode manuelclavier actif au survol
Vitesse0
Moteur G0
Moteur D0

04Une difficulté, et comment je l'ai résolue

Le problème : détecter un double appui

Le nitro devait s'activer seulement sur deux appuis consécutifs sur Z, ne pas se cumuler, et se désactiver dès qu'on change de vitesse ou de direction. Nos premières versions doublaient la vitesse à chaque appui.

La solution

J'ai mémorisé la dernière touche pressée et un indicateur « déjà doublé » dans des variables persistantes (static). La fonction sait ainsi si l'appui précédent était aussi un Z et si le nitro est déjà actif. Les cinq tests de la fonction ont ensuite été validés.

05Ce que j'ai appris

Compétences techniques

  • Structurer un programme C++ en fonctions réutilisables
  • Piloter des moteurs en PWM et lire des capteurs (GPIO) sous Linux
  • Concevoir avec des algorigrammes avant de coder
  • Écrire des jeux de test précis

Compétences transversales

  • Se répartir le travail en binôme et fusionner nos codes
  • Respecter un planning avec rendu intermédiaire
  • Proposer des améliorations à partir des limites constatées

Ce qui m'a marqué

La première fois que le robot a réagi au clavier, c'était très motivant : la preuve que notre programme fonctionnait. Si je refaisais le projet, je rendrais le pilotage plus intuitif : le robot avancerait tant qu'on maintient la touche, au lieu d'appuyer plusieurs fois.

  • C++
  • Raspberry Pi
  • Linux
  • GPIO / PWM
  • Algorigrammes
  • Tests unitaires
  • Binôme
  • Gestion du temps
  • Esprit d'amélioration