Matriz 8x8 con MAX7219

Encender una matriz 8x8 de LED directamente con Arduino requiere emplear 16 pines de salida, lo cuál supondría un gran desperdicio de recursos. Por este motivo, lo normal es que siempre empleemos un controlador específicamente diseñado para esta función. El MAX7219 esta diseñado para manejar una matriz 8x8 a través del bus SPI por lo que solo requiere de 3 pines de Arduino (SS, MOSI y SCK). Es mas ni siquiera se usa por completo el bus de manera que podemos manejar múltiples MAX7219.

1. Circuito propuesto

Como podrás observar el circuito es muy simples. No se requiere de resistencias imitadoras gracias a que MAX7219 tiene fuentes de corriente constante para cada segmento (anodo). Ademas tiene un decodificador BCD, un multiplexos de hasta 10 MHz y una RAM 8x8.

Matriz 8x8 con MAX7219

2. Componentes

Los componentes son muy simples.

  1. Arduino UNO
  2. Matriz 8x8 cátodo común
  3. MAX7219
  4. 56K

3. Código Arduino

Existen varias librerías para comunicar Arduino con un controlador MAX7219. Por ejemplo, tenemos la librería Max72xxPanel, que requiere el uso de la librería Adafruit-GFX.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
 
//Vcc - Vcc
//Gnd - Gnd
//Din - MOSI (Pin 11)
//Cs  - SS (Pin 10)
//Clk - CLK (Pin 13)
 
const int pinCS = 10;
const int numberOfHorizontalDisplays = 9;
const int numberOfVerticalDisplays = 1;
 
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
const int wait = 100;  //En millisegundos
const int spacer = 1;
const int width = 5 + spacer; //El ancho de letra sera de 5 pixeles.
 
void setup() {
   matrix.setIntensity(7); //Brillo entre 0~15
 
   //Adjust to your own needs
   matrix.setPosition(0, 0, 0); //Primer display
   matrix.setPosition(1, 1, 0); //Segundo display
   matrix.setPosition(2, 2, 0); //Tercer display
   matrix.setPosition(3, 3, 0); //Cuarto display
   matrix.setPosition(4, 4, 0); //Quinto display
   matrix.setPosition(5, 5, 0); //Sexto display
   matrix.setPosition(6, 6, 0); //Septimo display
   matrix.setPosition(7, 7, 0); //Octavo display
   matrix.setPosition(8, 8, 0); //Noveno display
   matrix.setPosition(9, 9, 0); //Decimo display
 
   matrix.setRotation(0, 1);    // Display is position upside down
   matrix.setRotation(1, 1);    // Display is position upside down
   matrix.setRotation(2, 1);    // Display is position upside down
   matrix.setRotation(3, 1);    // Display is position upside down
   matrix.setRotation(4, 1);    // Display is position upside down
   matrix.setRotation(5, 1);    // Display is position upside down
   matrix.setRotation(6, 1);    // Display is position upside down
   matrix.setRotation(7, 1);    // Display is position upside down
   matrix.setRotation(8, 1);    // Display is position upside down
   matrix.setRotation(9, 1);    // Display is position upside down
}
 
void loop() {
   for (int i = 0; i < width * tape.length() + matrix.width() - 1 - spacer; i++) {
 
      matrix.fillScreen(LOW);
 
      int letter = i / width;
      int x = (matrix.width() - 1) - i % width;
      int y = (matrix.height() - 8) / 2;    //center the text vertically
 
      while (x + width - spacer >= 0 && letter >= 0) {
         if (letter < tape.length()) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW, 1);
         }
 
         letter--;
         x -= width;
      }
      matrix.write(); // Send bitmap to display
      delay(wait);
   }
}

Si puedes mejorar o simplificar mas aun este código de ejemplo dímelo aquí