I- Introduction

L’entreprise Pololu commercialise une grande quantité de matériel pour la robotique. Parmi ces produit, une gamme est très intéressant pour la réalisation de projets robotiques: les mini moto-réducteurs N20. Il s’agit de moteurs DC équipés d’une réduction à engrenages métalliques, permettant d’obtenir des vitesses de rotation faibles voir très faibles et des couples d’autant plus grands. En plus d’avoir un grand nombre de configurations disponibles en termes de rapports de réduction, ces moteurs ont l’énorme avantage d’être extrêmement petits. Pour compléter cette gamme de moteurs, Pololu propose une série d’encodeurs rotatifs permettant de mesurer avec précision la position angulaire de l’arbre de sortie des moteurs. L’encodeur Pololu 2590 est un capteur optique censé renvoyer deux signaux carrés en quadrature, représentatifs de la position angulaire rotative du moteur. Cependant, la qualité de ces signaux ne permet pas une lecture fiable directement en les lisant depuis un microcontrôleur (par exemple un Arduino). Il est donc nécessaire d’utiliser un filtre entre la sortie de l’encodeur et le microcontrôleur. Erich Styger a déjà proposé une solution à ce problème en 2014 en concevant un filtre à base de convertisseurs Analogique/Digital. Cependant, ces composants n’étant pas disponibles en Colombie lorsque j’en avais besoin, et les importer ayant un coût disproportionné, j’ai décidé de concevoir un autre filtre plus simple et presque aussi efficace. En effet, il permet de corriger la forme des signaux en transformant les sinusoïdes en signaux carrés de rapport cyclique 50%, cependant le déphasage entre les deux canaux n’est pas garanti à exactement 90°.

II- Encodeur Optique Pololu 2590

1) Présentation

L’encodeur Pololu 2590 est un encodeur optique, constitué d’un PCB à souder à l’extrémité du moteur, et d’une roue codeuse qui s’assemble par friction à un second arbre moteur prévu à cet effet (situé avant la boite de réduction, la résolution est donc d’autant meilleure). Le PCB est équipé de deux phototransistors, qui détectent le passage des dents de la roue codeuse et génèrent des échelons sur deux canaux. La lecture de ces deux canaux déphasés de 90° depuis un microcontrôleur permet de mesurer un déplacement angulaire de l’axe moteur, ainsi que son sens de rotation.

Image 1: Encodeur utilisé sur le projet CN 2DOF

 

Image 2: Encodeurs utilisés sur le projet micromouse

2) Identification des signaux sortants

Après avoir acheté plusieurs encodeurs pour réaliser des projets universitaires, je me suis rendu compte que la lecture directe n’était pas possible depuis un microcontrôleur ou un Arduino. En effet, quelque soit la plateforme utilisée (Arduino ou microcontrôleur Freescale QE16), le programme n’arrivait pas à détecter correctement tous les pas. Pololu indique que cela est normal, et qu’il faut calibrer la position de la roue codeuse sur l’axe du moteur, afin d’obtenir des signaux optimaux en sortie de l’encodeur. Cette calibration se fait à l’aide d’un oscilloscope.

Image 3: Roue codeuse trop éloignée du PCB (Source: Pololu.com)

 

Image 4: Roue codeuse trop proche du PCB (Source: Pololu.com)

 

Image 5: Roue codeuse en position optimale (Source: Pololu.com)

Sur ce dernier relevé de mesures fourni par Pololu avec la roue codeuse en position optimale, on remarque très nettement que les signaux ne sont pas carrés, et n’ont pas une amplitude de 5V. En effet, le signal 1 (Jaune) oscille entre 0,5 et 4V, et le signal 2 (Bleu) entre 0,2V et 3,25V. De plus, après avoir réalisé mes propres mesures avec trois codeurs différents, il s’est avéré difficile d’obtenir des signaux proches de ceux-ci. Ainsi, un exemple de signaux obtenus pour la position optimale est le suivant:

Image 6: Signaux optimaux obtenus expérimentalement

Dans ce cas, le signal 1 (Jaune) oscille entre 1V et 2,8V et le signal 2 (Vert) entre 0,6 et 3,4V alors qu’ils devraient osciller entre 0 et 5V. En connectant ces signaux directement à un micro-contrôleur, celui-ci n’arrive pas à détecter les changements de niveaux logiques qu’il devrait détecter avec des signaux carrés. En effet, en se basant sur le cas du micro-contrôleur de l’Arduino Uno (ATMEGA328P), la documentation constructeur indique les seuils permettant de définir le passage d’un niveau à un autre dans la section 32.2 – Common DC Characteristics.

Image 7: Extrait de la documentation technique de l’ATMEGA328P (Source: microchip.com)

On y lit que si le microcontrôleur est alimenté en 5V (cas de l’Arduino Uno), la tension maximale pour lire une entrée à l’état bas est de 0,3 * 5V = 1,5V et la tension minimale pour lire un état haut est de 0,6 * 5V = 3V. Ainsi, dans l’exemple ci-dessus, le signal 1 (Jaune) ne dépasse jamais 2,8V, c’est à dire qu’un Arduino Uno ne détecte pas les états hauts.

III- Conception du filtre

1) Filtrage

Afin de filtrer ces signaux,la première étape est d’utiliser des Triggers de Schitt entre la sortie des encodeurs et l’entrée du microcontrôleur. Ces composants permettent de filtrer les états logiques d’un signal digital lorsqu’il est dégradé. C’est à dire que lorsque la tension d’entrée est inférieure à un seuil bas, sa sortie est à l’état bas, et lorsque l’entrée est supérieure à un seuil haut, sa sortie est à l’état haut. Les circuits intégrés 74HC14 conviennent parfaitement dans ce cas, puisque selon leur documentation technique, Section 13 : Transfer Characteristics, le seuil de passage à l’état bas est de 1,4V, et le seuil de passage à l’état haut de 2,38V; et nos deux signaux 1 et 2 du relevé précédents passent chacun ces deux seuils à chaque période. L’image 9 représente le traitement effectué par le Trigger.

Image 8: Extrait de la documentation technique du Trigger de Shmitt 74HC14 (Source: Nexperia)

Image 9: Évolution des signaux entrants et sortants du Trigger.

Après acquisition des nouveaux signaux filtrés à l’oscilloscope, on obtient bien un signal parfaitement carré de 5V d’amplitude, cependant son rapport cyclique est de l’ordre de 90%. Le résultat est que si l’on utilise les fronts montants et les fronts descendants pour mesurer le déplacement angulaire de l’arbre moteur, ou que l’on utilise l’encodeur dans les deux sens de rotation, les pas ne sont pas égaux et des erreurs de mesure sont induites.

2) Pré-amplification

Afin de corriger ce problème, il suffit d’amplifier le signal de sortie de l’encodeur, avant de le passer par le Trigger de Schmitt. Ainsi, en jouant sur le facteur d’amplification, on peut faire varier précisément les instants auxquels le signal passe par les seuils du trigger, et ainsi modifier le rapport cyclique. L’image 13 montre l’évolution des différents signaux en fonction du facteur d’amplification.

Afin de réaliser l’amplification, le plus simple est d’utiliser un amplificateur opérationnel LM324 en mode linéaire. A l’aide de seulement deux résistances et deux Trimmers adéquates on peut amplifier les deux canaux selon le gain souhaité.

IV- Fabrication du filtre

1) Conception et Fabrication du PCB

Après avoir testé et validé le montage sur protoboard, j’ai dessiné un PCB permettant de réduire l’encombrement du filtre et de le réutiliser sur plusieurs projets. Ce module permet de filtrer 4 canaux soit deux encodeurs en même temps.

Image 10: Schéma électronique du filtre

Image 11: Tracé des pistes et implantation des composants

 

Image 12: PCB fabriqué et assemblé

2) Calibration

Une fois le module câblé, on peut procéder à sa calibration : il suffit de régler les trimmers au maximum (10K Ohms dans ce cas) d’alimenter le moteur, et de mesurer les deux signaux en sortie du filtre. On peut alors baisser progressivement la valeur des trimmers jusqu’à atteindre un rapport cyclique de 50%. La figure animée ci-dessous illustre le procédé de calibration en montrant l’évolution des différents signaux.

Image 13: Évolution des signaux lors de la calibration.

V- Résultats et Conclusions

Après calibration, un relevé à l’oscilloscope donne les signaux de l’image 14 en sortie du filtre. On remarque que l’amplitude varie bien de 0V à 5V, et que le rapport cyclique du signal 2 (Vert) a été calibré à 50%. Le rapport cyclique du signal 1 (Jaune) importe moins puisque dans l’application utilisée il sert uniquement à déterminer le sens de rotation du moteur. Cette solution a déjà fait ses preuves dans plusieurs projets, et ce pour un coût très réduit (environ 3 euros, PCB inclus pour un filtre capable de traiter deux encodeurs).

Image 14: Signaux finaux obtenus après filtrage