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

Maîtriser les encodeurs rotatifs avec Arduino : Fonctionnement et intégration pas à pas

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

Présentation

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

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

Cet encodeur est aussi appelé encodeur quadrature ou encodeur rotatif relatif, et sa sortie est une série d'impulsions carrées.

Comment fonctionne un encodeur rotatif

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

Quand le disque commence à tourner pas à pas, les broches A et B font contact avec la broche commune et les deux signaux de sortie carrés sont générés en conséquence.

N'importe laquelle des deux sorties peut servir à déterminer la position de rotation si on compte simplement les impulsions du signal. Cependant, pour déterminer aussi le sens de rotation, il faut considérer les deux signaux en même temps.

On remarque que les deux signaux de sortie sont déphasés de 90 degrés l'un par rapport à l'autre. Si l'encodeur tourne dans le sens horaire, la sortie A est en avance sur la sortie B.

Si on compte les pas chaque fois que le signal change, de Haut vers Bas ou de Bas vers Haut, on remarque qu'à ce moment les deux signaux de sortie ont des valeurs opposées. Inversement, si l'encodeur tourne dans le sens antihoraire, les signaux de sortie ont des valeurs égales. En tenant compte de cela, on peut facilement programmer notre contrôleur pour lire la position de l'encodeur et le sens de rotation.

Exemple Arduino avec encodeur rotatif

Faisons un exemple pratique avec Arduino. Le module que j'utilise pour cet exemple est sur une carte d'extension et possède cinq broches. La première broche est la sortie A, la seconde la sortie B, la troisième la broche Bouton, et bien sûr les deux autres sont VCC et GND.

On peut connecter les broches de sortie à n'importe quelle broche numérique de l'Arduino.

Code source

Voici le code Arduino :

/* Arduino Rotary Encoder Tutorial
 * par Dejan Nedelkovski, www.HowToMechatronics.com */
#define outputA 6
#define outputB 7
int counter = 0;
int aState, aLastState;
void setup() {
  pinMode(outputA, INPUT);
  pinMode(outputB, INPUT);
  Serial.begin(9600);
  // Lecture de l'état initial de la sortie A
  aLastState = digitalRead(outputA);
}
void loop() {
  aState = digitalRead(outputA); // État "actuel" de la sortie A
  // Si l'état précédent et l'état actuel de la sortie A sont différents, une impulsion s'est produite
  if (aState != aLastState) {
    // Si l'état de la sortie B diffère de l'état de la sortie A, l'encodeur tourne dans le sens horaire
    if (digitalRead(outputB) != aState) {
      counter++;
    } else {
      counter--;
    }
    Serial.print("Position: ");
    Serial.println(counter);
  }
  aLastState = aState; // Mettre à jour l'état précédent avec l'état actuel
}

Description du code : On définit d'abord les broches auxquelles l'encodeur est connecté et les variables nécessaires. Dans le setup, on définit les deux broches en entrées, on démarre la communication série pour afficher les résultats sur le moniteur série, et on lit la valeur initiale de la sortie A qu'on place dans la variable aLastState.

Dans la boucle, on relit la sortie A mais cette fois on place la valeur dans aState. Si on tourne l'encodeur et qu'une impulsion est générée, ces deux valeurs diffèrent et le premier « if » devient vrai. Juste après, avec le second « if » on détermine le sens de rotation. Si l'état de la sortie B diffère de l'état de la sortie A, le compteur s'incrémente de 1, sinon il se décrémente. À la fin, après avoir affiché les résultats, on met à jour aLastState avec aState.

C'est tout pour cet exemple. Si on téléverse le code, on démarre le Moniteur Série et on tourne l'encodeur, on commence à obtenir les valeurs dans le moniteur. Le module que j'ai fait 30 comptages par cycle complet.

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

En plus de cet exemple de base, j'en ai fait un autre : contrôler 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
 * par Dejan Nedelkovski, www.HowToMechatronics.com */
#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 4, 5, 6, 7);
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0, angle = 0;
int aState, aLastState;
void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(outputA, INPUT);
  pinMode(outputB, INPUT);
  aLastState = digitalRead(outputA);
  lcd.begin(16, 2);
}
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);
}

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

Processus de fabrication

  1. Maîtriser les Files C# (Queue) : Enqueue, Dequeue et Opérations Premier Entré Premier Sorti
  2. Arduino et MPU6050 : Contrôle précis de servo-moteur avec SG90 et MG996R
  3. Construire une roue de mesure précise avec Arduino Nano et encodeur rotatif
  4. Module GPS u-blox LEA‑6H 02 : guide d'intégration Arduino et Python
  5. Lire température et humidité avec DHT11 sur Blynk – Tutoriel Arduino pas à pas
  6. Utiliser une thermistance facilement : Guide étape par étape Arduino
  7. Générer des Sons Musicaux avec Arduino : Guide Pas à Pas
  8. Connecter Arduino à NMEA‑0183 : Guide étape par étape
  9. Maîtriser Modbus sur Arduino : Guide étape par étape