Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Utiliser un codeur rotatif une Raspberry Pi Pico en code Arduino

(Mis à jour le 23/01/2023)

apercu codeur rotatif KY 040

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é !

exemple utilisation encodeur rotatif imprimante 3d

Le bouton de contrôle des imprimantes 3D est en général un codeur rotatif

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

CLK

GP14

DT

GP13

SW

Pas utilisé ici

+

3V3

GND

GND

Le schéma à faire est le suivant :

ky40 rotary encoder circuit diagram Pi Pico breadboard

Circuit électronique à reproduire

ky40 rotary encoder circuit diagram RP2040 breadboard

Circuit électronique à reproduire

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 :

schéma breadboard codeur rotatif Pi Pico
schéma breadboard codeur rotatif Pi Pico

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 .

librairie codeur rotatif rpi pi pico arduio ide

Les fichiers sources sont copiés dans le dossier de votre projet Arduino IDE

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 premium

Déjà abonné ? Connectez-vous