Nous sommes pratiquement arrivés à la fin de l'utilisation de la palette commune.
Nous allons maintenant aborder les blocs et les concepts qui permettent l'élaboration de programmes plus sophistiqués que ceux déjà vus (je veux parler des programmes qui consistent à faire évoluer vos robots par de simples marches avant ou arrière, ou de trajectoires circulaires).
Refaites-le à nouveau, …
Rejoignons à nouveau BONG. Supposons encore une fois qu'il dispose d'une paire d'oreilles et qu'il peut comprendre les ordres verbaux.
Je vais lui adresser une série d'instructions inhabituelles:
LEO

(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
LEO

(BONG avance à nouveau de 3 rotations, s'arrête puis tourne à droite…)
LEO

(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
LEO

(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
A votre avis, où se trouve maintenant BONG?
C'est exact - , il est revenu à son point de départ.
Le chemin qu'il a suivi est celui d'un carré et il attend à nouveau mes instructions.
Si vous deviez écrire un programme NXT-G pour que BONG se déplace en suivant un tracé de forme carrée, vous auriez probablement placé 8 blocs "DEPLACER" sur le rayon de séquence, tels que présentés ci-dessous, et configuré chaque bloc DEPLACER avec les 2 mêmes propriétés. Exact?
Un bloc DEPLACER qui entraîne les moteurs B et C durant 3 rotations, et un 2ème bloc DEPLACER pour exécuter un virage à droite. Cette paire de blocs étant ensuite répétée 3 fois, soit un total de 8 blocs.

Bien, cela aurait sans doute marché. Mais c'est aussi dépenser beaucoup d'énergie pour que BONG suive un tracé en forme de carré pour revenir finalement à sa position de départ. Y aurait-il une meilleure solution?
Essayons d'améliorer le pseudo-code:
LEO

(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
LEO

(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
(BONG avance de 3 rotations, s'arrête puis tourne à droite…)
Beaucoup mieux! J'ai seulement lancé 2 instructions: une pour la marche, une autre pour la répétition (3 fois), et j'ai économisé ma voix! Cela n'a pas empêché BONG d'exécuter parfaitement le travail demandé.
Dans le pseudo-code j'ai donné à BONG un ordre et mis une condition.
Cette condition est tout simplement une règle que doit suivre BONG. Dans notre cas cette règle consiste à répéter 3 fois ce couple d'instructions. Tant que BONG a connaissance de la règle et qu'il la suit, peu importe le nombre de répétitions; cela peut-être 1,100 ou plus.
Au lieu de lui demander de répéter 3 fois la règle, puis-je utiliser une condition différente? Oui, évidemment.
Voici quelques exemples:
LEO

LEO

LEO

C'est une autre façon de dire à BONG d'exécuter certaines instructions, et lui demander de les reproduire jusqu'à ce que "quelque chose survienne" (cela me rappelle la leçon n°6 …).
Et si BONG reproduit encore et encore ces instructions, on peut penser qu'il tourne en rond sur lui-même, qu'il boucle… C'est exactement ce qu'il fait: il BOUCLE sur lui même.
Et dans la vie de tous les jours, qu'est-ce une boucle? Ce peut-être un chemin circulaire, un objet qui tourne sur lui même, un geste répétitif. Et de plus, elle échappe à la notion de dimension, de quantité.
Si vous suivez un chemin circulaire, vous vous retrouverez forcément à votre point de départ. Une boucle de programmation est tout à fait semblable: elle tourne sur elle même, parfois indéfiniment jusqu'à ce que vous programmiez une sortie de boucle.
Et il se trouve que le logiciel NXT-G dispose d'un bloc spécialement conçu pour l'occasion: le bloc BOUCLE.

Pas très séduisant, ce bloc! Il est configuré dans la zone Contrôle sur Pour toujours.
Bien, maintenant chaque fois que j'introduirai à l'intérieur de cette boucle un bloc quelconque, ce dernier sera répété en permanence.
Prenons un exemple:
Je vais glisser à l'intérieur du bloc BOUCLE, un bloc DEPLACER ayant les caractéristiques suivantes: moteurs raccordés aux ports B et C, avec une rotation moteurs en marche avant.

Vous avez déjà remarqué que le bloc BOUCLE s'adapte automatiquement en s'élargissant pour recevoir le bloc DEPLACER. Il en sera toujours de même chaque fois qu'un nouveau bloc sera installé à l'intérieur de la BOUCLE.
Sauvegardons ce petit programme et faisons le exécuter par BONG.
BONG avance d'une rotation (de moteur), puis une très courte pause. Ensuite BONG avance encore d'une rotation, puis une nouvelle courte pause. Cela se poursuit de la même façon, jusqu'à ce que fatigué d'attendre ces répétitions, je décide d'arrêter le programme.
La pause survient quand le bloc DEPLACER termine son action et que le bloc BOUCLE vérifie sa condition. (cela se produit très rapidement).
N'oubliez pas que la condition est une règle que le robot doit suivre.
Pour ce bloc BOUCLE, la règle est ici de continuer "pour toujours" . Cela explique pourquoi le moteur tourne et tourne sans arrêt avec la courte pause à chaque tour.
Nous allons maintenant changer la condition. Comment dire à BONG de faire tourner le bloc DEPLACER 4 fois?
Jetez un coup d'oeil sur le panneau de configuration (ci-dessous). Vous remarquerez que la zone Contrôle dispose dans le champ de saisie d'un menu déroulant avec 5 options.
Option "Compter"

Choisissez "Compter", puis dans la zone de saisie "Compter", tapez 4. Vous devez taper ici une valeur entière. Les valeurs négatives ou zéro sont exclues.
Pour vérifier que le compte est bon, nous modifierons le programme en lui ajoutant un top sonore, qu'il suffira de compter pour la vérification.

BONG va donc exécuter 4 rotations suivies chacune d'un top sonore.
Option "Temps"
Revenons à présent sur les 5 options proposées, et commençons par la plus simple "Temps".

Dans cette option, vous préciserez dans le champ "Secondes" le temps alloué à la boucle; ici 25 sec. Cela signifie que tous les blocs situés à l'intérieur de la BOUCLE agiront pendant ces 25 secondes. En fixant cette limite de temps, vous avez aussi signifié à la BOUCLE sa sortie (loop break, en anglais). Au bout de 25 secondes, le programme se poursuivra ou s'arrêtera si aucun autre bloc ne suit le bloc BOUCLE.
Facile, non? La BOUCLE peut s'interrompre si vous annulez le programme, mais elle peut aussi être configurée pour s'interrompre si elle rencontre une condition particulière. C'est le cas déjà cité par exemple, d'un capteur tactile heurté.
Une remarque importante: s'il existe une ou des boucles à l'intérieur d'une boucle principale (on parle ici de "boucles imbriquées"), toutes les boucles internes seront exécutées avant que l'on sorte de la boucle principale.
Si par exemple, une boucle interne a une durée fixée à 40 secondes, elle sera exécutée, et la boucle externe (fixée à 25 sec.) ne sera pas répétée.
Autre remarque: dans la zone "Montrer", une case à cocher se trouve près de la petite icône "Compteur". Si vous cochez cette case un plot de données apparaît sur la partie gauche du bloc. Vous avez activé le plot compteur qui fournit à chaque reprise de la boucle le nombre de répétition. Les valeurs correspondantes sont transmises par le plot, grâce à un fil de données, à d'autres blocs pour les besoins du programme.
Option "Pour toujours"
Cette option a déjà été vue en début de la leçon, et elle est aussi simple que la précédente.
La boucle ne fait que répéter indéfiniment les bloc qu'elle contient et ne s'arrêtera que si le programme est interrompu ou si les piles sont hors service.
Option "Capteur"
Vous allez à présent choisir dans la zone Contrôle l'option capteur.
Vous remarquerez que le Capteur tactile est sélectionné par défaut.
Mais dans la zone Capteur, le champ de saisie - grâce à un sous-menu déroulant - permet de sélectionner celui utile pour votre programme (On y trouve même ceux que vous avez acquis et installés en complément du kit # 8527 - PF IRLink dans notre cas).

Ils ont été déjà vus dans la leçon n°5 et sont d'un usage simple. La seule chose que vous devez déterminer est le point de déclenchement qui provoquera la sortie de boucle. Ceci a été également abordé dans cette leçon.
Nous allons prendre l'exemple du capteur à ultrasons.

Dans cet exemple, le capteur à ultrasons est paramétré avec un point de déclenchement à 1,00 mètre. A noter également l'activation de la case compteur (le plot est visible à l'entrée de la boucle) pour permettre de récupérer la valeur du nombre de cycles.
Le bloc DEPLACER fait avancer le robot d'une rotation, suivi d'une légère pose, puis le cycle reprend tant que la distance entre le capteur fixé sur le robot, et un obstacle devant lui reste inférieure à 1 mètre. Dès que cette distance est atteinte, la boucle s'interrompt et le programme s'arrête.
Voici un autre exemple avec les boutons du NXT.
Le robot avance d'une rotation, émet un top sonore puis fait une légère pause. Cette action se répète inlassablement jusqu'au moment ou on appuie sur le bouton flèche gauche du NXT; la boucle s'interrompt alors et le programme se termine.

Option "Logique"
C'est la dernière option qui interrompt une boucle; elle se présente ainsi dans l'exemple qui suit:

Plusieurs remarques:
D'abord, le plot de données à gauche de la boucle est visible, puisque la case Compteur a été cochée. Je rappelle que par ce plot on peut récupérer en sortie, une valeur numérique qui est le nombre de cycles de la boucle.
Ensuite, et c'est le seul cas, un plot de données à droite de la boucle, qui accepte uniquement en entrée une valeur logique Oui ou Non. La valeur de défaut est précisée dans la zone "Jusque" avec Vrai comme choix, mais on pourrait choisir aussi Faux.
Cela signifie que la boucle s'exécute, quand la valeur sélectionnée (ici Vrai) est reçue (c'est une entrée de donnée).
En clair, tant que la valeur logique est VRAI, la boucle se répète. Dès que la valeur passe à FAUX, on sort de la boucle et le programme s'arrête.
Cet exemple illustre l'utilisation de cette option:

J'ai ajouté un bloc Ultrasons réglé suivant le panneau de configuration. Ensuite j'ai ouvert son Hub de plots de données pour relier le plot logique à celui de la boucle. J'ai enfin refermé le Hub, qui ne laisse visible que le plot utilisé, ici v/x.
Que se passe-t-il?
Le robot avance d'une rotation, émet un top sonore, puis fait une légère pause. Ensuite le capteur Ultrasons mesure la distance par rapport à un obstacle. Tant que la distance mesurée est inférieure à 30 cm, la boucle se répète. Dès que cette valeur est atteinte, on sort de la boucle et le programme s'arrête. Voilà une manière de sortir d'une boucle, sans intervention autre que celle du robot lui-même.
On aurait pu utiliser un autre capteur comme le Sonore qui aurait agit en fonction du niveau sonore (frapper des mains par exemple).
Je vous laisse maintenant écrire des programmes selon votre imagination et l'équipement de votre MOC. Exercez-vous pour maîtriser ce type d'action.
A suivre…