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 cet 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 compléter notre formulation nous devons 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 de 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 assurez 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 et avis d'expert

Reprenons un exemple qui a plus d'impact. Vous avez un robot autonome serveur de repas. Vous lui programmer 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 ou le mettre à la poubelle plutôt que de 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 toi !
C'est mon Mentor (c'est lui l'expert) en programmation informatique du labo de recherche en traitement d'image de Poitiers qui me réprimendait fortement quand les blocs "else" de mes codes VHDL passaient à la trappe…

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 : utilisé des variables globales, delay(1000) et b = b + 1 à la fin de votre bloc. Bonne programmation !

[ Voir une solution à decision_simple_evolution ]