Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Comment fonctionne l'encodeur rotatif et comment l'utiliser avec Arduino

Dans ce tutoriel, nous allons apprendre comment fonctionne l'encodeur rotatif et comment l'utiliser avec Arduino. Vous pouvez regarder la vidéo suivante ou lire le didacticiel écrit ci-dessous.

Aperçu

Un codeur rotatif est un type de capteur de position utilisé pour déterminer la position angulaire d'un arbre en rotation. Il génère un signal électrique, analogique ou numérique, en fonction du mouvement de rotation.

Il existe de nombreux types d'encodeurs rotatifs classés soit par signal de sortie, soit par technologie de détection. L'encodeur rotatif particulier que nous utiliserons dans ce tutoriel est un encodeur rotatif incrémental et c'est le capteur de position le plus simple pour mesurer la rotation.

Cet encodeur rotatif est également appelé encodeur en quadrature ou encodeur rotatif relatif et sa sortie est une série d'impulsions d'onde carrée.

Fonctionnement de l'encodeur rotatif

Examinons de plus près l'encodeur et voyons son principe de fonctionnement. Voici comment les impulsions d'onde carrée sont générées :l'encodeur a un disque avec des zones de contact régulièrement espacées qui sont connectées à la broche commune C et à deux autres broches de contact séparées A et B, comme illustré ci-dessous.

Lorsque le disque commencera à tourner pas à pas, les broches A et B commenceront à entrer en contact avec la broche commune et les deux signaux de sortie à onde carrée seront générés en conséquence.

N'importe laquelle des deux sorties peut être utilisée pour déterminer la position tournée si nous comptons simplement les impulsions du signal. Cependant, si nous voulons également déterminer le sens de rotation, nous devons considérer les deux signaux en même temps.

On peut remarquer que les deux signaux de sortie sont décalés de 90 degrés l'un par rapport à l'autre. Si l'encodeur tourne dans le sens des aiguilles d'une montre, la sortie A sera en avance sur la sortie B.

Ainsi, si nous comptons les pas à chaque fois que le signal change, de High à Low ou de Low à High, nous pouvons remarquer à ce moment-là que les deux signaux de sortie ont des valeurs opposées. Inversement, si l'encodeur tourne dans le sens inverse des aiguilles d'une montre, les signaux de sortie ont des valeurs égales. Donc, compte tenu de cela, nous pouvons facilement programmer notre contrôleur pour lire la position de l'encodeur et le sens de rotation.

Exemple d'encodeur rotatif Arduino

Faisons-en un exemple pratique en utilisant l'Arduino. Le module particulier que j'utiliserai pour cet exemple est fourni sur une carte de dérivation et comporte cinq broches. La première broche est la sortie A, la deuxième broche est la sortie B, la troisième broche est la broche Button et bien sûr les deux autres broches sont les broches VCC et GND.

Nous pouvons connecter les broches de sortie à n'importe quelle broche numérique de la carte Arduino.

Vous pouvez obtenir les composants nécessaires pour ce didacticiel Arduino à partir des liens ci-dessous :

  • Module d'encodeur rotatif……………….
  • Carte Arduino ……………………………
  • Breadboard et Jump Wires ……… 

Code source

Voici le code Arduino :

/*     Arduino Rotary Encoder Tutorial
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */
 
 #define outputA 6
 #define outputB 7

 int counter = 0; 
 int aState;
 int aLastState;  

 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 

 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state
 }Code language: Arduino (arduino)

Description du code : Nous devons donc d'abord définir les broches auxquelles notre encodeur est connecté et définir certaines variables nécessaires au programme. Dans la section de configuration, nous devons définir les deux broches comme entrées, démarrer la communication série pour imprimer les résultats sur le moniteur série, ainsi que lire la valeur initiale de la sortie A et mettre la valeur dans la variable aLastState.

Ensuite, dans la section de boucle, nous lisons à nouveau la sortie A mais maintenant nous mettons la valeur dans la variable aState. Donc, si nous faisons tourner l'encodeur et qu'une impulsion est générée, ces deux valeurs seront différentes et la première instruction "if" deviendra vraie. Juste après cela, en utilisant la deuxième instruction "if", nous déterminons le sens de rotation. Si l'état de la sortie B diffère de l'état de la sortie A, le compteur sera incrémenté de un, sinon il sera décrémenté. À la fin, après avoir imprimé les résultats sur le moniteur série, nous devons mettre à jour la variable aLastState avec la variable aState.

C'est tout ce dont nous avons besoin pour cet exemple. Si vous téléchargez le code, démarrez le moniteur série et commencez à faire tourner l'encodeur, nous commencerons à obtenir les valeurs dans le moniteur série. Le module particulier que j'ai fait 30 comptes chaque cycle complet.

En savoir plus :Capteur à ultrasons HC-SR04 et Arduino - Guide complet

Exemple 2 – Contrôle d'un moteur pas à pas à l'aide d'un encodeur rotatif

En plus de cet exemple de base, j'ai créé un autre exemple de contrôle de la position d'un moteur pas à pas à l'aide de l'encodeur rotatif.

Voici le code source de cet exemple :

/*     Stepper Motor using a Rotary Encoder
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */

 #include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

// defines pins numbers
 #define stepPin 8 
 #define dirPin  9
 #define outputA 10
 #define outputB 11

 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 

}
void loop() {

  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     if (counter >=30 ) {
      counter =0;
     }
     
     lcd.clear();
     lcd.print("Position: ");
     lcd.print(int(angle*(-1.8)));
     lcd.print("deg"); 
     lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}

void rotateCW() {
  digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000);   
}
Code language: Arduino (arduino)

N'hésitez pas à poser des questions dans la section des commentaires ci-dessous.


Processus de fabrication

  1. File d'attente C# avec exemples :qu'est-ce que la file d'attente C# et comment l'utiliser ?
  2. Contrôle du servomoteur avec Arduino et MPU6050
  3. Roue de mesure simple bricolage avec encodeur rotatif
  4. module GPS u-blox LEA-6H 02 avec Arduino et Python
  5. Comment lire la température et l'humidité sur Blynk avec DHT11
  6. Est-il facile d'utiliser une thermistance ? !
  7. Comment faire de la musique avec un Arduino
  8. Comment utiliser NMEA-0183 avec Arduino
  9. Comment utiliser Modbus avec Arduino