Utiliser un codeur rotatif une Raspberry Pi Pico en code Arduino
(Mis à jour le 23/01/2023)
Un codeur rotatif est un capteur qui permet de convertir une position angulaire en un signal de sortie afin de déterminer la position et le sens de rotation. Il est notamment très utilisé en moteurs pour l’asservissement, mais également dans les interfaces utilisateurs pour remplacer les potentiomètres. En plus, la plupart des modules DIY sont dotés d’un bouton-poussoir intégré !
Prendre en main un codeur rotatif : le KY-040
Dans ce tutoriel, nous allons découvrir comment utiliser ce module très pratique : le codeur rotatif KY-040
, fréquemment présent dans les kits DIY. Ce module peut être employé pour créer une interface utilisateur avec notre programme : sélectionner un menu, ajuster une variable…
Différence entre codeur rotatif et potentiomètre
À première vue, le codeur rotatif KY-040
peut facilement ressembler à un potentiomètre. Mais en fait, le potentiomètre est un capteur analogique et le codeur rotatif est numérique. Alors qu’un potentiomètre modifie la valeur d’une résistance, le codeur rotatif n’a pas de limite de tours: il tourne à l’infini.
Le codeur rotatif, par contre, détecte un nombre de « pas » par tours et envoie un signal à chaque pas. La différence s’en ressent par le toucher : le potentiomètre tourne de manière fluide, alors que le codeur rotatif tourne de manière saccadée.
Le codeur rotatif peut être directement utilisé par un microcontrôleur, car il émet des niveaux logiques. Sa précision est déterminée par le nombre de pas par tour, tandis que la précision du potentiomètre dépend de la précision de l’ADC nécessaire pour estimer sa position.
Note
Un potentiomètre est utilisé pour régler des paramètres analogiques, comme le volume d’un amplificateur. À l’inverse, un codeur rotatif est employé pour déterminer précisément une position angulaire et une direction.
Fonctionnement théorique d’un encodeur rotatif
Ce tutoriel ne rentre pas trop dans les détails techniques, mais il y a beaucoup de choses à dire 🤓. Si vous voulez connaître réellement le fonctionnement physique, les différentes technologies et les topologies classiques (par exemple, le comprendre le fonctionnement d’un encodeur rotatif optique à quadrature de phase 😨), je vous redirige vers la présentation théorique d’un encodeur rotatif .
Branchements de l’encodeur rotatif KY-040 sur la Pi Pico
Ce codeur rotatif possède 2 signaux pour connaître la position : CLK
et DT
. La broche SW
est reliée au bouton-poussoir intégré (SWitch).
Avertissement
Ce tutoriel est plus orienté vers les makers et ne couvre pas en profondeur les détails techniques. Cependant, si vous désirez connaître les technologies, les topologies classiques et le fonctionnement physique, je vous invite à jeter un œil à la présentation théorique d’un encodeur rotatif 🤓.
Voici une proposition de branchement sur la Raspberry Pi Pico et la carte uPesy RP2040 DevKit :
Codeur Rotatif |
Rasperry Pi Pico |
---|---|
|
|
|
|
|
Pas utilisé ici |
|
|
|
|
Le schéma à faire est le suivant :
Note
Je vous recommande d’alimenter l’encodeur en 3.3V afin d’avoir des niveaux logiques conformes aux spécifications du Pi Pico.
Et voici un exemple de montage sur breadboard :
Connaître la position angulaire du codeur rotatif KY-040
Avec un encodeur incrémental, on n’obtient pas directement l’angle en degrés, mais le nombre d’incréments effectués par l’utilisateur. C’est à nous d’en déduire l’angle depuis le programme. Ici dans cet exemple, nous voulons simplement connaître la valeur de l’incrément.
Il existe différentes méthodes pour déterminer l’incrément du codeur. La méthode idéale serait de détecter les pas sans bloquer le programme contrairement à une approche “naïve” qui vérifie constamment les signaux logiques reçus par le codeur. Sinon la Pico risque de ne pas prendre en compte certains pas si le codeur est tourné très rapidement.
Note
L’utilisation d’interruptions matérielles offre une approche optimale pour détecter les changements de niveau logique. Ces interruptions sont complètement détachées du CPU: on pourra utiliser la fonction loop()
pour faire autres choses.
Malheureusement, il n’existe pas de librairie toute prête optimisée pour la Raspberry Pi Pico compatible en code Arduino. Il existe cependant plusieurs codes prêts à l’emploi écrit en C pur (pour fonctionner avec le Pico SDK).
Les librairies utilisent soit des interruptions classiques, soit avec les broches PIO de la Pico couplées à des interruptions. En fait, pour faire simple, on peut associer une sorte de code assembleur basique qui sera exécuté par des blocs matériels PIO
. Cela permet de déléguer la logique du comptage du compteur.
Je vous propose d’utiliser cette librairie (qui fonctionne à peu près sur l’Arduino IDE). L’installation est un peu particulière car elle n’est pas prévue de base pour être installé depuis l’Arduino IDE. Il suffit de copier-coller le fichier quadrature.pio
et le fichier quadrature.pio.h
dans le dossier de votre projet (qui contient le code .ino
). Ils sont disponibles ici dans le repo GitHub .
Et voici le code élémentaire pour récupérer la valeur de l’incrément.
#include "hardware/pio.h"
#include "quadrature.pio.h"
#define QUADRATURE_A_PIN 13
#define QUADRATURE_B_PIN 14
PIO pio = pio0;
uint offset, sm;
void setup() {
Serial.begin(115200);
offset = pio_add_program(pio, &quadrature_program);
sm = pio_claim_unused_sm(pio, true);
quadrature_program_init(pio, sm, offset, QUADRATURE_A_PIN, QUADRATURE_B_PIN);
}
void loop() {
pio_sm_exec_wait_blocking(pio, sm, pio_encode_in(pio_x, 32));
uint encoder_value = pio_sm_get_blocking(pio, sm);
Serial.println(encoder_value);
delay(200);
}
On utilise ici le pio0
. Pour récupérer la valeur de l’incrément on doit utiliser les 2 fonctions pio_sm_exec_wait_blocking()
et pio_sm_get_blocking()
.
Note
Le comptage est fait en arrière-plan via PIO. On récupère la valeur de l’incrément uniquement quand on en a besoin.
Détecter la pression du bouton-poussoir
La librairie n’intègre pas de détection du bouton-poussoir. Cependant cela peut se faire facilement comme avec un bouton classique avec du code Arduino. On pourrait même utiliser une interruption pour avoir une détection en arrière-plan.
Liste de librairies pour un codeur rotatif
Voici une liste d’autres librairies qui peuvent être utilisées dans votre projet. Je vous invite à regarder la présentation de chaque sur leur dépôt Github respectif, pour choisir celle qui répondra le mieux à votre besoin 😊.
Cette section est réservée aux abonnés. Il vous reste 18% à découvrir.
Devenir membre premiumDéjà abonné ? Connectez-vous