Grupo de 4 matrices LED 8×8 con SPI

Objetivos

 

  • Presentar los grupos de 44 matrices LED de 8×8 controladas por MAX7219.
  • Descargar y aprender a usar las librerías necesarias.
  • Conectarlas y programarlas correctamente.
  •  

    Material requerido.

     

     

    Vista principal Arduino UNO
    conexiones cables macho-hembra.
    Vista principal grupo de 4 matrices LED 8×8 Con SPI

    Grupo de 4 matrices LED 8×8 con SPI

     

    Las matrices LED son displays que están formados por un grupo de LEDS formando normalmente cuadrados o rectángulos de diferentes tamaños, aunque cuando hablamos de Arduino suelen ser de 8×8.

    Como ya vimos en la sesión que le dedicamos Matriz LED 8×8 con MAX7219 y SPI, para controlar este tipo de matrices directamente con Arduino se necesitarían muchos pines. Tendríamos que conectar uno a cada fila y columna (o sea 16 en total) y activaríamos un LED poniendo a HIGH y LOW a su respectiva fila y columna. Además, al aplicar HIGH y LOW a varias filas y columnas de forma simultánea se encenderían todos los LED de las intersecciones.

    Si lo pensamos un poco, sería muy difícil generar gráficos, y tendríamos que recurrir a trucos que tienen que ver con como percibimos las imágenes a través de la vista.

    Por eso estas matrices normalmente se usan junto a un controlador, que suele ser el MAX7219, por lo sencillo y lo económico que es. La comunicación de este módulo se realiza a través de SPI, por lo que sólo necesitaremos 3 pines de Arduino a parte de la alimentación.

    Ampliacion que muestra el chip controlador

    Lo mejor de estas matrices es que además nos permite combinar las que queramos de ellas, conectando la salida de una a la entrada de la siguiente. En lo que concierne a este tutorial vamos a usar 2 grupos que vienen ya con 4 de estas matrices unidas, aunque podemos unir a otros tantos grupos de estos como queramos, y en diferentes posiciones. Para unir los dos grupos lo que hemos hecho  nosotros ha sido doblar un poco los pines de entrada de uno y soldarlos en los de salida del otro, aunque es un poco chapucero y seguro que podéis hacerlo mejor.

    grupo matrices led spi

    Esquema de montaje y programación

     

    Como ya hemos comentado un poco más arriba, la conexión de estas matrices a Arduino es muy sencilla. Nos basta con 5 pines, dos para la alimentación y 3 para el bus SPI. En este caso vamos a usar el Arduino UNO, pero si usáis otro tipo de Arduino tenéis que mirar qué pines son los que les corresponden al bus SPI: SS, MOSI  y SCK.

    grupo de matrices arduino

    En cuanto a la programación, tampoco va a ser nada del otro mundo gracias a un par de librerías que tendremos que descargar  e instalar como siempre hemos hecho: arduino-Max72xxPanel-master y Adafruit-GFX-Library-master.

    El programa que vamos a utilizar nos servirá para mostrar textos desplazándose de izquierda a derecha a través de 8 matrices, pero podríais cambiarlo según vuestros propósitos. En particular vamos a mostrar de forma aleatoria 11 Strings que hemos cargado relacionados con nuestra página.

    Lo primero que haremos será incluir las librerías y definir algunas variables que vamos a necesitar, el número de matrices verticales y horizontales y el pin CS. Además inicializamos el objeto con esos parámetros:

    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Max72xxPanel.h>
      
    const int pinCS = 10;
    const int numberOfHorizontalDisplays = 8;
    const int numberOfVerticalDisplays = 1;
    
    Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
    
    

    A continuación vamos a definir las variables que dictarán la velocidad de desplazamiento de los textos, el ancho de la fuente y el array donde guardaremos las strings que queramos mostrar. Recordad que no tienen por qué ser palabras simples, pueden ser frases completas. Podéis guardar tantas como quepan en la memoria de vuestro Arduino.

    const int wait = 100; // En milisegundos
     
    const int spacer = 1;
    const int width = 5 + spacer; // Ancho de la fuente a 5 pixeles
    
    String cadena[]= {"Prometec","Tutoriales de Arduino","Electronica","Robotica infantil","S4A","Raspberry Pi","Programacion","Arduino","Comunicaciones","Sensores","IoT"}; //textos

    En el setup tenemos que definir el brillo que queremos que tengan las pantallas, así como las posiciones en las que hemos montado las matrices, que en nuestro caso quedaría de esta forma:

    void setup() {
     matrix.setIntensity(7); // Ajustar el brillo entre 0 y 15
     
     // Ajustar segun las necesidades
     matrix.setPosition(0, 0, 0); // El primer display esta en <0, 0>
     matrix.setPosition(1, 1, 0); // El segundo display esta en <1, 0>
     matrix.setPosition(2, 2, 0); // El tercer display esta en <2, 0>
     matrix.setPosition(3, 3, 0); // El cuarto display esta en <3, 0>
     matrix.setPosition(4, 4, 0); // El quinto display esta en <4, 0>
     matrix.setPosition(5, 5, 0); // El sexto display esta en <5, 0>
     matrix.setPosition(6, 6, 0); // El séptimo display esta en <6, 0>
     matrix.setPosition(7, 7, 0); // El octavo display esta en <7, 0>
     matrix.setPosition(8, 8, 0); // El noveno display esta en <8, 0>
     
     matrix.setRotation(0, 1); // Posición del display
     matrix.setRotation(1, 1); // Posición del display
     matrix.setRotation(2, 1); // Posición del display
     matrix.setRotation(3, 1); // Posición del display
     matrix.setRotation(4, 1); // Posición del display
     matrix.setRotation(5, 1); // Posición del display
     matrix.setRotation(6, 1); // Posición del display
     matrix.setRotation(7, 1); // Posición del display
     matrix.setRotation(8, 1); // Posición del display
    }
    

    Y en el loop vamos a ir pasándole los strings para que los vaya mostrando en las pantallas como indica la librería:

    void loop() {
     int n = random(0,10);
     
     for (int i = 0; i < width * cadena[n].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; // Centrar el texto
     
     while (x + width - spacer >= 0 && letter >= 0) {
     if (letter < cadena[n].length()) {
     matrix.drawChar(x, y, cadena[n][letter], HIGH, LOW, 1);
     }
     
     letter--;
     x -= width;
     }
     matrix.write(); // Muestra los caracteres
     
     delay(wait);
     }
    }

    Aquí os dejamos el programa completo:

     Prometec4matrices.

     

     

    Grupo 8 matrices prometec

    Enviando cadenas por el puerto serie

     

    Para completar vamos a incluir un programa que muestre las cadenas que le enviemos por el puerto serie, aunque visto el programa anterior no tiene mucho misterio. La diferencia vendrá en que no definiremos el array de strings, si no que los crearemos en el loop con lo que recojamos por el puerto serie (recordad también que hay que fijar la velocidad de comunicación en el setup):

     

     void loop() {
     String cadena = "";
     long int time = millis();
     while (Serial.available()) {
     cadena += char(Serial.read());
     }
     
     for (int i = 0; i < width * cadena.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; // Centrar el texto
     
     while (x + width - spacer >= 0 && letter >= 0) {
     if (letter < cadena.length()) {
     matrix.drawChar(x, y, cadena[letter], HIGH, LOW, 1);
     }
     
     letter--;
     x -= width;
     }
     matrix.write(); // Muestra los caracteres
     
     delay(wait);
     }
    }

    Aquí os dejamos el programa completo Matrices_puerto_serie y un vídeo con el resultado.

     

    Además os dejamos una idea para que la trabajéis vosotros, conectarle un módulo bluetooth y pasarle las cadenas desde un teléfono móvil.

    Resumen de la sesión

     

    En esta sesión hemos aprendido varias cosas importantes:

  • Hemos visto como funcionan las matrices de LED SPI basadas en el chip MAX7219.
  • Hemos aprendido a utilizar grupos de 4 de esas matrices.
  • Hemos aprendido a unir varios grupos y a programarlos.
  • Deja una respuesta