MAX7219, passer de 8x8 à 16x16

Bonjour,
Bon, ça y est, après beaucoup de lectures ici et là, je suis maintenant capable de créer des trucs sur ma matrice de LEDs 8x8 MAX7219 programmée avec une NANO.
Maintenant, je voudrais passer à la taille au-dessus, c’est-à-dire 16x16, mais comment faire ?
Me suffit il d'écrire mes 1 et 0 sur 16 lignes et 16 colonnes, genre : B0000100000000000, au lieu de B00001000, pour obtenir l'allumage d'une LED sur ma ligne, ou y a-t-il une façon particulière d'adresser les consignes ?
A savoir, que je compte disposer quatre modules MAX7219 en carré, et que, pour l'instant je ne sais pas si je dois les "chainer" horizontalement ou verticalement.
Je suis à votre écoute pour toutes les pistes possibles, dans la limite de mes compétences, merci.
Hello,

Well, that's it, after a lot of reading here and there, I'm now able to create stuff on my 8x8 MAX7219 LED array programmed with a NANO.

Now, I would like to go to the next size up, i.e. 16x16, but how do I do that?

Is it enough to write my 1s and 0s in 16 rows and 16 columns, like B0000100000000000, instead of B00001000, to get an LED to light up on my line, or is there a particular way to address the instructions?

I'm planning to arrange four MAX7219 modules in a square, and for the moment I don't know if I should "chain" them horizontally or vertically.

I'm listening to you for all possible leads, within the limits of my skills, thank you.

J'ai peur que ce ne soit pas aussi simple. Je connais mal ces dispositifs, bien que j'aie fait joujou avec il y a quelques temps. Tu trouveras beaucoup d'information utile sur le site de Nick Gammon.

Ces matrices sont connectées en série donc si tu fais par exemple une matrice 16x16 avec 4 matrice 8x8 connectées comme suit

1 - 2 -
3 - 4

avec la 3 qui suit la 4, il est évident qu'un caractère affiché sur la matrice 16x16 aura le haut sur les matrices 1 et 2, et le bas sur le 3 et 4. Il faut gérer ça.

Bonjour,
Regarde la discussion Matrices de LED
J'utilise 4 x 2 matrices de LED.

Merci les Gars,
Je vais suivre vos conseils, et regarder les pistes en question.
La, ou je pense que mon problème est plus simple, c'est que je ne cherche pas à afficher ni à faire défiler du texte, mais juste, pour l'instant, maîtriser l'allumage de la, ou des, LED de mon choix par mon programme.
En fait, un "simple" problème d'adressage à comprendre...
Thanks guys,
I'll take your advice, and look at the tracks in question.
Where I think my problem is simpler is that I'm not trying to display or scroll text, but just, for the moment, control the lighting of the LED(s) of my choice by my program.
In fact, a "simple" addressing problem to understand...

Déjà ça dépend de quel type tu disposes,
CMS ou Circuit traversant la commande n'est pas la même, la matrice étant tournée de 90° l'une pas rapport à l'autre.

Traversant, pourquoi ?
En quoi ça intervient dans le programme ?

Je parle du circuit intégré en CMS ou traversant.
Quand tu regardes la carte avec circuit traversant, il n'est pas monté de la même façon que sur l'autre lien. La commande ne se fait pas de la même façon.
J'ai du mal à m'expliquer.
Pas exemple, si tu affiches A sur l'un, avec le même soft sur l'autre tu verras A tourné de 90°.

OK, d'accord, je comprends mieux ta question, c'est du CMS, mais cela ne change rien à la question de l'adressage des LEDs, pour l'instant il ne s'agit pas de l'orientation puisque je cherche à choisir quelle diode va s'allumer dans mon tableau de 2x 8x8 sur 2x 8x8.
Tu dis que tu utilise 4 fois 2 matrices, peux tu, s'il te plait, me donner un exemple de sketch que je voie si je peux m'en inspirer ou au moins comprendre où je butte ?

Alors là, je ne pourrai pas t'aider, je programme des PIC, désolé.

Merci, quand même, je vais continuer à chercher, et si je trouve, je publierais pour faire gagner du temps à ceux qui rament comme moi.
Ce n'est pas évident lorsqu'on débute sans formation préalable...

Bonjour,
En cherchant de tous cotés, j'ai réussi à bricoler le programme ci-joint. (dans un deuxième post, car le systeme me refuse l'envoi, trop grand).
Il n'est certainement pas parfait, mais il fonctionne, si quelqu'un peut me conseiller pour l'optimiser, je suis preneur, j'en saurais d'avantage ensuite.
Même s'il fonctionne, j'ai le problème que je voudrais porter à plusieurs minutes le temps d'attente (actuellement 1000 ms) entre l'allumage des LEDs.
Comme d'habitude, je suis à l'écoute de vos lumières...
Hello,
By searching on all sides, I managed to cobble together the attached program.
It is certainly not perfect, but it works, if someone can advise me to optimize it, I am taker, I would know more afterwards.
Even if it works, I have the problem that I would like to increase the waiting time (currently 1000 ms) between the lighting of the LEDs to several minutes.
As usual, I'm listening to your lights...

Comme je ne peux publier le programme entier, en voici le début:

/*
allumage/extinction progressive MAX7219     code non optimise
*/

#include "LedControl.h"
#include <binary.h>

/*
 initialisation E/S Ledcontrol
 pin 11 DataIn 
 pin 13 CLK 
 pin 10 LOAD
 */
LedControl lc=LedControl(11,13,10,4);

unsigned long delai=0;   

void setup() {

  lc.shutdown(0,false);      //    Réveil Max 1
  lc.shutdown(1,false);      //    Réveilt Max 2 
  lc.shutdown(2,false);      //    Réveilt Max 3 
  lc.shutdown(3,false);      //    Réveil Max 4
 
  lc.setIntensity(0,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
  lc.setIntensity(1,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
  lc.setIntensity(2,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
  lc.setIntensity(3,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
 
  lc.clearDisplay(0);          //    On efface tout
  lc.clearDisplay(1);          //    On efface tout, ajouté par YA
  lc.clearDisplay(2);          //    On efface tout, ajouté par YA
  lc.clearDisplay(3);          //    On efface tout, ajouté par YA
}

/*
ANIMATION CHENILLE
 */

void chenille()
 {

 // Ce qui suit est une esquisse de l'HM

 //========ALLUMAGE PREMIERE LIGNE EN BAS A GAUCHE
 //===================afficheur TROIS
 lc.setLed(3,7,0,true);   //   Allumage de la LED 1
delay(1000); 
  lc.setLed(3,7,1,true);  
delay(1000);
 lc.setLed(3,7,2,true);   
delay(1000);
 lc.setLed(3,7,3,true);  
delay(1000);
 lc.setLed(3,7,4,true);  
delay(1000);
 lc.setLed(3,7,5,true);   
delay(1000);
 lc.setLed(3,7,6,true); 
delay(1000);
 lc.setLed(3,7,7,true);  
delay(1000);
 //=================================AFFICHEUR  DEUX
 lc.setLed(2,7,0,true);  
delay(1000);
 lc.setLed(2,7,1,true);
delay(1000);
 lc.setLed(2,7,2,true);
delay(1000);
lc.setLed(2,7,3,true);
delay(1000);
 lc.setLed(2,7,4,true);
delay(1000);
 lc.setLed(2,7,5,true);
delay(1000);
 lc.setLed(2,7,6,true);
delay(1000);
 lc.setLed(2,7,7,true);
delay(1000);

 lc.setLed(3,6,0,true);  
delay(1000);
  lc.setLed(3,6,1,true);  
delay(1000);
 lc.setLed(3,6,2,true);  
delay(1000);
 lc.setLed(3,6,3,true);  
delay(1000);
 lc.setLed(3,6,4,true);    
delay(1000);
 lc.setLed(3,6,5,true);  
delay(1000);
 lc.setLed(3,6,6,true);  
delay(1000);
 lc.setLed(3,6,7,true);   
delay(1000);

lc.setLed(2,6,0,true);  
delay(1000);

Et la fin:

 lc.setLed(3,6,7,false);   
delay(1000);
  lc.setLed(3,6,6,false);   
delay(1000);
 lc.setLed(3,6,5,false);  
delay(1000);
 lc.setLed(3,6,4,false);   
delay(1000);
 lc.setLed(3,6,3,false);     
delay(1000);
 lc.setLed(3,6,2,false);   
delay(1000);
 lc.setLed(3,6,1,false);   
delay(1000);
 lc.setLed(3,6,0,false);   
delay(1000);

 lc.setLed(2,7,7,false);  
delay(1000);
 lc.setLed(2,7,6,false);
delay(1000);
 lc.setLed(2,7,5,false);
delay(1000);
lc.setLed(2,7,4,false);
delay(1000);
 lc.setLed(2,7,3,false);
delay(1000);
 lc.setLed(2,7,2,false);
delay(1000);
 lc.setLed(2,7,1,false);
delay(1000);
 lc.setLed(2,7,0,false);
 delay(250);

 lc.setLed(3,7,7,false);   
delay(1000);
  lc.setLed(3,7,6,false);   
delay(1000);
 lc.setLed(3,7,5,false);   
delay(1000);
 lc.setLed(3,7,4,false);   
delay(1000);
 lc.setLed(3,7,3,false);   
delay(1000);
 lc.setLed(3,7,2,false);  
delay(1000);
 lc.setLed(3,7,1,false);  
delay(1000);
 lc.setLed(3,7,0,false);   
delay(1000);
} 
//=============================FIN DU TABLEAU ET REDEMARRAGE DU REMPLISSAGE============================


void loop() { 
 chenille();

}

Pour simplifier ton code tu peux y mettre des boucles. Voici un exemple. Ceci :

 lc.setLed(3,7,0,true);   //   Allumage de la LED 1
delay(1000);
  lc.setLed(3,7,1,true); 
delay(1000);
 lc.setLed(3,7,2,true);   
delay(1000);
 lc.setLed(3,7,3,true); 
delay(1000);
 lc.setLed(3,7,4,true); 
delay(1000);
 lc.setLed(3,7,5,true);   
delay(1000);
 lc.setLed(3,7,6,true);
delay(1000);
 lc.setLed(3,7,7,true); 
delay(1000);

Peut s'écrire

for (int i=0; i<8;i++) { lc.setLed(3, 7, i, true); delay(1000); }

Une seule ligne ! :slight_smile:
Je te laisse faire la suite ?

Super génial!!!!
C'est beaucoup plus léger comme ça, j'ai ajusté les infos entre parenthèses, et j'ai pu supprimer un wagon de lignes.
Mon script a prit, grâce à toi, une sérieuse cure amaigrissante,
Mille merci, l'Ami.
Il ne me reste plus qu'à résoudre mon problème de tempo, arriver à programmer les changements sur des battements supérieurs à 2/3 minutes...

vous pourriez en faire même une fonction un peu générique

void animation(int addr, int row, int col, int debut=0, int fin=7, boolean state=true)
{
  if (fin > debut)
    for (int i = debut; i <= fin; i++) {
      lc.setLed(addr, row, i, state);
      delay(1000);
    }
  else
    for (int i = debut; i >= fin; i--) {
      lc.setLed(addr, row, i, state);
      delay(1000);
    }
}

si vous faites animation(3, 7); (grâce aux valeurs par défaut) c'est comme si vous aviez fait

lc.setLed(3, 7, 0, true); 
delay(1000);
lc.setLed(3, 7, 1, true);
delay(1000);
lc.setLed(3, 7, 2, true);
delay(1000);
lc.setLed(3, 7, 3, true);
delay(1000);
lc.setLed(3, 7, 4, true);
delay(1000);
lc.setLed(3, 7, 5, true);
delay(1000);
lc.setLed(3, 7, 6, true);
delay(1000);
lc.setLed(3, 7, 7, true);
delay(1000);

et si vous faite animation(3, 7, 7, 0, false);c'est comme si vous aviez fait

lc.setLed(3, 7, 7, false);
delay(1000);
lc.setLed(3, 7, 6, false);
delay(1000);
lc.setLed(3, 7, 5, false);
delay(1000);
lc.setLed(3, 7, 4, false);
delay(1000);
lc.setLed(3, 7, 3, false);
delay(1000);
lc.setLed(3, 7, 2, false);
delay(1000);
lc.setLed(3, 7, 1, false);
delay(1000);
lc.setLed(3, 7, 0, false);
delay(1000);

de même le setup() pourrait être raccourci en

  for (byte i = 0, i < 4; i++) {
    lc.shutdown(i, false);  // Réveil du module N° i
    lc.setIntensity(i, 0);  // Reglage luminosite, (adresse module, intensité de 0 à 15)
    lc.clearDisplay(i);          // On efface tout
  }

Merci J-M-L, de passer un p'tit peu de temps sur mon projet.
Là, il va me falloir quelques heures pour "digérer" ces propositions, car comme je voudrais comprendre ce que je fais, je passe beaucoup de temps à aller et venir sur les différents tutos et cours sur la programmation Arduino. De plus, comme je ne pratique "que" le Français (et l'Argo" mais il ne sert pas dans ce domaine), je jongle également entre DeepL et Google trad.
Sur la question des delay(1000), je pense, qu'à terme, ils devraient êtres amenés à disparaître, dans la mesure où, ensuite, je chercherai à faire avancer chaque changement par une impulsion fournie par une horloge externe (tempo longue).
J'avance et je reposerai, très certainement, d'autres questions.
Cordialement...

Bon, me revoilà, première tentative, dans le setup, lorsque je remplace :

//  lc.shutdown(0,false);      //    Réveil Max 1
//  lc.shutdown(1,false);      //    Réveilt Max 2 
//  lc.shutdown(2,false);      //    Réveilt Max 3 
//  lc.shutdown(3,false);      //    Réveil Max 4
 
//  lc.setIntensity(0,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
//  lc.setIntensity(1,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
//  lc.setIntensity(2,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
//  lc.setIntensity(3,0);       //    Reglage luminosite, (adresse module, intensité de 0 à 15
 
//  lc.clearDisplay(0);          //    On efface tout
//  lc.clearDisplay(1);          //    On efface tout, ajouté par YA
//  lc.clearDisplay(2);          //    On efface tout, ajouté par YA
//  lc.clearDisplay(3);          //    On efface tout, ajouté par YA
//}

par:

  for (byte i = 0, i < 4; i++) {
    lc.shutdown(i, false);  // Réveil du module N° i
    lc.setIntensity(i, 0);  // Reglage luminosite, (adresse module, intensité de 0 à 15)
    lc.clearDisplay(i);          // On efface tout
  }

J'obtien le message d'erreur:
expected ';' before '<' token
mais je ne trouve vraiment pas où il manque un point-virgule...

Bonjour,

Après i=0, il y a une virgule au lieu d'un point virgule.

Cétait un piège pour voir si vous suiviez... :wink:
Bon OK, j'ai tapé trop vite, c'est un ; qu'il faut...

 for (byte i = 0[color=red][b];[/b][/color] i < 4; i++) {

(vous auriez quand même pu trouver cela, le compilateur vous le dit...)