Encodeur rotatif KY-040.

Comprendre l’utilisation du codeur KY-040.

Proposer à un quelconque moteur de recherche le mot clef « KY-040 » prouve immédiatement qu’il sera facile de se procurer ce petit module directement utilisable sans avoir à faire appel à une bibliothèque dédiée. Ce dispositif est un codeur sans butée à 20 points par tour pourvu d’un « bouton poussoir » par appui sur la tige de commande centrale. Outre ce contact entre la sortie SW (Pour SWITCH.) et la masse commune GND, la sortie fournit deux lignes réunies au +5Vcc par des résistances de forçage de 10 kΩ.

Caractéristiques techniques du module KY-040 :
x   • Consommation maximale : 3 à 5 mA sous 5 Vcc.
x   • Température de fonctionnement : – 30 à + 70 °C.
x   • Température de stockage : – 40 à + 85 °C.
x   • Durée de vie du capteur de rotation : Minimum 30 000 cycles.
x   • Durée de vie du contact central : Minimum 20 000 cycles.
x   • Résistance de passage du contact central : 3 Ω maximum.

Fonctionnement.

Concrètement les deux sorties nommées respectivement CLK et DT sont en réalité deux lignes fournissant des signaux binaires de type créneaux déphasés de 90°. L’état « 1 » est forcé par les résistances de 10 kΩ réunies au +5Vcc. Ce type de codage est universel, on le retrouve un peu partout. Par exemple dans les souris informatiques à l’époque où une petite sphère servait de capteur de mouvements. Les deux lignes fournissant les signaux déphasés sont habituellement nommées A et B pour ce type de capteur. La Fig.21 détaille le schéma électrique de ce petit module en indiquant la nature des broches telle qu’elle est indiquée sur le circuit vu coté composants. Le déphasage de 90° pour les signaux électriques des lignes A et B permet de déterminer le sens de rotation. Plusieurs façons de déduire le sens de rotation sont possibles. Nous pouvons librement prendre  en compte les fronts montants ou les fronts descendants de la ligne A ou de la ligne B.

Pour ne pas risquer de perdre la détection d’une rotation de modeste amplitude, il importe de surveiller simultanément les deux lignes électriques du capteur.  Par exemple sur la Fig.22 la transition montante sert à analyser le sens de rotation. C’est l’étude chronologique, de l’ordre des transitions d’un même front sur les deux sorties qui permet de déterminer le sens de rotation.

Les séquences de programme qui exploitent le capteur rotatif.

L’analyse détaillée du petit programme P11_Evaluer_le_codeur_rotatif.ino va s’avérer d’une grande richesse, car nous allons explorer des domaines non encore défrichés dans l’art de programmer Arduino. Ce démonstrateur est issu de nombreuses expériences et utilise la répartition des Entrées / Sorties d’ARDUINO UNO adoptées pour le projet en cours de développement. Cette répartition est détaillée sur le tableau Fig.23 donné ci-dessous. Nous sommes confrontés à deux difficultés très classiques. La première résulte de la technologie du capteur. Composé de contacts électriques classiques, X, Y et SW seront forcément perturbés par des rebonds mécaniques. La deuxième réside dans l’obligation de ne pas « perdre » de détections de rotations. Comme le microcontrôleur doit continuer à travailler en tâche de fond, il faut informatiquement surveiller les lignes A et B par interruptions. Deux sources d’interruptions impliquent deux entrées spécifiques sur l’ATmega328.

L’examen du tableau de la Fig.23 dévoile l’organisation retenue pour les liaisons d’E/S avec en rouge l’exploitation du capteur rotatif et en gris clair les broches actuellement disponibles. Il n’y a pas pénurie à ce point de vue. Se servir d’une entrée analogique A1 pour gérer un capteur de type « tout ou rien » n’est pas optimal. Il serait plus judicieux de prendre D12 en entrée par exemple, et laisser A1 pour du mesurage analogique plus fin. Comme il y a pléthore, cette organisation privilégie un regroupement des entrées, ce choix étant arbitraire et « purement esthétique ». Une remise en cause sera donc facile si dans l’avenir des perfectionnements du générateur engendraient un besoin qui la justifie.

Les interruptions faciles avec l’ATmega328 d’ARDUINO.

D’un point de vue pratique, le microcontrôleur ATmega328 dispose de deux entrées externes d’interruptions sur les broches spécialisées 4 et 5 de son boitier, respectivement nommées INT 0 et INT 1. Ces deux broches sont reliées respectivement aux entrées binaires D2 et D3 sur la carte électronique Arduino.

NOTE : Les ATMega328 peuvent également gérer des interruptions de changement d’état sur vingt de leurs broches. Mais leur traitement n’est pas aussi simple que pour les interruptions externes car il faut aiguiller le code après avoir déterminé d’où vient le requête. La librairie arduino-pinchangeint.h a été développée afin de permettre à ceux qui le désirent l’utilisation de ces interruptions internes au µP.

REMARQUE : Nous avons déjà étudié les interruptions déclenchées par les TIMERs. Ces dispositifs sont des électroniques internes au microcontrôleur, et dédiées à des applications prévisibles généralement affectées à la gestion du temps. Dans ce chapitre nous allons étudier des possibilités d’interruptions déclenchées par des évènements externes survenus sur des broches d’E/S et non de logiques de comptages internes. La broche d’entrée étant soumise soit à un état « 0 » soit à un niveau « 1 », en fonction de l’application on peut vouloir surveiller soit un changement d’état, soit un sens de transition. Passons en revue les « outils logiciels » proposés par l’IDE pour les traiter :

attachInterrupt(NumINT,Procedure,MODE);
x   Instruction d’initialisation qui configure l’une des deux interruptions externes. Cette instruction spécifie la Procédure (Sans parenthèses pour la déclaration
x   d’appel mais avec pour son implémentation.)
à appeler lorsqu’une interruption externe est détectée sur NumINT. Elle remplace toute autre procédure qui
x   était attachée à cette interruption. Le paramètre MODE précise l’événement qui déclenchera les interruptions :
x             • LOW : Un niveau « 0 » sur la broche.                                          .
x             • CHANGE : Un changement d’état sur la broche.
x             • RISING : Une transition de « 0 » vers « 1 ».  (Un front montant)
x             • FALLING : Une transition de « 1 » vers « 0 ».  (Un front descendant)

IMPORTANT : Procédure attachée à l’interruption étant basées sur l’utilisation des TIMERs du microcontrôleur, la routine delay ne fonctionne pas et la valeur renvoyée par millis ne s’incrémente pas durant le code de cette dernière. Les données séries reçues pendant l’exécution de la Procédure sont perdues et le protocole I2C est également affecté.

NOTE : Les variables volatile sont toute déclarées en GLOBAL et peuvent
être modifiées par le programme de base et ses diverses subroutines.

detachInterrupt(NumINT);
x   Instruction qui libère la broche de l’interruption externe NumINT. Seule la broche liée à NumINT ne provoquera plus d’interruptions.
x   L’instruction attachInterrupt() permet d’en rétablir le fonctionnement, ou de la réorienter sur une autre routine de traitement d’interruptions.

noInterrupts();
x   Instruction qui désactive toutes les interruptions. Les interruptions permettent à certaines tâches importantes de survenir à tout moment, et sont
x   activées par défaut avec Arduino
. Plusieurs procédures et fonctions sont désactivées ou perturbées lorsque les interruptions sont déclenchées.
x   (Communications série, millis, delay etc) Les interruptions pouvant perturber le déroulement du code dans certaines sections critiques, noInterrupts permet
x   de suspendre en bloc et momentanément toutes les interruptions de l’ATmega328.

interrupts();
x   Instruction qui réactive les interruptions après qu’elles aient été désactivées par noInterrupts. Naturellement, la paire d’instructions de désactivation et
x   de rétablissement des interruptions peut se trouver dans toute procédure ou fonction du programme.

x                                           void loop() {
x                                              « code courant » …
x                                              noInterrupts(); // Désactivation des interruptions.
x                                              // Code critique sensible aux fonctions temporelles.
x                                              interrupts(); // Réactivation des interruptions.
x                                              Suite du « code courant » … }

x                                                                     Conseils sur l’utilisation des interruptions.
• L’usage des interruptions est idéal pour des tâches qui consistent à surveiller la détection d’un changement d’état rapide et aléatoire sur un capteur, sans
x   avoir pour autant à constamment tester l’état de la broche d’entrée qui lui est reliée.

• Idéalement, une fonction attachée à une interruption doit être la plus courte et la plus rapide possible. Une bonne pratique consiste à s’en servir pour
x   intercepter un événement aléatoire et positionner sa valeur dans une variable globale déclarée en type volatile. Le traitement de cette variable est ensuite
x   confié à la boucle de base ou à l’une de ses procédures de servitude.

>>> Page suivante.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *