CAPITULO V
“MÓDULO DE ENTRENAMIENTO DE UN DISPLAY MATRICIAL DE
LEDS 8x32”
5.1.-OBJETIVO:
Se elaboró el presente proyecto con el fin de desarrollar prácticas y
ensayos de programación y escritura en una pantalla o display de corrimiento
conformado por una matriz de LEDs de 8x32, controlado por una tarjeta Arduino
Mega y pueda servir como módulo didáctico para los docentes de la especialidad.
5.2.-DESCRIPCIÓN GENERAL
El módulo en su totalidad ha sido construido con dispositivos electrónicos
muy económicos y de fácil adquisición.
Este módulo está basado en la tarjeta Arduino Mega, que es la más básica
y accesible de comprar, utilizada en la mayoría de proyectos de Automatización y
Programación. Arduino es una marca de microcontroladores mundialmente
conocida por los amantes de la electrónica, la programación y la robótica. Es un
proyecto Open Source que pone a disposición de sus usuarios una amplia gama
de dispositivos basados en el microcontrolador AtMega..
La pantalla o display matricial de LEDs está compuesta por una Matriz LED
8x8 MAX7219 para Arduino (4 matrices) y consta de 4 matrices de 8x8 leds de
3mm multiplexados mediante el chip MAX7219.
Partes del módulo
https://www.picmicrolab.com/4-digit-led-dot-matrix-clock-arduino/
El principio de funcionamiento es el multiplexado. Es decir, utilizar unos pocos
pines de E/S del microcontrolador para manejar una serie de circuitos integrados
que se encarguen de excitar los LEDs que lo explicaremos más adelante con
mayor detalle.
5.3.-DESCRIPCIÓN DE LAS PARTES:
5.3.1.- Forma de Alimentación
La siguiente imagen resume los mecanismos que podemos utilizar para alimentar
el Arduino
Puertos de alimentación de la tarjeta arduino
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/
Alimentar el arduino mediante USB
Como ya mencionamos, es la forma más sencilla de alimentar la tarjeta
arduino. A través de esta entrada se admiten ÚNICAMENTE 5 volts.
Alimentación del arduino mediante USB
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/
Podemos obtener los 5 volts del puerto USB de nuestra PC y/o de cualquier
otro dispositivo compatible con USB (como un televisor con puerto USB, por
ejemplo), de un adaptador de teléfono móvil con salida a USB o a través de
uno de los “cargadores de emergencia” disponibles también para teléfonos
móviles.
El puerto USB cuenta con un fusible PPTC que limita la corriente que el
arduino (y sus accesorios) pueden demandar del puerto USB. La corriente
máxima entonces queda limitada a unos 500 mA. Usualmente no podemos
cometer errores de polaridad ni de voltaje cuando usamos USB para alimentar.
Alimentación del arduino mediante cable USB
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/
El jack de alimentación externa del arduino
La tarjeta arduino viene diseñada para aceptar alimentación mediante el
jack estándar que se encuentra en muchos equipos electrónicos. Normalmente
se utiliza un adaptador de corriente (AC/DC).
Alimentación del arduino mediante una fuente externa
https://www.geekfactory.mx/tutoriales/tutoriales-arduino/
Al tratarse de una entrada de corriente directa, la conexión del eliminador
tiene una polaridad que debe ser respetada: el polo positivo debe ir al centro
del conector. El voltaje adecuado a usar en esta entrada es de 7 a 12 volts DC.
Voltajes menores (5 a 7 volts) en esta entrada pueden causar que el
regulador interno del arduino no pueda trabajar correctamente. Voltajes
mayores a 12 pueden causar el rápido sobrecalentamiento del regulador,
aunque la cantidad de accesorios conectados (la demanda de corriente) no sea
grande.
Esta entrada tiene un diodo de protección para inversión de polaridad, por
lo que si no se respeta la polaridad, no ocurrirán daños, pero la tarjeta arduino
NO funcionará.
5.3.2.- Etapa de control
La etapa de control está conformada por la tarjeta Arduino Mega 2560 que
es una marca de microcontroladores mundialmente conocida por los amantes de
la electrónica, la programación y la robótica.
El Arduino Mega 2560 es una placa de desarrollo basada en el
microcontrolador ATmega2560. Tiene 54 entradas/salidas digitales (de las cuales
15 pueden ser usadas como salidas PWM), 16 entradas analógicas, 4 UARTs, un
cristal de 16Mhz, conexión USB, jack para alimentación DC, conector ICSP, y un
botón de reseteo. La placa Mega 2560 es compatible con la mayoría de shields
compatibles para Arduino UNO.
El Arduino Mega 2560 es una actualización que remplaza al Arduino Mega
Placa Arduino Mega 2560
http://panamahitek.com/arduino-mega-caracteristicas
Posee 54 pines digitales que funcionan como entrada/salida; 16 entradas
análogas, un cristal oscilador de 16 MHz, una conexión USB, un boton de reset y
una entrada para la alimentación de la placa.
La comunicación entre la computadora y Arduino se produce a través del
Puerto Serie. Posee un convertidor usb-serie, por lo que sólo se necesita conectar
el dispositivo a la computadora utilizando un cable USB como el que utilizan las
impresoras.
USB_CABLE para conectar la tarjeta Arduino
http://panamahitek.com/arduino-mega-caracteristicas
Arduino Mega posee las siguientes especificaciones:
Microcontrolador: ATmega2560
Voltaje Operativo: 5V
Voltaje de Entrada: 7-12V
Voltaje de Entrada(límites): 6-20V
Pines digitales de Entrada/Salida: 54 (de los cuales 15 proveen salida
PWM)
Pines análogos de entrada: 16
Corriente DC por cada Pin Entrada/Salida: 40 mA
Corriente DC entregada en el Pin 3.3V: 50 mA
Memoria Flash: 256 KB (8KB usados por el bootloader)
SRAM: 8KB
EEPROM: 4KB
Clock Speed: 16 MHz
5.3.3.- Matriz de 8x8
Una matriz LED es un display formado por múltiples LED en distribución
rectangular. Existen distintos tamaños, siendo el más habitual los cuadrados de
8×8 LED.
Matriz de 8x8 LEDs
https://www.luisllamas.es/matriz-led-arduino-max7219/
Podemos combinar varios módulos para formar un display mucho mayor. En estos
display podemos mostrar textos, dibujos o animaciones, como desplazar un texto
(scroll).
Matriz de 8x32 LEDs
https://www.luisllamas.es/matriz-led-arduino-max7219/
Encender una matriz de LED directamente con Arduino requiere emplear
una gran cantidad de pines, lo cual 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.
Matriz de LEDs 8x8 y su controlador MAX7219
https://www.luisllamas.es/matriz-led-arduino-max7219/
Un controlador habitualmente empleado por ser barato y sencillo es el
integrado MAX7219.
La etapa de control está conformada por la tarjeta Arduino Mega 2560 que
es una marca de microcontroladores mundialmente conocida por los amantes de
la electrónica, la programación y la robótica.
El principio de operación es el multiplexado. Es decir, utilizar unos pocos
pines de E/S del microcontrolador para manejar una serie de circuitos integrados
que se encarguen de excitar los LEDs. Existen diversas maneras y muchos
modelos diferentes de circuitos y algoritmos para realizar esta tarea.
Una matriz de LED está formada por diferentes LED, cableados de forma
conjunta por filas y columnas. Podemos encender un LED determinado de la
matriz aplicando correctamente los valores HIGH y LOW a su respectiva fila y
columna.
Configuración ánodo común y cátodo común de matriz de LEDs 8x8
https://www.luisllamas.es/matriz-led-arduino-max7219/
Si aplicamos valores HIGH y LOW a varias filas y columnas de forma
simultánea se encenderán todos los LED de las intersecciones. De esta forma,
resulta casi imposible generar gráficos complejos.
Para poder hacer gráficos el procedimiento consiste en hacer un barrido por
filas (o columnas). Encendemos todos los LED de una única fila (o columna), y a
continuación cambiamos a la siguiente. Sólo una fila (o columna) está encendida
cada instante pero, al hacerlo rápidamente, el efecto en nuestra visión es ver toda
la imagen formada de forma simultánea.
Este efecto se denomina “Persistencia de visión” (POV), y es consecuencia
de la forma en la que los humanos percibimos el movimiento. Es muy empleado
en electrónica e informática.
Encender una matriz de 8×8 LED requeriría 16 señales digitales y un
trabajo constante del procesador para refrescar la imagen. Eso es una cantidad
enorme de recursos para cualquier autómata, que estaríamos mal aprovechando
para simplemente encender un display.
Por este motivo, empleamos un controlador como el MAX7219 que está
especialmente diseñado para encender displays de 7 segmentos y matrices de
led, y libera a nuestro procesador para hacer tareas mucho más valiosas.
La comunicación con el MAX7219 se realiza a través del bus SPI (Serial
Peripheral Interface) por lo que sólo se requieren 3 pines de Arduino (CS, DIN y
CLK). Además ni siquiera “ocupamos” del todo estos pines, ya que con el mismo
bus podemos controlar múltiples dispositivos.
Circuito MAX7219 conectado a una matriz de LEDs de 8x8
https://howtomechatronics.com/tutorials/arduino/8x8-led-matrix-max7219-
tutorial-scrolling-text-android-control-via-bluetooth/
Por último, las propias placas MAX7219 generalmente incorporan un puerto
de entrada y salida, de forma que podemos combinar múltiples controladores sin
ninguna dificultad.
El esquema eléctrico es sencillo. Alimentamos el módulo a través de Vcc y
Gnd, y conectamos los pines correspondientes para la comunicación SPI.
En caso de usar más de un módulo, conectaríamos las salidas de cada
módulo con las entradas del siguiente, y conectaríamos el primero a Arduino.
MAX7219 conectado al Arduino
https://www.luisllamas.es/matriz-led-arduino-max7219/
Los números de Pin dependen del modelo concreto de Arduino. En Arduino
Mega corresponden con los pines 51, 52, y 53.
DIAGRAMA DE FLUJO EMPLEADO DEL PROGRAMA A DESARROLLAR
INICIO
CONFIGURACIÓN
PA → OUT
PB → OUT
CARGAR LETRA 1
MOSTRAR
CORRER
CARGAR LETRA
MOSTRAR
CORRER
SUBRUTINA CARGA
B0 → F0
B1 → F1
B2 → F2
B4 → F4
B3 → F3
B5 → F5
SUBRUTINA MOSTRAR
F39,0 → RA0
SUB RUTINA CLK
F38,0 → RA0
SUB RUTINA CLK
F0,0 → RA0
SUB RUTINA CLK
Activar la fila 0
SUB RUTINA de retardo
Desactiva la fila 0
5.3.4.- Programa de letra que se desplaza (scroll)
#include "LedControl.h" //Incluimos
#include "Adafruit_GFX.h" //Incluimos
LedControl lc=LedControl(51,52,53,4);
#define demora 1000
byte dos[8]{
B00000000,
B01000011,
B10000101,
B10001001,
B10010001,
B01100001,
B00000000,
B00000000,
};
byte M0[8]{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
};
byte M1[8]{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
};
byte M2[8]{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
};
byte M3[8]{
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
};
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,8);
lc.clearDisplay(0);
lc.shutdown(1,false);
lc.setIntensity(1,8);
lc.clearDisplay(1);
lc.shutdown(2,false);
lc.setIntensity(2,8);
lc.clearDisplay(2);
lc.shutdown(3,false);
lc.setIntensity(3,8);
lc.clearDisplay(3);
carga_inicial();
// La función LOOP se ejecutará continuamente después de haberse ejecutado la
función SETUP
void loop() {
corrimiento();
void carga_inicial() {
for(int fila = 0; fila < 8; fila++) {
M0[fila] = dos[fila];
void corrimiento() {
// M0[7] = M3[0];//Retorna el último dato del display
//lc.setColumn(0,7,M0[7]);
M3[0] = M3[1];
lc.setColumn(3,0,M3[0]);
M3[1] = M3[2];
lc.setColumn(3,1,M3[1]);
M3[2] = M3[3];
lc.setColumn(3,2,M3[2]);
M3[3] = M3[4];
lc.setColumn(3,3,M3[3]);
M3[4] = M3[5];
lc.setColumn(3,4,M3[4]);
M3[5] = M3[6];
lc.setColumn(3,5,M3[5]);
M3[6] = M3[7];
lc.setColumn(3,6,M3[6]);
M3[7] = M2[0];
lc.setColumn(3,7,M3[7]);
//delay(demora);
M2[0] = M2[1];
lc.setColumn(2,0,M2[0]);
M2[1] = M2[2];
lc.setColumn(2,1,M2[1]);
M2[2] = M2[3];
lc.setColumn(2,2,M2[2]);
M2[3] = M2[4];
lc.setColumn(2,3,M2[3]);
M2[4] = M2[5];
lc.setColumn(2,4,M2[4]);
M2[5] = M2[6];
lc.setColumn(2,5,M2[5]);
M2[6] = M2[7];
lc.setColumn(2,6,M2[6]);
M2[7] = M1[0];
lc.setColumn(2,7,M2[7]);
M1[0] = M1[1];
lc.setColumn(1,0,M1[0]);
M1[1] = M1[2];
lc.setColumn(1,1,M1[1]);
M1[2] = M1[3];
lc.setColumn(1,2,M1[2]);
M1[3] = M1[4];
lc.setColumn(1,3,M1[3]);
M1[4] = M1[5];
lc.setColumn(1,4,M1[4]);
M1[5] = M1[6];
lc.setColumn(1,5,M1[5]);
M1[6] = M1[7];
lc.setColumn(1,6,M1[6]);
M1[7] = M0[0];
lc.setColumn(1,7,M1[7]);
//delay(demora);
M0[0] = M0[1];
lc.setColumn(0,0,M0[0]);
M0[1] = M0[2];
lc.setColumn(0,1,M0[1]);
M0[2] = M0[3];
lc.setColumn(0,2,M0[2]);
M0[3] = M0[4];
lc.setColumn(0,3,M0[3]);
M0[4] = M0[5];
lc.setColumn(0,4,M0[4]);
M0[5] = M0[6];
lc.setColumn(0,5,M0[5]);
M0[6] = M0[7];
lc.setColumn(0,6,M0[6]);
5.3.5.- Programa frases que se desplaza (scroll)
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
const int pinCS = 53;
const int numberOfHorizontalDisplays = 8;
const int numberOfVerticalDisplays = 1;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays,
numberOfVerticalDisplays);
const int wait = 100; // En milisegundos
const int spacer = 1;
const int width = 5 + spacer; // Ancho de la fuente a 5 pixeles
String cadena[]= {"Libreria - Miguel..."}; //textos
void setup() {
// put your setup code here, to run once:
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.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
void loop() {
// put your main code here, to run repeatedly:
//int n = random(0,10);
int n = 0;
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);