Led Matrix 8x8 Module Librairies MD_MAX72XX et MD_PAROLA

Bonjour j’ai acheté un module de 4 Matrix 8x8 sur ebay que j’utilise avec une arduino nano avec les librairies md_max72XX et parola …

J’utilise un exemple Print Text de la libraire MD_MaX72 pour faire mes tests …
J’ai un effet miroir quand je téléverse mes sketchs.
J’utilise les dernières version des librairies.

Après plusieurs recherche j’ai trouvé que l’on pouvait modifier le type de hardware directement dans le sketch en changeant :

#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW

Cela n’arrange pas les choses en mettant FC16_HW …

// Use the MD_MAX72XX library to Print some text on the display
//
// Demonstrates the use of the library to print text.
//
// User can enter text on the serial monitor and this will display as a
// message on the display.

#include <MD_MAX72xx.h>
#include <SPI.h>

#define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); }

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4

#define CLK_PIN   13  // or SCK
#define DATA_PIN  11  // or MOSI
#define CS_PIN    10  // or SS

// SPI hardware interface
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// Arbitrary pins
//MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Text parameters
#define CHAR_SPACING  1 // pixels between characters

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE  75
char message[BUF_SIZE] = {"Hello!"};
bool newMessageAvailable = true;

void readSerial(void)
{
  static uint8_t	putIndex = 0;

  while (Serial.available())
  {
    message[putIndex] = (char)Serial.read();
    if ((message[putIndex] == '\n') || (putIndex >= BUF_SIZE-3))  // end of message character or full buffer
    {
      // put in a message separator and end the string
      message[putIndex] = '\0';
      // restart the index for next filling spree and flag we have a message waiting
      putIndex = 0;
      newMessageAvailable = true;
    }
    else
      // Just save the next char in next location
      message[putIndex++];
  }
}

void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)
// Print the text string to the LED matrix modules specified.
// Message area is padded with blank columns after printing.
{
  uint8_t   state = 0;
  uint8_t   curLen;
  uint16_t  showLen;
  uint8_t   cBuf[8];
  int16_t   col = ((modEnd + 1) * COL_SIZE) - 1;

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);

  do     // finite state machine to print the characters in the space available
  {
    switch(state)
    {
      case 0: // Load the next character from the font table
        // if we reached end of message, reset the message pointer
        if (*pMsg == '\0')
        {
          showLen = col - (modEnd * COL_SIZE);  // padding characters
          state = 2;
          break;
        }

        // retrieve the next character form the font file
        showLen = mx.getChar(*pMsg++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf);
        curLen = 0;
        state++;
        // !! deliberately fall through to next state to start displaying

      case 1: // display the next part of the character
        mx.setColumn(col--, cBuf[curLen++]);

        // done with font character, now display the space between chars
        if (curLen == showLen)
        {
          showLen = CHAR_SPACING;
          state = 2;
        }
        break;

      case 2: // initialize state for displaying empty columns
        curLen = 0;
        state++;
        // fall through

      case 3:	// display inter-character spacing or end of message padding (blank columns)
        mx.setColumn(col--, 0);
        curLen++;
        if (curLen == showLen)
          state = 0;
        break;

      default:
        col = -1;   // this definitely ends the do loop
    }
  } while (col >= (modStart * COL_SIZE));

  mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}

void setup()
{
  mx.begin();

  Serial.begin(57600);
  Serial.print("\n[MD_MAX72XX Message Display]\nType a message for the scrolling display\nEnd message line with a newline");
}

void loop()
{
  readSerial();
  if (newMessageAvailable)
  {
    PRINT("\nProcessing new message: ", message);
    printText(0, MAX_DEVICES-1, message);
    newMessageAvailable = false;
  }
}

Avez vous des pistes ?
Sur les anciennes version des librairies apparemment on devait changer directement les valeurs dans la librairie …

Bien à vous,
bypbop

Ta demande est mal placée, ici c'est pour les projets terminés. Demande au modérateur de déplacer ton message dans la bonne section.

Cette question est récurrente, cherche sur le forum, en utilisant l'icône en forme de loupe en haut à droite de ta fenêtre, avec des mots clés comme max72xx ou max7219. Les premières réponses sont celles du forum français.

Merci je demande à un Modo dslé

Topic déplacé....

Il existe d’autres types de matrices que tu peux tester

enum moduleType_t
{
PAROLA_HW, ///< Use the Parola style hardware modules.
GENERIC_HW, ///< Use ‘generic’ style hardware modules commonly available.
ICSTATION_HW, ///< Use ICStation style hardware module.
FC16_HW ///< Use FC-16 style hardware module.
};

J’ai testé les 4 et cela ne fonctionne pas correctement. Le meilleur resultat est en miroir.
Bien à toi,
Bypbop

On trouve des solutions à ce problème sur internet, mais pour des versions précédentes de la bibliothèque. En fouillant dans le code, je pense qu’il faut modifier la bibliothèque : le plus “simple” est d’aller dans le fichier MD_MAX72xx.cpp, et de choisir dans les lignes 55 à 59, celle qui te donnait le meilleur résultat (celui que tu appelles le miroir) :

   case PAROLA_HW:    _hwDigRows = true;  _hwRevCols = true;  _hwRevRows = false; break; // tested MC 8 March 2014
   case GENERIC_HW:   _hwDigRows = false; _hwRevCols = true;  _hwRevRows = false; break; // tested MC 9 March 2014
   case ICSTATION_HW: _hwDigRows = true;  _hwRevCols = true;  _hwRevRows = true;  break; // tested MC 9 March 2014
   case FC16_HW:      _hwDigRows = true;  _hwRevCols = false; _hwRevRows = false; break; // tested MC 23 Feb 2015
   default:           _hwDigRows = _hwRevRows = _hwRevCols = false; break;   // not a known board config

Là, tu modifies la valeur de _hwRevRows : si c’est true, tu mets false et vice-versa. Puis tu recompiles et tu me dis ce qui se passe…

La solution la plus propre serait de créer un nouveau type de HW. Il faudrait modifier le fichier MD_MAX72xx.h, lignes 282 et suivantes, en ajoutant un type

  enum moduleType_t
  {
    PAROLA_HW,    ///< Use the Parola style hardware modules.
    GENERIC_HW,   ///< Use 'generic' style hardware modules commonly available.
    ICSTATION_HW, ///< Use ICStation style hardware module.
    FC16_HW,       ///< Use FC-16 style hardware module.
    MonType_HW  /// le mien à moi que je modifie comme je veux
  };

puis changer dans le fichier MD_MAX72xx.cpp en ajoutant le case ad-hoc :

   case PAROLA_HW:    _hwDigRows = true;  _hwRevCols = true;  _hwRevRows = false; break; // tested MC 8 March 2014
   case GENERIC_HW:   _hwDigRows = false; _hwRevCols = true;  _hwRevRows = false; break; // tested MC 9 March 2014
   case ICSTATION_HW: _hwDigRows = true;  _hwRevCols = true;  _hwRevRows = true;  break; // tested MC 9 March 2014
   case FC16_HW:      _hwDigRows = true;  _hwRevCols = false; _hwRevRows = false; break; // tested MC 23 Feb 2015
   case MonType_HW :  _hwDigRows = false; _hwRevCols = true;  _hwRevRows = true; break; // ajouté le 02/09/2019
   default:           _hwDigRows = _hwRevRows = _hwRevCols = false; break;   // not a known board config

et utiliser le nouveau type dans ta déclaration de la matrice :

#define HARDWARE_TYPE MD_MAX72XX::MonType_HW

Mais il peut y avoir (je pense pas mais on ne sait jamais) d’autres lignes à changer autre part dans les fichiers de la bibliothèque…

Merci lesept cela fonctionne correctement avec la première méthode ...
J'avais pas mal fouillé mais je n'étais pas retombé sur cette modification !
Je teste la deuxième méthode et je reviens vers toi !

Merci bcp
Bypbop