Etabli
← Retour aux leçons
Leçon · FND-14 · Machines à états · 3/4

Approfondir : coder et instrumenter sa machine

4 étapes·25 min·0/4 fait·quiz à réussir
voix

Ta machine tient sur une feuille — cette leçon la fait tenir dans la carte, et parler. Tu vas donner à chaque état ses gestes d'arrivée, remplacer les attentes sourdes par l'horloge — 800 ms de recul SANS —, tendre un filet sous l'état qui n'en sort jamais, et brancher le journal qui raconte, par transition, la vie intérieure du robot .

📖 Comprendre

1. L'entrée, le pendant, la sortie

Un état vit trois temps. L'ENTRÉE, une seule fois : les gestes d'arrivée — régler les du nouvel état, allumer sa d'annonce — et surtout NOTER L'INSTANT d'arrivée dans entreeEtat. Le PENDANT, à chaque tour de boucle : agir si besoin, et surveiller les flèches de sortie. La SORTIE, parfois : un geste d'adieu — éteindre un projecteur, couper un son — avant de céder la place.

Le bon endroit pour les gestes d'entrée existe déjà : changerEtat, passage obligé de tous les changements. Elle imprime la , note entreeEtat = (), écrit la boîte — et exécute les gestes d'arrivée du nouvel état. Résultat garanti par construction : l'entrée s'exécute UNE fois, jamais répétée à chaque tour ; et la boucle, elle, ne règle plus les en boucle — elle surveille.

2. Les états temporisés : millis, pas delay

L'enchaînement classique — RECULE pendant 800 ms, puis TOURNE pendant 600 ms, puis reprendre — appelle un (800)… et c'est le piège : pendant la sieste, le hurle dans le vide, le deuxième passe inaperçu, l'urgence attend. Un delay dans une branche endort TOUTE la machine : les états temporisés ne se codent jamais ainsi.

La bonne écriture découle de l'instant d'entrée noté par changerEtat : l'âge de l'état vaut () − entreeEtat. La branche RECULE surveille alors une flèche d'horloge — âge au-delà de 800 ms, direction TOURNE — exactement comme une flèche de . La boucle reste éveillée : pendant les 800 ms de recul, elle tourne environ 80 fois, et chacun de ces tours vérifie aussi le . L'attente n'est plus un sommeil, c'est une .

delay(500)0 ms…il compte, il ne fait RIEN d'autrependant delay : le monde continue, le processeur non

3. Le timeout : le filet de l'horloge

Chaque état doit répondre à une question dérangeante : et si ma condition de sortie n'arrivait JAMAIS ? Le la pose brutalement : dans SUIVRE, si la ligne disparaît — virage trop sec, trait effacé — la flèche « ligne retrouvée de l'autre côté » ne s'allume plus, et le robot avance tout droit, pour toujours. Un état sans issue de secours est une panne programmée.

Le filet s'appelle timeout : on mémorise l'instant du dernier contact avec — dernierContactLigne, remis à jour à chaque détection — et la branche SUIVRE surveille une flèche de plus : () − dernierContactLigne au-delà de 5 000 ms, direction RECHERCHE, où le robot pivote lentement sur place pour balayer le sol. Le timeout est une comme une autre, déclenchée par l'horloge au lieu d'un — et il se teste : soulève le robot, compte cinq secondes, la bascule doit tomber .

deux yeux sur le blanc → tout droitle tout-ou-rien corrige toujours APRÈS coup : d'où le zigzag

4. Le journal : l'historique raconte le comportement

Le journal obéit à une règle de sobriété : une ligne par — l'instant, le départ, l'arrivée — jamais une ligne par tour. À cent tours par seconde, imprimer à chaque tour noierait tout ; imprimer à chaque changement produit un récit : « 4200 : SUIVRE, puis RECULE », « 5000 : RECULE, puis TOURNE », « 5600 : TOURNE, puis SUIVRE ». Trois lignes, et l'épisode entier se relit : contact, recul, pivot, reprise.

L'historique est aussi un médecin : un état qui ne dure qu'une milliseconde est louche ; deux états qui s'échangent la balle dix fois par seconde — le ping-pong — trahissent un sans ; un état qui n'apparaît jamais révèle une flèche morte. Et la contre-épreuve absolue : chaque ligne imprimée doit correspondre à une flèche du diagramme. Une sans flèche sur la feuille, c'est un bug qui signe ses aveux.

🧮 Exemple guidé : 800 millisecondes de recul, à la loupe

Le pare-chocs du suiveur touche un plot à t = 4 200 ms. Le plan : RECULE pendant 800 ms, puis TOURNE pendant 600 ms, puis SUIVRE. Un tour de boucle dure 10 ms. Déroule les transitions à la milliseconde, journal compris — et compare avec la version delay.

  1. 1.t = 4 200 ms : contact — changerEtat(RECULE) : journal « 4200 : SUIVRE, puis RECULE », entreeEtat = 4200, moteurs inversés — une seule fois, à l'entrée.
  2. 2.t = 4 210, 4 220, … : la branche RECULE calcule l'âge : 4 210 − 4 200 = 10 ms, puis 20, puis 30… sous les 800 : on reste. Et chaque tour vérifie AUSSI le fin de course — la boucle n'a jamais fermé les yeux.
  3. 3.t = 5 000 ms : âge = 800 — flèche d'horloge : « 5000 : RECULE, puis TOURNE », entreeEtat = 5000, pivot enclenché. Quatre-vingts tours de RECULE, zéro delay.
  4. 4.t = 5 600 ms : âge = 600 — « 5600 : TOURNE, puis SUIVRE ». Le robot rattrape la ligne ; dernierContactLigne repart à jour, le filet du timeout est réarmé.
  5. 5.Relis le journal : trois lignes, trois instants, toute l'histoire. Un delay(800) aurait produit le même ballet vu de loin — mais sourd au fin de course, et sans une ligne pour le raconter.

L'instant d'entrée noté par changerEtat a transformé deux attentes en deux flèches d'horloge : la machine a dansé son enchaînement sans jamais dormir, et le journal en garde la partition exacte, datée à la milliseconde.

🛠 Pratiquer sur l'établi

  1. 01Coder la machine : d'état, un switch, des cas

    Monte le squelette au propre : des constantes nommées pour SUIVRE, RECULE, TOURNE et RECHERCHE, la boîte « etat », l'aiguillage avec un cas par état, et changerEtat — l'unique porte d'écriture de la boîte. Chaque cas s'écrit en deux temps : agir, puis surveiller ses flèches. La scène de la boîte te rappelle qui porte toute la machine : une seule variable, lisible à tout instant.

    sur l'établi
    écriredistance18liresi distance < 20→ STOPmême boîte, contenu neuf à chaque mesure — la décision suit

    📖 Termes de cette étape

Objectifs

  • +Coder proprement avec switch
  • +Tracer les changements d'état
  • +Gérer les timeouts
🧪 S'entraîner dans le bac à sable

Quiz de validation

À réussir pour valider la leçon

Réponds de mémoire, sans remonter la page : c'est l'effort de rappel qui grave le cours. Les trois bonnes réponses valident la leçon.

1. RECULE doit durer 800 ms. Comment écrire l'attente ?

2. Que fait-on à l'ENTRÉE d'un état, et une seule fois ?

3. Quand le journal doit-il écrire une ligne ?

🧠 Ce qu'il faut retenir

  • 1.switch(etat) + un cas par état : le squelette lisible de tout comportement.
  • 2.Le journal des raconte la vie du robot mieux que tout débogueur.
  • 3.Un timeout est une comme une autre — déclenchée par l'horloge.