bclose

Scrolling con MAX7219

Desplazamiento lateral de mensajes en el display

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.

 

  Tienda España Tienda Mexico
Imagen de Arduino UNO  Arduino UNO o equivalente.  Arduino UNO o equivalente.
Protoboardconexiones

Una Protoboard larga más cables.

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

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

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:

Contenido solo disponible para suscriptores. ¡Accede al contenido!

        

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.
 

 

 

 

 

 

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login

(149) Comments

  • Avatar for Charly
    • 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.

  • Avatar for Charly
    • Andres

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

  • Avatar for Charly
    • Andres

    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…..

  • Avatar for Charly
    • Admin

    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

  • Avatar for Charly
    • 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

  • Avatar for Charly
    • Admin

    Hola Juan, Fijate donde dice:

    char msg[] = «Arduino»; //Aqui va tu mensaje

  • Avatar for Charly

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

  • Avatar for Charly
    • Admin

    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

  • Avatar for Charly
    • 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)

  • Avatar for Charly
    • Admin

    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)

  • Avatar for Charly

    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

  • Avatar for Charly
    • Admin

    Hola Yuri, si sigues leyendo veras un ejemplo hecho

  • Avatar for Charly

    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

  • Avatar for Charly
    • Admin

    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

  • Avatar for Charly
    • Julio mendez

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

  • Avatar for Charly

    alguien sabe como se resuelve este problema?

  • Avatar for Charly

    ya logre solucionar el problema solo que me he encontrado con un problema parece ser que la función shiftRight no funciona, no se por que y parece que es un problema algo añejo

  • Avatar for Charly

    El código no me funciona me hace extraños; por ejemplo le introduzco algo por el monitor serial y no pasa nada pero lo hago una segunda vez seguida ya funciona la matriz pero imprime caracteres extraños alguien sabe por que pasa eso (probé el código con 2 matrices y con una y de ambas formas paso lo siguiente)

  • Avatar for Charly
    • Ivan

    Hola Kai, tendrías que usar la función shiftright. Está explicado hacia el final de la sesión. Un saludote.

  • Avatar for Charly
    • Kai

    Como haría si quiero que las letras se muevan de izquerda a derecha

Para porder realizar consultas a nuestros expertos, tienes que ser suscriptor. Suscribiendote nos ayudas a mantener este proyecto en marcha.

¡ Quiero Suscribirme !

Si ya eres premium y no puedes comentar haz login. Hacer login