Encodeur à quadrature, Pico et MicroPython
Bonjour à tous,
L'article d'aujourd'hui regroupe plusieurs domaines.
Il démarre en effet de la récupération d'éléments sur l'imprimante HP DesignJet T520 ou je m'arrête spécifiquement sur les moteurs équipés de disques optiques.
Equipé d'un moteur 5V (CN459-60067 BN026Y18), d'un disque optique et d'un encodeur à quadrature optique, je voulais savoir s'il était possible de l'utiliser avec MicroPython.
Le disque optique
La photo haute résolution du disque optique permet de relever plusieurs informations utiles.
Le disque présente 50 interstices transparents entre deux numéro successif. Le disque étant numéroté de 1 à 12, cela représente 600 pulsations par tour (ce que reprend l'une des références sur le disque).
Les autres références/informations sur le disque ne renvoi malheureusement que vers les imprimantes HP.
L'encodeur optique
Pour sa part, l'encodeur optique est monté sur une plaquette fixée directement sur le support métallique.
Cet encodeur contient un LED (émetteur de lumière) ainsi que deux capteur photo-sensibles. Le décalage entre les deux capteurs permet d'identifier le sens de rotation du moteur.
Le connecteur 4 contacts est utilisé pour:
- la masse
- l'alimentation 5V (déduit de la résistance utilisée pour la LED).
- Deux signaux à quadrature.
Les signaux
Quelques mesures rapides permettent de savoir que le capteur produit une tension de sortie (pas besoin de résistances pull-up ou pull-down).
Maintenant que le brochage est identifié, il ne reste plus qu'à branché un oscilloscope sur les deux canaux de sorties.
Notez le décalage entre les deux signaux entre marche avant et marche arrière!
L'oscilloscope nous informe aussi que la fréquence des pulsations est de 24.4 KHz (soit 24400 fois par seconde). La période est de 1/24400 soit 41µSec (temps en deux impulsions sur un même canal).
Brancher sur Raspberry-Pi Pico
Les signaux de sortie étant étant en 5 volts (ou presque), il faut utiliser un pont diviseur de tension pour ramener la tension sous 3.3V.
Bibliothèque et code d'exemple
D'autre part la période de 41µSec nécessitera un code particulièrement rapide pour ne pas rater d'impulsion.
Une section de code en PIO permettra de suivre suivre la cadence... même sous MicroPython!
La bibliothèque adéquate est disponible dans le dépôt esp8266-upy ( esp8266-upy/LIBRARIAN/rp2lib ).
rp2qenc.py contient le code PIO et la classe PIO_QENC permettant d'utiliser un encodeur à quadrature autonome sur un Pico.
La classe PIO_QENC permet de compter (ou décompter) un compteur permettant de connaître le nombre de tour moteur (valeur signée encodée sur 32 bits).
Le code permettant de lire le compteur est relativement simple.
from machine import Pin from time import sleep_ms from rp2qenc import PIO_QENC pinA = Pin(15, Pin.IN, Pin.PULL_UP) pinB = Pin(16, Pin.IN, Pin.PULL_UP) qenc = PIO_QENC(0, (pinA, pinB)) print('starting....') for i in range(120): print('iter %3i : Quadrature value = %i' % (i,qenc.read()) ) sleep_ms(500) qenc.sm_qenc.active(0) print('stop')
Voici qui termine ce petit article.