Mega 2560 and 4 module MAX 7219 Dot Matrix Pinout problem or Program problem?

Hi,

I have been having issues getting my Arduino Mega 2560 to communicate to a 4 module MAX 7219 Dot Matrix and need some help troubleshooting.

VCC on the matrix is wired to the Arduino Mega Power 5V pin

GND on the matrix is wired to the Arduino Mega Power GND pin

DIN on the matrix is wired to the Arduino Mega Digital (PWM-) 11 pin

CS on the matrix is wired to the Arduino Mega Digital (PWM-) 10 pin

CLK on the matrix is wired to the Arduino Mega Digital (PWM-) 13 pin

Upon plugging the Arduino Mega into my computer, all LEDs illuminate on the left three modules and none on the far right module where the wires are attached.

I installed the md_max72xx, md_maxpanel, and md_parola libraries.

When I attempt to use the MD_Parola scrolling example I specify the hardware type as FC16_HW with max devices as 4. I then Upload the code (successfully), but nothing changes and I cannot enter text through the Serial Monitor.

Thoughts? What am I doing wrong here?

If you have the library set for hardware SPI you are using the wrong pins. The Mega has the hardware SPI on totally different pins. The SPI reference has a table showing how the SPI pins are mapped to different processors.

MOSI Din 51
SCK CLK 52
CS CS 53 (default)

If you are using software SPI you need to tell the library which pins you have connected.

Maybe the type is not good. Try one of those

   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.

Default pins are defined in the sketch. To change them the full constructor is

   * \param mod       the hardware module type used in the application. One of the MD_MAX72XX::moduleType_t values.
   * \param dataPin   output on the Arduino where data gets shifted out.
   * \param clkPin    output for the clock signal.
   * \param csPin     output for selecting the device.
   * \param numDevices  number of devices connected. Default is 1 if not supplied.
   */
  MD_Parola(MD_MAX72XX::moduleType_t mod, uint8_t dataPin, uint8_t clkPin, uint8_t csPin, uint8_t numDevices = 1);

and I cannot enter text through the Serial Monitor.

I think that that may be a separate issue. Post your code and we can see.

Please read the how to use the forum-please read sticky.

// Use the Parola library to scroll text on the display
//
// Demonstrates the use of the scrolling function to display text received
// from the serial interface
//
// User can enter text on the serial monitor and this will display as a
// scrolling message on the display.
// Speed for the display is controlled by a pot on SPEED_IN analog in.
// Scrolling direction is controlled by a switch on DIRECTION_SET digital in.
// Invert ON/OFF is set by a switch on INVERT_SET digital in.
//
// UISwitch library can be found at https://github.com/MajicDesigns/MD_UISwitch
// MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
//

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

// set to 1 if we are implementing the user interface pot, switch, etc
#define USE_UI_CONTROL 0

#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif

// Turn on debug statements to the serial output
#define DEBUG 0

#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif

// 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::ICSTATION_HW
#define MAX_DEVICES 4
#define CLK_PIN   52
#define DATA_PIN  51
#define CS_PIN    53

// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Scrolling parameters
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8;  // change the effect
const uint8_t INVERT_SET = 9;     // change the invert

const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL

uint8_t scrollSpeed = 25;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds

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

#if USE_UI_CONTROL

MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);

void doUI(void)
{
  // set the speed if it has changed
  {
    int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);

    if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
      (speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
    {
      P.setSpeed(speed);
      scrollSpeed = speed;
      PRINT("\nChanged speed to ", P.getSpeed());
    }
  }

  if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // SCROLL DIRECTION
  {
    PRINTS("\nChanging scroll direction");
    scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
    P.setTextEffect(scrollEffect, scrollEffect);
    P.displayClear();
    P.displayReset();
  }

  if (uiInvert.read() == MD_UISwitch::KEY_PRESS)  // INVERT MODE
  {
    PRINTS("\nChanging invert mode");
    P.setInvert(!P.getInvert());
  }
}
#endif // USE_UI_CONTROL

void readSerial(void)
{
  static char *cp = newMessage;

  while (Serial.available())
  {
    *cp = (char)Serial.read();
    if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE-2)) // end of message character or full buffer
    {
      *cp = '\0'; // end the string
      // restart the index for next filling spree and flag we have a message waiting
      cp = newMessage;
      newMessageAvailable = true;
    }
    else  // move char pointer to next position
      cp++;
  }
}

void setup()
{
  Serial.begin(57600);
  Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");

#if USE_UI_CONTROL
  uiDirection.begin();
  uiInvert.begin();
  pinMode(SPEED_IN, INPUT);

  doUI();
#endif // USE_UI_CONTROL

  P.begin();
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}

void loop()
{
#if USE_UI_CONTROL
  doUI();
#endif // USE_UI_CONTROL

  if (P.displayAnimate())
  {
    if (newMessageAvailable)
    {
      strcpy(curMessage, newMessage);
      newMessageAvailable = false;
    }
    P.displayReset();
  }
  readSerial();
}

The LED matrix occasionally changes its display, but in no particular sequence - mainly full modules turning on or off. For reference, these are the modules I am using:

I have 8x8 LED modules that look identical to the image down to how the PCB traces run. I have connected, according to your setup, one of the modules to my Mega and uploaded your posted code. I set for FC16_HW.

#define HARDWARE_TYPE MD_MAX72XX::FC16_HW

That is the only change. I get "Hello enter new message scrolling onto the screen and this output:

[Parola Scrolling Display]
Type a message for the scrolling display
End message line with a newline

in serial monitor.

And as you say, the serial input does not work. I will look into that.

Do you see the message on the screen if you change to FC16_HW?

I had tried using all four hardware types and none of them worked even though I was fairly certain it as FC16_HW. I re-did all of the wiring multiple times and finally got it to work. Must have had a bad connection with one of the wires I assume? Serial input works as it should now too. Thank you to everyone for the assistance!

As per groundFungus' post, the pins for the hardware SPI are different for the MEGA, so you need to connect the display to the correct SPI pins.

If you want to use 10, 11 and 13, then you need to change to Software object definition at the top of the code so that it uses your pins instead of the hardware SPI settings.

// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

I got the serial input to work, too. To my dismay, I am not sure what I did to make it work. That always irritates.