Écran graphique "O'LEDs"

Mise à jour le 2 mars 2008

http://matthieu.weber.free.fr

Avec des LEDs haute luminosité, le résultat serait encore plus sympa !

Contexte :

Pourquoi ne pas réaliser un écran graphique avec un simple matrice de LEDs ? La puissance des microcontrôleurs et le bas prix des LEDs nous permet de réaliser des dispositifs d'affichages tels; peu onéreux, très fiables et facilement programmables, ici par exemple via une interface série RS232 ou encore avec le bus I²C. A partir de là, libre à votre imagination de lui faire faire tout ce que vous voulez :
- Analyseur de spectre audio pour chaîne Hi Fi, vue mètre;
- Oscilloscope;
- Borne annonce à texte défilant;
- Moniteur vidéo (très) faible résolution...
                                                      ...ou comme présenté ailleurs sur ce site, une horloge murale de studio.

 

Caractéristiques techniques :

 

Schéma de principe et fonctionnement :

Schéma du montage. (Cliquez ici pour l'agrandir)

Le montage est alimenté directement en 5 volts. La régulation de tension si besoin est, doit se faire auparavant. (Elle pourra par exemple, être récupérée sur celle du montage exploitant notre écran à LEDs. Attention toutefois, l'alimentation de l'écran peut demander jusqu'à 450mA, toute LEDs allumées.
 
Le PIC offre une interface série compatible TTL (Logique 0-5 volts). Pour pouvoir dialoguer avec un périphérique (ordinateur, PDA...) utilisant un port série RS-232, il faut utiliser un convertisseur qui adapte les tensions TTL à celle du protocole RS232c (...+/- 12 volts). Le Max 232, (IC11) exploitant 4 condensateurs de 10µF assure à merveille ce rôle. Il fabrique grâce à une "pompe de charge" les tensions positives et négatives nécessaires. Sa consommation est de l'ordre de 5 mA. Il peut piloter 2 liaisons séries bi-directionnelles. Ici, nous n'en exploitons qu'une.
 
Les LEDs (prendre des LEDs hautes luminosité!!) sont agencées en matrice afin de minimiser les connections. Pour acheminer le courant du + 5 volts à l'anode des LEDs, nous utilisons les transistors T1 à T13, de type PNP (BC557) qui sont pilotés via le microcontrôleur 18F252 via les ports A et B. Ceux ci conduisent lorsque le PIC présente un niveau bas sur les sortie reliées aux bases des transistors. R1 à R13 limitent le courant de base des transistors. T14 un MOS FET canal P permet de doser le courant général  circulant dans la matrice de LEDs en fonction de la luminosité ambiante. Si R28, qui est une photo résistance, reçoit de la lumière, sa résistance baisse pour atteindre un centaine d'ohms en plein soleil. La tension sur la grille de T14 baissant alors, ce dernier devient plus conducteur, limitant un peu moins le courant dans les LEDs. A l'opposé, dans l'obscurité, R28 présente une résistance élevée (de l'ordre de 300 Kohms ou plus selon le composant), cette valeur est toutefois bornée par R27 montée en parallèle de R28. R26 étant une résistance plus faible que  R27 et R28 réunies, la tension de grille de T14 est proche des 3-4 volts, et donc ce dernier ne conduit pratiquement plus. Ainsi l'afficheur à LEDs se fera discret la nuit mais R27 garantira un éclairement minimum même en pleine obscurité.
R14 à R25 limitent le courant dans les LEDs à (5-2,1) / 7,2 = 403 mA dans les LEDs (lorsque T14 est pleinement conducteur), ce qui peu paraître beaucoup. Mais comme le microcontrôleur n'adresse qu'une seule colonne de LEDs à la fois à un instant donné, le rapport cyclique concernant l'alimentation des LEDs est de 1/32 (il y a 32 colonnes de LEDs) Le courant dans les LEDs atteint donc 403/32 = 12,5 ma au maximum. (Ici, Vled = 2,1 V)
IC2 à IC6 sont des amplificateurs Darlington à collecteurs ouverts. C'est à eux la charge de drainer le courant de la matrice de LEDs vers la masse. Lorsque un niveau haut se présente sur l'une des 7 entrées du circuit, sa sortie peut alors drainer jusqu'à la masse un courant pouvant atteindre 500 mA.
 
IC2 à IC6 sont pilotés par IC7 à IC10, ce sont des CD 4017, réalisant la fonction: "compteur de johnson décimal". Ceux-ci, eux mêmes pilotés par le microcontrôleur réalisent la fonction de balayage (un "chenillard" si vous préférez) commutant chaque colonnes de LEDs. Ok, les CD 4017 marchent donc comme des chenillard, mais on ne peux pas vraiment les cascader pour faire un long chenillard de plus de 8 LEDs sans un petit artifice : En fait c'est comme si l'on avait 8 chenillards indépendant, gérant chacun 8 colonnes de LEDs de l'afficheur (colonnes 1 à 8 pour le 1er 4017, led 9 à 16 pour le 2ème 4017, colonnes 17 à 24 pour le 3ème 4017 et le dernier s'occupe des colonnes 25 à 32. Une seule colonne de LED n'est allumée à la fois, ors il y a 4 CD 4017, il suffit donc d'en faire tourner 1 et ("d’éteindre" avec patte CS ou OE sur un 4017)  les 3 autres.  Ouf ! Vous suivez toujours ?  ;o)

Concrètement, le PIC applique un reset sur l'entrée des 4 CD 4017, (impulsion positive de la part de RC0 RC1 RC2 et RA5) positionnant leur sortie Q0 à "1". Ensuite, tout en maintenant le reset actif sur IC8, IC9, IC10, il envoie des impulsions d'horloge via RC5 sur l'entrée 14 (CLK) des CD 4017. Les entrées CLK des 4 circuits sont reliées entre elles. Seul IC7 va travailler car sa patte 15 de reset (RS) est inactive, faisant passer successivement une par une, ses sorties Q1 à Q9 à "1". Ensuite, IC7 est remis à zéro par un état haut sur sa patte 15 (RS). De ce fait, c'est sa patte 3, (IC7-Q0) qui devient active, mais celle-ci n'est reliée à aucune LEDs. Au même moment, IC8 est débloqué par un état bas sur son entrée 15 (RS).


Par exemple, pour travailler avec la colonne 19: c'est le 4017 numéro 3 qui la pilote car il gère les colonnes  17 à 24 : On coupe le 1er, le 2 ème et le 4ème. lorsque le 3ème sera arrivé à sa 8 ème et dernière sortie (pilotant la colonne 24),  au moment de passer à la colonne suivante (la 25, donc...) on coupera le 4017 numéro 3 et on passera au 4017 numéro 4...

Pendant ce temps, les impulsions d'horloges continuent d'arriver depuis le PIC... et c'est au tour d'IC8 de piloter ses 9 colonnes de LEDs... Et ainsi de suite pour IC8, IC9 et IC10 jusqu'à la 32ème colonne où l'on revient au début pour recommencer indéfiniment. Nous obtenons un chenillard à 32 sorties formant notre balayage ligne. Bien sur celui-ci se doit d'être très rapide afin de ne pas avoir d'effet de scintillement de l'afficheur. Votre radio-réveil marche suivant le même principe... Avec moins de LEDs à gérer.


ATTENTION! Les leds ne sont traversées par un courant que durant 1/32 de temps. Procurez-vous impérativement des LEDs à HAUTE LUMINOSITÉ (disponible couramment et à un prix modique) si vous voulez que votre écran aie de la "pèche". La photo en début d'article présente un écran réalisé avec des leds standard...

Il n'y a pas ici de balayage trames comme pour un écran de téléviseur à tube cathodique, car plusieurs lignes de LEDs (de 0 à 13) peuvent êtres commandées simultanément par le PIC.


ATTENTION: Pour des raisons de simplification du circuit imprimé, les connections sur le circuit imprimé entre les ULN2003 et les 4017 (c'est à dire entre IC2, IC3...IC10) ne correspondent pas forcément avec le schéma. C'est au PIC de recréer le bon séquencement des sorties, sachant que dans tout les cas, les sorties des 4017 ne sont elle même pas rangées (par rapport à leurs numéro de broches), dans l'ordre.
Il n'y a pas ici de balayage trames comme pour un écran de téléviseur à tube cathodique, car plusieurs lignes de LEDs (de 0 à 13) peuvent êtres commandées simultanément par le PIC.
Le PIC devra donc tenir compte du séquencement des colonnes de LEDs qui sera le suivant (En se référant UNIQUEMENT au circuit imprimé):

N° col. LED

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

23

25

26

27

28

29

30

31

32

Séquencement

6

4

1

9

7

3

2

5

8

10

14

11

16

18

13

12

15

17

23

19

20

26

22

24

21

25

27

30

29

28

32

31

Circuit concerné (Et sa sortie)

IC7

IC8

IC9

IC10

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q8

Q9

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q8

Q9

Q1

Q2

Q3

Q4

Q5

Q6

Q7

Q8

Q9

Q1

Q2

Q3

Q4

Q5

Ceci devrais également offrir une moindre perception d'un effet de "chatoiement" lorsque l'on balaye de gauche à droite l'afficheur du regard.

Envie d'une aspirine ? Normal, je comprends  !!
 

Programme du PIC :

Le PIC assure donc le balayage constant des lignes et la commande des trames de LEDs tout en interprétant les commandes utilisateur depuis son port I²C et série; de plus, il doit en mémoriser/réafficher l'état des 416 LEDs, car la matrice de LEDs n'a en elle-même aucune cellule mémoire (ce ne sont que de simples LEDs !

J'ai écris le programme du PIC en langage C, sans doute le plus connu des langages de programmation avec le basic. Le C dispose depuis peu d'un compilateur en Open Source, SDCC (Small Devices Cross Compiler) capable notamment de générer du code assembleur pour les PICs de la famille 16Fxxx et 18Fxxx. A noter que pour le moment, le code généré pour la famille des 16Fxxx est limité car SDCC est toujours en cours de développement. C'est pourquoi je suis passé directement à la famille des 18Fxxx avec le 18F252 directement compatible broche à broches avec le 16F876A.

 

Fichiers du programme :         (Télécharger les fichiers sources (V 0.6) et le fichier .HEX)

Attention, les fichiers sont commentés mais encore en version bêta. Certaines fonctions et optimisations n'ont pas encore été implémentées !

 

 

La fonction print_str()  (définie dans uart_sdcc.c) affiche un texte sur la liaison série (RS232), pas sur l'écran à LEDs.

La fonction d'affichage proprement dite se trouve dans la routine d'interruption qui débute aux lignes suivantes:

[...]
/-----------------------------
------------------------------
// Interruptions management function
void voidisr(void)interrupt 1
{
  if (PIR1bits.RCIF == 1)        // We received a char on the UART
    {
    unsigned char caractere;
[...]


L'affichage est traité au débordement du timer 0   =>    (INTCONbits.T0IF == 1)      // Interruption from TIMER 0

A un moment on voit  "   clock = 0;  " suivis quelques lignes plus loin de  "   clock = 1; "  => Cela envoie une impulsion positive sur l'entrée CLK du 1er CD 4017 (le chenillard) qui active la 1ere colonne.
A chaque nouvel débordement du timmer 0, donc a chaque nouvel appel de "   clock = 0;  " suivis de "   clock = 1;  "  les 4017 vont commander la colonne suivante jusqu'à la 32 ème puis revenir au début.

Chaque 4017 ne gère que 8 colonnes, donc il sont chainés en série, et leur sorties est contrôlée par ce code:

    RS4 = !( count > 26);
    RS3 = !((count < 27)&&(count > 17));
    RS2 = !((count < 19)&&(count > 8));
    RS1 = !( count < 10);
 
RSx = Register Select du 4017 numéro x.                 Si RS = 1  alors le 4017 correspondant est activé, sa sortie est activée.  si RS = 0  alors il ne peut rien commander...
Ici, RS est équivalent à Chip Enable (CS) en anglais (Selection des sorties d'un circuit CD4017)

 
L1 à L13 représentent les 13 lignes de l'afficheur

mem0 est un tableau contenant l'image de ce qu'il y a a afficher. La routine d'interruption lis cette mémoire et l'envoie sur l'afficheur LED. (L'afficheur LED n'a pas de mémoire, mais comme le défilement est très rapide, la persistance rétinienne fait le reste...)

col = mem0[séquence[count-1]];  Permet de d'afficher par multiplexage les 13 lignes d'entrées (correspondant à une colonne position X) X compte donc de 1 à 32 très rapidement et en continu.

C'est le même principe que les radio-réveils à LEDs

Circuit imprimé et implantation des composants :

Le circuit imprimé (18,1 X 9,3 cm) (Cliquez ici pour l'agrandir)

 

L'implantation des composants (Cliquez ici pour l'agrandir).

N'oubliez pas de réaliser avec du fil isolé, coté cuivre, les 4 connections en jaune !

 

Photos :

Voici ce que donne l'interpréteur de commande de l'écran en mode RS-232.

Le logiciel utilisé est "l'hyper terminal" disponible sous Windows. Bien sur, d'autres équivalents existent sous Windows Mac et Linux.

L'affichage ressemble à une console grâce à l'utilisation de commandes ASCII spéciales VT100 standards permettant de modifier les couleurs à la volée.

 

L'afficheur O'LEDs en fonctionnement.



Détail de la matrice à LEDs.

Sur la gauche, s'alignent les 13 transistors PNP pilotant les lignes.

 

Gros plan sur le PIC 18F252, véritable chef d'orchestre de l'écran.

 

Coté cuivre du circuit imprimé.

Notez que les cathodes des LEDs sont soudées entre elles par colonnes au

 dessus du circuit imprimé et ramenées au entrées des ULN2003.

Cela évite l'emploi d'un circuit imprimé double face !

 

RETOUR A L'ACCUEIL

http://matthieu.weber.free.fr