bclose

Scrolling con MAX7219

Desplazamiento lateral de mensajes en el display
tienda online prometec

Objetivos

 

 

    • Continuar jugando con los displays MAX7219.
    • Montar un grupo de displays que nos permita mostrar líneas de texto.
    • Desplazar esos textos por la pantalla (Scrolling).
 

Material requerido.

Imagen de Arduino UNO  Arduino UNO o equivalente.
Protoboardconexiones

Una Protoboard larga más cables.

Vais a necesitar cables macho / macho  y al menos 4 macho/hembra

Array LED 8x8

Varias matrices LEDs 8×8, con un MAX7219. Aquí vamos a usar 4

 

Agrupando matrices LED 8×8

 

Cuando montamos el primer tutorial de estas pequeñas matrices LED 8×8 estábamos centrados en montar una colección de tutoriales que pudiera usar, quien tuviera interés, para iniciarse en Arduino y no íbamos sobrados de tiempo para otros menesteres.

Por eso, esperamos que nos disculpéis si se nos fueran quedando cosas en el tintero y nos olvidásemos de tocar algunos temas que sin duda podrían ser de interés, pero que quizás, aquel no era el momento, y así, algunas ideas se fueron quedando fuera.

Pero recientemente un amable lector, nos animó a escribir una sesión en la que usáramos una colección de estas matrices 8×8 basadas en el MAX7219, para mostrar la forma de mover mensajes por la pantalla, haciendo ese desplazamiento (Scrolling) tan típico de displays de LEDs de mayores dimensiones, para informar o anunciar cosas.

Y entonces recordé que esta era una de las aplicaciones más simpáticas de estos displays, y que montar un grupo de ellos en fila podía ser de una cierta utilidad para más de uno de nuestros lectores, y que en su día se quedó fuera, más por falta de oportunidad  que de ganas.

Y por eso, queridos amigos, en esta sesión vamos a intentar reparar tan desafortunada omisión, montando un pequeño ejemplo de cómo podemos usar estos displays con MAX7219 para mostrar mensajes fijos por un lado, y de cómo desplazarlos por la pantalla cuando lo deseéis.

Vamos a montar los ejemplos sencillos de ambos casos y luego, seguro que los seguidores más osados podrán hacer mezclas de ambos a su gusto.

 

Esquema de conexiones

 

Antes de que empecéis a cablear este ejemplo tenéis que entender que os vais a hartar a colocar cablecitos en la protoboard, y además este es uno de esos encantadores casos de que un único cable mal puesto arruinará el circuito, volviéndolo prácticamente inútil. Así que ánimo. Tomaros un tranquilizante y empecemos con calma.

En primer lugar os conviene usar una protoboard larga que os permita acomodar los displays que vais a usar, ( En mi caso 4) y por eso me las he traído al frontal de la protoboard, porque no sobran sitios donde pinchar los cables.

MAX7219

Vamos a empezar colocando la alimentación de las matrices. Tened en cuenta que como vamos a mover el texto hacia la izquierda (Al revés, seria problemático de leer) el display número 1, es el que está más a la derecha (Sorpresa).

Por eso conviene que empecéis cableando desde allí para evitar errores de interpretación. Los displays MAX7219 tienen rotulado en la parte inferior la función de cada pin. Empecemos conectando los pines de Vcc y GND.

El cableado de esta sesión no es complicado, pero si un tanto confuso de presentar en una protoboard con Fritzing, y nada de lo que he visto me ha convencido, así que vamos a usar una representación simbólica de las conexiones, que creo que será más fácil de seguir.

Vamos a empezar uniendo el pin  VCC de cada display al siguiente, y cuando acabéis haced lo mismo con GND ordenadamente.

 
  • Este es uno de esos casos en que es imprescindible ser medio ordenado, porque de lo contrario, es muy improbable que consigáis conectar todos los pines correctamente.
  • Os recomiendo muy seriamente, que uséis cables de colores y os ciñáis a que cada color corresponda a un pin de señal, porque cuando tengáis que revisar porque no funciona (Uy sí. Os va a pasar casi con seguridad) tener un criterio de colores es lo único que nos salvará del desastre.  

Yo he usado los colores habituales, rojos para Vcc y negros para GND. Elegid otro color cualquiera para la señal de CS, en mi caso Azul, unid todos los pines inferiores desde la protoboard de esta señal.

Matriz MAX7219

Ahora hagamos lo mismo con todos los pines de Clock (Amarillo en mi caso) y CS Azul.

Pines Clock + CS

Recordad que estamos usando unos displays que usan el bus SPI, por lo que al unir los CS, que son Chip Select, todos los displays se activarán o apagarán a la vez. Pero también queremos que la información fluya de cada display al siguiente, y para eso los displays tienen otro conector en la parte superior, además del inferior.

La función de estos pines superiores son exactamente los mismos que los de la parte inferior con una excepción, el pin inferior central está rotulado como DIN o Data In, es decir entrada de datos, mientras que el superior hace las funciones de DOUT o Data Out salida.

Por eso hay que usar ahora los cables macho/Hembra para conectar la salida del primer display DOUT1 a la entrada de datos del display 2 DIN2.

 
  • Recordad que el primero es el mas a la derecha según miráis a los displays.
  • Si conectáis empezando desde el de la izquierda no va a funcionar así que ojo.  
Conectando los Data out a los data in

Ya solo falta conectar la cascada a nuestro Arduino. Para ello

Conexion con Arduino

Llevamos los pines de control DIN, CLOCK, CS a los pines 12, 11 y 10 respectivamente, además claro está, de unir VCC y GND. Y con eso dejamos listo el hardware.

 

El Programa de control.

 

Andaba yo pensando en que librería usar para manejar los displays y mira por donde, ya se nos habían adelantado con una librería que hace exactamente lo que queremos y sin complicaciones, así que vamos a tirar de ella directamente (Simplemente por eficiencia y eficacia, no por vagancia, No señor)

Esta Liberia se llama Arduino MaxMatrix library y tiene su propia página en GoogleCode que podéis encontrar en cuanto la busquéis, e incluye un par de  ejemplos de cómo mostrar mensajes estáticos y con desplazamiento lateral que usaremos directamente como base para nuestros programa.

El primer programa mostrará como sacar un mensaje estatico en el conjunto: Prog_39B_1

Lo primero es instalar la librería siguiendo el procedimiento habitual y después podemos empezar nuestro programa con un include, para cargar la librería:

#include <MaxMatrix.h>

Lo siguiente es que como la librería no incluye ningún Font, tenemos que proporcionar el nuestro, algo que ya dominamos y que por si acaso, nos viene dado.

No voy a incluir aquí el array de caracteres (Que veréis en cuanto carguéis el programa) pero si hacer un comentario. Los ejemplos originales incluyen la definición del array de Font como:

PROGMEM prog_uchar CH[] = {…… }

Que aquí hemos cambiado por

const byte CH[] = {…… }

Porque la versión 1.6.4 de Arduino me daba error de compilación y a priori no hay diferencia practica entre ambas expresiones.

 
  • Hay una diferencia importante. PROGMEM es una directiva que indica al compilador almacenar el array de caracteres en la memoria FLASH de Arduino y no en la SRAM más escasa y fácil de agotarse, especialmente si hacéis un programa mayor.
  • Como no me daba problemas he preferido usar la memoria RAM normal para evitar complicaciones, pero nunca se sabe.  

Después tenemos unos valores importantes, las definiciones de los pines de control, y el número de displays que vamos a usar,  y por último creamos una instancia de MaxMatrix para gobernar el conjunto de displays:

int data = 12;
int load = 10;
int clock = 11;

int maxInUse = 4;    //Numero de displays a usar
MaxMatrix m(data, load, clock, maxInUse);

Usaremos un array de char, para contener el mensaje estático que queremos mostrar

char msg[] = "Arduino";

void setup()
   { m.init();                                  // Iniciar el conjunto
     m.setIntensity(15);             // Brillo de los displays. Entre 0 y 15
     printString(msg);                 // Mostrar el mensaje
   }

Aquí tenéis una foto con el resultado:

Array de matrices

No ha estado mal para abrir el apetito, pero aquí el plato principal es hacer desplazarse las letras lateralmente, así que vamos con ello: Prog_39B_2

#include <MaxMatrix.h>
int data = 12;
int load = 10;
int clock = 11;
int maxInUse = 4;    //change this variable to set how many MAX7219's you'll use
MaxMatrix m(data, load, clock, maxInUse);

Las definiciones previas son iguales, y el setup inicializa la instancia m de MaxMatrix y bajo un poco la intensidad para intentar que el video final no salga demasiado saturado (Empeño bastante inútil, por lo que he visto).

void setup()
   {   m.init();
       m.setIntensity(8);
       Serial.begin(9600);
   }

Vamos en loop a recoger lo que escribamos en la puerta serie:

while (Serial.available() > 0)
   {   byte c = Serial.read();
       Serial.println(c, DEC);
       printCharWithShift(c, 100); 
   }

delay(100);
m.shiftLeft(false, true);

Reconoceréis que os esperabais algo mas difícil, pero no. Es la ventaja de usar librerías Adhoc. Cuando hay algo disponible en la puerta serie, lo leemos char a char, y llamamos a la función printCharWithShift () a la que le pasamos el carácter a mostrar y el delay en el desplazamiento de este primer carácter.

Después shiftLeft() desplaza todo el mensaje a la izquierda, al que le pasamos dos bool.

 
  • El primero indica si queremos o no que el mensaje se repita (Aunque funciona fatal) y el segundo es si queremos rellenar de 0s, sea esto lo que sea). No he notado la diferencia.
  • También disponemos de estas otras funciones:

    Funcion Parametros Descripcion
    shiftLeft Bool Rotar, Relleno Desplaza a la izquierda
    shiftRight Bool Rotar, Relleno Desplaza a la derecha
    shiftUp Bool Rotar Desplaza arriba
    shiftDown Bool Rotar Desplaza abajo
 

El programa incluye también un par de funciones de utilidad printCharWithShift()  y printStringWithShift(), a las que no vale la pena dedicar tiempo por ahora, y que podéis usar como cualquier otra función disponible en la librería.

Y esto es todo por ahora. Aquí tenéis un video con el resultado:

 

Resumen de la sesión

 

 

    • Hemos visto, como conectar múltiples MAX7219 en casa cada para montar un display de varios caracteres.
    • Hemos visto , también, como usar estos grupos para hacer scrolling lateral de los mensajes a través del conjunto.
    • Vimos cómo usar la librería MaxMatrix de Arduino para sacar mensajes estáticos.
 

 

 

 

 

 

(130) Comments

    • Mario Pastor

    Hola: he probado el montaje y creo entender como funciona, pero quisiera adaptarlo para enviar una letra o un numero a cada display, por ejemplo un marcador de tantos de ping pong ¿Cómo se envía un carácter a cualquiera de los 4 displays?
    muchas gracias

    • Hola Mario, No he visto muy claro que la librerias permita manejar dos displays independientes, por lo que deberias buscar otra libreria que lo permita o bien, mas sencillo, usar dos arduinos cada uno con su display y comunicarlos de cualquer forma

  • Buenas tardes. Cuando hago todos los pasos para hacer el scroll no encuentro donde poner lo que quiero que diga el cartel.
    En el tutorial de mensaje estático poníamos: char msg [] = “Arduino”; y mas abajo poniamos printString (msg) ;
    Pero luego para hacer el scroll no encuentro donde poner eso. No se donde poner mi escritura en el cartel como “Arduino”, y si vuelvo a poner char msg…(todo lo escrito anteriormente) me da error el printString msg diciendo que no esta definido.
    Como debo hacer para que el cartel pase mi escritura con ese scroll? gracias.

    • Hola Rodrigo, cuando hacemos el scroll metemos el mensaje desde el puerto serie a través del monitor serie.

    • Maida

    Buenas noches a todos por aquí. Alguien me puede ayudar a agregar un carácter nuevo en el Array de caracteres? He tratado de crearlo, lo agrego pero no me lo muestra. supongo que no debe sera si nomas de sencillo? Deben tener un orden y tampoco los encontré dentro de la librería. Muchas gracias! Lindo Tutorial.

    • Tendrías que crear un array con los caracteres y luego hacer una función para mostrarlos correctamente. Si quieres mostrar dibujos me suena que hay una librería llamada led control que puede servirte. Un saludo.

    • Jorge

    Hola buenas, tengo algunas dudas que no se si me lo podrían resolver.

    1. Tengo la matriz programada con un string que se va repitiendo .¿Habría alguna forma de programarla o cablearla para que cuando yo desconecte el arduino, no tenga que volver a cargar el programa? Quiero poner la matriz en una máquina arcade controlada por raspberry y me gustaría que el mensaje saliese mientras que la máquina esté encendida.

    2. ¿Hay alguna forma de hacer que los caracteres que van entrando, se vayan quedando en la pantalla hasta completar el string y luego se borre?

    Y por último, habría alguna forma de conectar el arduino con la raspberry para que al usar kodi media center o recalbox/retropie puedan mostrar string diferentes??
    Mucha gracias por todo.

    • Me imagino Jorge que tu problema es para conseguir que tu raspberry cargue un programa tuyo al arrancar ¿No?

      No estoy seguro de enteder el punto 2

      No conozco mucho el Kodi o similares, pero des la raspi puedes mandar el mensaje que quiereas que proyecte tu arduino mediante el puerto serie

  • Hola amigo, estoy trabajando el scroll con dos matrices de 8×8, pero tengo un problema, digito por ejemplo “SALGAN” , me muestra solamente hasta “SAL”, podrias ayudarme, muchas gracias.

    • Hola Julián, debería valerte con cambiar el número de displays en el programa. No sé me ocurre mucho más que te puede estar fallando…

    • Elimelec

    Buenas tardes, soy nuevo en este tema y todos los tutoriales y explicaciones que he encontrado todos muestran como agregar matrices 8×8 de forma horizontal. Mi pregunta es: ¿como se hace para agregar matrices de forma vertical? en este tutorial se ocupan 4 modulos de 8×8 de forma horizontal, pero si quisiera hacer uno de 3 modulo de forma vertical y 5 modulo de manera horizontal, como se tendrían que conectar entre ellos. No se si me explique!, gracias de antemano. Saludos

    • uhhhmmmm !! no lo he intentado antes. Tendras que revisar la libreria a ver que dice al respecto

  • Buenas Tardes
    Alguien me podría asesorar con mi proyecto? tengo muchos problemas en el ensamblado y tal vez la programación, la verdad no encuentro el problema y ya han pasado varios meses que no puedo avanzar y en este mes debo entregar mi proyecto terminado.

    • Hola Raúl, ¿qué es lo que estás intentando hacer? Y recuerda que tenemos un foro dónde puedes tambier explicar tu proyecto con más detalle y ver si entre todos podemos echarte una mano. Un saludo.

  • Hola, gracias por el tutorial, tengo la necesidad de controlar la intensidad de cada uno de los leds que aparecen en la matriz, ¿es esto posible usando el MAX7219?

    • Hola José, la librería creo que te deja controlar el brillo de los leds de la matriz en general. Si quieres controlarlos de forma individual y es que se puede, tendrás que tocar seguramente la librería.

    • Angel

    Sería posible utilizar el max7219 con leds de 5mm y crear yo una matriz más grande en tamaño visual? Para ya sea armar un letrero mucho más grande?

    • Supongo que no habría problema si copias el esquema de la matriz sustituyendo los leds por los que comentas. Un saludo.

  • Hola de nuevo.
    ¿Seria posible que el mensaje apareciera estatico y cuando escribo otro en el serial se borrara y apareciera el siguiente, pero en estatico?

    • No deberías tener problema. Muestra el mensaje como aparece en la sesión y cada vez que recibas uno borra antes la pantalla. Un saludo.

  • Hola de parte de un recien llegado.
    He probado los codigos, pero en el que puedo cambiar el mensaje por puerto serie no me aparece nada en los displays, en el monitor serial aparecen numeros que seran los del codigo ascII pero nada en los displays. ¿Le ocurrio a alguien lo mismo?

    • Hola! Probablemente tengas diferente velocidad de comunicación en el monitor serie y en el programa. Fíjate que tengan la misma. UN saludo.

  • Hola!!

    Las funciones shiftUp y shift Down no funcionan!!

    • No puedo probarlo ahora mismo, pero a lo mejor actualizando la librería lo solucionas. Un saludo.

    • Franco

    Buenas tardes, estoy investigando para realizar un proyecto para la facultad y me vendría bien tu ayuda!

    Es posible conectar otra serie de 4 matrices al lado? o inclusive 2 series más de 4? Y en caso de ser posible, se puede manipular independientemente los led? Como por ejemplo para formar figuras en la matriz.

    Desde ya, muchas gracias.
    Saludos!

    • Hola Franco,

      Creo recordar que la libreria viene con un parametro en el que fijas cuantos display vas a poner en cascada y que por defecto esta en 6 por lo que habria que tocarlo a mano para ampliarlo pero no deberia ser demasiado complicado.

      No he hecho pruebas para jugar con cada display de forma independiente pero estoy seguro de que no habra problemas porque la libreria dispone de de las funciones raiz y siempre podras añadir las tuyas si no hubiese una que te sriva

    • Pablo

    En el primer sketch , habría alguna manera de colocar dónde está el mensaje una variable que fuera cambiando? Eso me gustaría imprimir con un rtc la hora en uno de estos displays entonces sería cambiar el mensaje por la variable tipo time_t.
    Gracias, saludos.

    • Andres

    Hola compre una tira de matriz led de 32*8 pero usando ese programa y libreria el texto me sale vertical, y una parte en cada matriz en vez de horizontal seguido.
    Las matrices vienen unidas, como puedo configurarlo? Gracias

    • Hola andres , tenemos pendiente un tuto con estas tiras pero en principio deben ser iguales que si usas el equivalnte individual y unas varias. Te recomendaria actualizar la libreria a una version mas reciente y ver si se corrige el problema

      • Gracias por la pronta respuesta. He descargado la ultima libreria pero no hay manera, hace el scroll pero en cada matriz y va pasando a la siguiente pero en cada una vertical, vamos como si fuese saltando a la linea siguiente…..

        • Una imagen vale más que mil palabras
          http://i.imgur.com/lkSHjuQ.jpg

        • Hola andres, seguro que hay un parametro que cambia la orientacion o bien siempre puedes buscar otra libreria que te lo permita ¿Vale? Ya me diras

    • mira esta web , tiene lo que buscas ademas de un ejemplo super completo y por supuesto la libreria.

  • hola, en el segundo codigo que linea debo agregar para escribir el texto que deseo que se muestre en la matriz ?

    • Hola Juan, Fijate donde dice:

      char msg[] = “Arduino”; //Aqui va tu mensaje

    • Ricardo Hinojosa

    Muy buena tarde, una pregunta yo tengo una tira con 4 marices pero estas ya vienen juntas y su posiciones ya es diferente viene la salidas a las entradas de la otra matriz como le hago para poder orientar el texto, (en tus matices es como si pones a la izquierda el max y sus salidas a la derecha)

    • Hola Ricardo, creo que funcionara exactamente igual que si conectas tu las 4 matrices, pues es lo que hace esa matriz x4.
      Creo recordar que la libreria que usabamos te ofrece la posibilidad de hacer el scroll en ambas direcciones

  • Hola como esta, muy lindo tutorial, al mensaje fijo no puedo hacerlo funcionar me da error en printString(msg); ‘printString’ was not declared in this scope. Me podrias ayudar. Saludos

    • Hola Antonio, He comprobado a compilar de nuevo el programa que mencionas con la libreria instalada y me compila correctamente, por lo que pienso que o bien no has instalado la libreria (tiene toda la pinta) o tienes una version vieja del entorno IDE (Yo tengo la 1.6.8)

  • Excelente tutorial… una consulta y como puedo hacer para que el mensaje que envio desde el puerto serie sea continuo por ejemplo hacerlo desde una app

    • Hola Yuri, si sigues leyendo veras un ejemplo hecho

    • Julio mendez

    como podria poner un seleccionador y poder guardar varios mensajes y poder mandarlos a llamar con el seleccionador?????

    • Hola Julio. Podrias usar un teclado de 16 teclas para seleccion hasta 16 mensajes o mas sencillo aun usar un potenciometro y en funcion de su posicion decidir que mensaje mostrar

Give a Reply

WordPress Anti-Spam by WP-SpamShield