Objectifs

  • Savoir le fonctionnement d’un encodeur rotatif
  • Savoir utiliser un encodeur
  • Savoir les caractéristiques d’un encodeur
  • Savoir les limites de l’encodeur
  • Etc.

Applications

Qu’est-ce qu’encodeur rotatif ?

Un encodeur rotatif est un dispositif électromécanique qui permet de savoir l’angle ainsi la direction de la rotation. Il est constitué d’un curseur tournant comme celui du potentiomètre, mais graduel. Le nombre de pas du curseur par tour caractérise la résolution de l’encodeur. L’encodeur ci-dessous est constitué de 10 pas (ou micro-tous) par tour complète du curseur.

Le module KY-040

Le module KY-040 est un exemple d’un encodeur rotatif. Il dispose de trois sorties TOR et 10 micro-pas. Un front descendant apparut dans la sortie CLK (horloge) au moment de la détection d’une transition dans le curseur dans un sens ou dans l’autre sens.  En parallèle, la sortie DT (direction) est positionnée en fonction du sens de rotation du curseur : DT=’0′ (Sens 1), DT=’1′ (Sens 2). Le module dispose aussi d’un bouton poussoir monté sur le curseur (il faut appuyer sur le curseur pour enclencher le bouton poussoir).

Encodeur rotatif arduino

Voir le tuto concernant la procédure de la lecture de ‘encodeur ainsi les défauts de ce type de l’encodeur.

Programme Arduino

Le code ci-dessous permet de lire la position de l’encodeur en utilisant la fonction getRot(). Le bouton poussoir est utilisé pour initialiser le compteur de rotation.

#define clkPin    2
#define dtPin 3
#define swPin 4 // Bouton Poussoir (Reset)
#define numPos 10 // de 0 à numPos-1


int nReset=1;

void setup()
{
//Init
Serial.begin(9600);
pinMode(clkPin,INPUT);
pinMode(dtPin,INPUT);
pinMode(swPin,INPUT_PULLUP);
}

void loop()
{
nReset=digitalRead(swPin);
int R=getRot(clkPin, dtPin, numPos,200, nReset);
Serial.print(R); Serial.print("\t");
Serial.println(R);
}

int getRot(int clkpin, int dtpin, int rotmax, int delay_ms, int nrst)
{
static int rotVal = 0;
static bool clkState = LOW, clkLast = HIGH;

clkState = digitalRead(clkpin);
if ((clkLast == LOW) && (clkState == HIGH))
{
if (digitalRead(dtpin) == HIGH) // Down
{
rotVal--;
if ( rotVal < 0) rotVal = rotmax-1;
}
else // Up
{
rotVal++;
if ( rotVal >= rotmax)rotVal = 0;
}
delay(delay_ms);
}
clkLast = clkState;

// Init
if (nrst==0)
{
rotVal = 0;
clkState = LOW;
clkLast = HIGH;
}
return rotVal;
}
Click to rate this post!
[Total: 2 Average: 5]

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut

You have successfully subscribed to the newsletter

There was an error while trying to send your request. Please try again.

FPGA | Arduino | Matlab | Cours will use the information you provide on this form to be in touch with you and to provide updates and marketing.