Un codeur rotatif peut être décrit sommairement comme une paire d'interrupteurs qui s'ouvrent et se ferment de façon répétée pendant qu'on tourne un bouton. Les deux interrupteurs changent d'état à des moments légèrement différents, et il est possible d'utiliser cette caractéristique pour déterminer le sens de rotation du bouton (pour une description plus détaillée du principe de fonctionnement, voir ce précédent billet).

- CLK (clock): premier interrupteur actionné par la rotation du bouton
- DT (data): deuxième interrupteur actionné par la rotation du bouton
- SW (switch): interrupteur actionné quand on appuie sur le bouton
- GND: à relier à la masse
- +: à relier à 3,3 V
J'ai branché le module à la carte Nucleo de la façon suivante:
- broche CLK du codeur rotatif: broche D2 du Nucleo
- broche DT du codeur rotatif: broche D3 du Nucleo
- broche SW du codeur rotatif: broche D7 du Nucleo
- broche GND du codeur rotatif: broche GND du Nucleo
- broche + du codeur rotatif: broche 3V3 du Nucleo
Dans le script ci-dessous, j'utilise le créateur "RotaryEncoder" pour créer un objet nommé "codeur". Les deux premiers arguments sont les numéros des broches auxquelles le codeur est branché sur la carde (D2 et D3, dans mon cas). Les 3 arguments suivants indiquent respectivement la valeur minimale, la valeur maximale et la valeur par défaut associées au codeur:
RotaryEncoder codeur(D2, D3, -10,10,0);
La valeur par défaut est celle que votre codeur prendra au démarrage du programme, avant que l'utilisateur ait tourné le bouton (j'ai choisi une valeur de 0). Lorsque l'utilisateur tournera le bouton dans le sens horaire, la valeur augmentera progressivement, par bonds de 1. Si on atteint la valeur maximale (que j'ai réglée à 10), une rotation du bouton dans le sens horaire n'a aucun effet. Si l'utilisateur tourne le bouton dans le sens antihoraire, la valeur diminue progressivement, sauf si la valeur minimale (que j'ai réglée à -10) est atteinte.
La bibliothèque ne gère que la rotation du bouton. Pour vérifier si le bouton est enfoncé ou non, j'ai utilisé DigitalIn qui est une fonction régulière de mbed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/************************************************************************* | |
Lecture d'un codeur rotatif branché à une carte STM32 Nucleo | |
Utilisation de la bibliothèque RotaryEncoder par Shinichiro Nakamura: | |
https://os.mbed.com/users/shintamainjp/code/RotaryEncoder/ | |
Instructions détaillées: | |
http://electroniqueamateur.blogspot.com/2018/10/lecture-dun-codeur-rotatif-avec-stm32.html | |
*************************************************************************/ | |
#include "mbed.h" | |
#include "RotaryEncoder.h" | |
Serial pc(USBTX, USBRX); // tx, rx: communication par USB avec un ordinateur | |
RotaryEncoder codeur(D2, D3, -10,10,0); // pin1, pin2, valeur min, valeur max, valeur par défaut | |
DigitalIn bouton(D7,PullUp); // pour tester si le bouton du codeur est enfoncé ou non | |
int main() | |
{ | |
while(1) { | |
printf("Valeur = %d", codeur.getVal()); // affichage de la position de rotation | |
if (!bouton) { // alors le bouton est enfoncé | |
printf(" *\n"); // on affiche un astérisque | |
} | |
else{ | |
printf("\n"); // on n'affiche rien | |
} | |
wait_ms(200); // courte pause | |
} | |
} |
Yves Pelletier (Twitter, Facebook)
Super explications ! merci.
RépondreSupprimerOu peut on trouvé des encodeurs crantés mécaniquement ? De même un encodeur ou il y aurait une force de rappel le ramenant au neutre ?
J'aimerais construire une poste de pilotage de bateau à moteur. Il me faudrait un encodeur très solide pour réaliser une "barre de navigation" numérique.