Afficheur 7 segments MAX7219 avec Arduino

Cet article détaille le pilotage par Arduino d’un afficheur 7 segments équipé du circuit intégré MAX7219. Vous y apprendrez également à définir vos propres caractères et à faire défiler un message.

Montage Arduino pour piloter un afficheur 7 segments MAX7219 en I2C

J’ai récemment réalisé l’électronique d’un flipper avec un Arduino UNO pour un passionné. Dans les années 90, les flippers étaient présents dans presque tous les cafés. Pour conserver l’effet « rétro » nous avons choisi d’utiliser un afficheur 7 segments MAX7219. C’est l’occasion de rédiger un article sur son utilisation.

L’afficheur 7 segments choisi intègre 1 puce MAX7219 et 2 afficheurs « basiques » 3461AS:

  • L’afficheur « basique » 3461AS, fabriqué par l’entreprise XLITX, est un afficheur 7 segments de 4 chiffres (fiche technique).Emplacement des 2 afficheurs 3461AS sur la carte d'affichage
  • Le circuit intégré MAX7219 de l’entreprise Maxim simplifie le pilotage d’afficheurs 7 segments. Il offre une interface série de 3 fils au microcontrôleur (Arduino dans notre cas) et permet de piloter jusqu’à 8 chiffres (soit 2 afficheurs 3461AS). Pour plus de détail, voici la fiche technique.
    Emplacement du composant MAX7219 au dos de la carte d'affichage

Le matériel nécessaire

Pour cette réalisation, vous avez besoin:

Carte Arduino UNO Rev 3 Cordon USB de type A/B Platine d'essai 830 points
Carte Arduino UNO Câble USB 2.0 Type A/B Plaque d’essai
Afficheur 7 segments MAX7219  
Câbles Afficheur 7 segments MAX7219  

Câblage de l’afficheur 7 segments MAX7219 avec la carte Arduino

Le circuit intégré MAX7219 (et donc la carte d’affichage) offre une interface SPI unidirectionnelle permettant la transmission des informations à afficher:

  • La broche DIN est reliée à la sortie 11 de l’Arduino. C’est par cette connexion que l’Arduino transmet ses données au MAX7219.
  • La broche CS est reliée à la sortie 10 de l’Arduino. Elle permet à ce dernier de signaler au MAX7219 que les données actuellement émises sont à prendre en compte.
  • La broche CLK est reliée à la sortie 12 de l’Arduino. C’est le signal d’horloge qui va permet au MAX7219 d’être synchronisé avec le microcontrôleur.

Pour l’alimentation de l’afficheur vous reliez:

  • La broche VCC de l’écran au 5V de l’Arduino.
  • Les deux masses ensemble (GND).
Branchement d'un afficheur à base de MAX7219 sur Arduino

Bibliothèque de gestion de l’afficheur 7 segments MAX7219

Je vous invite à installer la bibliothèque nommée « LedControl by Eberhard Fahle » dans votre environnement de développement Arduino. Cette bibliothèque LedControl simplifie l’utilisation des afficheurs à base de circuits intégrés MAX7219 et MAX7221. 

Si vous souhaitez connaitre la procédure d’installation d’une bibliothèque sous Arduino, je vous invite à vous reporter au chapitre « Installation d’une bibliothèque pour l’écran OLED » de l’article « Température et humidité avec Arduino ».

Le code logiciel

Pour construire le code logiciel de ce projet nous allons passer par 3 étapes:

  1. Afficher un compteur numérique (lien).
  2. Définir des caractères (page 2).
  3. Faire défiler un texte sur l’afficheur (page 3).

Afficher un compteur numérique

Cette première partie est une découverte du pilotage de l’afficheur 7 segments MAX7219 sous Arduino. Elle consiste en l’écriture du code logiciel d’un compteur numérique.

Comme d’habitude, nous démarrons par l’ossature de code Arduino suivante:

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{

}

// Fonction principale du programme, s'exécute en boucle:
void loop()
{

}

Puis nous indiquons au compilateur  l’utilisation de la bibliothèque LedControl par la ligne :

// Déclaration des bibliothèques utilisées
#include "LedControl.h"

Si vous le souhaitez, les informations d’utilisation de la bibliothèque « LedControl » sont disponibles à ce lien.

Pour initialiser cette bibliothèque, nous appelons le constructeur « LedControl() » en lui indiquant en paramètres les ports d’entré/sortie utilisés pour le câblage:

// Déclarations globales
LedControl afficheur_g=LedControl(11/*Broche DIN - Jaune*/, 12/*Broche CLK - Bleu*/, 10/*Broche CS - Vert*/); // Initialisation du contrôleur de l'afficheur 7 segments

Ensuite, dans la fonction « setup« , nous allumons l’écran à l’aide de la méthode « shutdown() » qui fait sortir l’afficheur du mode veille. Le réglage de la luminosité des DEL se réalise à l’aide de la méthode « setIntensity() ».

Les méthodes « shutdown » et « setIntensity », comme toutes les méthodes de l’objet « LedControl », prennent pour 1er paramètre le numéro d’afficheur 7 segments MAX7219 ou MAX7221. Dans cet article, ce paramètre est toujours à la valeur 0 car nous n’utilisons qu’un afficheur 7 segments MAX7219 pour notre projet:

// Fonction de démarrage, s'exécute une seule fois:
void setup()
{
    afficheur_g.shutdown(0,false); // Allume l'afficheur
    afficheur_g.setIntensity(0,7); // Définit la luminosité (valeur de 0 à 15)
}

L’afficheur 7 segments MAX7219 de ce projet possède 8 chiffres. Un entier non-signé de 32 bits est donc suffisant pour stocker la valeur de notre compteur.

Concernant le déroulement du programme le compteur va démarrer à 0, s’incrémenter jusqu’à son maximum ‘99999999’, puis redémarrer à partir de 0.

Nous pouvons partir de la fonction « loop » suivante avant d’ajouter les appels au méthodes de gestion de l’afficheur:

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    static uint32_t compteur_l = 0;

    if(compteur_l==99999999)
    {
        compteur_l=0;
    }
    else
    {
        compteur_l++;
    }
}

Cette fonction « loop() » va d’abord être complétée par la méthode « clearDisplay() » pour effacer l’écran:

afficheur_g.clearDisplay(0); // On efface l'écran

Affin de nous permettre de visualiser la valeur inscrite sur l’afficheur, nous ajoutons une attente de 200ms à l’intérieur de notre boucle:

delay(200); // 200ms pour visualiser la valeur affichée

Concernant l’affichage en lui même, Il est important de comprendre que la bibliothèque « LedControl » ne permet pas de piloter l’afficheur dans son ensemble mais seulement 1 chiffre de l’afficheur. Nous devons donc isoler chaque chiffre du compteur « compteur_l » avant l’affichage. Pour réaliser cette décomposition, nous utilisons la division par 10 et l’opérateur « % » qui permet d’obtenir le reste d’une division entière.

Pour l’affichage de chaque chiffre, nous utilisons la méthode « setDigit() » qui prend pour paramètres:

  • Le numéro d’afficheur.
  • L’index du chiffre de l’afficheur concerné (0 à 7 dans notre cas).
  • La valeur numérique à afficher.

La fonction « loop » devient alors:

// Fonction principale du programme, s'exécute en boucle:
void loop()
{
    static uint32_t compteur_l = 0;
    uint32_t valeur_tampon_l;
     
    afficheur_g.clearDisplay(0); // On efface l'écran
    valeur_tampon_l = compteur_l;
    for(int ii_l=0; ii_l<8; ii_l++)
    {
        afficheur_g.setDigit(0, ii_l, valeur_tampon_l % 10, false);
        valeur_tampon_l = valeur_tampon_l / 10;
    }

    if(compteur_l==99999999)
    {
        compteur_l=0;
    }
    else
    {
        compteur_l++;
    }
    delay(200); // 200ms pour visualiser la valeur affichée
}

C’est le moment de tester ! Je vous invite à compiler votre programme puis à le transférer dans l’Arduino. Vous observerez le résultat suivant:

Test du compteur numérique avant améliorations

Qu’en pensez-vous ?

  1. Mon avis est que les « zéros » affichés à gauche du nombre sont inutiles et rendent difficile la lecture.
  2. J’aimerai également ajouter un effet de clignotement sur certaines valeurs clef (par exemple les centaines) pour rendre notre compteur plus  « vivant ».

Pour la suppression des « zéros » inutiles, il suffit de modifier la boucle « for() » afin de stopper l’affichage dès que l’ensemble des chiffres significatifs a été affiché. Pour cela, remplacez les conditions de la boucle « for() » par:

for(int ii_l=0; (ii_l<8)&&(valeur_tampon_l!=0); ii_l++)

Concernant le clignotement, celui-ci va être réalisé par coupure de l’affichage puis le ré-allumage à deux reprises, à l’aide de la méthode « shutdown() »:

switch(compteur_l%100)
// L'afficheur est éteint à 99, ré-allumé à 100, ré-éteint à 101 et  ré-allumé à 102
{
    case 99:
    case 01:
        afficheur_g.shutdown(0,true); // Eteint l'afficheur
        break;

    case 00:
    case 02:
        afficheur_g.shutdown(0,false); // Allume l'afficheur
        break;
}   

Maintenant que l’afficheur numérique est terminé, je vous invite à passer à la prochaine étape pour découvrir comment définir vos propres caractères  (page suivante).

Laisser un commentaire