dimanche 6 décembre 2015

Matrice de 64 LEDs, Max7219 et Arduino

Aujourd'hui, je vous présente quelques petits conseils qui vous permettront de contrôler une matrice de 64 LEDs (8 X 8) au moyen d'une carte Arduino et d'un pilote de LEDs Max7219.

La matrice de LEDs

J'ai utilisé une matrice constituée de 64 LEDs rouges et munie de 16 broches:  chacune des 8 lignes est associée à une broche, et chacune des 8 colonnes est associée à une autre broche.

Il ne faudrait pas croire que toutes les matrices 8 X 8 sont identiques.  Dans certains cas, les lignes sont des cathodes et les colonnes sont des anodes (ce qui signifie que la LED s'allume si la broche qui contrôle sa colonne est à un potentiel plus élevé que la broche qui contrôle sa ligne).  Mais il existe également des matrices dont les lignes sont des anodes et les colonnes sont des cathodes (et alors la LED s'allume si la broche qui contrôle sa ligne est à un potentiel plus élevé que la broche qui contrôle sa colonne).

Pour compliquer les choses encore un peu plus, les broches situées sous la matrice ne sont pas disposées dans l'ordre, et j'ai cru comprendre que la disposition des broches peut être très différente d'une matrice à l'autre.

Puisque j'avais l'intention d'utiliser la bibliothèque LEDControl et que cette bibliothèque a été conçue en fonction des matrices "ligne = cathode et colonne = anode", j'ai opté pour une matrice de LEDs dont le brochage est illustré ci-contre (le numéro inscrit sur ma matrice est HSN-1088AS).

D'après ce schéma, pour allumer la première LED en haut à droite, il faut soumettre la broche numéro 13 à un potentiel plus élevé que la broche numéro 9.  Pour allumer sa voisine de droite, il faut que la broche numéro 3 soit à une tension plus élevée que la broche numéro 9, etc.

Il reste à déterminer quelle broche porte le numéro 13, etc.  Au verso de ma matrice, il y a un petit chiffre "1" sous la broche 1, et un petit chiffre 9 vis-à-vis la broche 9.



Donc si je place la matrice du côté des LEDs, avec le numéro situé en bas, les broches sont numérotées de la même façon que sur un circuit intégré:


Si vous ne disposez pas d'un schéma indiquant le brochage de votre matrice de LED, vous devriez pouvoir le déduire par vous mêmes en effectuant des tests au moyen d'une source de tension et d'une résistance de protection.

Si votre matrice est de type "ligne = anode et colonne = cathode", pas de panique; ça va quand même fonctionner, à la condition d'en tenir compte lors de la connexion avec le Max7219 et de la conception du programme.

Bien entendu, si vous préférez, vous pouvez construire votre propre matrice au moyen de 68 LEDs individuelles que vous aurez patiemment soudées ensemble.

À l'autre extrême, vous pouvez utiliser un module comportant une matrice 8 X 8 déjà connectée à un Max7219 (vous en trouverez facilement sur eBay), auquel cas il ne vous reste plus qu'à programmer l'Arduino...

Le circuit intégré Max7219 (ou Max7221)

Les circuits intégrés Max7219 et Max7221 sont pratiquement interchangeables:  ils sont spécialement conçus pour allumer et éteindre un grand nombre de LEDs en maintenant dans celles-ci un courant constant.

Dans le schéma ci-contre, "Dig" et "Seg" font référence aux digits et aux segments d'un afficheur à 7 segments.

Pour piloter notre matrice de LEDs, il s'agit de brancher chaque broche "Dig" à une broche contrôlant une ligne de la matrice, et chaque broche "Seg" à une broche contrôlant une colonne de la matrice (mais c'est le contraire si vous utilisez une matrice de type "ligne = anode et colonne = cathode").

Broche 1 (DIN) du Max7219 : Broche 12 de l'Arduino
Broche 2 (DIG 0) du Max7219:  Ligne 1 de la matrice (1ère en haut) (Broche 9*)
Broche 3 (DIG 4) du Max7219:  Ligne 5 de la matrice (Broche 1*)
Broche 4 (GND) de Max7219:  GND de l'Arduino
Broche 5 (DIG 6) du Max7219:  Ligne 7 de la matrice (Broche 2*)
Broche 6 (DIG 2) du Max7219:  Ligne 3 de la matrice (Broche 8*)
Broche 7 (DIG 3) du Max7219:  Ligne 4 de la matrice (Broche 12*)
Broche 8 (DIG 7) du Max7219:  Ligne 8 de la matrice (Broche 5*)
Broche 9 (GND) du Max7219:  GND de l'Arduino
Broche 10 (DIG 5) du Max7219:  Ligne 6 de la matrice (Broche 7*)
Broche 11 (DIG 1) du Max7219:  Ligne 2 de la matrice (Broche 9*)
Broche 12 (LOAD) du Max7219:  Broche 10 de l'Arduino
Broche 13 (CLK) du Max7219:  Pin 11 de l'Arduino
Broche 14 (SEG A) du Max7219:  Colonne 2 de la matrice (2e à gauche) (Broche 3*)
Broche 15 (SEG F) du Max7219:  Colonne 7 de la matrice (Broche 15*)
Broche 16 (SEG B) du Max7219:  Colonne 3 de la matrice (Broche 4*)
Broche 17 (SEG G) du Max7219: Colonne 8 de la matrice (Broche 16*)
Broche 18 (ISET) brancher une résistance de 33 kΩ entre cette pin et 5 V
Broche 19 (V+) du Max7219:  sortie 5 V de l'Arduino
Broche 20 (SEG C) du Max7219:  Colonne 4 de la matrice (Broche 10*)
Broche 21 (SEG E) du Max7219:  Colonne 6 de la matrice (Broche 11*)
Broche 22 (SEG DP) du Max7219:  Colonne 1 de la matrice (1ère à gauche) (Broche 13*)
Broche 23 (SEG D) du Max7219: Colonne 5 de la matrice (Broche 6*)
Broche 24 (DOUT):  utile pour brancher plusieurs matrices en cascade

*Les numéros de broches en rouge sont valides pour la matrice que j'ai utilisée, mais pas nécessairement pour toutes les matrices.

La bibliothèque LEDControl:

Pour faciliter la programmation, j'ai utilisé la bibliothèque LEDControl (voir ici pour des instructions détaillées).

Pour allumer une LED individuelle sur la matrice, on utilise cette syntaxe:

setLed(adresse,ligne,colonne,état)
  • "adresse" est le numéro de la matrice (le nombre "0" si vous n'en avez qu'une)
  • "ligne" est le numéro de la ligne (en commençant par "0" pour la première en haut)
  • "colonne" est le numéro de la colonne (en commençant par "0" pour la première à gauche)
  • "état" est un booléen:  true pour allumer la LED, false pour l'éteindre
Pour une matrice de type "ligne = anode et colonne = cathode", les lignes et les colonnes sont inversées:  vous faites donc setLed(adresse,colonne,ligne,état)




Un exemple de sketch

Voici finalement un sketch qui affiche tour à tour toutes les lettres de l'alphabet, puis tous les chiffres.


Yves Pelletier   (TwitterFacebook)

6 commentaires:

  1. SALUT YVES SIL TE PLAIT PEUX TU COMMENTER LES LIGNES 456 ET 457?

    RépondreSupprimer
  2. Non, il faut juste commenter l456 :
    // for (byte masque = 00000001; masque>0; masque <<= 1)

    RépondreSupprimer
  3. Bonjour, le sketch fonctionne bien, j'ai par contre un peu de mal à comprendre la ligne :
    lc.setLed(0,ligne,col,(B10000000 >> col & grille[ligne]));

    Pour allumer la Led il faudrait que (B10000000 >> col & grille[ligne]) = TRUE et j'ai des difficultés à comprendre cette condition logique.

    Si je prends exemple de la Led du A qui devrait s'allumer sur la 2eme ligne, 3eme de la matrice :
    lc.setLed(0,1,2,(B10000000 >> 3 & B00111000);
    Cela reste toujours aussi flou... en quoi (B10000000 >> 0 & B00111000 = TRUE ?

    Si quelqu'un pourrait m'orienter
    Merci

    RépondreSupprimer
    Réponses
    1. Bonjour,

      Cet article portant sur les opérations bitwise aidera peut-être:

      https://electroniqueamateur.blogspot.com/2018/10/operations-bit-bit-arduino.html

      Supprimer
    2. Merci pour l'article, très bien expliqué avec quelques exemples en plus !
      Le problème était que je ne m'étais pas mis en tête que TRUE=1 donc l'expression lc.setLed(0,row,col,true) = lc.setLed(0,row,col,1)

      Du coup, si je reprends l'exemple de la Led du A qui devrait s'allumer sur la 2eme ligne, 3eme colonne de la matrice :
      grille[1] : B00111000 ; col : 2 ; ligne ; 1

      lc.setLed(0,ligne,col,(B10000000 >> col & grille[ligne]));
      -->lc.setLed(0,1,2,(B10000000 >> 2 & B00111000);
      --> lc.setLed(0,1,2,(B00100000 & B00111000);
      --> lc.setLed(0,1,2,(B00100000);

      Donc si j'ai bien compris, a partir du moment que j'ai un 1 dans l'octet qui vérifie la condition d'allumage ((B10000000 >> col & grille[ligne])), la led s'allume.

      J'espère que je n'ai pas écrit de bêtises pour ne pas induire les autres lecteurs en erreur.
      Et merci pour la réactivité de la réponse

      Cedrick

      Supprimer
  4. Excellent tutoriel, fonctionne avec les modules standard MAX7219. Je signale juste une erreur: la broche 11 (DIG 1) du Max7219 correspond à la ligne 2 de la matrice (Broche 14*)

    RépondreSupprimer