Page 87 - arduino_Neat
P. 87
dans la configuration du programme.
Boucle principale (loop)
Notre boucle de programme principal doit encore une fois changer. Nous mettons d'abord
sous commentaires les fonctions liées à la prise d'information et au test moteur, soit
montrerValeurCapteur () et testerServoMoteur (). Ensuite, nous ajoutons les fonctions qui nous
servirons à analyser le capteur et modifier la position du servomoteur en fonction de celle-ci,
soit modifierPosSelonCapteur () et decroitreServoPos ().
Finalement, nous ajoutons l'instruction servo1.write (servoPos) afin de spécifier à l'objet servo1 la
position telle qu'elle a été modifiée par le programme. L'instruction du delay (20) permet un
certain espacement entre les lectures et assignations moteur.
Sous-routines
Nous ajoutons trois sous-routines à notre programme :
void determinerCapteurBase()
{
servo1.write(0);
delay(2000);
capteurBase = analogRead(pinCapteur);
}
Cette fonction sert d'abord à initialiser la position du moteur avec servo1.write (0). Ensuite, il
faut faire attendre le programme 2 secondes avec delay (2000) pour laisser le temps au
moteur de se positionner. Finalement, le programme fera une lecture du capteur avec
analogRead (pinCapteur) pour assigner cette valeur à la variable capteurBase. Nous utiliserons
cette variable pour calculer l'écart entre une lecture « sans ombre » et une lecture avec
l'ombre projetée par la main ou le doigt.
void modifierPosSelonCapteur()
{
int difference = 0;
valeurCapteur = analogRead(pinCapteur);
difference = capteurBase - valeurCapteur;
difference = max(difference, 0);
servoPos = min ( servoPos + difference, 180);
}
Cette fonction a la particularité de contenir une déclaration de variable, l'instruction int
difference = 0. Habituellement réservée à la première section du programme, une déclaration
de variable faite à l'intérieur d'une sous-routine crée ce qu'on appelle une variable locale. Ceci
signifie que la variable « n'existera » que dans le contexte d'exécution de la fonction ou sous-
routine dans lequel elle se situe. Par conséquent, aucune autre fonction ou sous-routine ne
pourrait faire usage de la variable difference. Par opposition, les variables qui sont déclarées au
tout début du programme sont considérées comme globale, c'est à dire qu'elles « existent » et
sont accessible à toutes les fonctions ou autre routines.
La seconde instruction de cette sous-routine assigne à valeurCapteur la lecture de la pin liée au
capteur. Ensuite, nous calculons la différence entre la valeur du capteur « sans ombre »
contenu dans capteurBase et celle « avec ombre » (ou sans) de valeurCapteur.
Finalement, comme il est possible que la différence nous retourne une valeur négative (dans le
cas où il y aurait eu une illumination, par exemple, nous limitons la valeur de différence à un
minimum de 0. Bien que cela semble contre-intuitif, nous utilisons dans ce cas la fonction max ()
. Celle-ci prend en paramètre deux valeurs (en l'occurrence difference et 0) et retournera celle
des deux qui sera la plus élevée. Ainsi, si difference = -5, max (difference, 0) retournera 0,
puisque ce chiffre est plus élevé que -5. Par contre, si difference = 10, la fonction retournera 10.
Nous assignons la valeur retournée par max () à difference.
87