Débuter avec un potentiomètre angulaire (360 degrés) Keyes KY-040 • Domotique et objets connectés à faire soi-même

Dans ce tutoriel nous allons apprendre comment utiliser un potentiomètre angulaire (Rotary Encoder). Un potentiomètre angulaire permet de connaître la position du curseur sur 360 degrés et de déterminer le sens de rotation. Pour cet article, j’ai utilisé un potentiomètre angulaire Keyes KY-040 acheté sur Banggood pour moins de 4,50€ (lot de 5).

Principe du potentiomètre angulaire

Un potentiomètre angulaire à un nombre définit de positions pour une révolution complète (un tour de 360 degrés). On peut sentir un clic à chaque pas lorsqu’on tourne le curseur du potentiomètre. Le KY-040 possède 30 pas, soit une résolution de 12 degrés.

Même si on appel ce composant un potentiomètre, le principe de fonctionnement en est tout autre. Ici on ne mesure pas la valeur d’une résistance variable, on mesure des signaux logiques sur deux broches digitales de l’Arduino. Par exemple, lorsque l’on est sur une position, A et B ont le même niveau logique (0 ou 1). Si on tourne dans le sens horaire, le signal d’état A change avant B, et inversement lorsque tourne dans le sens horaire.

Le KY040 est également équipé d’un bouton que l’on actionne en appuyant sur l’axe. Le signal est récupéré sur la broche repérée SW. On pourra s’en servir pour faire un Reset de la position (au démarrage), allumer un afficheur….

Branchement du Keyes KY-040

Branchez le KY-040 comme ceci sur un Arduino. La broche indiquée entre parenthèse correspond à un branchement sur un module ESP8266 ESP-12 (par exemple une Wemos D1 Mini) :

GND GND

+       +5V

CLK    Pin 4 (D1) -> signal A

DT     Pin 5 (D2) -> signal B

SW     Pin 0 (D3) -> Bouton poussoir

Code

Voici un petit code pour tester rapidement le comportement du KY040. En début de programme, vous trouverez plusieurs variables pour configurer le programme en fonction de votre branchement et des caractéristiques de votre potentiomètre angulaire :

  • PinCLK, broche CLK (signal A)
  • PinDT, broche DT (signal B)
  • PinSW, broche SW (bouton)
  • nbPos, résolution du potentiomètre

Ouvrez le moniteur série pour afficher l’index de la position et l’angle du curseur.

int val; 
int PinCLK = 4;
int PinDT = 5;
int PinSW = 0;
static long encoderPos = -1;    // Au 1er démarrage, il passera à 0
int PinCLKLast = LOW;
int nbPas = 20;                 // Résolution de l'encodeur
int n = LOW;

void setup() { 
  pinMode (PinCLK,INPUT);
  pinMode (PinDT,INPUT);
  pinMode (PinSW,INPUT);
  Serial.begin (9600);
} 

void loop() { 
   if (!(digitalRead(PinSW))) {      // Reset la position si on appui sur le potentiomètre
     encoderPos = 0;
     //Serial.println("Reset position");
   }
   
   n = digitalRead(PinCLK);
   
   if ((PinCLKLast == LOW) && (n == HIGH)) {
     
     if (digitalRead(PinDT) == LOW) {
       Serial.print("Sens antihoraire, position ");
       encoderPos--;
       if ( encoderPos < 0 ) {
         encoderPos = nbPas;
       }
     } else {
       Serial.print("Sens horaire, position ");
       encoderPos++;
       if ( encoderPos > ( nbPas - 1 ) ) {
         encoderPos = 0;
       }
     }
     Serial.print (encoderPos); Serial.print(", angle "); Serial.println( abs ( encoderPos * ( 360 / nbPas ) ) );
     //Serial.print ("/");
   } 
   PinCLKLast = n;
 }

Un potentiomètre angulaire permet de connaitre la position d’un curseur sur un tour complet. On peut également déterminer le sens de rotation. Petit bémol toutefois, il est nécessaire de mettre le potentiomètre dans une position initiale connue au démarrage du programme (zéro), position à partir de laquelle seront déterminée les changements suivants. Comme à chaque redémarrage du programme, on perd la position précédente, on ne pourra pas utiliser le KY-040 pour faire un contrôle de volume par exemple. On pourra utiliser le signal SW du bouton poussoir pour réaliser un reset de la position par exemple.

Avez-vous aimé cet article ?