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.
| Fonction | Rô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
-
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.

Planning : scénario 1, puis scénario 2, puis validation et rendu final. -
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 ?

Mode automatique : lire les capteurs, puis avancer, tourner ou s'arrêter. 
Mode manuel : sécurité demi-tour, puis traitement de chaque touche. -
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 nitrovoid 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; }
-
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()Vitesse Moteur gauche Moteur droit Durée 1 10 2,5 2,5 s ✓ 3 30 7,5 2,5 s ✓ 5 50 12,5 2,5 s ✓
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.
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.
