Dernière mise à jour :
13/07/2025
Présentation
Ce circuit comporte sur un même circuit imprimé un encodeur rotatif et
un anneau de 12, 15 ou 20 LED.
Par rapport à la version Enc-LED-Ring
001, ce modèle présente une particularité : celle de
transmetre une valeur numérique comprise entre 0 et 255 ou un caractère
"+" ou "-", selon le sens de rotation de l'encodeur. Pour
cela, un
petit microcontrôleur PIC24 a été mis à contribution. Il assure à lui
seul le "décryptage" des signaux en quadrature A et
B de l'encodeur, le pilotage/affichage des LED et la transmission des
données
sur un port série. Quatre circuits ont été étudiés :
-
Schéma 002a
: version avec PIC24F04KA200 et 12 LED, modes Point et Ruban
-
Schéma 002b
: version avec PIC24F04KA200 et 15 LED, mode Ruban
seul
-
Schéma 002c
: version avec PIC24F04KA200 et 20 LED, mode Ruban
seul
-
Schéma 002d
: version avec PIC24F08KA101 et 20 LED, modes Point et Ruban
La
limitation "mode ruban seul" des versions 002b et 002c est liée à la
taille mémoire programme du PIC24F04KA200 qui n'est que de 4K et
insuffisante pour tout faire avec 15 ou 20 LED, raison pour laquelle
le PIC24F08KA101 avec ses 8K de mémoire est venu à la rescousse pour la version 002d.
Schéma 002a (12 LED avec PIC24F04KA200)
Le schéma révèle le coeur du montage : un encodeur EC12D à
contacts mécaniques et un PIC24 pour la gestion de l'ensemble.

Schéma 002b (15 LED avec PIC24F04KA200)
Idem schéma 002a, mais avec 15 LED au lieu de 12.
Schéma 002c (20 LED avec PIC24F04KA200)
Idem schéma 002a, mais avec 20 LED au lieu de 12.
Schéma 002d (20 LED avec PIC24F08KA101)
Changement de PIC pour un petit complément de resources mémoire programme bienvenu.
Fonctionnement
Le fonctionnement de base est identique pour toutes les versions :
- décodage du sens de rotation de l'encodeur rotatif
- affichage LED sur anneau 12, 15 ou 20 éléments
- transmission de données au format série UART-TTL
Décodage des signaux A et B
L'encodeur
rotatif EC12D permet d'obtenir les deux signaux en
quadrature de phase sur les broches A et B quand l'axe est mis en
mouvement dans un sens ou dans l'autre. Ce modèle équipé de contacts
mécaniques ne réclame aucune alimentation, contrairement aux encodeurs
équipés de LED. Les broches A et B de l'encodeur sont directement
reliées à deux broches du microcontrôleur PIC24
configurées en entrées avec pullup internes activées. Quand les
contacts mécaniques se ferment, on dispose de signaux logiques actifs à
l'état bas qui provoquent des interruptions au sein du PIC.
Affichage LED
L'affichage LED se fait en mode Point ou en mode
Ruban. Dans le mode Point, une seule LED au maximum peut être allumée à
tout instant. En mode Ruban, plusieurs LED peuvent s'allumer "en même
temps". Dans le second cas, la consommation moyenne de courant est plus
élevée, tout en restant modeste (environ 20 mA). Le
microcontrôleur PIC24 assure l'affichage en mode multiplexé
des LED
selon un principe astucieux qui permet de n'utiliser que 4 ou 5 lignes
d'entrée/sortie (méthode expliquée à la page
Affichage
Multiplexé).
C'est grâce à ce principe qu'on peut ici se contenter d'un boitier 14
broches pour assurer la totalité des fonctions.
Remarque
: pour la version 12 LED, 4 lignes d'entrée/sortie suffisent. Si j'en
ai utilisé 5, c'est pour assurer la compatibilité de câblage entre les
3 versions 12/15/20 LED.
Chacune des LED
travaille sur une période de temps partagé : 1/12 du temps
total
pour la version à 12 LED, 1/20 du temps pour la version à 20 LED.
La vitesse de
rafraichissement global est de 1 kHz, soit environ 83 Hz pour chaque
LED dans la version 12 LED, ou encore 50 Hz pour la version 20
LED. Ce rythme est assez élevé pour limiter le risque de scintillement
gênant.
Synchronisation avec votre système
Les données émises (Tx) ou reçues (Rx) par l'encodeur 002a respectent
le format de transmission série (UART) suivant :
19200 bauds, 8 bits data, 1 bit stop, sans parité
Un seul octet est nécessaire pour définir la valeur transmise, cette
dernière sera donc limitée à la plage 0-255.
Transmission
Au
repos, quand l'encodeur mécanique n'est pas manipulé, aucune donnée
n'est transmise sur la sortie Tx. Dès qu'une rotation vers la
gauche ou la droite est detectée, un octet est transmis sur la sortie
Tx. Cet octet représente :
- logiciels
version hexa : valeur en cours, comprise entre 0 et 255
- logiciels
version ascii : sens de rotation, caractère "+" pour
incrémentation ou "-" pour décrémentation
Comme les données émises par
l'encodeur 002a sur la sortie Tx se limitent à un octet par valeur
transmise, la durée d'un message est d'environ 500 us (0,5 ms).
Réception
Votre système peut transmettre des données sur
l'entrée Rx de l'encodeur 002a afin de le synchroniser lors de la mise
sous tension, pour permettre un affichage LED autre que "0" et
correspondant à une valeur mémorisée dans votre système (preset ou
recall). Les
données reçues par l'encodeur sont retransmises en écho pour valider
leur bonne prise
en compte. Un buffer circulaire de 128 octet permet au système de
digérer de grandes quantités de données entrantes dans de courts
intervales de temps.
La
valeur à transmettre pour allumer une ou plusieurs LED peut être
comprise entre 1 et 248. Le bit de poids fort (bit #7) détermine le
mode d'affichage Point (bit7=0) ou Ruban (bit7=1). Ainsi, toute valeur
inférieure à 128 correspond au mode d'affichage Point, alors que toute
valeur supérieure à 128 correspond au mode ruban. Le tableau ci-après
résume les valeurs acceptées.
Pilotage de 12 LED
(schéma 002a)
|
Mode
Point |
Mode
Ruban |
Aucune
LED allumée |
0, 128 |
LED1 |
1~10 |
129~138 |
LED2 |
11~20 |
139~148 |
LED3 |
21~30 |
149~158 |
LED4 |
31~40 |
159~168 |
LED5 |
41~50 |
169~178 |
LED6 |
51~60 |
179~188 |
LED7 |
61~70 |
189~198 |
LED8 |
71~80 |
199~208 |
LED9 |
81~90 |
209~218 |
LED10 |
91~100 |
219~228 |
LED11 |
101~110 |
229~238 |
LED12 |
111~120 |
239~248 |
Aucun changement |
121 à 127, 249 à 255 |
-
Pilotage de 20 LED
(schéma 002d)
|
Mode
Point |
Mode
Ruban |
Aucune
LED allumée |
0, 128 |
LED1 |
1~6 |
129~134 |
LED2 |
7~12 |
135~140 |
LED3 |
13~18 |
141~146 |
LED4 |
19~24 |
147~152 |
LED5 |
25~30 |
153~158 |
LED6 |
31~36 |
159~164 |
LED7 |
37~42 |
165~170 |
LED8 |
43~48 |
171~176 |
LED9 |
49~54 |
177~182 |
LED10 |
55~60 |
183~188 |
LED11 |
61~66 |
189~194 |
LED12 |
67~72 |
195~200 |
LED13 |
73~78 |
201~206 |
LED14 |
79~84 |
207~212 |
LED15 |
85~90 |
213~218 |
LED16 |
91~96 |
219~224 |
LED17 |
97~102 |
225~230 |
LED18 |
103~108 |
231~236 |
LED19 |
109~114 |
237~242 |
LED20 |
115~120 |
243~248 |
Aucun changement |
121 à 127, 249 à 255 |
-
Une
valeur de 0 ou 128 provoque l'extinction de toutes les LED, et une
valeur comprise dans la plage [121..127] ou dans la plage [249..255]
n'engendre aucun changement. La partie de code utilisée dans le PIC
pour l'affichage des LED en fonction de la valeur en cours (ou
dernièrement reçue) est la suivante (pour la version à 12 LED) :
procedure Disp_ValueToLEDs(iVal:
byte);
begin
if ((iVal >= 121) and (iVal <= 127)) or (iVal
>= 249) then exit;
iLEDs := $00;
iLEDs.1 := (((iVal >= 001) and (iVal
<= 010)) or (iVal >= 129));
iLEDs.2 := (((iVal >= 011) and (iVal
<= 020)) or (iVal >= 139));
iLEDs.3 := (((iVal >= 021) and (iVal
<= 030)) or (iVal >= 149));
iLEDs.4 := (((iVal >= 031) and (iVal
<= 040)) or (iVal >= 159));
iLEDs.5 := (((iVal >= 041) and (iVal
<= 050)) or (iVal >= 169));
iLEDs.6 := (((iVal >= 051) and (iVal
<= 060)) or (iVal >= 179));
iLEDs.7 := (((iVal >= 061) and (iVal
<= 070)) or (iVal >= 189));
iLEDs.8 := (((iVal >= 071) and (iVal
<= 080)) or (iVal >= 199));
iLEDs.9 := (((iVal >= 081) and (iVal
<= 090)) or (iVal >= 209));
iLEDs.10 := (((iVal >= 091) and (iVal <= 100))
or (iVal >= 219));
iLEDs.11 := (((iVal >= 101) and (iVal <= 110))
or (iVal >= 229));
iLEDs.12 := (((iVal >= 111) and (iVal <= 120))
or (iVal >= 239));
end;
Dans le code qui précède, on distingue dans chaque ligne
iLEDs.x :=
la portion qui assure l'allumage en mode Point (condition de gauche) et
celle qui assure l'allumage en mode Ruban (condition de droite).
Utilisation du système
La sortie Tx de l'encodeur 002a doit
aboutir à l'entrée Rx de votre système, et l'entrée Rx de l'encodeur
002a doit aboutir à l'éventuelle sortie Tx de votre système (câblage
facultatif pour cette deuxième liaison).
Prototype
En cours de réalisation pour la version 002d avec PIC24F08KA101 (ou PIC24F16KA101).
PCB en attente de réception.
Logiciels du PIC
Les fichiers binaires compilés *.hex à flasher dans le
PIC est disponible dans l'archive zip
ci-après.
Enc-LED-Ring_002x
- 24F0xKAxxx - (13/07/2025)
Si vous souhaitez
recevoir par la poste un PIC
préprogrammé et prêt à utiliser, merci de
consulter la page
PIC
- Sources.
Circuits imprimés (PCB)
Tous sont
réalisés en double face.
Les trois circuits 002a, 002b et 002c avec
PIC24F04KA200 ont une base identique, mais les PCB sont
forcément différents
du fait que chacun héberge un nombre de LED différent.
Le circuit 002d avec PIC24F08KA101 est le plus complet et le boîtier du
PIC est un SOP (espacement broches de 1,27 mm), nettement plus facile à
souder que le boîtier SSOP du PIC24F04KA200 (espacement broches de
0,65 mm).
Pour toutes les versions, le PIC et
les résistances de limitation de courant des LED sont
câblés
"côté soudure".
Historique
13/07/2025
- Première mise à disposition