DASH - Carré fou

DASH - Carré fou

1. Introduction

Salut l’ami !
Si tu te retrouves ici, c’est que tu as en ta possession un Robot Dash ! Félicitations ! Tu as l’âme d’un génie de la programmation ! Partons à l’aventure dès à présent !


Ici, tu vas apprendre à accomplir un "carré fou". Si tu n'as jamais fait de programmation avant, tu risques de trouver ce tutoriel trop compliqué.

Pour réussir, tu dois déjà connaître les tests de conditions, les boucles itératives, les variables (aléatoires) et les appels de fonction. Si n'est pas le cas, commence par une activité plus simple et reviens vite !

C’est parti !

 

2. Qu'est-ce qu'un carré fou ?

Un carré fou consiste en un déplacement (plus ou moins) aléatoire du robot, conscrit dans une surface donnée (un carré imaginaire). Ici, **Dash** ne sortira pas d’un carré grand d’un mètre de côté et s’y déplacera aléatoirement comme s’il y avait des murs invisibles au contour.

carré fou
Dans un premier temps, tu vas essayer de créer une ligne folle. C'est le même principe qu'un carré fou, mais sur une seule direction.

ligne folle

3. Ligne folle

La ligne folle va être codée en 3 étapes : tu vas d'abord créer un déplacement aléatoire, puis contrôler le positionnement, avant d'ajouter des contraintes.

Pour cela, utilise l'application Blockly et muni toi de ton robot Dash.
Précisons un peu plus la teneur du problème.

Le robot a deux possibilités : soit il avance, soit il recule. Chaque mouvement est aléatoire, aussi bien dans la direction que dans la longueur.

Pour simplifier le problème, nous dirons que le robot avance de décimètre en décimètre. De même, nous supposerons que le robot se déplace sur un mètre maximum. En somme, s’il est à son point de départ, Dash ne peut qu’avancer et s’il se trouve un mètre plus loin, il ne peut que reculer.

Essaye d'ores et déjà d'imaginer comment tu vas pouvoir accomplir une telle mission avant d'étudier le découpage étape par étape à suivre.

4. Déplacement aléatoire

Pour réussir cette ligne folle, il faut tout d’abord programmer un déplacement aléatoire. Dans la partie « variables » de Blockly, il faut configurer une nouvelle variable. Dans cet exemple, ce sera l’ « orange ! orange».

configurerL’interface de déclaration de variable demande peut-être un peu d’habitude à utiliser avec son ergonomie… fruitière.

Clique sur les « Dés » pour déclarer l’aléatoire. Étant donné qu’il est laborieux de manipuler les « + » et les « - », on se contentera d’un aléa entre -10 et +10 ; un nombre négatif (avec le "-" devant) signifie que le robot va se déplacer en reculant.

aléatoire

Ainsi, l’instruction suivante servira à modifier cette variable « orange !orange» pour qu’elle corresponde à un déplacement en décimètres, en la multipliant par 10. Ainsi, les distances possibles seront -100, -90, -80, … , 80, 90, 100.

modifier
À ce stade, exécute un court programme pour vérifier que le robot se déplace effectivement de manière aléatoire, dans les deux sens, à l’aide d’une boucle infinie. À noter, il ne faut pas chercher parmi les blocs « Conduire » pour ce mouvement, mais toujours parmi les blocs « Variables ».

conduire
Il s’agissait de la partie (presque) facile de la ligne folle : le robot avance et recule au hasard mais ne respecte pas la limite d'un mètre. Dorénavant, il faut contraindre le robot à rester entre 0 et 1 mètre. Pour cela, il va falloir apprendre au robot à se repérer.

 

5. Positionnement

À présent, il va être nécessaire de faire appel à une nouvelle variable pour aider Dash à se repérer (en réalité, il en faudra deux, nous verrons plus tard pourquoi).
Cette variable (« cerises !» dans l'exemple) doit être configurée au démarrage, en dehors de la boucle infinie. Elle vaut 0 au départ car il s’agit de la position initiale du robot.

Petite astuce : il peut être intéressant de coller au sol un morceau de ruban adhésif pour marquer la ligne de départ du robot ; de même, ajoutes en un 1 mètre plus loin pour symboliser la limite à ne pas franchir afin de t'aider à vérifier que ton programme fonctionne.

La variable « cerises ! » est en constante évolution. Elle indique après chaque déplacement sa position par rapport au point 0. Pour se faire, tu dois comprendre qu’il faut ajouter le dernier déplacement du robot à la précédente valeur de « cerises !» pour indiquer sa nouvelle position : c'est-à-dire ajouter « orange !» à « cerises !» après chaque mouvement.


De même, teste le programme et vérifie que la variable « cerises !» (visible à gauche sur la tablette en cours d'exécution) évolue comme il faut et que sa valeur correspond grosso modo à sa position par rapport au ruban adhésif.

 

 6. Contraintes (1)

Enfin, il est attendu que le robot ne sorte jamais de la ligne imaginaire d’un mètre qui lui est affectée.

Au départ, le robot peut avancer de n'importe quelle distance (pourvue qu'elle soit inférieure à 100). Admettons que le robot avance de 80. De cette position, il ne va pas pouvoir avancer de 30 en second mouvement.

Il y a plusieurs façons d’envisager le contournement de ce problème, dont voici un exemple : si le robot avance de 30 à partir de la position 80, il sera en position 110. On peut dire que cela revient à être sur une deuxième ligne poursuivant la première, en position 10.

Mais comme on ne veut pas qu’il sorte de la ligne, on va considérer qu’il est resté sur la même ligne. Ainsi, la position 110 est équivalente à la position 10 sur la ligne d’origine. Également, la position 130 se ramène à la position 30, etc.


De la même manière, reculer au-delà de 0, revient à être sur une nouvelle ligne précédant la ligne d’origine. Ainsi, la position -30 correspond à la position 70 sur la ligne principale ( 100 + (– 30) ).

Naturellement, il va falloir retirer 100 à la longueur censée être effectuée par Dash lorsqu’il dépasse la ligne au-delà du point 100 (et ajouter 100 lorsqu’il la dépasse au-delà du point 0).

 

6. Contraintes (2)

Ainsi, il va falloir effectuer un test de comparaison pour vérifier si le robot va sortir de la ligne ou non, avant d’effectuer le mouvement. Cela implique de créer une nouvelle variable, qui va servir de test et « faire semblant » de faire le mouvement avant de le réaliser vraiment. Cette nouvelle variable sera provisoire et servira juste de test de position.

De fait, puisqu’il s’agit d’une nouvelle variable qui sera employée durant un instant précis, proposer d’effectuer le test de comparaison dans un bloc à part : ce qui fera appel aux fonctions.

Dans cet exemple, la nouvelle variable est la « pomme ! » et le bloc de test a été baptisé « TestPosition ! ».


Comme expliqué précédemment, la « pomme !» doit prendre la valeur des « cerises !» comme si le robot avait effectué le mouvement. Ainsi, configure la « pomme ! » à partir des « cerises ! » et ajoute lui l’ « orange !».

Ensuite, deux comparaisons :
> Est-ce que la variable « pomme !» est plus grande que 100 ?
> > Dans ce cas, retirer 100 à l’ « orange !» ;

> Est-ce que la variable « pomme !» est plus petite que 0 ?
> > Dans ce cas, ajouter 100 à l’ « orange !».
Ensuite, effectue le mouvement « conduire » avec la valeur de l’ « orange !» mise à jour.
Il ne faut pas changer la suite du programme en affectant comme précédemment la nouvelle valeur à « cerises !» en ajoutant la *véritable* valeur d’ « orange !» (celle qui est éventuellement transformée par « TestPosition ! »).


Essaye de le faire tout seul avant de cliquer vers la page suivante où tu verras la solution !

 

6. Contraintes (3)

Remarque : n'oublie pas d’appeler la fonction « TestPosition ! » dans le programme principal.

Avec brio, la première mission est accomplie : Dash progresse sur une ligne folle en avançant ou en reculant et en ne dépassant jamais un segment de longueur 100 cm. Vérifie le !

Dès lors, il est possible d’attaquer la seconde partie de la mission : le carré fou.

 

7. Carré fou (1)

Le plus gros du travail a été fait dans la partie précédente : la logique du programme a été débroussaillée dans son ensemble. Cette partie est juste un peu laborieuse car elle demande de faire une seconde fois ce qui a déjà été programmé.

En effet, tu dois comprendre que ce qui fonctionne pour une ligne, doit fonctionner aussi pour sa perpendiculaire. De fait, il faut ajouter une nouvelle (et dernière) variable « pastèque !» (dans cet exemple) qui indique la position du robot sur l’autre axe du carré (en Mathématiques, on parle d'abscisses et d'ordonnées).

Ensuite, après le précédent programme (à la fin de la boucle infinie), ajoute un virage (à gauche dans l’exemple) et recommence la série d’instructions ; cette façon de faire est nécessaire car le robot se déplace sur deux axes différents – il ne faut pas mélanger les « cerises !» et les « pastèques !»…

Une première subtilité réside dans le fait que l’instruction « configurer ‘‘ pomme ! ’’ » doit être sortie de la fonction « TestPosition !». En effet, il faut lui attribuer la valeur des « cerises !» dans un cas, puis de la « pastèque !» dans l’autre (toujours dans un souci de distinguer les deux axes de déplacement).

Même chose, dans la seconde partie du programme, c’est la valeur de « pastèque !» qui se modifie avec « orange !» une fois celle-ci mise à jour par le Test de Position.

Ajoute en guise de conclusion de la deuxième partie du programme, un virage dans le sens inverse que le premier (à droite dans mon exemple).

Remarque : il est important que les virages se fassent toujours dans le même sens avant (ou après) le passage d’un axe à un autre. Tourner deux fois à droite revient à faire un demi-tour et donc l’axe s’en trouverait inversé. Cela peut se programmer également, mais les difficultés que cela apporte à l’optimisation du programme rend cette tâche peut-être trop ambitieuse pour un tutoriel. Mais la question mérite d’y réfléchir si tu es motivé !

Essaye de le faire tout seul avant de cliquer vers la page suivante où tu verras la solution !

 

7. Carré fou (2)

Enfin, toujours dans un souci d’optimisation, étant donné que la déclaration d’aléatoire apparaît à deux reprises, incorpore la dans une fonction.


Bravo ! Mission accomplie ! Ton robot se meut dans un carré fou ad vitam æternam !

Imagine d'autres fonctions de ton robot Dash ou son copain Cue qui nécessitent l'utilisation de variables et partage les avec la communauté SMARTEO !

À bientôt pour de nouvelles aventures !

Laissez un commentaire

* Champs obligatoires

Veuillez noter que les commentaires doivent être vérifiés et approuvés avant d'être publiés.