Aide à la programmation : Solutionnaires des défis
Les défis demandés sont des tâches très ouvertes. En effet, et cela est typique de tout ce qui touche la programmation, il y a plusieurs façons d’arriver à un objectif. Cela rend donc difficile la rédaction d’un solutionnaire. L’intention de ce solutionnaire est d’offrir une solution, parmi d’autres, qui est fonctionnelle, mais imparfaite. Ainsi, nous laissons un espace à l’expérimentation afin d’optimiser le comportement du Qbot.
Note : Seule la section Loop du code sera affichée. Il faut toujours laisser la fonction moteur dans la section Global Variables et Functions et y déclarer toute nouvelle variable utilisée.
Note : La fonction moteur simple sera utilisée pour les défis 1 à 4. Il est aussi possible d’utiliser la fonction moteur avancé. Il faut, dans ce cas, toujours mettre une vitesse de 0 au 1er argument.
Défi 1 : Avancer-reculer
Défi de base :
Le Qbot avance généralement plus rapidement qu’il ne recule. Si on veut que le robot fasse du surplace, il faudra ajuster les vitesses et les temps d’attente.
Défi avancé :
Cette solution n’est vraiment pas parfaite. Le Qbot fait trois aller-retour, puis arrête durant 10 secondes. Ensuite, comme tout cela est dans la section Loop du code, le robot recommence l’ensemble de la routine. Sans les 10 secondes d’attente, la situation est encore pire : le robot a une vitesse nulle durant une fraction de seconde avant de répéter les trois aller-retour.
(Le bloc Repeat se trouve dans la section bleu foncé Con.)
Pour une solution idéale : Oublier le bloc Repeat et adapter le code Compteur dans les opérations utiles : si le compteur est plus petit ou égal à 3, fais un aller-retour et augmente le compteur de 1. Sinon, arrête le moteur.
Cliquer ici pour un exemple de solution idéale au défi 1 avancé.Défi 2 : Les antennes
Défi de base :
Noter l’utilisation du Else If pour la seconde condition.
Cette solution fonctionne, mais n’est pas conforme aux bonnes pratiques de programmation. En effet, il n’est pas d’usage de répéter une ligne de code. Pour y remédier, il faudrait consolider le If et le Else If ensemble.
Le bloc If utilisé jusqu’à maintenant ne permet pas de vérifier deux conditions à la fois, mais le bloc If se trouvant dans l’onglet Advanced de la section bleu foncé le permet.
Insérer le bloc And/Or de la section mauve Log.
Comme on veut que le Qbot s’arrête si l’antenne gauche OU l’antenne droite est fausse, il faut changer le And pour un Or.
Dans chaque espace du Or, on peut insérer le bloc de comparaison logique de la section mauve Log pour tester la condition sur les deux antennes.
Défi avancé :
Cette solution n’est pas idéale pour les mêmes raisons que la solution proposée au défi 1 avancé : le robot recommence à avancer après 10 secondes, alors qu’on voudrait qu’il reste immobile. Encore une fois, une solution possible serait de s’inspirer du Compteur dans les opérations utiles. On peut déclarer une variable « stop » à une valeur de 0. Après que le robot ait reculé, on change la valeur de la variable stop pour 1. Ensuite, il suffit de modifier la structure If-Else pour ajouter une condition : Else-If la variable stop est égale à 1, on arrête le robot.
Cliquer ici pour un exemple de solution idéale au défi 2 avancé.
Défi 3 : Détecteur de distance
Pour ce défi, une distance d’arrêt de 15 cm a été choisie.
Défi de base :
Ce code fonctionne assez bien. Il pourrait être pratique d’ajouter une lecture du capteur à ultrasons dans le moniteur série (voir les opérations utiles) afin de valider le fonctionnement du capteur et d’assurer que le modèle que vous avez donne réellement des informations en centimètre.
Défi avancé :
Ici, la structure du code solution est tout à fait convenable. Par contre, le robot exhibe un comportement erratique lorsqu’on exécute le code. Les modifications qui doivent être faites relèvent de la calibration des paramètres de distance et de vitesse.
Cliquer ici pour un exemple de solution idéale au défi 3 avancé.
Défi 4 : Encodeur (optocoupleur)
Une des solutions au défi 4 est de combiner les opérations utiles Compteur et vérifier si une variable a changé de valeur. On veut compter chaque fois que le signal de l'optocoupleur change de valeur, donc chaque fois que la valeur précédente n’égale pas la valeur actuelle. On utilise donc le symbole « != », qui signifie « n’égale pas ».
Pour déterminer la valeur au compteur avant d’arrêter, on obtient 24 en multipliant le nombre de rayons (6) par le nombre de tours de roue demandé (2) et encore par deux, car le compteur augmente deux fois par rayon : lorsqu’il commence à bloquer le faisceau et lorsqu’il cesse.
Pour améliorer ce code, on pourrait ajouter une condition qui fait qu’on compte seulement lorsqu’un rayon bloque le faisceau du détecteur. Il peut être utile de vérifier la valeur de l'optocoupleur avec le moniteur série.
On pourrait aussi donner une cible en tour de roue ou en centimètre et laisser le programme déterminer le nombre de « clics » au compteur.
Défi 5a : Coccinelle aléatoire - interrupteurs
(Sur le Qbot qui a servi à faire les défis 5 et 6, les moteurs avancent lorsqu’on leur donne une valeur négative.)
Ce code fonctionne assez bien, mais encore une fois il faudrait optimiser les paramètres de vitesse.
Défi 5b : Coccinelle aléatoire - ultrasons
(Sur le Qbot qui a servi à faire les défis 5 et 6, les moteurs avancent lorsqu’on leur donne une valeur négative.)
La particularité de la démarche utilisée ici est la structure If-Else imbriquée dans un If. Donc, si le Qbot est proche de sa cible, on détermine aléatoirement s’il doit aller à droite ou à gauche avec le bloc Random.
Évidemment, il y aurait eu plusieurs autres possibilités de structures logiques.
Défi 6 : Suiveur de ligne (capteurs infrarouges)
(Sur le Qbot qui a servi à faire les défis 5 et 6, les moteurs avancent lorsqu’on leur donne une valeur négative.)
Pour ce défi, les capteurs infrarouges étaient ajustés pour donner un « 1 » s'ils étaient sur le ruban et un « 0 » s'ils étaient à côté.
Si le capteur du centre est sur le ruban, on avance en ligne droite assez rapidement. Si le capteur de gauche est sur le ruban, on tourne vers la gauche. Le Qbot adopte le comportement analogue pour le capteur de droite.
Si aucun des capteurs n’est sur le ruban, on avance quand même, mais lentement, en espérant rattraper le ruban sur un des trois capteurs. Ce point pourrait être amélioré, car on ne peut pas distinguer un écart momentané entre le ruban et la fin de la trajectoire.