Le module MAX7219 - matrice LED 8x8
publication: 17 juin 2022 / mis à jour 21 juin 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
La matrice LED 8x8
Voici notre matrice à LEDs 8x8:
L'afficheur est consitué de 8 rangées de 8 leds, soit un total de 64 LEDs.
Au dos de l'afficheur, 5 connecteurs à droite et 5 connecteurs à gauche. Tous les connecteurs portent les mêmes indications, excepté le 3ème connecteur qui est marqué DIN à droite, DOUT à gauche.
Signification des connecteurs:
- VCC entrée 5 Volts (+)
- GND entrée 0 Volts (-) (GND = Ground)
- DIN / DOUT DIN pour l'entrée des données, DOUT pour la sortie des données
- CS connecteur pour la sélection (CS = Chip Select)
- CLK connecteur pour le signal de synchronisation (CLK = CLocK)
Avec les seuls connecteurs DIN, CS et CLK nous devons gérer les 64 LEDs de cet afficheur...
Caractéristiques de l'afficheur 8x8
Pour utiliser un afficheur 8x8 LEDs sur votre carte ESP32, il faut disposer d'une alimentation 5V annexe.
Le connecteur GND de l'afficheur 8x8 LEDs doit être relié à une borne GND de la carte ESP32.
L'afficheur est piloté par un circuit référencé MAX7219. Ce composant dispose de 2x huit sorties parrallèles gérant la matrice de LEDs. Il dispose également d'un interface de communication série de type SPI (Serial Peripheral Interface), interface dont nous verrons les caractéristiques plus loin.
Aucune indication sur l'afficheur ne permet de déterminer dans quel sens orienter cet afficheur.
Certains articles sur Internet montrent qu'il est possible de mettre en série plusieurs afficheurs 8x8 LEDs:
N'ayant à disposition qu'un seul afficheur LED 8x8, il nous est impossible de tester le raccordement de plusieurs matrices LEDs 8x8 en série.
Nous allons considérer que le bas de l'afficheur correspond aux connecteurs d'entrée, placés en bas. Les cinq connecteurs de sortie sont placés en haut.
Connexion à la carte ESP32
8x8 LED matrix |
ESP32 |
---|---|
VCC | ext. +5V |
GND | GND |
DIN | MOSI |
CS | SS |
CLK | SCK |
DOUT* | MISO |
* en option - la sortie DOUT est connectée:
- pour un seul module MAX7219: à la borne MISO de la carte ESP32
- pour plusieurs modules MAX7219; à la borne DIN du module MAX7219 suivant. La borne DOUT du dernier module MAX7219 est connectée à la carte MISO de la carte ESP32.
La puce MAX7219
C'est une puce intégrée à notre afficheur LED 8x8.
La puce MAX7219 divise un ensemble de 64 LEDs en huit colonnes («chiffres») de huit LEDs chacune. Les colonnes sont numérotées de 1 à 8 et chaque LED d'une colonne est représentée par un seul bit dans le registre de cette colonne.
Spécification de la matrice LED
Tension de fonctionnement: DC 4.7V – 5.3V
Tension typique: 5V
Courant opérationnel: 320mA
Courant max: 2A
Température de fonctionnement: 0 ℃ – 50 ℃
Température typique: 25 ℃
Organisation de la matrice
Chaque rangée correspond à une adresse. Chaque adresse peut recevoir un octet dans l'intervalle hexadécimal [00..ff].
Chaque colonne correspond à un bit dans l'octet transmis comme donnée.
Donc, l'allumage d'une rangée sera effectué en transmettant deux octets:
- addr: adresse de la rangée à gérer, dans l'intervalle hexadécimal [01..08]. La valeur $01 étant celle marquée row1 ci-dessus.
- data: donnée à mettre dans la rangée, dans l'intervalle hexadécimal [00..ff]. La valeur $00 éteint toutes les LEDs, la valeur $FF allume toutes les LEDs.
Serial-Data Format (16 Bits)
Voici comment sont organisées addr data:
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X | X | X | X | ADDRESS | MSB --- DATA --- LSB |
- addr ne peut prendre que les valeurs hexadécimales [00..0f]. Ce sont les bits D8 à D11 marquées ADDRESS dans le ableau ci-dessus.
- data suit addr
Les adresses $0d et $0e ne sont pas exploitées.
Voici les actions effectuées par les adresses addr:
REGISTER | ADDRESS | HEX CODE |
||||
---|---|---|---|---|---|---|
D15 D12 | D11 | D10 | D9 | D8 | ||
No-Op | X | 0 | 0 | 0 | 0 | $00 |
Digit 0 | X | 0 | 0 | 0 | 1 | $01 |
Digit 1 | X | 0 | 0 | 1 | 0 | $02 |
Digit 2 | X | 0 | 0 | 1 | 1 | $03 |
Digit 3 | X | 0 | 1 | 0 | 0 | $04 |
Digit 4 | X | 0 | 1 | 0 | 1 | $05 |
Digit 5 | X | 0 | 1 | 1 | 0 | $06 |
Digit 6 | X | 0 | 1 | 1 | 1 | $07 |
Digit 7 | X | 1 | 0 | 0 | 0 | $08 |
Decode Mode | X | 1 | 0 | 0 | 1 | $09 |
Intensity | X | 1 | 0 | 1 | 0 | $0a |
Scan Limit | X | 1 | 0 | 1 | 1 | $0b |
Shutdown | X | 1 | 1 | 0 | 0 | $0c |
Display Test | X | 1 | 1 | 1 | 1 | $0f |
- addr $00 sans action
- addr $01..$08 rangée de LEDs à allumer, data $00..$ff
- addr $09 mode décodage: $00 = pas de décodage; $01 = décodage BCD (ne pas utiliser pour la matrice LED 8x8
- addr $0a réglage intensité de l'affichage: $00..$0f, $00 étant l'intensité minimale, $0f étant l'intensité maximale;
- addr $0b portée limite des rangées à afficher: $00..$07; mettre $07 pour gérer toute la matrice LED
- addr $0c désactive l'affichage: $00..$01; mettre $01 pour rendre visible les LEDs.
- addr $0f teste l'affichage. Permet de contrôler le bon état de toutes les LEDs. Valeurs: $00 opérations normales; $01 mode test des LEDs.
Voici les mots permettant de gérer la matrice LED 8x8 via le module MAX7219:
Le mot MAX7219.send
transmet deux octets vers le module MAX7219:
\ send two bytes to MAX7219 thru SPI port : MAX7219.send ( c1 c2 -- ) MAX7219.select swap SPI.write SPI.write MAX7219.deselect ;
Les mots MAX7219.normal
et MAX7219.shutdown
permettent respectivement
d'utiliser le mode d'affichage normal ou désactivé:
: MAX7219.normal ( -- ) $0c $01 MAX7219.send ; : MAX7219.shutdown ( -- ) $0c $00 MAX7219.send ;
Les mots MAX7219.test.on
et MAX7219.test.off
permettent d'activer ou
désactiver le mode test des LEDs:
: MAX7219.test.on ( -- ) $0f $01 MAX7219.send ; : MAX7219.test.off ( -- ) $0f $00 MAX7219.send ;
MODE | ADDRESS CODE |
REGISTER DATA | |||||||
---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
Shutdown Mode | X | X | X | X | X | X | X | X | 0 |
Normal Operation | X | X | X | X | X | X | X | X | 1 |
Le mot MAX7219.intensity
permet de régler l'intensité des LEDs en mode
affichage normal. Ce réglage agit sur l'ensemble des LEDs de la matrice 8x8.
: MAX7219.intensity ( c -- )
$0a swap MAX7219.send
;
Le mot MAX7219.decode
permet de sélectionner le mode de décodage du module MAX7219.
: MAX7219.decode ( c -- )
$09 swap MAX7219.send
;
Le mot MAX7219.scan.limit
permet de limiter l'action sur seulement certaines rangées de LEDs.
: MAX7219.scan.limit ( c -- )
$0b swap MAX7219.send
;
SCAN LIMIT | REGISTER DATA | HEX CODE |
|||||||
---|---|---|---|---|---|---|---|---|---|
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | ||
Display digit 0 only | X | X | X | X | X | 0 | 0 | 0 | $00 |
Display digits 0 & 1 | X | X | X | X | X | 0 | 0 | 1 | $01 |
Display digits 0 1 2 | X | X | X | X | X | 0 | 1 | 0 | $01 |
Display digits 0 1 2 3 | X | X | X | X | X | 0 | 1 | 1 | $03 |
Display digits 0 1 2 3 4 | X | X | X | X | X | 1 | 0 | 0 | $04 |
Display digits 0 1 2 3 4 5 | X | X | X | X | X | 1 | 0 | 1 | $05 |
Display digits 0 1 2 3 4 5 6 | X | X | X | X | X | 1 | 1 | 0 | $06 |
Display digits 0 1 2 3 4 5 6 7 | X | X | X | X | X | 1 | 1 | 1 | $07 |
Et enfin, le mot MAX7219.set.digit
: MAX7219.set.digit ( cbits cdigit -- )
swap MAX7219.send
;
Ce mot est utilisé dans les exemples de test d'affichage ci-après.
Quelques tests d'affichage
Le mot disp-test-1
permet de tester l'affichage des LEds de la matrice
8x8:
\ all LEDs on full, 232mA needed : disp-test-1 ( -- ) init.VSPI MAX7219.test.on begin key? until MAX7219.test.off SPI.end ;
Voici ce que donne l'exécution du mot disp-test-1
:
L'exécution est interrompue en appuyant sur une touche du clavier.
Le mot disp-test-2
allume les 4 LEDs de gauche de la première rangée:
\ left 4 LEDs on first row, 42mA needed : disp-test-2 ( -- ) init.VSPI MAX7219.normal $03 MAX7219.intensity $00 MAX7219.scan.limit $f0 $01 MAX7219.set.digit begin key? until MAX7219.shutdown SPI.end ;
Voici ce que donne l'exécution du mot disp-test-2
:
L'exécution est interrompue en appuyant sur une touche du clavier.
Le mot disp-test-3
affiche un caractère smiley:
\ draw face, 18mA needed : disp-test-3 ( -- ) init.VSPI MAX7219.normal $01 MAX7219.intensity $07 MAX7219.scan.limit $00 MAX7219.decode [ 2 base ! ] 00000000 $01 MAX7219.set.digit 01100110 $02 MAX7219.set.digit 00000000 $03 MAX7219.set.digit 00011000 $04 MAX7219.set.digit 00011000 $05 MAX7219.set.digit 10000001 $06 MAX7219.set.digit 01000010 $07 MAX7219.set.digit 00111100 $08 MAX7219.set.digit [ decimal ] begin key? until MAX7219.shutdown SPI.end ;
Voici ce que donne l'exécution du mot disp-test-3
:
L'exécution est interrompue en appuyant sur une touche du clavier.
Legal: site web personnel sans commerce / personal site without seling