ESP32 - Encodeur rotatif

Dans ce guide, vous apprendrez comment utiliser l'encodeur rotatif avec un ESP32. Voici ce que nous allons apprendre :

Préparation du matériel

1×ESP-WROOM-32 Dev Module
1×USB Cable Type-C
1×Rotary Encoder
1×Breadboard
1×Jumper Wires
1×(Recommended) ESP32 Screw Terminal Adapter

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos de l'encodeur rotatif

Un bouton rotatif, comme sur une radio, peut envoyer des signaux qui se transforment en électricité. Il nous aide à savoir combien il a tourné et où il est placé. Il existe deux types principaux :

  • Encodeur incrémental : Celui-ci utilise des signaux rapides pour mesurer combien quelque chose a changé de position.
  • Encodeur absolu : Ce type donne un code secret pour chaque emplacement, ce qui nous aide à trouver où quelque chose se trouve, même si le courant est coupé.

Cette leçon concerne principalement le premier type, l'encodeur incrémental.

Brochage du module d'encodeur rotatif

brochage de l'encodeur rotatif

Un module encodeur rotatif possède 4 broches :

  • Broche CLK (Sortie A) : est l'impulsion principale qui nous indique combien de rotation a eu lieu. Chaque fois que vous tournez le bouton d'un cran (clic) dans l'une ou l'autre direction, la broche CLK émet un signal qui complète un cycle complet (BAS → HAUT → BAS).
  • Broche DT (Sortie B) : fonctionne comme la broche CLK mais émet un signal qui est en retard sur le signal CLK de 90 degrés. Cela nous aide à déterminer la direction de la rotation (dans le sens des aiguilles d'une montre ou dans le sens inverse).
  • Broche SW : provient du bouton de l'encodeur. Elle est normalement ouverte. Lorsque nous ajoutons une résistance de tirage à cette broche, la broche SW sera HAUTE lorsque le bouton n'est pas poussé et BASSE lorsqu'il est poussé.
  • Broche VCC (+) : doit être connectée à VCC (entre 3,3 et 5 volts)
  • Broche GND : doit être connectée à GND (0V)

Encodeur rotatif vs potentiomètre

Vous pourriez confondre l'encodeur rotatif avec le potentiomètre, mais ce sont des composants distincts. Voici une comparaison entre eux :

  • L'encodeur rotatif est comme la version moderne du potentiomètre, mais il peut faire plus de choses.
  • L'encodeur rotatif peut tourner en rond sans s'arrêter, alors que le potentiomètre ne peut tourner que sur environ trois quarts de cercle.
  • L'encodeur rotatif génère des impulsions, tandis que le potentiomètre fournit une tension analogique.
  • L'encodeur rotatif est pratique lorsque vous avez juste besoin de déterminer de combien le bouton a bougé, et non pas exactement où il se trouve. Le potentiomètre est utile lorsque vous avez vraiment besoin de savoir exactement où se trouve un bouton.

Fonctionnement d'un encodeur rotatif

sortie de l'encodeur rotatif

À l'intérieur de l'encodeur, il y a un petit disque avec des fentes qui est connecté à une broche appelée C, qui agit comme une masse commune. Vous avez deux autres broches, A et B.

  • Lorsque vous tournez le bouton, les broches A et B touchent cette broche de masse commune C, mais l'ordre dans lequel elles la touchent dépend de la direction dans laquelle vous tournez le bouton (dans le sens horaire ou antihoraire).
  • Ces contacts créent deux signaux. Ils sont un peu différents en termes de timing car une broche touche la masse avant l'autre. Ces signaux sont déphasés de 90 degrés, ce qui est appelé codage en quadrature.
  • Si vous tournez le bouton dans le sens horaire, la broche A touche la masse avant la broche B. Mais si vous tournez dans le sens antihoraire, c'est la broche B qui touche d'abord la masse avant la broche A.
  • En vérifiant quand chaque broche touche ou quitte la masse, nous pouvons déterminer dans quelle direction le bouton tourne. Nous faisons cela en vérifiant ce qui arrive à la broche B lorsque la broche A change.
Comment fonctionne un encodeur rotatif

Lorsque A passe de l'état BAS à l'état HAUT :

  • Si B est ÉLEVÉ, le bouton est tourné dans le sens antihoraire.
  • Si B est BAS, le bouton est tourné dans le sens horaire.

※ NOTE THAT:

Les broches A et B sont connectées aux broches CLK et DT. Cependant, selon les fabricants, l'ordre peut être différent. Les codes fournis ci-dessous ont été testés avec l'encodeur rotatif de DIYables.

Comment programmer pour un encodeur rotatif

  • ESP32 lit le signal de la broche CLK
  • Si l'état passe de BAS à HAUT, alors l'ESP32 lit l'état de la broche DT.
    • Si la broche DT est HAUTE, le bouton est tourné dans le sens antihoraire, l'ESP32 augmente le compteur de 1
    • Si la broche DT est BASSE, le bouton est tourné dans le sens horaire, l'ESP32 diminue le compteur de 1

Diagramme de câblage

Schéma de câblage de l'encodeur rotatif ESP32

This image is created using Fritzing. Click to enlarge image

Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, vous pouvez trouver des conseils dans le tutoriel suivant : Comment alimenter l'ESP32.

Code ESP32 - Encodeur rotatif

Le code ESP32 ci-dessous fait :

  • Détecte la direction et l'ampleur de la rotation de l'encodeur.
    • Si détection du bouton tourné d'un cran (clic) dans le sens horaire, augmentez le compteur de un.
    • Si détection du bouton tourné d'un cran (clic) dans le sens antihoraire, diminuez le compteur de un.
  • Détecte si le bouton est pressé.
/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin #define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin #define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object that attach to pin 7; void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // read the initial state of the rotary encoder's CLK pin prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); // MUST call the loop() function first // read the current state of the rotary encoder's CLK pin CLK_state = digitalRead(CLK_PIN); // If the state of CLK is changed, then pulse occurred // React to only the rising edge (from LOW to HIGH) to avoid double count if (CLK_state != prev_CLK_state && CLK_state == HIGH) { // if the DT state is HIGH // the encoder is rotating in counter-clockwise direction => decrease the counter if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } Serial.print("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("Clockwise"); else Serial.print("Counter-clockwise"); Serial.print(" - count: "); Serial.println(counter); } // save last CLK state prev_CLK_state = CLK_state; if (button.isPressed()) { Serial.println("The button is pressed"); } }

Pour simplifier le code du debounce de bouton, la bibliothèque ezButton est utilisée.

Étapes rapides

Si c'est la première fois que vous utilisez ESP32, consultez comment configurer l'environnement pour ESP32 sur Arduino IDE.

  • Installez la bibliothèque ezButton sur Arduino IDE.
  • Copiez le code ci-dessus et ouvrez-le avec Arduino IDE
  • Cliquez sur le bouton Upload sur Arduino IDE pour téléverser le code vers ESP32
  • Tournez le bouton dans le sens des aiguilles d'une montre, puis dans le sens inverse
  • Appuyez sur le bouton
  • Consultez le résultat sur le moniteur série.
COM6
Send
Rotary Encoder:: direction: CLOCKWISE - count: 1 Rotary Encoder:: direction: CLOCKWISE - count: 2 Rotary Encoder:: direction: CLOCKWISE - count: 3 Rotary Encoder:: direction: CLOCKWISE - count: 4 Rotary Encoder:: direction: CLOCKWISE - count: 5 Rotary Encoder:: direction: ANTICLOCKWISE - count: 4 Rotary Encoder:: direction: ANTICLOCKWISE - count: 3 Rotary Encoder:: direction: ANTICLOCKWISE - count: 2 Rotary Encoder:: direction: ANTICLOCKWISE - count: 1 Rotary Encoder:: direction: ANTICLOCKWISE - count: 0 The button is pressed
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explication du code

Consultez les commentaires ligne par ligne dans le code.

Code ESP32 - Encodeur rotatif avec interruption

Dans le code précédent, utiliser le polling pour vérifier en continu l'état de la broche peut gaspiller les ressources de l'ESP32 et entraîner des comptages manqués si l'exécution d'autres codes est lente.

Une solution efficace consiste à utiliser l'interruption, qui élimine la nécessité du sondage. Cela permet à l'ESP32 d'effectuer d'autres tâches sans manquer les comptages. Ci-dessous se trouve le code ESP32 qui utilise l'interruption pour lire la direction et la position à partir de l'encodeur rotatif.

/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-rotary-encoder */ #include <ezButton.h> // the library to use for SW pin #define CLK_PIN 25 // ESP32 pin GPIO25 connected to the rotary encoder's CLK pin #define DT_PIN 26 // ESP32 pin GPIO26 connected to the rotary encoder's DT pin #define SW_PIN 27 // ESP32 pin GPIO27 connected to the rotary encoder's SW pin #define DIRECTION_CW 0 // clockwise direction #define DIRECTION_CCW 1 // counter-clockwise direction volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time; // for debouncing int prev_counter; ezButton button(SW_PIN); // create ezButton object that attach to pin 7; void IRAM_ATTR ISR_encoder() { if ((millis() - last_time) < 50) // debounce time is 50ms return; if (digitalRead(DT_PIN) == HIGH) { // the encoder is rotating in counter-clockwise direction => decrease the counter counter--; direction = DIRECTION_CCW; } else { // the encoder is rotating in clockwise direction => increase the counter counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { Serial.begin(9600); // configure encoder pins as inputs pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); // set debounce time to 50 milliseconds // use interrupt for CLK pin is enough // call ISR_encoder() when CLK pin changes from LOW to HIGH attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoder, RISING); } void loop() { button.loop(); // MUST call the loop() function first if (prev_counter != counter) { Serial.print("Rotary Encoder:: direction: "); if (direction == DIRECTION_CW) Serial.print("CLOCKWISE"); else Serial.print("ANTICLOCKWISE"); Serial.print(" - count: "); Serial.println(counter); prev_counter = counter; } if (button.isPressed()) { Serial.println("The button is pressed"); } // TO DO: your other work here }

Maintenant, lorsque vous tournez le bouton, vous remarquerez des informations qui apparaissent sur le moniteur série, tout comme ce que vous avez vu dans le code précédent.

※ NOTE THAT:

  • Vous pouvez trouver sur d'autres sites des tutoriels qui utilisent deux interruptions pour un seul encodeur, mais cela est inutile et gaspilleur. Une seule interruption suffit.
  • Il est important d’utiliser le mot-clé volatile pour les variables globales utilisées dans l'interruption. Négliger cela pourrait conduire à des problèmes inattendus.
  • Gardez le code à l'intérieur de l'interruption aussi simple que possible. Évitez d'utiliser Serial.print() ou Serial.println() à l'intérieur de l'interruption.

Application de l'encodeur rotatif ESP32

Avec l'encodeur rotatif, nous pouvons réaliser les applications suivantes mais sans nous y limiter :

  • ESP32 - L'encodeur rotatif contrôle la position du moteur Servo
  • ESP32 - L'encodeur rotatif contrôle la luminosité de la LED
  • ESP32 - L'encodeur rotatif contrôle la vitesse du moteur pas à pas

Vidéo

Références de fonction

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!