Une grande différence entre l’électronique d’un robot et la programmation d’un robot est que l’une est sensible aux phénomènes physiques tandis que l’autre est totalement binaire.
Dans votre code, vous avez l’habitude d’écrire ainsi (c’est du code Arduino mais vous pouvez imaginer la même chose en tout autre langage) :
void setup()
// patte 1 en entrée
pinMode(1,INPUT) ;
void loop()
// détection de l’entrée
if (digitalRead(1) == HIGH)
// en haut
else
// en bas
Dans la plupart des cas, cela fonctionne. Par exemple si vous mettez en route un moteur ou que vous allumez une lumière, vous ne remarquerez pas ce qu’on appelle "rebond" : il n’y a pas toujours qu’un seul passage de bas à haut ou de haut à bas, on peut avoir plusieurs fois des aller/retour. Cela pose problème quand on incrémente un compteur (plusieurs incréments) ou quand on déclenche un chronomètre (pour une course de robots par exemple).
Les causes peuvent être différentes selon le capteur :
– pour un interrupteur mécanique, la mécanique est parfois composée d’une lame qui vient faire contact lorsque vous la pressez. Pour qu’elle retrouve sa position initiale lorsque vous enlevez votre pression, elle fonctionne comme un ressort et de ce fait elle va vibrer.
– pour un capteur optique, la lumière peut être réfléchie par l’objet qui coupe les rayons lumineux et se réfléter sur le capteur.
Traitement logiciel
On peut facilement modifier le logiciel pour ajouter un second test après quelques millisecondes correspondant aux rebonds.
void loop()
// détection de l’entrée
if (digitalRead(1) == HIGH)
delay(20) ; // attente de 20 millisecondes
if (digitalRead(1) == HIGH)
// en haut
else
// en bas
Mais ce n’est pas ce qui nous intéresse ici. On préfèrerait plutôt laisser le code le plus simple et changer le montage pour qu’il modifie le signal d’entrée lors du premier changement et qu’il ne prenne pas en compte les rebonds.
Solutions électroniques
Une des solutions consiste à utiliser un circuit monostable comme le NE555. Nous l’avions déjà utilisé pour générer un signal pour servomoteur, dans un montage astable. Cette fois on va utiliser le principe "monostable".