samedi 15 juillet 2023

Utilisation d'un codeur rotatif avec le Raspberry Pi Pico (Micropython)

À première vue, un codeur rotatif (rotary encoder) ressemble à un potentiomètre: il s'agit d'un bouton que l'utilisateur peut tourner afin de contrôler un appareil (modifier le volume sonore, par exemple).

Contrairement au potentiomètre, toutefois, le codeur rotatif produit un signal purement numérique. Deux interrupteurs s'ouvrent et se ferment à mesure qu'on tourne le bouton. Ces deux interrupteurs sont placés en quadrature, c'est à dire qu'ils sont décalés dans le temps l'un par rapport à l'autre, ce qui permet de déduire le sens de la rotation du bouton.


Connexions du codeur rotatif au Rasberry Pi Pico

Pour la rédaction de ce tuto, j'ai utilisé un codeur rotatif de type KY-040: il s'agit d'un petit module qui comporte, en plus du codeur rotatif lui-même, des résistances de tirage 10 kΩ. Le module comporte 5 connecteurs: CLK et DT (clock et data) sont les deux interrupteurs en quadrature actionnés par la rotation du bouton, alors que SW (switch) est l'interrupteur qui est actionné lorsqu'on pousse sur le bouton. Les entrées + et GND servent à l'alimentation du module.

J'ai branché le codeur rotatif au Raspbery Pi Pico de la façon suivante:

  • Broche GND du codeur rotatif: une des broches GND du Raspberry Pi Pico
  • Broche + du codeur rotatif: sortie 3,3 V du Raspberry Pi Pico
  • Broche SW du codeur rotatif: broche GP15 du Raspberry Pi Pico *
  • Broche DT du codeur rotatif: broche GP 14 du Raspberry Pi Pico *
  • Broche CLK du codeur rotatif: broche GP 13 du Raspberry Pi Pico *
* Ces 3 broches seront définies dans notre programme en micropython, et vous pouvez donc les remplacer par d'autres broches au besoin.


Installation de la bibliothèque micropython "Rotary"

Mike Teachman a produit un excellent pilote Micropython pour l'utilisation d'un codeur rotatif

Deux fichiers de ce dépôt gitHub doivent être installés sur votre Raspberry Pi Pico: 
  • rotary.py 
  • rotary_irq_rp2.py

Script en micropython #1

-
-

Lorsque vous exécutez le programme ci-dessus avec Thonny, la console affiche la valeur du codeur chaque fois qu'elle change (donc lorsque vous tournez le bouton). L'état du bouton poussoir s'affiche également lorsque son état change (0 quand il est enfoncé, 1 quand il est relâché).



Le constructeur RotaryIRQ (lignes 17 à 22) comporte plusieurs arguments qui nous permettent de personnaliser le comportement de l'encodeur rotatif:
  • pin_num_clk : numéro de la broche du Raspberry Pi Pico reliée à la sortie CLK de l'encodeur.
  • pin_num_dt : numéro de la broche du Raspberry Pi Pico reliée à la sortie DT de l'encodeur.
  • min_val : valeur minimale générée par l'encodeur (par défaut: 0)
  • max_val : valeur maximale générée par l'encodeur (par défaut: 10)
  • incr : de quel incrément la valeur change à chaque 'click' pendant la rotation de l'encodeur. (par défaut: 1)
  • reverse: booléen indiquant pour quel sens de rotation les valeurs augmentent. À "False", la valeur augmente quand on tourne dans le sens antihoraire. À "True", la valeur augmente quand on tourne dans le sens horaire.
  • range_mode: détermine comment l'encodeur se comportera lorsque les limites min_val et max_val sont dépassées. Les trois valeurs possibles sont RotaryIRQ.RANGE_UNBOUNDED (aucune limite), RotaryIRQ.RANGE_BOUNDED (la valeur plafonne au résultat maximum lorsqu'on tente de le dépasser) et RotaryIRQ.RANGE_WRAP (la valeur retourne au minimum lorsqu'on dépasse le maximum).
  • pull_up: booléen qu'on règle à True pour activer les résistances pull-up internes du Raspberry Pi Pico si notre codeur rotatif ne comporte pas de résistances pull-up (ce qui n'est pas notre cas).
  • half_step: booléen qu'on peut régler à True pour activer la détection des demi-pas.
  • invert: booléen qu'on peut régler à True pour inverser les broches DT et CLK.
La seule contrainte un peu gênante que j'ai trouvée au pilote de Mike Teachman, c'est que la valeur initiale du codeur rotatif est nécessairement la valeur minimale. On peut imaginer des cas où il serait plus pertinent qu'au démarrage du programme, la valeur se situe à mi-chemin entre le minimum et le maximum, mais ça ne semble pas avoir été prévu.

Le pilote ne gère pas le signal généré par la sortie SW du module KY-040 (qui indique si l'utilisateur a enfoncé le bouton), mais c'est facile de le prendre en charge nous-mêmes dans notre script. Contrairement aux sorties CLK et DT, la sortie SW n'est munie d'aucune résistance de tirage, c'est pourquoi on active la résistance pull up interne de la broche 15 (ligne 26).

Script en micropython #2

-
-

Dans ce deuxième exemple, le codeur rotatif contrôle la luminosité de la LED embarquée du Raspberry Pi Pico. Cette LED est donc alimentée par un signal modulé en largeur d'impulsion (PWM). Les valeurs limites du codeur rotatif sont réglées à un minimum de 0 (rapport cyclique de 0%, LED complètement éteinte) et à un maximum de 65535 (rapport cyclique de 100%, LED allumée à pleine intensité). De plus, l'incrément a été réglé à 4000 pour qu'il ne soit pas nécessaire de faire accomplir au bouton des centaines de tours avant de commencer à constater un résultat...

Lorsque vous exécutez ce script, la LED devrait être éteinte au départ, mais elle devient de plus en plus brillante à mesure que vous tournez le bouton dans le sens horaire.

À lire également:

Ce blog comporte aussi un article sur l'utilisation d'un codeur rotatif avec une carte Arduino, et avec une carte STM 32 Nucleo programmée avec mbed.

Mes autres articles concernant la programmation du Raspberry Pi Pico en Micropython se trouvent dans la dernière moitié de cette page.


Yves Pelletier 


Aucun commentaire:

Enregistrer un commentaire