dimanche 7 octobre 2018

Lecture d'un codeur rotatif avec STM32 Nucleo (mbed)

Dans ce court billet, je vous présente comment j'ai procédé pour lire l'état d'un codeur rotatif en quadrature (rotary encoder) avec une carte STM32 Nucleo programmée avec mbed.

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).

Le codeur rotatif que j'ai utilisé est un module de type "KY-040" qui comporte 5 connecteurs:
  • 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
Pour programmer la carte Nucleo au moyen de l'IDE en ligne mbed, j'ai utilisé la bibliothèque RotaryEncoder par Shinchiro Nakamura.


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.

On peut vérifier le fonctionnement correct du codeur rotatif grâce à un logiciel de communication série réglé à 9200 bauds.  La position du codeur est affichée périodiquement. Au départ, la valeur affichée est celle que vous avez choisie dans votre programme comme valeur par défaut.  Cette valeur augmente lorsque vous tournez le bouton en sens horaire, et diminue lorsque vous le tournez en sens antihoraire. Lorsque vous enfoncez le bouton, un astérisque est également affiché.


Yves Pelletier   (TwitterFacebook)


1 commentaire:

  1. Super explications ! merci.
    Ou 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.

    RépondreSupprimer