bclose

Matriz LED 8×8 con MAX7219 y SPI

Arduino y los arrays de 8x8 SPI

Objetivos

 

 

    • Presentar las matrices LED de 8×8 controladas por MAX7219.
    • Mostrar un circuito de muestra.
    • Programar diferentes mensajes.
 

Material requerido.

Imagen de Arduino UNO Arduino UNO o equivalente.
Protoboard conexiones

Una Protoboard más cables..

Array LED 8x8

Una matriz de LEDs 8×8, con gobernada por un MAX7219

tienda online prometec

Las matrices LED

 

Si me habéis aguantado hasta aquí, ya estáis familiarizados con la idea, de que cuando en electrónica algo es un asco, por trabajoso, pesado o molesto, alguien se descuelga con un chip integrado que nos resuelve la papeleta y así podemos dedicarnos a pensar en lo que queremos y no estar preocupados por si se suelta un cable o por si habremos definido bien las matrices de caracteres.

Y como ya sospechabais, las matrices LED de 8×8, no son una excepción.

De hecho, tenemos un integrado muy extendido del fabricante Maxim, el MAX7219/MAX7221 que nos hace reconciliarnos con las matrices LEDs y hasta con los displays de 7 segmentos. Sus características son:

 
  • Entrada y salida en serie, para necesitar menos pines.
  • Controla displays de 7 segmentos de hasta 8 dígitos.
  • Bar graph displays o Barras de LEDs.
  • Matrices de 8×8 o hasta 64 LEDs individuales.
  • Solo requiere una resistencia externa para los 64 LEDs.
  • Incluye decodificador BCD (No hay necesidad de dibujar matrices de caracteres, las lleva incluidas. Mayúsculas, minúsculas y hasta números y signos).
  • Se encarga del multiplexado de los caracteres y dígitos.
  • Incluye memoria de los caracteres.
  • Es compatible con SPI y QSPI, (Algún día tendremos que hablar del SPI).
  • Es barato y se consiguen por pocos euros.
 

Así que la única razón para manejar cualquier tipo de displays LED a mano y cableando, es la de comprender un circuito y aprender (Sufriendo por supuesto), pero en el mundo real usaremos un chip de este estilo, porque nos ahorrará muchas horas de  improperios.

Array LED 8x8

En el futuro incluiremos alguna sesión mostrando como manejar displays con el chip directamente, pero de momento vamos a empezar por una placa que incluye una matriz de 8×8 con uno de estos chips.

Por menos  de lo que valen los componentes, ya nos venden unas plaquitas con una matriz gobernada por un MAX7219 y con pines para olvidarnos de las complicaciones. Son fáciles de montar en una protoboard y con la ventaja añadida de que se pueden cascadear, es decir, montar hasta 8 en serie. La conexión con nuestros Duino es a través de un puerto serie asíncrono SPI

Esquema de conexiones

 

De nuevo, cuando se usa un controlador externo, la conexión es trivial.

Esquema electrico

Y para la protoboard

protoboard

 

El Programa de control

 

Para manejar el array, existe disponible una librería de control, llamada LedControlMS y que podéis descargar desde aquí Libreria adafruit LEDControl

Una vez que la hayáis instalado con Programa\Importar Librería\Añadir librería, debéis lo primer hacer el include correspondiente:

#include "LedControlMS.h"

Después indicar cuantos displays vamos a usar, uno de momento y crear una instancia de la clase LedControl, pasándole los pines de control y por último el número de matrices que vamos a usar:

#define NumMatrix 1
LedControl lc=LedControl(12,11,10, NumMatrix);

Cuando arrancamos las matrices están en modo standby. Hay que levantarlas

for (int i=0; i< NumMatrix ; i++)
   {
       lc.shutdown(i,false);  // Activar la matriz
       lc.setIntensity(i,8);  // Poner el brillo a un valor intermedio
       lc.clearDisplay(i);    // Y borrar todo
   }

Y ya solo queda escribir el mensaje:

lc.writeString(0,"Curso Arduino de Prometec.net");

En resumen, el programa completo para escribir un mensaje quedaría así:  Prog_38_1 

#include "LedControlMS.h"
#define NumMatrix 1       // Cuantas matrices vamos a usar

LedControl lc=LedControl(12,11,10, NumMatrix);  // Creamos una instancia de LedControl

void setup()
   {
      for (int i=0; i< NumMatrix ; i++)
        {
           lc.shutdown(i,false);    // Activar las matrices
           lc.setIntensity(i,8);    // Poner el brillo a un valor intermedio
           lc.clearDisplay(i);      // Y borrar todo
        }
   }

void loop()
   {
        lc.writeString(0," Curso Arduino de Prometec.net ");
        delay(1000);
   }

Como podeis ver, igual igual que en la sesión anterior.No tenemos que definir arrays de caracteres, ni preocuparnos de multiplexar los pines.

 
  • Soy un fiel defensor de trabajar lo mínimo para conseguir nuestros objetivos (en la jerga informática se llama optimizar recursos), pero esto es porque los chicos de Adafruit, a los que nunca les daremos suficientemente las gracias, se han trabajado una librería para nosotros.
  • Pero no os equivoquéis, esta librería por debajo, hace exactamente lo que vimos en la sesión anterior. Definir arrays de caracteres y funciones de multiplexado de LEDs.
  • Si tenéis interés, (Alguien habrá digo yo) podéis verlo, porque haciendo \\Programa\Añadir fichero podéis buscar dos programas en vuestro directorio de librerías, que suele ser\Documents\Arduino\libraries\LedControlMS en Windows y si cargáis LedControlMS.cpp veréis los programas que forman la librería(No os asusteis, que las libreiras no estan hechas para que las entiendan los novatos).
 

Entre tanto aqui os dejo un mini video con el resultado.

 

Resumen de la sesión

 

 

    • Hemos visto, muy por encima, las caracteristicas MAX7219.
    • En el futuro volveremos sobre este integrado, porque resuleve muy bien la problemática de displays LEDs de diferentes tipos.
    • Hemos visto que ya nos venden montadas con bus SPI modulos con array de 8×8 y unMAX7219, que se manejan muy facilmente si queremos sacar mensajes de texto o numeros.
 

 

 

 

(78) Comments

  • Excelente tutorial. Me sirvió mucho.
    No se si pudieras ayudarme con una versión para poder mandar una cadena de texto desde una página web.
    Llevo vario intentos y no lo he podido lograr.
    Agradecería la ayuda.

  • Hola, mi matriz RGB imagino que será compatible pero no tiene las conexiones que salen en tu esquema. en un lado tengo VN, GND y en un cuadrito pone RST GND, SCK MO, MI VCC y luego en otro lado pone DTR, GND, TXD, RXD, VDD, GND, SCL, SDA.
    Como podría conectarlo? y seria posible ir cambiando el mensaje con el modulo Bluetooth y una aplicación en el móvil?
    Gracias.

    • Hola Jordi, no me atrvo a decirte nada sin conocer tu modelo, lo siento

  • Hola,

    En primer lugar quería felicitarte por el buen trabajo desarrollado. Aunque tengo conocimientos de electrónica, no programaba desde que a mediados de los 80 jugaba con el Basic. Estoy gratamente sorprendido porque hasta ahora he sido capaz de seguir el código de las lecciones del curso gracias a la facilidad con la que expones.

    En cuanto a la práctica, veo que el pin de Arduino asignado al CLK es el D11, mientras que el que tiene especificado la placa para el CLK del bus SPI es el D13. Veo que en la instancia de creación de la matriz se especifican cada uno de los pines de Arduino asignados al dispositivo (DIN, CS, CLK, NUM). ¿Significa eso que realmente podemos usar cualquiera de los pines digitales para gobernar estos dispositivos?

    Gracias de antemano.

    • Hola Tito, en efecto, la idea de crear una instancia de la matriz es que podamos definir que pines usamos para su control y como la comunicacion es digital no requieren ninguna caracteristica especial. Asi pues puedes usar cualquier pin para controlar la matriz y usarlos para tus propios fines si los necesitas

    • Elmer De Ve

    Hola! Quería agradecerte una vez más, ya que este es otro de tus aportes me ha servido de mucho.
    Saludos desde Argentina, Hernán!

  • Hola, estoy haciendo un proyecto que incluye reloj (RTC) , Ethernet y 4 matrices led como la del post, mi pregunta es : ¿Se puede poner las matrices y la ethernet shield a la vez sin problemas ya que usa los mismos pins? o ¿ hay que adaptar algo?

    Para poneros en situación mi proyecto es un reloj que esta conectado a la red y através de la pagina web que genera Arduino puedo hacer el cambio de hora y fecha, todo esto ya me funciona pero ahora llega la tercera parte, mostrar la hora/fecha al usuario y para ello quería hacer que lo mostrara en las matrices, de ahí mi duda.
    Ademas la matriz mostrara la hora, la fecha (cada X tiempo) y si es un dia señalado mostrara un mensaje tipo (Feliz cumpleaños, Feliz navidad,etc..).

    • Hola David, tanto el shield ethernet como el display de matriz tienen comunicacion basada en SPI que es un bus serie pensado para ser compartido. Puedes conectar ambos al SPI pero debes indagar un poco en internet para encontrar las direcciones de cada uno y usarlas en cada orden que des para evitar que haya confusiones ¿Vale?

    • Joaquin

    Hola, ¿se puede alimentar las matrices con una fuente diferente a los pies indicados del arduino? Al conectar más matrices supongo que tendremos problemas de alimentación al tener que dar el puerto una corriente demasiado alta, ¿es posible que la alimentación de 5v sea independiente y que no se pierda sincronismo?

    • Buenos dias Joaquin,

      Desde luego que si. Siempre la alimentacion es independiente de los circuitos de control, a condicion que mantengas un GND comun, pero siempre puedes usar una alimentacion externa de mas potencia de la que un arduino pueda proporcionar.

      En general tendemos a usar la alimentacion de arduino porque no solemos cargar en exceso pero cuando es necesario basta con que uses una alimentacion externa

    • Toni

    hola, he bajado el winzip y pego el programa en la arduino Mega 2560 y me dice :
    Arduino:1.6.12 (Windows 7), Tarjeta:”Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)”

    E:\DESCARGAS\Prog_38_1\Prog_38_1\Prog_38_1.ino:9:26: fatal error: LedControlMS.h: No such file or directory

    #include “LedControlMS.h”

    ^

    compilation terminated.

    exit status 1
    Error compilación en tarjeta Arduino/Genuino Mega or Mega 2560.

    Este reporte podría tener más información con
    “Mostrar salida detallada durante la compilación”
    opción habilitada en Archivo -> Preferencias.
    A qué puede ser debido?

    • Hola Toni, tuienes que incluir la librería .zip que has descargado en el IDE. Un saludo.

    • Hola Tony, aparentemente te dice que no has instalado la libreria de LEDcontrol

  • No especifique bien cuando pulse el boton me debe de leer ota palabra o frase.

  • hola,mmm una pregunta planteo hacer un proyecto conectado 10 matrices juntas,pero no se si me funciona y ademas tengo que dar una opcion de pulsar un boton y cambie, mmm como le ago.

    • Hola Dofy, creo que permite hasta 8 en serie. Un saludo.

    • María L

    Hola
    ¿Es posible conectar la matriz a los pines ISCP (1-MISO, 2SCK) que hay a la derecha? ¿como los debería nombrar en la función ledControl? LedControl(int dataPin, int clkPin, int csPin, int numDevices=1);
    Gracias

  • Buenas noches quisiera saber donde esta el tutorial sobre el 74HC95 porfavor

  • disculpa al conectar mi matriz no hace nada de lo de el programa, se quedan estaticos casi todos los leds pero algunos ni prenden. algo me haca pensar que son mis matices las que estan mal ( compre unas con max7219 montado). incluso intente con el desplazamiento con la libreria maxmatrix pero tampoco me funciona.

Give a Reply

WordPress Anti-Spam by WP-SpamShield

¡Ofertón!

Robot Rover 4×4

Ahora por sólo

50€ + IVA

¡Lo quiero!