Prendre des décisions : les choix conditionnels
Que ce soit pour un humain, un animal ou un robot, la prise de décision est une activité permanente. Nous pouvons donc dire que la prise de décision fait partie du comportement biologique ou robotique de l'intelligence en question. Pour un robot, l'étendue de la réflexion (et donc de sa profondeur) pourrait être mesurée par un degré plus ou moins élevé de prise de décision.
Programmation des choix conditionnels
La comparaison
La comparaison est très utilisée pour la prise de décision.
Par exemple : si il pleut, je pars en autobus.
Nous voyons dans cette formulation que si la condition est vrai une action est engagée et pour cela nous utilisons le mot si.
Par contre rien n'est dit concernant le cas ou il ne pleut pas.
Pour préciser notre formulation nous devons donc spécifier une autre action. Et notre phrase se transforme ainsi :
si il pleut je pars en autobus, autrement je pars à pied.
La structure conditionnelle en if else
En informatique nous avons des mots réservés pour programmer les prises de décisions et les choix multiples. Le langage Arduino ne fait pas exception puisqu'il est issu du langage C.
Nous avons donc if (si) et else (autre).
Votre robot BOE-Shield-Bot aura souvent besoin de prendre des décisions fondées sur des données issuent de capteurs. Voici un programme simple qui montre le concept de la prise de décision. Il compare la valeur de deux nombres a et b, et envoie un message pour vous dire si oui ou non a est plus grand que b.
Si la condition (a > b) est vraie, il exécute le bloc de code if : Serial.print("a est plus grand que b"). Si a n'est pas plus grand que b, il exécute alors le bloc de code else : Serial.print("a n'est pas supérieur à b").
- Entrez le code dans l'éditeur, enregistrer le sous decision_simple et téléchargez vers la carte Arduino,
- ouvrez le moniteur série et testez pour vous assurer que vous obtenez le bon message,
- essayez d'échanger les valeurs de a et b,
- télécharger à nouveau le programme et vérifier qu'il affiche l'autre message.
// La robotique avec le BOE Shield-bot
// decision_simple
void setup()
{
Serial.begin(9600);
int a = 89;
int b = 42;
if(a > b)
{
Serial.print("a est plus grand que b");
}
else
{
Serial.print("a n'est pas plus grand que b");
}
}
void loop()
{
// Vide, rien à répété
}
Remarque
Peut-être que vous avez seulement besoin d'un message lorsque a est supérieur à b. Si c'est le cas, vous pouvez retirer l'instruction else et son bloc de code comme ceci :
void setup()
{
Serial.begin(9600);
int a = 89;
int b = 42;
if(a > b)
{
Serial.print("a est plus grand que b");
}
}
Le fonctionnement du programme est tout de même assuré car dans la programmation du compilateur et les largesses du langage, il est prévu ce genre de manquement à la discipline de la part du codeur. Mais quand est il vraiment ?
Contre-remarque
Reprenons un exemple qui a plus d'impact. Vous avez un robot autonome serveur de repas. Vous lui programmez la prise de décision suivante : si le gateau n'est pas empoisonné, sert le aux invités.
Par contre rien n'est dit concernant le cas ou le gateau est mauvais.
Nous pouvons donc émettre un doute sur l'action à effectuer dans ce cas.
Pour lever le doute et ne pas laisser la machine décider pour nous, nous devons spécifier une autre action. Il vaut mieux en effet détruire le gateau et le mettre à la poubelle plutôt que de le laisser sur la table de la cuisine.
Maintenant, il se peut que nous n'ayons rien à faire ; c'est le cas du code ou l'on veut aucun message si a n'est pas supérieur à b. Pourtant, en bon codeur respectueux il faut une autre action.
Dans certain langage informatique il existe des instructions pour dire « ne rien faire » (NOP). Dans notre exemple, nous avons deux solutions à notre portée :
- Demandez un affichage vide : else { Serial.print(""); } ,
- ou intitialisé une variable à zéro : else { boolean z = false; }
Dans les exemples de codes du chapitre 1, j'ai utilisé « nop » au lieu de « z » et donné deux exemples de programmation : decision_simple_vide et decision_simple_nop.
La machine ne doit pas décider pour nous !
Plus de choix avec if else if
Votre programme peut être ammener à surveiller trois conditions : supérieur, inférieur ou égal. Vous utiliserez alors un enchaînement d'instructions du type if… else if… else.
...
if(a > b)
{
Serial.print("a est plus grand que b");
}
else if(a < b)
{
Serial.print("b est plus grand que a");
}
else
{
Serial.print("a est égal à b");
}
...
Un programme peut aussi contenir de multiples conditions avec les opérateurs logiques tels && et ||. L'opérateur && signifie ET, les deux barres verticales || représente l'opérateur OR. Par exemple, le bloc de cette déclaration sera exécutée seulement si a est supérieur à 50 et b est inférieur à 50.
if((a > 50) && (b < 50))
{
Serial.print("Valeurs normales dans les limites définies");
}
Un autre exemple : nous écrivons un message d'alerte si a est plus grand que 100 ou b inférieur à zéro.
if((a > 100) || (b < 0))
{
Serial.print("Attention danger !");
}
Un dernier exemple : Si vous voulez comparer si deux valeur sont égales vous utilisez deux signes égal l'un à coté de l'autre comme ceci : ==.
if(a == b)
{
Serial.print("a et b sont égaux");
}
Dans les prochains chapitres nous mettrons à profit toutes ces notions, mais vous pouvez dés maintenant vous exercer en programmant dans le bloc loop() et en faisant évoluer les valeur de a ou b. A chaque tour vous changer la valeur et vous afficher les messages en conséquence.
Astuces : utilisez des variables globales, delay(1000) et b = b + 1 à la fin de votre bloc. Bonne programmation !