Accueil | Arduino | Tutoriels Arduino | Réaliser un encodeur optique angulaire à l’aide de phototransistors

Réaliser un encodeur optique angulaire à l’aide de phototransistors

Pour réaliser la girouette du projet d’anémomètre avec girouette connectés à base d’ESP8266, j’ai cherché une solution simple et peu couteuse pour déterminer la direction du vent. En faisant mes recherches, j’ai trouvé comment réaliser un encodeur de position angulaire absolue à base de Led et des phototransistors. Je vous propose de découvrir le principe de fonctionnement de ce capteur dans ce tutoriel. Vous y trouverez peut être d’autres applications dans vos projets diy. J’imagine qu’en robotique ce type d’encodeur pourrait être très utilise.

Cet encodeur remplacera également avantageusement un potentiomètre angulaire à 360° (lire le tutoriel sur le Keyes KY-040) qui ne permet d’encoder que des positions relatives.

Phototransistor Vishay TEPT4400

L’idée est donc d’utiliser des phototransistor pour réaliser l’encodeur optique. Un phototransistor fonctionne comme un interrupteur qui passe à l’état bas (LOW) en présence de lumière. J’ai trouvé des Vishay TEPT400 vendus par lot de 5 pour environ 4,50€ sur eBay ou Aliexpress mais vous pouvez également utiliser des Osram SFH310 (ou 310) qui sont toutefois beaucoup plus chers (documentation technique).

Comme pour chaque détecteur, le phototransistor présente des avantages et des inconvénients.

Pour commencer, voici les principaux avantages :

  • Le phototransistor est très similaire à une led (blanche) et compacte (3mm de diamètre avec 2 broches). Le branchement est similaire.
  • Le spectre de détection est très large ce qui permet de choisir presque n’importe quelle couleur de Led (figure ci-dessous).
  • Le prix est raisonnable.

Mais il y a aussi quelques inconvénients :

  • Comme une Led, le phototransistor nécessite une résistance en amont pour fonctionner.
  • La détection est directionnelle (30°). La Led devra être dans l’axe du phototransistor pour avoir une bonne détection.
  • La distance de détection est proportionnelle à la puissance lumineuse. Elle est assez faible, entre 10 et 15mm. Les Leds devront être alimentées à pleine puissance pour que l’encodeur de position fonctionne bien.

Ce phototransistor peut être alimenté directement en 5 Volts depuis la carte Arduino (un ESP8266 ou un Raspberry Pi). Il est sensible de 440 à 800nm avec un maximum à 570nm, ce qui correspond à la couleur jaune. Cependant, son spectre de détection est assez large (dans le cas du Vishay TEPT4400) ce qui permet de choisir une autre couleur (rouge, vert, bleu) sans affecter significativement son fonctionnement. La documentation technique est disponible ici pour tout savoir sur ses caractéristiques.

Sensibilité spectrale du phototransistor Vishay TETP4400. Max. à 570nm
Sensibilité spectrale du phototransistor Vishay TEPT4400. Sensibilité maximale à 570nm.

Comment réaliser un encodeur optique à base de code de Gray ?

Pour réaliser de détecteur, je me suis appuyé sur cet article publié en 2013 par Yoctopuce (un fabricant Suisse de cartes d’acquisition, d’actionneurs, et capteurs). Sans rentrer trop dans les détails techniques, on place un disque d’encodage entre les Led et les phototransistors. Les Led sont placées sur un cercle.

Remarque. J’ai utilisé Autodesk Fusion 360 pour la CAO. Tous les fichiers se trouvent sur le github ici.

Maintenant on va découper dans ce disque des lumières de manière à ce qu’à chaque changement de position (incrément du capteur), il n’y ait que l’état d’un seul phototransistor qui change. Pour cela, on créé 32 cercles (ce qui donne une meilleure précision de mesure qu’avec 30).

Encodeur optique préparation découpe lumières

Il ne reste plus qu’à supprimer les disques et les arc inutiles en utilisant l’outil « Break« . Voici la séquence que j’ai découpé :

  • La plus grande lumière est composée de 10 cercles.
  • Ensuite on laisse 4 cercles vides
  • La seconde lumière est composée de 3 cercles
  • Ensuite on laisse 2 cercles vides
  • Et enfin la troisième lumière est constituée par 2 cercles

encodeur optique lumière disque encodage vishay tetp4400 phototransistor

Amélioration. Ce capteur est encore au stade du prototype. Si vous l’avez amélioré, n’hésitez pas à partager vos améliorations dans les commentaires avec la communauté.

Circuit et matériel nécessaire

Pour réaliser votre encodeur de position optique vous aurez besoin du matériel suivant :

Voici le circuit à réaliser sur une breadboard.

circuit encodeur optique tept4400 vishay

Code

Le code du capteur est vraiment très simple. Le code de Gray permet de ne pas avoir d’état transitoire lors d’un changement d’état du capteur. Ce n’est pas un problème pour projet DIY Arduino mais ce n’est pas le cas pour un capteur industriel qui doit mesurer avec précision des mouvements rapides (en robotique par exemple). Ici c’est le principe qui compte avant tout.

On a donc besoin de 5 entrées numériques. La fonction getPosition() va lire l’état de chaque bit et prendre son opposé. Il ne reste plus qu’à convertir en byte pour obtenir un index de position. Pour cela il suffit d’attribuer un poids à chaque bit. Par exemple pour 10110, on fait 0*1 + 1*2 + 1*4 + 0*8 + 1*16 = 0+2+4+0+16 = 22.

Réalisation des éléments par impression 3D et assemblage

Vous pouvez récupérer et imprimer les fichiers STL de la girouette dur le projet github ici. Vous devez imprimer au moins les pièces suivantes :

  • Boitier girouette (83 minutes, 27g de PLA)
  • Disque encodeur (13 minutes, 3g de PLA)
  • Support Led (33 minutes, 9g de PLA)
  • fabriquer un support pour les phototransistor ou imprimer la plaque de liaison (67 minutes, 21g de PLA)

Une fois les éléments fabriqués par impression 3D, suivez les étapes d’assemblage du projet d’anémomètre et girouette connectés.

Une fois assemblé, vous obtiendrez ceci.

2. Girouette assemblée

Index des positions en images

Le tableau ci-dessous illustre le fonctionnement du capteur. Pour bien montrer le fonctionnement du code de Gray, j’ai mis en gras le bit qui à changé d’état entre deux changement d’orientation. En attribuant un poids à chaque bit (1 pour le bit0, 2 pour le bit1…), on obtient facilement l’index de la position.

IncrémentDirection du vent

(rotation du disque codeur)

Index de positionbit4

Poids : 16

bit3

Poids : 8

bit2

Poids : 4

bit1

Poids : 2

bit0

Poids : 1

1Code de gray 100001
22- 00011300011
33- 010111101011
44- 110112711011
55- 100111910011
66- 100101810010
77- 00010200010
88- 00110600110
99- 101102210110
1010- 101112310111
1111- 00111700111
1212- 00101500101
1313- 00100400100
1414- 011001201100
1515- 011011301101
1616- 011111501111
1717- 011101401110
1818- 010101001010
1919-01000801000
2020- 110002411000
2121- 110102611010
2222- 111103011110
2323-111002811100
2424- 101002010100
2525- 100001610000
2626- 100011710001
2727- 101012110101
2828- 111012911101
2929-110012511001
3030- 01001901001