Site icon AranaCorp

Utilisation d’un Encodeur rotatif avec Arduino

4.3
(19)

L’encodeur rotatif est un capteur de rotation dont on peut connaitre la direction et l’angle. Similaire en aspect au potentiomètre, l’encodeur n’a pas de course limite et au lieu de renvoyer une valeur de résistance, comme le potentiomètre, l’encodeur renvoie deux signaux digitaux représentant la direction et la rotation.
Avec l’algorithme adéquat, il est possible de récupérer l’état de ces deux contacteurs et de retrouver sa position. L’encodeur rotatif est parfois couplé d’un bouton poussoir ce qui est pratique lorsqu’on veut créer une interface.

Matériel

Principe de fonctionnement

L’encodeur rotatif est muni de deux contacteurs, l’un qui se ferme ou s’ouvre selon le sens de rotation; l’autre, s’ouvre et se ferme lorsqu’on tourne l’axe de l’encodeur. Sachant cela, un encodeur envoie deux signaux digitaux (état HAUT ou BAS), l’un pour récupérer la direction et l’autre pour mesurer l’angle de rotation. Le nombre de changement d’état sur un tour varie selon la résolution du potentiomètre.

Schéma

Un capteur qui renvoie un signal digital se branche de préférence sur les entrées digitales du microcontrôleur. L’encodeur rotatif possède 3 broches de sortie: une pour le bouton poussoir (SW) et deux pour la direction (DT) et la détection de rotation (CLK).

Code

Pour récupérer les informations de l’encodeur rotatif, il va nous falloir repérer les changements d’état de chaque signal de sortie du capteur et définir les variables et leurs modifications en fonction de ces signaux. Plus précisément, l’algorithme détecte le passage de la broche de l’état HAUT à BAS. Ensuite, nous détectons le sens de rotation en testant si la broche DT est à l’état HAUT ou BAS, si le sens de rotation est antihoraire la variable rotVal est décrémentée sinon elle est incrémentée.

//Parameters
const int clkPin  = 2;
const int dtPin  = 4;
const int swPin  = 7;

//Variables
int rotVal  = 0;
bool clkState  = LOW;
bool clkLast  = HIGH;
bool swState  = HIGH;
bool swLast  = HIGH;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init Rotary
  pinMode(clkPin,INPUT);
  pinMode(dtPin,INPUT);
  pinMode(swPin,INPUT_PULLUP);
}

void loop() {
  readRotary();
}

void readRotary( ) { /* function readRotary */
  ////Test routine for Rotary
  // gestion position
  clkState = digitalRead(clkPin);
  if ((clkLast == LOW) && (clkState == HIGH)) {//rotary moving
    Serial.print("Rotary position ");
    if (digitalRead(dtPin) == HIGH) {
      rotVal = rotVal - 1;
      if ( rotVal < 0 ) {
        rotVal = 0;
      }
    }
    else {
      rotVal++;
      if ( rotVal > 10 ) {
        rotVal = 10;
      }
    }
    Serial.println(rotVal);
    delay(200);
  }
  clkLast = clkState;

  //gestion bouton
  swState = digitalRead(swPin);
  if (swState == LOW && swLast == HIGH) {
    Serial.println("Rotary pressed");
    delay(100);//debounce
  }
  swLast = swState;
}

Résultat

On observe la variable rotVal évoluer en fonction de la rotation de l’encodeur et on détecte correctement la pression sur l’axe de l’encodeur.

Applications

Sources

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 4.3 / 5. Vote count: 19

No votes so far! Be the first to rate this post.

Quitter la version mobile