MAX 7219
Comprendre le MAX 7219
Le MAX 7219 est un circuit intégré permettant le contrôle d'afficheur sept segments jusqu'à huit digits et de matrices à leds.
L’aspect le plus important du MAX 7219 est de pouvoir être contrôlé par un bus compatible SPI, QSPI et MICROWIRE. N'utilisant que trois fils pour la communication, il permet ainsi de libérer des sorties de la carte Arduino pour d'autres usages.
Tout d’abord, je commencerai par détailler le fonctionnement du MAX 7219 à l’aide du "datasheet". Ensuite, je vous proposerai la librairie « SPI .h » et « LedControl.h » pour l'exploiter dans vos programmes.
Exploiter le DATASHEET.
Le "datasheet" est un document (pdf) fourni par le fabriquant du composant dans lequel nous y trouverons toutes les explications nous permettant son exploitation. Nous nous appuierons donc sur ce document et les tableaux qui y sont représentés. Vous verrez par conséquent, comment lire un "datasheet".
Le format de transmission des données série du MAX 7219
En premier lieu le MAX 7219 utilise un format de transmission sur 16Bits de D0 à D15 représenté par le tableau ci-dessous.
- Les huit premiers bit de D0 à D7 pour des données (data). D0 étant le bit, dit de poids faible (LSB) et D7 le bit de poids fort (MSB).
- Les quatre prochains bits de D8 à D11 sont utilisés pour les adresses (registre).
- Les quatre bits de D12 à D15 restent par contre inexploités.
Ainsi, le MAX 7219 utilise 14 registres de 0xX0 à 0xXF représentés dans le tableau (N°) ci- dessous. Le registre OxXD n’étant pas exploité.
Tableau des adresses de registre
Commençons par examiner les registres « «DIGIT0 » à « DIGIT7 » représentés en hexadécimale de 0xX1 à 0xX8. En fait, ces huit registres permettent d’affecter une donnée à chaque Digit. Vous observerez qu'il y a aussi des fonctions spécifiques.
Les fonctions du MAX 7219.
1) La fonction "decode mode" - "0xx9".
Commençons par le registre "decode Mode" "0xX9", il permet d'activer le code "B font". Le code B s'active sur les digits de votre choix en y inscrivant un bit à 1. Le tableau 4 ci-dessous, nous donne quelques exemples d'activation du "decode mode".
Il suffit de prendre pour exemple la deuxième ligne du tableau pour comprendre comment activer le code B. L'activation à 1 du digit 0 de l'afficheur par la donnée 0x01(héxa.) implique que seul le digit 0 sera en code B. Les sept autres digits à 0 de l'affichage ne seront pas gérés par le code B.
Par exemple, si l'on souhaite activer le code B seulement au digit quatre (4), cela nous donnera en binaire et respectivement au tableau ceci: 0001 0000 soit en hexadécimale 0x10. Nous avons donc la donnée utile à renseigner au registre "decode mode" "0xX9" pour activer le code B au digit 4 "D4". Bien-sûr, vous remarquerez que cette donnée est la suivante après 0x0f.
Qu'est-ce que le "code B" ?
Pour comprendre le code B, il faut tout d’abord savoir que c'est une fonction interne au MAX 7219 qui décode les données d'affichage selon un tableau prédéfini et représenté ci-dessous.
Plus précisément ce tableau nous montre comment, en fonction du registre appelé correspondant à un caractère , le MAX 7219 va activer les segments pour afficher les chiffres et caractères inscrits dans le tableau du code B .
Ainsi, chaque donnée d'affichage d'un caractère présent dans ce tableau sera systématiquement décodé, si le mode code B est activé au digit piloté pour l'affichage de la donnée qu'il reçoit .
Prenons le cas de l'envoi de la donnée du chiffre quatre (4) "0x04" à afficher au digit 0 et activé en "decode Mode", tous les segments correspondant au registre du chiffre 4 seront activés pour afficher 4. Soit les segments B,C,F et G sur l'afficheur sept segments. Comme indiqué par le tableau 5.
A l'inverse, si "décode mode" n'est pas activé, seul le segment E de l'afficheur va s'allumer. Pourquoi ? Car la valeur "0x04" vaut en binaire 0000 0100 et que dans ce cas le MAX 7219 décode l'affichage suivant un mode binaire. On trouve ici un exemple important, à savoir que sans "decode mode" chaque segment est piloté individuellement en fonction du bit à 1. Le tableau 6 ci dessous représente la correspondance des huit segments via les huit bits.
En fait "decode mode" nous simplifie la tâche de façon à ne pas traiter en binaire l'affichage d'un chiffre. Ce qui impliquerait l'envoi de huit données de huit bits les unes après les autres pour piloter chaque segment. Il faut reconnaître que cela serait fastidieux.
En conclusion, il est possible d'afficher des symboles ou caractères comme le moins "- "ou un "C" en désactivant "decode mode" au digit de notre choix.
2) LA FONCTION "intensity" - "0xXA"
Abordons à présent le registre "intensity" "0xXA". Il permet de définir l'intensité lumineuse de l'afficheur. En fonction du tableau 7, ci-dessous, il peut avoir seize (16) données, sur quatre (4) bits, possible de "0xX0" à "0xXF" (hexa.) allant du plus faible éclairage au plus fort.
LA FONCTION "scan limit" - "OxXB"
Passons ensuite au registre "scan limit" "OxXB" Il a pour rôle de définir le nombre de digits que l'on souhaite exploiter de digit0 à digit8. En fonction du tableau 8 ci-dessous, il peut prendre huit (8) données sur trois (3) bits allant de 0xX0 à 0xX7 sélectionnant ainsi les digits de droite à gauche.
Il faut souligner que le digit 0 sera toujours le minimum configurable et à juste titre, car il ne serait pas logique d'utiliser cette fonction pour une extinction générale alors qu'une fonction de ce type existe.
3) LA FONCTION "shutdown" - "OxXC".
Le registre "shutdown" "OxXC". Il permet d'allumer ou d’éteindre l'afficheur. Suivant le tableau trois (3) ci-dessous? il ne prend que deux (2) données sur un (1) bit soit "0xX0" ou "0xX1". A zéro (0) "0xX0" l'afficheur est éteint.
4) LA FONCTION "Display test" - "0xXF"
Et enfin, le registre "Display test" "0xXF", il permet de tester l'afficheur en activant toutes les leds de l'afficheur. En fonction du tableau dix (10) comme "shutdown", il ne prend que deux (2) données sur un (1) bit soit "0xX0" ou "0xX1". A un (1) le mode test de l'afficheur est activé.
Cependant, il est à noter que le mode test reste activé tant qu'une donnée de désactivation "0xX0" n'est pas renvoyé au registre "0xXF".
Concrètement, nous venons de passer en revue les fonctions de registre ainsi que leurs données d'exploitation.
Mais nous ne savons toujours pas comment les transmettre au MAX.
L'ENVOI DES DONNÉES.
Avant propos: Les données transmises.
Dans nos programmes, il va falloir remplacer le "X" majuscule, dans les données des tableaux, par le chiffre ou la lettre correspondant à la bonne donnée hexadécimale.
Prenons le cas de la donnée "0xX6". En premier lieu, regardons les deux premiers "caractères" "0x", ils indiquent que la donnée et de type HEXADÉCIMALE. Voyons ensuite les deux prochain caractères "X6". Ces derniers sont la transcription hexadécimale d'une donnée en bits. Hors le format Hexadécimale n'accepte pas le terme "X" il va donc falloir le remplacer. Mais par quoi ?
Pour le savoir, il suffit d'utiliser la calculette du "PC" en mode programmeur sur "hexa" et "octet" et de reprendre les bits du tableau, en l’occurrence le sept (7), en cliquant sur les bits affichés en calculette. Avec 0000 0110 on trouve 6, ce qui nous fait "06" car ce format s'écrit sur deux caractères et le premier a par défaut 0, si il n'est pas affiché.
A partir de là "0xX6" devient "0x06".
Toutefois, il sera possible de l'écrire simplement par zéro "0 ou un "1" lorsque la donnée n'est que sur un (1) bit.
Le format d'envoi.
Avant tout chose, elles doivent respecter ce que l'on appelle un format d'envoi. Et c'est donc dans vos programmes que ce format devra être respecté.
Nous venons de voir précédemment qu'il fallait renseigner une adresse et sa donnée pour activer la fonction d'un registre. Il nous faudra donc les envoyer toutes les deux.
Considérons une fonction de transfert de données constituée des deux paramètres utiles "adresse" et "data". (data = données en anglais).
- void transfert(adresse, data);
Pour une compréhension aisée, prenons par exemple, la fonction "Display test" qui a pour adresse "0xXF", si l'on souhaite l'activer, il faut donc inscrire "0xX1" comme donnée.
En conclusion, cela nous donne en paramètre de fonction.
- void transfert(0x0F, 0x01); //Transfert des données.
La fonction transférera de notre carte Arduino vers le MAX7219, les données selon le protocole choisi via le port série. Dans notre cas, c'est le SPI que nous utiliserons.
LA COMMUNICATION
LE S.P.I.
Le Max 7219 peut fonctionner avec plusieurs protocoles de communication bus. Mais dans ce tutoriel, nous utiliserons et ne parlerons que du protocole de bus SPI qui transmet les données de la platine Arduino vers le MAX 7219.
Qu'est ce que le SPI "Serial Peripheral Interface" ? C'est une communication sur le principe du maître-esclave. Ce qui veut dire que la transmission des données ne se fait que dans un seul sens du maître vers l'esclave, donc la platine Arduino représente le maître et le MAX 7219 l'esclave. Plusieurs esclaves peuvent être reliés à ce bus série et seront sélectionnés pour réception de données via une ligne prévue à cet effet.
LA LIAISON SPI
Ci-dessous,nous avons le schéma de câblage de la liaison série entre la platine Arduino et le MAX 7219.
- MOSI qui signifie "Master Output Slave INput" est une broche de sortie vers DIN qui est l'entrée de traitement des données série.
- I/O est une sortie vers LOAD (CS) qui est l'entrée d'activation de chargement de données.
- SCK est une sortie vers CLK qui est l'entrée d' horloge série.
Le choix des différentes broches pour la liaison SPI ne s'est pas fait au hasard. Elles ont été définies par la configuration matérielle de la carte Arduino en fonction du mode SPI. Pour le savoir, il faut consulter la documentation de la carte Arduino pour le mode SPI.
Il existe d'autres broches, de type mâle, facilement reconnaissable pour installé cette liaison.
Premièrement la broche onze (11) MOSI configurée en mode sortie va envoyer les données sous forme de suite de bit zéro(0)-un(1).
Deuxièmement la broche dix (10) I/O configurée en mode sortie, activera le chargement des données dans le MAX.
Et troisièmement la broche treize (13) SCK configurée également en mode sortie, elle synchronisera et cadencera la transmission des données.
Voici la représentation schématique de la transmission au niveau du MAX7219..
C'est ainsi que se passe la transmission en fonction de l'état de chaque entrée du MAX. Vous constaterez qu'il y a aussi DOUT qui est une entrée utilisée pour connecter en série plusieurs MAX7219 ou MAX7221 mais nous ne l'utiliserons pas.
En résumé, la condition de fonctionnement de ce circuit dépend de l'état bas LOAD (CS), de l'envoi des données par MOSI et de leur synchronisation par SCK. Ce schéma illustre bien la transmission des données du bit de poids fort D15 vers le bit de poids faible D0.
L'exploitation du bus SPI
Tout d’abord pour exploiter le MAX, il va nous falloir configurer notre port série SPI à l'aide de paramètres. Tout comme nous le faisons pour exploiter le port série du moniteur avec la fonction Serial.begin();.
Sauf qu'à la différence du port série moniteur, cela va se faire au travers d'une librairie incluse dans l'IDE de Arduino. Cette librairie s'appelle <SPI.h>
Dans le programme, interviennent plusieurs instructions qu'il va être nécessaire de comprendre.
Les instructions à connaître
Cette instruction indique que nous incluons la librairie SPI.
SPISettings est utilisée pour configurer le port SPI, il prend successivement trois paramètres:
- La vitesse de transmission des données.
- L'ordre d'envoi des données.
- Le mode d'envoi.
Initialise le bus SPI en utilisant les données de SPISettings dans notre cas TransferMax7219 .
Transfert des données sous un format de un (1) octet soit huit (8) bit.
La fonction de transfert de données
Cette tâche étant répétitive, nous avons du créer une fonction de transfert pour dialoguer aisément avec le MAX 7219 dont on fait abondamment usage dans le programme.
La fonction prend deux paramètres en considération: le registre auquel on souhaite s'adresser et la valeur de la donnée.
Exemple:
Prenons le cas de l'exemple illustré ci-dessus. On fait appel à la fonction Trsf7219 pour transmettre au registre 0x0A « intensity » la donnée 0x06, soit la valeur 13/32. Ce qui a pour effet de modifier la luminosité de l’afficheur.
Vous savez à présent exploiter l'utilisation des données et leur transmission vers le MAX via la communication SPI. Néanmoins, il existe un moyen plus simple de transférer des données vers le MAX. Ce moyen est une librairie que l'on appelle <LedControl.h>
Utilisation de LedControl
LedControl est une librairie simple qui offre des fonctions simplifiées de transfert de données vers le MAX7219 rendant ainsi la programmation d'un afficheur sept segments ou d'une matrice plus souple et conviviale. Elle utilise des fonctions sous forme de texte bien documenté et qui permettent de réaliser de nombreuses choses.
Les fonctions de bases
Après avoir téléchargé la librairie <ledcontrol.h>, il est nécessaire de l'inclure au programme.
Ci-dessous LedControl est déclaré par une instance d'un objet et appelé "septSegMax" dans notre programme. Cette fonction prend trois (3) paramètres, définis par le câblage de la platine Arduino et un (1), la dernière valeur correspond au nombre de contrôleur présent sur le bus.
L'objet "septSegMax" servira donc à faire appel aux fonctions fournies par <LedControl.h>.
- Le premier paramètre définit la broche 10 de l'Arduino comme étant LOAD CS
- Le deuxième paramètre définit la broche 13 de l'Arduino comme étant CLK
- Le troisième paramètre définit la broche 11 de l'Arduino comme étant le MOSI
- Le dernier paramètre correspond au nombre de MAX7219 utilisé. Ici un (1).
Voyons enfin les fonctions de <LedControl.h>
La fonction shutdown();
Cette fonction permet d'allumer ou d’éteindre le MAX 7219. Si la valeur est false, le circuit fonctionne normalement et à l'inverse, true le circuit est éteint. Vous constatez de toute évidence que les registres précédemment utilisés ont été remplacés par des fonctions de sorte que leurs noms soient évocateurs à rôle. Dans notre cas, shutdown(paramètre1, paramètre2 ); il faut reconnaître que cela est bien plus simple.
La fonction setIntensity();
Vous l'aurez deviné cette fonction permet de définir l'intensité lumineuse de l'afficheur en 16 valeurs différentes; 15 étant notamment le maximum représentant le nombre de données possible que l'on a vu dans le tableau sept (7).
La fonction clearDisplay();
Cette fonction éteint l'afficheur et supprime toutes les données précédentes.
fonction AFFICHEUR SEPT SEGMENTS
La fonction setDigit();Elle prend quatre paramètres:
- le premier est l'adresse de l'afficheur par défaut toujours à 0.
- le deuxième est le digit qui a une valeur de 0 à 7.
- le troisième est la valeur de l'afficheur comprise de 0 à 15 en correspondance hexadécimal (afficher la lettre A vaut 10 et F vaut 15)
- le quatrième permet d'afficher le point DP si la valeur est "true".
La fonction setRow
- le premier est l'adresse de l'afficheur par défaut toujours à 0.
- le second est le digit en question qui prendre pour valeur de 0 à 7.
- le troisième est une donnée en octet "B01110111" ou en hexadécimal "0x77". Ce troisième paramètre a pour avantage d'afficher tous les segments que l'on souhaite sur un digit de manière distincte.
fonction MATRICE 64 LED
LedControl ne s'aborde pas exactement de la même façon si on travaille en matrice ou en afficheur sept segments.
Info: L'usage de la matrice 1588BS inverse mes colonnes et mes lignes.
Les fonctions de base
la fonction setLed
Elle prend quatre paramètres:
- le premier est l'adresse de l'afficheur par défaut toujours à 0.
- le second est la ligne de la matrice qui prendre pour valeur de 0 à 7.
- le troisième est la colonne de la matrice qui prendre pour valeur de 0 à 7.
- le quatrième si elle a pour paramètre " true" la diode est allumée, sinon elle a "false" et la diode est éteinte.
la fonction setRow
Elle prend trois paramètres:
- le premier est l'adresse de l'afficheur par défaut toujours à 0.
- le second est la ligne en question qui prend pour valeur de 0 à 7.
- le troisième est une donnée en octet "B01110111" ou en hexadécimal "0x77". Ce troisième paramètre a pour avantage d'afficher toutes les diodes que l'on souhaite sur la colonne de manière distincte.
la fonction setColumn
Elle prend trois paramètres:
- le premier est l'adresse de l'afficheur par défaut toujours à 0.
- le second est la colonne en question qui prendre pour valeur de 0 à 7.
- le troisième est une donnée en octet "B01110111" ou en hexadécimal "0x77". Ce troisième paramètre a pour avantage d'afficher toutes les diodes que l'on souhaite sur la ligne de manière distincte.
Schéma de montage
Schéma Afficheur Sept Segments
Maintenant pour utiliser le Max 7219, nous allons faire un montage type avec deux afficheurs 4 digits, dont il est possible de câbler qu'un seul afficheur.
Vous trouverez un sketch pour 8 et 4 digits en téléchargement. .
Schéma Matrice 1588BS
Constater que les digits de la matrice correspondent à la cathode commune et que les segments à l'anode commune, ceci inverse l'utilisation de la librairie LedControle où les colonnes correspondent aux segments et les digits aux lignes. Après avoir tester plusieurs montages celui-ci a été le plus fonctionnel.
Recevez gratuitement les codes sources de PlaisirArduino
Amusez-vous tout de suite avec les entrées/sorties de votre carte Arduino Uno
Vous y retrouverez : des scketchs, des schémas et des PDF