Arduino UNO Q - Encodeur Rotatif

Un encodeur rotatif détecte le mouvement et la direction de rotation. Contrairement à un potentiomètre, il peut tourner en continu sans limite. Dans ce tutoriel, vous apprendrez à connecter un encodeur rotatif à l'Arduino UNO Q, à compter les pas de rotation, détecter la direction, et vérifier le compteur à distance via Telegram.

Arduino UNO Q - Encodeur Rotatif

Matériel Requis

1×Arduino UNO Q
1×USB Cable for Arduino Uno Q
1×Encodeur rotatif
1×Fils de connexion
1×Recommandé: Shield à bornier à vis pour Arduino Uno
1×Recommandé: Sensors/Servo Expansion Shield for Arduino Uno
1×Recommandé: Shield plaque d'essai pour Arduino Uno
1×Recommandé: Boîtier pour Arduino Uno
1×Recommandé: Kit plaque de base prototypage et plaque d'essai pour Arduino Uno

Ou vous pouvez acheter les kits suivants:

1×Kit de Capteurs DIYables (18 capteurs/écrans)
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

Brochage

Un module encodeur rotatif possède généralement 5 broches :

  • CLK (Sortie A) : Impulsion à chaque cran de rotation (LOW→HIGH→LOW)
  • DT (Sortie B) : Même impulsion que CLK mais décalée de 90° ; utilisée pour détecter la direction
  • SW : Bouton-poussoir intégré (LOW lorsqu'appuyé, HIGH lorsque relâché via pull-up)
  • VCC (+) : 3,3V ou 5V
  • GND : Masse
Brochage de l'Encodeur Rotatif

Encodeur Rotatif vs Potentiomètre

  • Un encodeur rotatif tourne en continu dans les deux sens ; un potentiomètre est limité à environ 270°
  • Un encodeur rotatif génère des impulsions (numérique) ; un potentiomètre produit une tension (analogique)
  • Utilisez un encodeur lorsque vous devez savoir de combien quelque chose a tourné ; utilisez un potentiomètre lorsque vous avez besoin de connaître la position absolue

Fonctionnement

Sortie de l'Encodeur Rotatif

Lorsque le bouton tourne, CLK et DT génèrent des impulsions alternées. Le déphasage de 90° entre eux indique la direction :

  • CLK passe de LOW à HIGH :
    • DT est LOW → Rotation horaire → incrémenter le compteur
    • DT est HIGH → Rotation antihoraire → décrémenter le compteur
    Fonctionnement de l'Encodeur Rotatif

    Comment Programmer

    • Détecter la transition de CLK de LOW à HIGH
    • Lire DT pour déterminer la direction
    • Mettre à jour un compteur : +1 pour le sens horaire, -1 pour le sens antihoraire

Schéma de Câblage

Schéma de Câblage Arduino UNO Q Encodeur Rotatif

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Code MCU — Encodeur Rotatif (Par Polling)

L'Arduino UNO Q possède deux processeurs : le MCU STM32 (gère le contrôle matériel en temps réel) et le MPU Qualcomm (exécute Debian Linux). Dans cette section, seul le MCU STM32 est programmé — le côté Linux reste inactif. Une section ultérieure montrera comment les deux processeurs fonctionnent ensemble.

Cette version utilise le polling pour détecter les transitions de CLK. Elle est simple mais peut manquer des comptages si loop() s'exécute lentement :

/* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-rotary-encoder */ #include <ezButton.h> #define CLK_PIN 2 // pin connected to CLK of encoder #define DT_PIN 3 // pin connected to DT of encoder #define SW_PIN 4 // pin connected to SW of encoder #define DIRECTION_CW 0 #define DIRECTION_CCW 1 int counter = 0; int direction = DIRECTION_CW; int CLK_state; int prev_CLK_state; ezButton button(SW_PIN); // create ezButton object for SW pin void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); prev_CLK_state = digitalRead(CLK_PIN); } void loop() { button.loop(); CLK_state = digitalRead(CLK_PIN); if (CLK_state != prev_CLK_state && CLK_state == HIGH) { if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } // TO DO: use counter and direction here } prev_CLK_state = CLK_state; if (button.isPressed()) { // TO DO: button pressed action here } }

Étapes Rapides

  • Première utilisation d'Arduino UNO Q ? Suivez le tutoriel Démarrer avec Arduino UNO Q pour préparer votre environnement de développement avant de continuer.
  • Câbler l'encodeur : Connectez CLK à la broche 2, DT à la broche 3, SW à la broche 4, VCC à 3,3V, GND à GND.
  • Connecter : Branchez l'Arduino UNO Q à votre ordinateur avec un câble USB-C.
  • Ouvrir Arduino App Lab : Lancez Arduino App Lab et attendez qu'il détecte votre Arduino UNO Q.
  • Créer une nouvelle application : Cliquez sur le bouton Créer une nouvelle application.
Créer une nouvelle application dans Arduino App Lab sur Arduino UNO Q
  • Donnez un nom à l'application, par exemple : DIYables_RotaryEncoder
  • Cliquez sur Créer pour confirmer.
  • Vous verrez un ensemble de dossiers et fichiers générés dans votre nouvelle application.
Dossiers et fichiers de l'application Arduino App Lab sur Arduino UNO Q
  • Trouvez le fichier sketch/sketch.ino — c'est ici que vous collerez le sketch MCU.
  • Coller le sketch : Copiez le code MCU ci-dessus et collez-le dans le fichier sketch. Laissez les autres fichiers par défaut.
    • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
    Add sketch library in Arduino App Lab on Arduino UNO Q
    • Search for ezButton created by ArduinoGetStarted.com and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    ezButton ArduinoGetStarted.com

    Button library supports debounce, pressed/released events and the press counting. It is easy to use with multiple buttons. The library can be used for push-button, momentary switches, toggle switch, magnetic contact switch (door sensor)... It is designed for not only beginners but also experienced users.

    1.0.6
    Install
    More Info
    • Search for Arduino_RouterBridge created by Arduino and click the Install button.
    My Apps / DIYables Apps
    Run
    Bricks
    No bricks added...
    Sketch Libraries
    No sketch libra...
    Files
    python
    sketch
    .gitignore
    README.md
    app.yaml
    sketch.ino
    Add sketch library
    Arduino_RouterBridge Arduino

    This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

    0.4.1
    Install
    More Info
    • Téléverser : Cliquez sur le bouton Exécuter dans Arduino App Lab pour compiler et téléverser vers le STM32.
    Cliquez sur le bouton Exécuter dans Arduino App Lab sur Arduino UNO Q
    • Tournez le bouton dans le sens horaire et antihoraire. Les changements de compteur sont enregistrés via Bridge Monitor dans la section suivante.
    • Appuyez sur le bouton — un événement de pression de bouton se déclenche.

    Code MCU — Encodeur Rotatif (Par Interruption)

    L'utilisation d'une interruption matérielle sur la broche CLK garantit qu'aucun comptage de rotation n'est manqué, même lorsque loop() est occupé :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-rotary-encoder */ #include <ezButton.h> #define CLK_PIN 2 // pin connected to CLK of encoder #define DT_PIN 3 // pin connected to DT of encoder #define SW_PIN 4 // pin connected to SW of encoder #define DIRECTION_CW 0 #define DIRECTION_CCW 1 volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time = 0; int prev_counter; ezButton button(SW_PIN); void ISR_encoderChange() { if ((millis() - last_time) < 50) return; if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); } void loop() { button.loop(); if (prev_counter != counter) { // TO DO: use counter and direction here prev_counter = counter; } if (button.isPressed()) { // TO DO: button pressed action here } }

    Étapes Rapides

    • Utilisez le même câblage et la même application que l'exemple précédent.
    • Remplacez le sketch par la version avec interruption et cliquez sur Exécuter.
    • Tournez le bouton et appuyez dessus — les résultats sont enregistrés via Bridge Monitor.

    Programmation Bridge Linux + MCU

    L'Arduino UNO Q possède deux processeurs qui fonctionnent ensemble : le MPU (Qualcomm, exécute Debian Linux) et le MCU (STM32, exécute Zephyr OS avec votre sketch Arduino). Ils communiquent via RPC grâce à la bibliothèque Arduino_RouterBridge — jamais via des ports série bruts.

    • L'encodeur rotatif est connecté au MCU (STM32) — câblé aux broches numériques avec support d'interruption. Le MCU suit le compteur et la direction en temps réel.
    • Le MPU ne peut pas lire l'encodeur directement — il doit demander la valeur du compteur au MCU via Bridge.call(). Le MCU répond immédiatement.
    • Le MPU dispose du Wi-Fi — parce que le MPU exécute Debian Linux complet avec Wi-Fi, il peut signaler le compteur de l'encodeur via Telegram à la demande.
    • Communication : Bridge.call() côté Linux invoque les fonctions Bridge.provide() côté MCU
    • ⚠️ Réservé : /dev/ttyHS1 (Linux) et Serial1 (MCU) sont utilisés par le routeur Arduino — ne les ouvrez jamais directement

    En bref : Le MPU demande le compteur → Le MCU lit le compteur actuel et la direction → Le MCU rapporte les valeurs → Le MPU les enregistre ou les transmet.

    Sketch MCU — encodeur rotatif avec Bridge et sortie Monitor :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-rotary-encoder */ #include "Arduino_RouterBridge.h" #include <ezButton.h> #define CLK_PIN 2 #define DT_PIN 3 #define SW_PIN 4 #define DIRECTION_CW 0 #define DIRECTION_CCW 1 volatile int counter = 0; volatile int direction = DIRECTION_CW; volatile unsigned long last_time = 0; int prev_counter; ezButton button(SW_PIN); void get_counter() { Monitor.print("Counter: "); Monitor.print(counter); Monitor.print(", Direction: "); Monitor.println(direction == DIRECTION_CW ? "Clockwise" : "Counter-clockwise"); } void reset_counter() { counter = 0; Monitor.println("Counter reset to 0"); } void ISR_encoderChange() { if ((millis() - last_time) < 50) return; if (digitalRead(DT_PIN) == HIGH) { counter--; direction = DIRECTION_CCW; } else { counter++; direction = DIRECTION_CW; } last_time = millis(); } void setup() { pinMode(CLK_PIN, INPUT); pinMode(DT_PIN, INPUT); button.setDebounceTime(50); attachInterrupt(digitalPinToInterrupt(CLK_PIN), ISR_encoderChange, RISING); Bridge.begin(); Monitor.begin(); Bridge.provide("get_counter", get_counter); Bridge.provide("reset_counter", reset_counter); Monitor.println("Rotary Encoder Bridge ready"); } void loop() { button.loop(); if (prev_counter != counter) { Monitor.print("DIRECTION: "); Monitor.print(direction == DIRECTION_CW ? "Clockwise" : "Counter-clockwise"); Monitor.print(" | COUNTER: "); Monitor.println(counter); prev_counter = counter; } if (button.isPressed()) { Monitor.println("Button pressed"); } }

    Script Python (Arduino App Lab) — interroger le compteur de l'encodeur depuis Linux :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-rotary-encoder */ from arduino.app_utils import * import time def loop(): while True: Bridge.call("get_counter") time.sleep(2) App.run(user_loop=loop)
    • Remarque : Assurez-vous que Bridge.begin() est appelé dans le sketch MCU et que le sketch est téléversé avant d'exécuter le script Python côté Linux.
    • ⚠️ Avertissement : N'ouvrez jamais directement /dev/ttyHS1 (sous Linux) ou n'utilisez pas Serial1 (sur MCU) dans votre code — ces ports sont réservés par le routeur Arduino et y accéder cassera le Bridge.

    Étapes Rapides

    • Téléverser le sketch MCU : Ouvrez Arduino App Lab, créez une nouvelle application, collez le sketch MCU Bridge ci-dessus dans sketch/sketch.ino, installez les bibliothèques ezButton et Arduino_RouterBridge, et cliquez sur Exécuter.
    • Ajouter le script Python : Collez le code Python ci-dessus dans l'onglet Python de la même application.
    • Exécuter l'application : Cliquez sur Exécuter — le côté Python interroge le compteur de l'encodeur toutes les 2 secondes.
    • Tournez le bouton de l'encodeur dans les deux sens.
    • Vérifier la console : Ouvrez l'onglet Console → sous-onglet MCU Monitor pour voir les changements de compteur enregistrés en temps réel.

    Sortie de la Console App Lab

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    Message (Enter to send a message to "Newbiely" on usb(2820070321))
    New Line
    9600 baud
    Rotary Encoder Bridge ready DIRECTION: Clockwise | COUNTER: 1 DIRECTION: Clockwise | COUNTER: 2 DIRECTION: Clockwise | COUNTER: 3 DIRECTION: Counter-clockwise | COUNTER: 2 DIRECTION: Counter-clockwise | COUNTER: 1 Button pressed

    Intégration Telegram

    Vérifiez le compteur de l'encodeur à distance depuis n'importe où via Telegram.

    Si vous n'avez pas encore de bot Telegram, consultez Arduino UNO Q - Bot Telegram pour obtenir votre token de bot avant de continuer.

    Sketch MCU : Gardez le même sketch MCU de la section Bridge précédente — aucune modification nécessaire. Assurez-vous qu'il est déjà téléversé et en cours d'exécution sur le STM32 avant de continuer.

    Script Python (Arduino App Lab) — bot Telegram pour le compteur d'encodeur :

    /* * Ce code Arduino UNO Q a été développé par newbiely.fr * Ce code Arduino UNO Q 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/arduino-uno-q/arduino-uno-q-rotary-encoder */ from arduino.app_utils import * import requests import time BOT_TOKEN = "YOUR_BOT_TOKEN" API_URL = f"https://api.telegram.org/bot{BOT_TOKEN}" last_update_id = 0 def send_message(chat_id, text): requests.post(f"{API_URL}/sendMessage", json={"chat_id": chat_id, "text": text}) def get_updates(): global last_update_id resp = requests.get(f"{API_URL}/getUpdates", params={"offset": last_update_id + 1, "timeout": 5}) return resp.json().get("result", []) def loop(): global last_update_id updates = get_updates() for update in updates: last_update_id = update["update_id"] msg = update.get("message", {}) chat_id = msg.get("chat", {}).get("id") text = msg.get("text", "").strip() if text == "/count": counter = Bridge.call("get_counter") send_message(chat_id, counter) elif text == "/reset": Bridge.call("reset_counter") send_message(chat_id, "Encoder counter has been reset to 0.") else: send_message(chat_id, "Commands:\n/count — read encoder counter value\n/reset — reset counter to 0") time.sleep(1) App.run(user_loop=loop)
    • Remarque : Remplacez YOUR_BOT_TOKEN par le token obtenu auprès de @BotFather sur Telegram.
    • Envoyez /count pour vérifier la valeur actuelle du compteur d'encodeur.
    • Envoyez /reset pour remettre le compteur à 0.

    Étapes Rapides

    • Téléverser le sketch MCU : Utilisez le sketch MCU Bridge de la section précédente (téléversez-le d'abord si ce n'est pas déjà fait).
    • Coller le script Telegram : Copiez le code Python ci-dessus dans l'onglet Python de votre application dans Arduino App Lab.
    • Définir votre token : Remplacez YOUR_BOT_TOKEN dans le script par votre token de bot réel.
    • Exécuter l'application : Cliquez sur Exécuter — le bot commence à écouter les messages Telegram.
    • Testez : Tournez l'encodeur, envoyez /count — le bot répond avec la valeur du compteur et la direction.

    Sortie de la Console App Lab

    DIYables_Apps
    Stop
    sketch.ino
    1#include "Arduino_RouterBridge.h"
    Serial Monitor
    Python
    [2026-04-29 12:00:01] Telegram: /count [2026-04-29 12:00:01] Counter: 5, Direction: Clockwise [2026-04-29 12:03:20] Telegram: /reset [2026-04-29 12:03:20] Encoder counter has been reset to 0.
    Telegram
    Telegram 12:45
    Welcome to Telegram!
    ArduinoBot 10:19
    Chatting with Arduino...
    telegram-botfather
    BotFather Yesterday
    Your bot has been created.

    ArduinoBot

    bot
    Today
    /count
    10:15 AM ✓✓
    Counter: 5, Direction: Clockwise
    10:16 AM
    /reset
    10:17 AM ✓✓
    Encoder counter has been reset to 0.
    10:18 AM

    Intégration d'OpenClaw

    Vous pouvez adapter OpenClaw à ce tutoriel en vous référant aux instructions du tutoriel Arduino UNO Q - OpenClaw.

    Idées d'Applications/Projets

    • Contrôle du volume à distance : Associer la rotation de l'encodeur aux niveaux de volume audio — vérifier le niveau actuel via Telegram
    • Compteur de pas : Compter les impulsions de l'encodeur pour mesurer le mouvement dans un système mécanique — signaler via Telegram
    • Navigateur de menu : Utiliser la rotation de l'encodeur pour parcourir les options d'un menu distant piloté depuis le MPU
    • Suivi de position : Suivre la position absolue en comptant les pas depuis une position initiale connue
    • Cadran de vitesse : Tourner l'encodeur pour définir une vitesse cible pour un moteur — confirmer le réglage via Telegram

    Défiez-vous

    • Facile : Ajouter un buzzer qui émet un bip à chaque fois que le bouton de l'encodeur est appuyé
    • Moyen : Exposer des callbacks séparés pour get_counter(), get_direction(), et get_button_count()
    • Avancé : Créer un bot Telegram qui envoie automatiquement une alerte lorsque le compteur dépasse un seuil configurable — stocker le seuil dans une variable Python configurable via Telegram

    Tutoriels connexes

    ※ NOS MESSAGES

    • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !