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
- Ordinateur
- Arduino UNO
- Câble USB A Mâle/B Mâle
- Encodeur rotatif
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
- Remplacer un potentiomètre et un bouton dans une interface par un encodeur rotatif
- Capteur de position ou de vitesse
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie