mardi 12 août 2014

Codeur rotatif et Arduino

Aujourd'hui, je partage avec vous mes récentes expérimentations avec des codeurs rotatif (rotary encoders).

Codeur rotatif vs potentiomètre

Un codeur rotatif vous permet d'intégrer aux dispositifs que vous construisez un bouton que l'utilisateur tournera pour modifier un paramètre.   Il peut s'agir, par exemple, d'un bouton qu'on tourne pour modifier le volume d'une chaîne stéréo.  Du point de vue de l'utilisateur, donc, il y a peu de différences entre un codeur rotatif et un potentiomètre (sauf que, contrairement au potentiomètre, le codeur rotatif peut être tourné à l'infini, sans qu'on atteigne un point où il refuse de tourner davantage).

Du point de vue du concepteur de l'appareil, toutefois, le codeur rotatif est très différent du potentiomètre.  Lorsque vous tournez le bouton d'un potentiomètre, la résistance de ce dernier change progressivement, ce qui vous permet d'envoyer à l'Arduino un signal analogique qui varie de façon continue entre 0 et 5 V.  Mais lorsque vous tournez le bouton d'un codeur rotatif, il se comporte comme un assemblage de deux interrupteurs qui s'ouvrent et se ferment plusieurs fois par tours:  l'Arduino recevra donc une suite de valeurs logiques alternant entre 0 et 5 V.

Utilisation du codeur avec des résistances de tirage externes

Utilisons d'abord un encodeur avec des résistances de tirage (pullup resistors), question de bien comprendre comment ça marche (nous verrons un peu plus loin comment remplacer ces résistances externes par les résistances de tirage internes de l'Arduino).

Lorsqu'il s'agit d'un simple interrupteur, on procède de cette façon:


Lorsque le bouton n'est pas enfoncé, aucun courant ne peut circuler dans la résistance.  La chute de potentiel dans la résistance est donc nulle (U  = RI), et l'Arduino se trouve à un potentiel de 5 V.  Lorsqu'on presse le bouton, l'Arduino est directement en contact avec la masse et se trouve donc à un potentiel nul (pendant ce temps, un courant traverse la résistance qui est soumise â une différence de potentiel de 5 V:  cette résistance est nécessaire pour éviter un court circuit lorsqu'on presse le bouton!).

Comme je l'ai déjà mentionné, le codeur rotatif se comporte comme deux interrupteurs qui s'ouvrent et se ferme pendant qu'on tourne le bouton.   Sur la figure située au tout début de cet article, les pins A et GND forment un premier interrupteur, alors que les pins B et GND en forment un deuxième (les deux interrupteurs partagent la même masse).

Nous pouvons donc câbler notre codeur rotatif de cette façon:


Voyons voir...  Lorsqu'il y a contact entre la pin A et la pin GND du codeur rotatif, la pin 2 de l'Arduino est à 0 V, alors qu'elle est à 5 V pendant qu'il n'y a pas de contact.  Pendant qu'il y a contact entre la pin B et la pin GND du codeur, la pin 3 de l'Arduino est à 0 V alors qu'elle est à 5 V en absence de contact.

... Mais pourquoi deux interrupteurs plutôt qu'un seul, dites-vous?  C'est pour déterminer le sens de la rotation du bouton.  Tel qu'illustré ci-dessous, le signal produit par la pin B est légèrement décalé par rapport au signal produit par la pin A (ils sont en quadrature).


Supposons qu'on programme une interruption qui s'exécutera chaque fois que le signal de la pin A passe de 0 à 5 V.  Si le bouton tourne dans le sens horaire (gauche à droite sur le schéma), la pin B, au même moment, est toujours à 5 V.  Si le bouton tourne dans le sens antihoraire (droite à gauche sur le schéma), la pin B est toujours à 0 V lorsque la pin A passe de 0 à 5 volts.

Et voici un sketch qui fonctionne exactement de cette façon:


Utilisation du codeur avec les résistances de tirage internes de l'Arduino

Vous pouvez simplifier le circuit en utilisant les résistances de tirage internes de l'Arduino.  Ça se branche comme ça:



...et il faut ajouter deux lignes de code supplémentaires dans la partie "setUp" du sketch ci-haut pour activer les résistances de tirage:

   digitalWrite (PinA, HIGH);
   digitalWrite (PinB, HIGH);

Puisque PinA et PinB ont été définies comme des entrées, digitalWrite a pour effet d'activer leur résistance de tirage interne.


Utilisation d'un breakout KY-040

Vous pouvez trouver sur eBay, en échange d'un peu de menue monnaie, des codeurs rotatifs "KY-040"  qui comportent déjà des résistances de tirage (donc vous n'activez pas les résistances de tirage interne de l'Arduino).  Vous les branchez de cette façon:

CLK (clock)  ---  Arduino 2  (c'est la pin A)
DT (data)  ---  Arduino 3 (c'est la pin B)
SW (switch) --- Arduino 4 (bouton poussoir)
GND  -----  Arduino GND
+  ----   Arduino 5 V

Ajout de condensateurs, pour l'anti-rebond

On conseille souvent l'ajout de deux condensateurs de 0,47 μF comme dispositif anti-rebond:



Je dois avouer que j'ai obtenu des résultats assez similaires avec ou sans condensateurs:  ça fonctionne relativement bien, à la condition de ne pas tourner le bouton trop vite, mais les résultats ne sont pas parfaits.

Les instructions pour l'utilisation du KY-040 ont été prises sur le forum Arduino.

Yves Pelletier (Twitter:  @ElectroAmateur)

1 commentaire: