Catégories
Arduino capteur électronique Projets Arduino Projets électroniques

Projet Encodeur Rotatif avec Arduino

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

  • Capteur de vitesse & sens de rotation (encodeur optique)
  • Capteur angulaire
  • Asservissement de l’angle
  • Commutateur électromécanique multipositions
  • Curseur/ Slider électronique
  • Potentiomètre électromécanique linéaire
  • Etc.

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;
}

Laisser un commentaire