Electronique > Théorie > Encodeur optique

Dernière mise à jour : 29/01/2017

encodeurs_optiques

Présentation

Un encodeur optique (parfois aussi appelé roue codeuse optique) est un composant électromécanique qui peut prendre différentes formes, et qui dans bien des cas ressemble beaucoup à un potentiomètre. Mais contrairement à ce dernier, l'encodeur possède un axe dont le déplacement n'est limité ni vers la gauche ni vers la droite : il peut être tourné indéfiniment dans un sens comme dans l'autre, il n'y a pas de butée.

encodeur_optique_001

Ce genre de composant peut être utilisé pour décrémenter ou incrémenter la valeur de différents paramètres dans un système électronique, tel un four à micro-ondes avec affichage numérique, ou une surface de contrôle servant à piloter un logiciel séquenceur, par exemple. L'encodeur permet de déterminer une position, la vitesse et/ou le sens de rotation.

Fonctionnement général

Si le potentiomètre classique possède trois broches, l'encodeur optique "classique" en possède souvent quatre, parfois cinq ou six : deux broches pour son alimentation (il y a en effet une LED à l'intérieur qui nécessite du courant pour s'allumer) et deux broches pour la sortie des "données", ces dernières étant généralement nommées A et B. Une éventuelle troisième sortie - appelée signal de référence ou zéro - permet parfois d'envoyer une impulsion à chaque révolution complète. Il existe plusieurs types d'encodeurs optiques, avec des structures internes plus ou moins différentes, mais le principe de base reste le même : la LED intégrée éclaire des capteurs sensibles à la lumière à travers de trous pratiqués dans un disque physiquement solidaire de l'axe que peut manoeuvrer l'utilisateur.

encodeur_optique_disque_001c

S'il n'y avait qu'un seul capteur sensible à la lumière àl'intérieur de l'encodeur optique, on disposerait déjà d'un système capable de produire des impulsions électriques à un rythme dépendant de la vitesse de rotation de l'axe. Par exemple, si le disque intercallé entre LED émettrice et récepteur photosensible possède 200 trous régulièrement espacés sur son pourtour, on obtiendrait 200 impulsions pour une rotation complète de l'axe. Ce serait déjà pas mal, mais en aucun cas cela ne permettrait de savoir dans quel sens l'axe évolue. Pour déterminer le sens de rotation, un deuxième capteur photosensible est installé à une certaine distance du premier, de telle sorte que les informations délivrées par les deux capteurs - qui reçoivent tous deux de la lumière mais pas au même moment - soient décalées dans le temps. Le schéma suivant représente l'encodeur optique RES20-50-200 de COPAL, constitué d'une LED avec sa résistance de limitation de courant intégrée, et les deux photodétecteurs (phototransistors NPN) câblés en collecteur commun, sorties A et B disponibles sur leurs jonctions émetteur (pour pouvoir exploiter ces sorties, il faut mettre une résistance entre chaque émetteur et la masse).

encodeurs_optiques_bases_000ab encodeurs_optiques_bases_000ab

Le décalage temporel en question (entre sorties A et B) est généralement de Pi / 2, ce qui correspond à un décalage de 1/4 du temps occupé par une période complète (déphasage de 90 degrés). On parle aussi de signaux en quadrature, ne soyez donc plus surpris de lire "encodeur optique à quadrature" dans telle ou telle publicité, ça vient de là. Mais un petit diagramme valant mieux qu'un grand discours, voici un exemple de signaux délivrés sur les sorties A et B d'un encodeur à quadrature.

encodeurs_optiques_bases_000a

L'écart temporel entre les impulsions des deux sorties peut être obtenu de plusieurs façons : les deux récepteurs photosensibles peuvent être éclairés par un même trou placé sur une même circonférence, ou par deux trous différents, chacun situé sur un cercle concentrique qui lui est propre. Mais au final, on obtient la même chose sur les sorties A et B, deux signaux périodiques de "fréquences" égales mais décalés en phase de Pi / 2.

Détermination du sens de rotation
Comme vu précédement, le sens de rotation peut être deviné en regardant de quelle façon les sorties A et B changent d'état logique. Cela est facile à faire, il suffit de prendre une des deux sorties comme référence et de regarder ce qui se passe sur l'autre. Si l'on décompose dans le temps les différentes solutions binaires qu'offrent les deux sorties, on se rend compte qu'il n'existe que quatres possibilitées - ce qui n'a rien de surprenant puisqu'on travaille sur deux bits - qui sont espacées de façon égales dans le temps.

Rotation dans le sens horaire
Supposons pour commencer que les deux sorties soit à l'état logique bas. En tournant l'axe de l'encodeur dans le sens des aiguilles d'une montre, la sortie A passe à l'état logique haut alors que la sortie B reste à l'état logique bas. C'est l'instant T1...

encodeurs_optiques_bases_000b encodeurs_optiques_graphe_002a

Puis, si on continue de tourner l'axe, la sortie B passe à son tour à l'état logique haut, puis A repasse à l'état logique bas, puis B repasse à l'état logique bas. Ce qui nous donne les quatres instants T1 à T4 suivants :
T1 : A = 1 et B = 0
T2 : A = 1 et B = 1
T3 : A = 0 et B = 1
T4 : A = 0 et B = 0
On remarque que A est en avance sur B.

Rotation dans le sens anti-horaire
Il suffit de lire le diagramme dans l'autre sens...

encodeurs_optiques_bases_000c encodeurs_optiques_graphe_002b

T1 : A = 0 et B = 1
T2 : A = 1 et B = 1
T3 : A = 1 et B = 0
T4 : A = 0 et B = 0
On constate maintenant que B est en avance sur A. C'est en sachant comment cela fonctionne dans ce sens que l'on peut en déduire les faits inverses : en regardant en permanence l'état des deux sorties A et B, on en déduit que l'axe a été tourné, et avec très peu de besoin en calcul, on peut aussi en déduire dans quel sens la rotation s'est opérée. Le simple fait de regarder à un instant donné l'état logique des deux sorties A et B ne suffit cependant pas : il faut aussi avoir mémorisé l'état de ces sorties lors du précédent changement d'état, et effectuer une comparaison entre anciens et nouveaux états pour savoir dans quel ordre les choses se passent. Une façon de faire est expliquée plus en détails (avec un exemple pratique) à la page PIC - Bases - Encodeur optique

Nombres de trous et résolution
Le nombre de trous pratiqués dans le disque et par lesquels la lumière de la led peut passer pour aller jusqu'aux photodétecteurs, détermine la précision de l'encodeur. Le disque peut comporter 100 trous sur son pourtour, tout comme il peut en comporter 6000. Ce qui veut dire que le nombre d'impulsions fournies en un tour complet de l'axe (et du disque) peut varier dans d'assez grandes proportions. Les deux photos qui suivent montrent deux disques ayant des résolutions différentes : les trous sont si nombreux et si serrés sur la deuxième photo, qu'on a un peu de mal à les distinguer.

encodeur_optique_004 encodeur_optique_007

Plus le nombre de trous est élevé et plus la résolution est importante, cette dernière doit être choisie en fonction de l'application concernée. Une résolution élevée pourrait sembler préférable dans tous les cas (qui peut le plus pourrait à priori le moins), mais elle n'est pas forcement nécessaire et peut même poser certains problèmes dans des systèmes qui ne seraient pas en mesure de traiter un gros flux d'informations dans un temps très court (microcontrôleur travaillant avec une fréquence d'horloge basse, par exemple). De plus, il existe un rapport assez direct entre la résolution de l'encodeur et son prix, inutile de dépenser plus que nécessaire (les prix varient entre 5 euros et 200 euros). D'un point de vue angulaire, la résolution atteint 3,6 degrés pour un modèle 100 trous (360 / 100), et atteind 0,06 degrés pour un modèle 6000 trous (360 / 6000). Si l'encodeur optique doit être utilisé pour connaitre le positionnement d'un objet mobile (tel qu'une lunette astronomique), la résolution devra être élevée. Par contre, pour un petit montage électronique "utilitaire", un modèle faible résolution peut sans doute largement suffire.

Alimentation des encodeurs et "polarité" des signaux de sortie

Ha, des sorties. Bien. Mais, heu... comment dire... je branche quoi et où ?

Utilisation des sorties (collecteur commun ou collecteur ouvert)
Quand les sorties de l'encodeur optique sont de type "émetteur commun/collecteur ouvert", il faut y ajouter une résistance de charge reliée au +Valim qui permet de disposer d'un état logique haut quand le transistor correspondant est bloqué. Si vous n'ajoutez pas ces résistances, vous aurez en sorties soit un niveau bas, soit un état indéterminé.
Quand les sorties de l'encodeur optique sont de type "collecteur commun/émetteur ouvert", il faut y ajouter une résistance de charge reliée à la masse qui permet de disposer d'un état logique bas quand le transistor correspondant est bloqué. Si vous n'ajoutez pas ces résistances, vous aurez en sorties soit un niveau haut, soit un état indéterminé.

encodeurs_optiques_bases_000ea

Les résistances de charge (qu'on peut aussi appeler résistances de rappel) peuvent dans certains cas être remplacées par les pullup ou pulldown internes au microcontrôleur, quand bien sûr ce dernier en possède. Il faut toutefois se méfier car les fameuses "résistances" de rappel intégrées aux uC sont en fait des générateurs de courant et non pas vraiment de simples résistances. Leur emploi peut parfois poser problème (cas assez typique avec des liaisons I2C à "haute" vitesse). Voici un exemple de signaux acquis avec une même configuration matérielle (encodeurs Grayhill et PIC 24F), dans un cas en utilisant les pullup internes du PIC (écran de gauche), dans l'autre cas en utilisant des vraies résistances externes de 2,2 kO (écran de droite).

encodeurs_optiques_bases_000e_graphe_001a  encodeurs_optiques_bases_000e_graphe_001b

Même si on constate des fronts légèrement plus raide dans le second cas, cela fonctionne bien avec les deux configurations. A noter que la "propreté" des transitions dépend énormément de la façon dont l'utilisateur manipule l'axe de l'encodeur, et de la qualité mécanique de l'encodeur lui-même...

Alimentation encodeur optique en 3,3 V ou en 5 V ?
Bien souvent, un encodeur optique est associé à un microprocesseur ou microcontrôleur qui tire son énergie d'une source de tension de 5 V ou 3,3 V. Problème de compatibilité en vue ? L'encodeur, s'il nécessite une tension, doit de préférence en utiliser une qui "colle" avec celle du microcontrôleur (uC) auquel il est raccordé. De plus en plus, les microcontrôleurs nécessitent du 3,3 V, et la grande majorité des encodeurs optiques fonctionne sous 5 V. Cela n'est toutefois pas un soucis, car un encodeur optique "5 V" peut être utilisé dans un circuit "3,3 V" selon l'une des trois méthodes suivantes :
- raccord direct entre encodeur alimenté en 5 V et uC alimenté en 3,3 V, uniquement possible si les broches de l'uC sont "tolérantes 5 V"
- insertion d'adaptateurs/convertisseurs de niveau (5 V vers 3,3 V) entre encodeur alimenté en 5 V et uC alimenté en 3,3 V
- sous-alimentation de l'encodeur 5 V, avec une tension de 3,3 V
Ce dernier cas nécessite des essais, car le fait de sous-alimenter la LED incluse dans l'encodeur peut conduire à des dysfonctionnements, surtout quand on tourne l'axe un peu vite. Les transitions haut-bas et bas-haut sur les sorties peuvent alors être moins franches. La copie d'écran suivante à gauche montre ce qu'on obtient avec un encodeur Grayhill 62A prévu pour une tension de 5 V, quand il est alimenté en 5 V. La copie d'écran de droite montre ce qu'on a avec le même encodeur mais cette fois sous-alimenté en 3,3 V.

encodeurs_optiques_bases_000ac  encodeurs_optiques_bases_000e_graphe_001c  encodeurs_optiques_bases_000e_graphe_001b  

Dans les deux cas, les signaux sont tout-à-fait exploitables. Ma dernière maquette - un contrôleur MIDI - qui les fait travailler en sous-régime fonctionne très bien.

Détection des changements d'état des sorties
Pour détecter les changements d'états survenus sur les deux sorties A et B, et déterminer par la même occasion le sens de rotation de l'axe, rien de tel qu'un microcontrôleur. Ce type de composant peut disposer de plein de broches, et embarque l'intelligence que vous lui transférez. Pour un résultat fiable, (une détection avec le moins de risques de ratées) il est préférable d'avoir recours aux interruptions externes. La plupart des PIC (et autres uC) possèdent une ou plusieurs broches qui peuvent déclencher une interruption externe. Le classique 16F628A par exemple, dispose de 5 broches (RB0 et RB4 à RB7) qu'on peut ainsi mettre à contribution pour des encodeurs optiques. Pour des besoins plus élaborés (4 encodeurs optiques ou plus) la tâche est un poil plus ardue mais pas impossible. 

encodeurs_optiques_bases_000fa
Projet avec PIC et 4 encodeurs optiques

Il suffit de trouver le bon uC - ou le composant annexe qu'on lui associe - qui comble le besoin.

Encodeur asymétriques et symétriques

L'encodeur vu ci-avant est de type asymétrique, les deux sorties A et B se font sur un seul fil et sont référencées par rapport à la masse. Une sortie (A ou B) peut délivrer soit un état "flottant", soit un état logique haut ou bas selon la configuration interne de l'encodeur. Il existe aussi des encodeurs de type symétriques pour lesquels les sorties A et B se font chacune sur deux fils (A et A' pour la première sortie, B et B' pour la seconde sortie). Pour ces derniers, les sorties ne peuvent délivrer que des états logiques haut ou bas, jamais flottant. C'est pourquoi on dit aussi de ce genre de sortie qu'elle correspond à une configuration de type "push-pull". Tout comme dans le domaine audio, les sorties symétrique (complémentées / différentielles) offrent une meilleur immunité au bruit et assurent une plus grande robustessse des signaux dans des environements perturbés, surtout quand les liaisons entre encodeur et circuit de traitement sont longues (voir Symétrique / asymétrique).

Encodeurs incrémentaux

Ce type d'encodeur permet uniquement de mesurer des changements de position, mais il est bien sûr possible d'en déduire vitesse et même accélération (ce que permettent aussi les autres types d'encodeurs).

Encodeur absolu

Ce type d'encodeur permet de connaitre la position d'un objet solidaire de l'axe. Il est constitué de segments opaques et de segments transparents répartis en plusieurs cercles concentriques sur la roue de l'encodeur. Le premier cercle, situé au milieu de la roue, possède un certain nombre de segments. Le cercle suivant (en allant vers le bord extérieur du disque) possède deux fois plus de segments que le premier. Le suivant (en allant toujours vers le bord extérieur du disque) en possède deux foix plus que le précédent (et donc quatre fois plus que le premier), etc. Le premier cercle (le plus proche du centre) comporte un segment transparent et un segment opaque. Le deuxième possède deux segments transparents et deux segments opaques. Le troisième cercle possède quatre segments de chaque type, etc. On se trouve en pleine représentation binaire avec le bit de poids fort situé au plus près du centre et le bit de poids faible situé le plus à la périphérie du disque. On comprendra donc qu'un disque doté de 10 cercles sera en mesure de donner un nombre relatif à sa position compris entre 0 et 1023 (2 puissance 10 positions possibles), et qu'un disque doté de 16 cercles sera en mesure de donner un nombre relatif à sa position, compris entre 0 et 65535 (2 puissance 16 positions). Bien sûr, pour que cela fonctionne, il faut un capteur photosensible par piste (cercle).

Des encodeurs "très/trop" bon marché ?

Je ne pourrai pas cacher bien longtemps que je fais partie de ceux qui achètent parfois des composants de manière compulsive, se disant que "ça peut servir un jour". Les encodeurs optiques sérieux (professionnels) coûtent cher, plusieurs dizaines d'euros la pièce. Alors forcément, quand on voit un lot de 3 encodeurs mécaniques pour 1 euro, ou un lot de 10 pour moins de 5 euros, on est tenté. J'ai ainsi commandé, l'année dernière (2016) un lot de 3 encodeurs mécaniques (et non optiques) pour 1 euro, et un autre lot de 4 encodeurs mécaniques pour 2 euros. Dans la foulée (début 2017) je me suis aussi laissé tenter par un lot de 10 encodeurs mécaniques pour environ 4 euros.

encodeurs_optiques_bases_000fb  encodeurs_optiques_bases_000fa

Remarque : on reconnait ces encodeurs mécaniques au fait qu'ils possèdent 3 broches, et non 4 ou 5 (pas besoin d'alimenter une source lumineuse). Une des particularités de ce type d'encodeur (je parle bien de ceux que j'ai acquis, et non de tous les types) est de délivrer des signaux temporaires et non fixes. En exploitant les changements d'états avec les interruptions d'un uC, pas de soucis (en tenant toutefois compte des rebonds). Mais gare aux crises de nerf si on essaye de savoir où on en est avec un simple multimètre en mode ohmmètre...
Alors, ces encodeurs valent-ils le coucou (coup et coût) ? Désolé, mais je vais être franc. Si c'est pour faire des tests sur une petite maquette et vérifier un principe de fonctionnement, alors OK. Mais si c'est pour un montage sérieux qui doit tenir dans le temps, oubliez tout de suite. Sur les sept encodeurs mécaniques que j'ai achetés en 2016 et testés début 2017, un seul fonctionnait encore (les autres sont simplement et purement bloqués, on ne peut plus les tourner) ! Mais pourquoi en avoir racheté, alors que c'est de la m... ? C'est simple, j'ai passé la dernière commande avant de (re)tester les "vieux"... Je m'attendais évidement à ce qu'ils tiennent moins longtemps que ceux proposés par les pros, mais pas à ce point là ! Ceci dit je dois être honnête avec vous. Ces encodeurs ont été stockés dans un garage dont la température avoisine toujours la température extérieure.

Voir aussi

PIC - Bases - Encodeur optique - Exemple avec PIC et MikroPascal
Compteur points 002 - Comptage et décomptage entre 0000 et 9999 avec PIC 16F628A et 4 afficheurs 7 segments
Alimentation ajustable 014c - Génération tension et signal PWM avec deux encodeurs optiques