Sylvain Mahé Le site Web Retour à l'accueil Principes Partager des idées et des projets. Contact 06.45.49.96.98
contact@sylvainmahe.site
Écriture de la page : Sylvain Mahé
Afficher des caractères avec la classe SpiMax7219 La classe SpiMax7219 permet d'utiliser des afficheurs à diodes électroluminescences (digits et matrice) pilotées par le composant MAX7219, ce dernier communique en SPI à la fréquence de 4MHz avec le microcontrôleur (l'automate programmable) : Ports des automates programmables concernés par le SPI : Automate programmable MODULABLE 20 :
- Port GPIO 11 (PB2) = SS (slave select)
- Port GPIO 12 (PB3) = MOSI (master output slave input)
- Port GPIO 13 (PB4) = MISO (master input slave output)
- Port GPIO 14 (PB5) = SCK (serial clock)

Automate programmable MODULABLE 32 :
- Port GPIO 5 (PB4) = SS (slave select)
- Port GPIO 6 (PB5) = MOSI (master output slave input)
- Port GPIO 7 (PB6) = MISO (master input slave output)
- Port GPIO 8 (PB7) = SCK (serial clock)
Exemple pour afficher un nombre entier : #include <SpiMax7219.h> int main() { SpiMax7219 myDisplay = SpiMax7219 (5); myDisplay.integer (256, 1, 8, true); return 0; } Dans cet exemple, un objet myDisplay de type SpiMax7219 est déclaré, en paramètre est indiqué d'utiliser le port GPIO numéro 5 de l'automate programmable pour sélectionner l'esclave (slave select) sur le bus SPI. Par habitude en SPI, je connecte la sélection de l'esclave au port de l'automate programmable relié à la fonction SS (slave select) du microcontrôleur quand je le peux, ce qui permet de regrouper tout le câblage relatif au SPI.

Mais en réalité, cette entrée/sortie n'est en fait un port SS à la fonction spécifique que lorsque le SPI est configuré en mode esclave, ce qui n'arrive jamais avec MODULE. Vous pouvez donc choisir l'esclave sur la sortie SS du microcontrôleur, ou tout autre port d'entrée/sortie disponible (sauf MISO qui même inutilisé doit rester comme une entrée libre lorsque le SPI est en fonctionnement).
Puis la fonction integer de l'objet myDisplay est appelée :
- Le 1er paramètre 256 est le nombre entier à afficher (sur 32 bits maximum).
- Le 2ème paramètre 1 indique la position ou commence l'affichage de ce nombre (position 1).
- Le 3ème paramètre 8 indique la position ou termine l'affichage de ce nombre (position 8).
- Le 4ème paramètre true permet de caler le nombre affiché à droite (false pour le caler à gauche) dans l'intervalle de positions sélectionnée (positions 1 à 8).
Dans cet exemple, le nombre à afficher (256) comporte seulement 3 digits, l'intervalle de positions qui lui est accordé pour être affiché comporte 8 digits (positions 1 à 8) c'est-à-dire la totalité de l'afficheur. En conséquence, le 4ème paramètre (calage) est effectif lorsque le nombre à afficher prend moins de place que l'intervalle sélectionnée (ceci permet de caler le nombre sur la partie gauche ou droite de l'intervalle choisie). Autres fonctions utiles : D'autres fonctions existent, comme l'affichage des nombres décimaux, l'affichage de texte, de points ou lignes sur une matrice à dels, ou encore le réglage de la luminosité (par PWM), etc... Exemple pour afficher un nombre décimal : #include <SpiMax7219.h> int main() { SpiMax7219 myDisplay = SpiMax7219 (5); myDisplay.decimal (2.56, 3, 7, 1, false); return 0; } Paramètres de la fonction decimal de l'objet myDisplay :
- Le 1er paramètre 2.56 est le nombre décimal à afficher (en virgule flottante 32 bits).
- Le 2ème paramètre 3 indique la position ou commence l'affichage de ce nombre (position 3).
- Le 3ème paramètre 7 indique la position ou termine l'affichage de ce nombre (position 7).
- Le 4ème paramètre 1 indique le nombre de chiffres à afficher après la virgule.
- Le 5ème paramètre false permet de caler le nombre affiché à gauche (true pour le caler à droite) dans l'intervalle de positions sélectionnée (positions 3 à 7).
Exemple pour afficher un nombre entier et décimal l'un à coté de l'autre : #include <SpiMax7219.h> int main() { SpiMax7219 myDisplay = SpiMax7219 (5); myDisplay.integer (256, 1, 4, true); myDisplay.decimal (1.28, 5, 8, 1, true); return 0; } Dans cet exemple, le nombre entier 256 sera affiché dans l'intervalle de positions 1 à 4 et calé à droite dans son intervalle de positions. Le nombre décimal qu'en à lui sera affiché dans l'intervalle de positions 5 à 8, avec 1 chiffre après la virgule, et à l'instar du nombre décimal il sera calé à droite dans son intervalle de positions sur l'afficheur. Le nombre entier affiché en premier ne sera pas effacé tant que des caractères ne viendront pas écraser les positions (intervalles) qu'il occupe. Si vous souhaitez effacer tout ce qui est affiché sur l'afficheur, utilisez la fonction clearDevice. Exemple pour afficher du texte : #include <SpiMax7219.h> int main() { SpiMax7219 myDisplay = SpiMax7219 (5); myDisplay.word ("hello"); return 0; } La fonction word de l'objet myDisplay prend en paramètre un ou plusieurs caractères alphanumériques. Ici c'est le mot hello qui est affiché (sur l'afficheur à digits ou le mini afficheur à digits). Il est également possible d'afficher des nombres avec cette fonction, pour cela il suffit d'écrire en paramètre par exemple "123.45", ou bien encore d'afficher les lettres avec leurs points (virgules) correspondants (en suffixe) en écrivant "..hel.l.o". Ici les deux l. s'afficheront avec un point en dessous. Un caractère à la fonction spécifique existe, c'est la barre oblique /. Celle-ci permet de terminer le rafraîchissement de l'affichage à cet endroit, et par conséquent de ne pas écraser les digits suivants, car en effet avec la fonction word, par défaut c'est l'intégralité de l'affichage qui est mis à jour. Exemple pour régler la luminosité de l'affichage : #include <SpiMax7219.h> int main() { SpiMax7219 myDisplay = SpiMax7219 (5); myDisplay.brightness (4); return 0; } La fonction brightness est appelée et prend en paramètre un nombre entier de 1 à 16 (16 étant la luminosité maximale). Vous pouvez réaliser des effets complexes avec toutes les fonctions qui vous sont proposées dans cette classe, libre à vous de composer votre affichage d'une manière harmonieuse ! Affichage en cascade sur le bus SPI : Il est possible aisément de connecter plusieurs afficheurs sur le bus SPI via la définition de broches SS (slave select) qui peuvent être communes à plusieurs périphériques. Exemple pour connecter plusieurs afficheurs en cascade et/ou en parallèle sur le bus SPI : #include <SpiMax7219.h> int main() { SpiMax7219 myDigitDisplay = SpiMax7219 (5); SpiMax7219 myMatrixDisplay = SpiMax7219 (5); SpiMax7219 myWordDisplay = SpiMax7219 (4); myDigitDisplay.integer (256, 1, 8, true); myMatrixDisplay.dot (7, 2); myMatrixDisplay.dot (8, 1); myWordDisplay.word ("hello "); return 0; } Explication des connexions :
- La broche SS (slave select) de l'afficheur relatif à l'objet myDigitDisplay est connectée au port GPIO 5 de l'automate programmable, il est le 1er périphérique en cascade sur le bus SPI, étant l'objet déclaré en premier.
- La broche SS de l'afficheur relatif à l'objet myMatrixDisplay est également connectée au port GPIO 5 de l'automate programmable, donc cet afficheur est défini comme étant le 2ème périphérique en cascade sur le bus SPI, car déclaré en deuxième et sur le même port que le précédent.
- Le 3ème afficheur, relatif à l'objet myWordDisplay, voit sa broche SS connectée à un autre port que les deux afficheurs précédents, le port GPIO 4 de l'automate programmable, il est donc en parallèle par rapport aux autres, et est placé comme étant le seul périphérique sur cette partie du bus SPI.
L'ordre de positionnement en cascade des afficheurs suit l'ordre de déclaration des objets de type SpiMAX7219, si plusieurs afficheurs utilisent un port en commun de l'automate programmable pour connecter leur broches SS respectives, ils seront en cascade dans l'ordre chronologique des déclarations. Si votre alimentation le permet, ce principe de connexions en cascade (série) et/ou en parallèle vous garanti de faire fonctionner un très grand nombre d'afficheurs sur un même automate programmable. Exemple d'affichage aléatoire : Avec MODULE il vous est possible de combiner les fonctionnalités de plusieurs classes comme vous le souhaitez, il devient alors facile de réaliser des effets en utilisant plusieurs classes dédiées à la réalisation de certaines tâches plus ou moins complexes. C'est ce que montre l'exemple suivant par l'utilisation de 3 classes, SpiMax7219 pour piloter en SPI un affichage à matrice, Random pour générer des positions aléatoires ce qui permet d'allumer les dels au hasard sur la matrice, et Timer afin d'effectuer ces tâches périodiquement. Ci-dessous le détail du programme : #include <SpiMax7219.h> #include <Random.h> #include <Timer.h> int main() { unsigned char line = 1; SpiMax7219 myMatrix = SpiMax7219 (5); Random::seed (32); while (true) { for (line = 1; line <= 8; line++) { myMatrix.draw (Random::integer (0, 255), line); } Timer::pause (100); } return 0; } Dans l'exemple ci-dessus c'est la fonction draw associée à l'objet myMatrix qui est utilisée afin de changer l'allumage des dels. Cette fonction prend en 1er paramètre un nombre de 0 à 255 qui correspond aux 8 bits, et donc aux 8 dels de la ligne dont le numéro de ligne est indiqué en 2ème paramètre par la variable line. Ce 2ème paramètre est incrémenté dans la boucle for afin d'effectuer un balayage des 8 lignes de la matrice de 64 dels. Après quoi une pause bloquante de 100 millisecondes cadence le groupe de tâches précédentes dans le but d'effectuer un rafraîchissement périodique de l'affichage. Références : Récapitulatif des fonctions de cette classe : SpiMax7219 (const unsigned char PIN_SS); void brightness (const unsigned char BRIGHTNESS); void digit (const unsigned char DIGIT, const bool COMMA, const unsigned char POSITION); void integer (const signed long INTEGER, const unsigned char POSITION_MIN, const unsigned char POSITION_MAX, const bool SIDE); void decimal (const float DECIMAL, const unsigned char POSITION_MIN, const unsigned char POSITION_MAX, const unsigned char DIGIT_AFTER_COMMA, const bool SIDE); void character (const char *CHARACTER, const unsigned char POSITION); void word (const char *WORD); void byte (const unsigned char BYTE); void draw (const unsigned char DRAW, const unsigned char POSITION); void drawDevice (const unsigned char DRAW1, const unsigned char DRAW2, const unsigned char DRAW3, const unsigned char DRAW4, const unsigned char DRAW5, const unsigned char DRAW6, const unsigned char DRAW7, const unsigned char DRAW8); void dot (const unsigned char X, const unsigned char Y); void clearLine (const unsigned char LINE); void clearDevice();