ARD16 – Más sobre LED’s

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail

En el artículo anterior vimos cómo podemos, con una placa Arduino Mega, gestionar, aparte de un teclado y LED’s indicadores, cuatro displays de siete segmentos. El montaje funciona, sí, pero, debido al elevado número de cables necesarios, así cómo a lo engorroso del código, en la práctica es inviable. Sólo tiene aplicación dentro del contexto de lo meramente didáctico (y, en ese sentido, sí le hemos sacado partido).

Existen en el mercado dispositivos basados en el circuito integrado MAX 7219 que permiten gestionar desde ocho hasta sesenta y cuatro displays LED de siete segmentos con solo cinco cables (dos de los cuales son de alimentación y masa, respectivamente), y muchas menos líneas de código, mediante el uso de una librería compacta, robusta y fácil de usar: LedControlMaster. El enlace de descarga y el resumen de uso de sus métodos lo puedes encontrar pulsando este enlace. En este artículo vamos a ver ejemplos prácticos de su uso, con diversos dispositivos de display LED, tanto de segmentos cómo matriciales.

UN CONJUNTO DE OCHO DISPLAYS

Figura 16.1. Ocho displays en un circuito compacto.

Figura 16.1. Ocho displays en un circuito compacto.

Este es un ejemplo de montaje compacto del MAX 7219 con ocho displays de siete segmentos, dispuestos en dos pastillas de cuatro. El dispositivo lo ves en la figura 16.1. Se puede adquirir en tiendas de electrónica, o en comercios online. Si estás interesado, puedes mirar esta página, donde puedes encontrarlo por un precio que, en el momento de escribir estas líneas, ronda los cinco euros. Personalmente, esta tienda es de las que más confianza me ofrece. He comprado bastante y

 

Figura 16.2. El MAX 7219.

Figura 16.2. El MAX 7219.

siempre buenas experiencias (y no, no llevo comisión 😛 ). En la figura 16.2 puedes ver el reverso del dispositivo, donde se aprecia el circuito integrado MAX 7219.

 

Cómo se aprecia en las imágenes, los displays están, cómo decíamos, en dos patillas de cuatro, “pinchadas” en unos conectores que tiene la plaquita. Todo el dispositivo es de reducido tamaño (algo más de ocho centímetros de largo), ligero, robusto y cómodo de usar.

Vemos que hay dos filas de cinco pines en los extremos. La de la izquierda tiene una serigrafía por delante de la

Figura 16.3. Cinco cablecillos macho-hembra.

Figura 16.3. Cinco cablecillos macho-hembra.

plaquita, con las indicaciones VCC (alimentación a 5 voltios procedente de Arduino), GND (masa), DIN (Data IN, entrada de datos), CS (Chip Select, Selección de Chip) y CLK (Clock, reloj). Esa fila de cinco pines es la que usaremos para conectar el dispositivo a Arduino (en este caso ya podemos volver a usar Arduino Uno, porque, para este dispositivo, tenemos pines de sobra).

En la parte derecha de la plaquita hay otros cinco pines, esta vez serigrafiados por detrás. La nomenclatura es parecida. CS se llama, aquí, LOAD y DIN aparece como DOUT (Data Out). Estos pines de la derecha no los vamos a usar en el primer montaje. Se emplean para conectar otro dispositivo igual que este, en cascada. No te preocupes de eso ahora. Lo veremos más adelante en este mismo artículo.

EL MONTAJE

Figura 16.4. Dispositivo de ocho displays conectado a Arduino Uno

Figura 16.4. Dispositivo de ocho displays conectado a Arduino Uno

Lo primero que vamos a hacer es emplear cinco cablecillos como los de la figura 16.3 para conectar los pines de la izquierda del dispositivo a Arduino 1, de la siguiente forma:

  • El pin VCC del dispositivo al pin 5V de Arduino Uno.
  • El pin GND del dispositivo a cualquiera de los tres pines que Arduino Uno tiene marcados como GND.
  • El pin DIN del dispositivo al pin 3 de Arduino Uno.
  • El pin CS del dispositivo al pin 4 de Arduino Uno.
  • El pin CLK del dispositivo al pin 5 de Arduino Uno.

Los dos primeros (de alimentación y masa) están claros. Pero, ¿por qué los otros a los pines 3, 4 y 5? ¿Por qué no a otros pines digitales?. Bueno, pues, simplemente, porque así los hemos elegido. Es una cuestión de criterio.

En la figura 16.4 vemos el montaje completado (a excepción del cable USB, que enchufaremos en un momento).

Y ya está. Es así de simple, cómo contraposición a lo que hacíamos en el artículo 15, con toda esa maraña de cables, absolutamente inmanejable.

EL SKETCH

En este caso vamos a realizar un sketch que muestre los números del 0 al 8 en los ocho displays. No es muy espectacular, pero nos ilustrará en cuanto a lo simple que es manejar estos dispositivos (en seguida pasaremos a cosas más interesantes). Veamos primero el listado completo, y luego entramos en detalles.

Lo primero que hacemos es incluir la librería LedControl. Aunque ahora comentaremos algunos detalles, puedes leer más sobre esta librería, así como descargártela, pulsando este enlace. La incluimos en nuestro sketch, como ya es habitual, con la instrucción siguiente:

#include <LedControl.h>

Observa que las instrucciones que se refieren a la inclusión de una librería en nuestro sketch no acaban en punto y coma, como el resto de las instrucciones de Arduino.

A continuación creamos un objeto de la clase LedControl, al que hemos llamado dispositivo, mediante el método constructor de esta clase, como se ve en la siguiente línea:

LedControl dispositivo = LedControl(3, 5, 4, 1);

Este objeto que hemos creado representa al módulo que hemos conectado a Arduino, y se usará para controlarlo.

RECUERDA. El constructor es un método “especial”, con el mismo nombre de la clase a la que pertenece, que se usa para crear objetos de esa clase. Un objeto es una estructura de programación que implementa todos los métodos y objetos de la clase.

El constructor de esta clase recibe cómo ves, cuatro argumentos:

  • El primero es el pin de Arduino al que tenemos conectado el pin DIN del módulo de LED’s (en nuestro ejemplo, el 3).
  • El segundo es el pin de Arduino al que tenemos conectado el pin CLK del módulo (el 5, en nuestro ejemplo).
  • El tercero es el pin de Arduino al que tenemos conectado el pin CS del módulo (el 4).
  • El cuarto argumento es el número de módulos que vamos a conectar en nuestro montaje. En este caso es solo uno, y así lo indicamos.

A continuación vemos algo que, en la práctica, no se da casi nunca en los sketches Arduino. Todo el código lo hemos colocado en la sección setup, y la sección loop está vacía. Esto es porque vamos a ejecutar nuestro código una sola vez, encenderá los displays que le digamos, y así se quedarán. Ya no hay que hacer nada más.

Lo primero que vemos es la siguiente línea:

dispositivo.shutdown (0, false);

Esto se usa para “activar” el módulo. Lo normal es que, por defecto, el módulo esté en modo de ahorro de energía. En la práctica esto significa que no puede visualizarse nada en los displays. El método shutdown recibe dos argumentos. El primero es un índice que se refiere al módulo que queremos activar. Como queremos activar el primer módulo (ya que, de hecho, sólo tenemos uno) el índice es 0. En programación, cuando tenemos una colección de lo que sea (una matriz, por ejemplo o, cómo en nuestros montajes de este artículo, una colección de módulos), los índices se empiezan a contar siempre desde 0.

Ya sabemos que con el 0 le indicamos al método que nos referiremos al primer módulo.

El segundo método es un valor booleano. El valor false indica que desactivamos el modo de ahorro de energía, por lo que el módulo ya estará en condiciones de mostrar datos. Si ponemos el valor true (el que “viene” por defecto), el módulo se apaga.

A continuación encontramos la siguiente línea:

dispositivo.setDigit (0, 7, 1, false);

El método setDigit pone un dígito en uno de los ocho displays del módulo. Los argumentos que recibe son los siguientes:

  • El primero es, una vez más, el índice del módulo, que es 0, como ya vimos en el método shutdown.
  • El segundo es el número de display sobre el que queremos actuar, de los ocho que tenemos. Los displays empiezan a contarse desde 0 y, en el módulo, desde la derecha, de modo que el display 7 es el de la izquierda del todo, y el display 0 el de la derecha.
  • El tercer argumento es el dígito que queremos mostrar en el display especificado del módulo indicado.
  • El cuarto argumento es booleano. El valor false indica que dejaremos apagado el punto del display destinado a los decimales. Un valor true encenderá el punto.

El resto de las líneas son más de lo mismo. Nos vamos refiriendo a los distintos displays, asignándoles dígitos consecutivos de modo que, al final el módulo muestra el aspecto de la figura 16.5.

Figura 16.5. Los números del 1 al 8 encendidos en nuestro módulo.

Figura 16.5. Los números del 1 al 8 encendidos en nuestro módulo.

Sólo con esto, si nos ponemos a pensarlo, ya tenemos los ingredientes que necesitamos para hacer, casi, cualquier cosa con este tipo de módulos. Lo vamos a ver en el siguiente ejemplo.

UN POCO MÁS ALLÁ

A continuación vamos a hacer algo un poco más llamativo. Del montaje físico no decimos nada, porque es igual que el anterior, así que, vamos al código.

EL SKETCH

El código que vamos a usar es el siguiente:

Pruébalo, mira lo que hace, y veamos como lo hace. La mayoría de las instrucciones ya las conocemos, pero hay algunas nuevas. En primer lugar, podemos establecer la intensidad luminosa de los displays, así:

dispositivo.setIntensity (0,8);

El método setIntensity() recibe dos argumentos. El primero, como ya imaginas, es el índice del módulo que, al ser sólo uno, es 0. El segundo es un valor de 0 a 15. A mayor valor, más intensidad.

A continuación nos aseguramos de que no haya “nada” en ninguno de los displays del módulo, así:

dispositivo.clearDisplay (0);

El método clearDisplay() borra todos los displays del módulo indicado como argumento.

Dentro de la sección loop tenemos varios bucles que iteran mostrando algunos números en los displays. Además, tenemos una instrucción nueva:

dispositivo.setChar(0, i, ' ', false);

el método setChar() funciona del mismo modo que setDigit() pero, en lugar de mostrar un número, muestra un carácter. La lista de caracteres que podemos mostrar con este tipo de displays es bastante limitada. Son los siguientes: A, b, c, d, E, F, H, L, P, -, _ y   (un espacio en blanco, lo que, en la práctica, es borrar un display concreto).

Al final, tenemos un último bucle que hace parpadear los ocho puntos decimales (si quieres leer algo sobre el funcionamiento de bucles, pulsa este enlace). Para ello establece el valor en una variable booleana, cambiando el valor de la misma en cada ciclo. Como sabemos, una variable booleana recibe uno de dos posibles valores: true o false. Cada uno es el opuesto del otro, lo que significa que, con el operador de negación (!) cambiamos el valor que contiene, como vemos en la siguiente línea:

punto = !punto;

USANDO MÁS MÓDULOS

Si queremos conectar más módulos podemos hacerlo en cascada. Conectamos los pines de la derecha (salida) de nuestro módulo a los pines de la izquierda (entrada) del módulo siguiente. Para ello necesitamos cinco cablecillos con conector hembra en los dos extremos. Los pines VCC, GND y CLK se corresponden los de cada módulo con el siguiente. El pin de salida DOUT del primer módulo lo conectamos al pin de entrada DIN del siguiente. El pin de salida LOAD lo conectamos al pin de entrada CS del siguiente módulo. Y ya está. El montaje con dos módulos queda como ves en la figura 16.6.

Figura 16.6. Dos módulos conectados en cascada.

Figura 16.6. Dos módulos conectados en cascada.

UN SKETCH

Observa el siguiente listado:

MATRICES DE LED’S

Figura 16.7. Una matriz de 8x8 LED's, basada en MAX 7219

Figura 16.7. Una matriz de 8×8 LED’s, basada en MAX 7219

En el mercado hay también matrices de cinco por siete, o de ocho por ocho diodos LED, basadas en el mismo MAX 7219, que también podemos gestionar con la librería LedControl. En la figura 16.7 podemos ver una de estas matrices, que podemos adquirir, por muy poco dinero, en este enlace.

Estas matrices son mucho más flexibles, a la hora ce visualizar datos, que los displays de siete segmentos. Sin embargo, aquellos tenían la ventaja de que, con un sólo módulo, podías controlar ocho displays, mientras que cada matriz de estas es un módulo que debe controlarse. Será cada diseño, según lo que esperemos de él, el que “elija” que dispositivo de visualización le es más adecuado.

Aquí ya no establecemos el dígito o carácter que queremos mostrar, sino que indicamos que LED’s van a estar encendidos, o cuáles apagados, dentro de la matriz. Podemos actuar sobre columnas, sobre filas o sobre LED’s individuales. Las colomnas se empiezan a numerar de 0 a 7, de izquierda a derecha; las filas van de 0 a 7, de arriba a abajo; los LED’s individuales se identifican por su fila y su columna.

El conexionado es el mismo que con los módulos de displays de siete segmentos, por lo que no vamos a demorarnos aquí en detalles repetitivos. En la figura 16.8 tienes un montaje con esta matriz, si quieres verlo.

Figura 16.8. Matriz de LED's conectada a Arduino

Figura 16.8. Matriz de LED’s conectada a Arduino

EL PRIMER SKETCH

Empezaremos con un sketch muy simple, que sólo y apagará, en parpadeo, los cuatro LED’s del centro de la matriz, alternándolos con los cuatro de las esquinas. El sketch es el siguiente:

De aquí cabe destacar el método setLed(). Recibe cuatro argumentos que le indican sobre que matriz vamos a actuar, la fila y columna del LED que nos interesa, y el estado que queremos darle. Puedes ver los detalles en el artículo sobre está librería.

OTRO SKETCH

En este caso vamos a preparar un sketch que desplace una columna de LED’s encendidos de izquierda a derecha de la matriz, y vuelta atrás. El listado es el siguiente:

Aquí cabe destacar el método setColumn(). Recibe el índice de la matriz sobre la que queremos actuar, el índice de columna sobre la que queremos actuar, y un valor que indica, en binario, que LED’s estarán encendidos, y cuales apagados. Los LED’s a los que se les asigne valor 1 se encenderán y los que reciban valor 0 se apagarán. El valor puede expresarse en binario o en decimal y, para calcularlo tenemos que saber que LED’s queremos encendidos en la columna y cual es su peso especifico en un sistema de ocho bits. Observa la siguiente tabla, donde se empiezan a contar los LED’s de abajo a arriba.

 

LED PESO ESPECÍFICO
Octavo (el superior) 128
Séptimo 64
Sexto 32
Quinto 16
Cuarto 8
Tercero 4
Segundo 2
Primero (el inferior) 1

Así, si queremos encender los LED’s cuarto y quinto de la columna, miramos sus pesos específicos, que serían 8 y 16, respectivamente. Los sumamos y obtenemos el valor 24.

Lo mismo puede decirse para encender o apagar LED’s por filas, mediante el método setRow(). Ten en cuenta que las filas se cuentan de 0 a 7, empezando por arriba. Dentro de una fila, los LED’s empiezan a contarse por la izquierda, y le asignaremos, a cada uno, su propio peso específico. Dentro de cada fila, el LED dde menos peso específico es el de la derecha, y el de más (128), el de la izquierda.

Aquí ves un sketch, variante del anterior, que desplaza la fila iluminada de arriba a abajo y vuelta.

El peso específico de los LED dentro de cada fila es el siguiente:

LED PESO ESPECÍFICO
Octavo (el izquierdo) 128
Séptimo 64
Sexto 32
Quinto 16
Cuarto 8
Tercero 4
Segundo 2
Primero (el derecho) 1

Con estos dispositivos la forma de determinar, en cada caso que filas, columnas y/o LED’s individuales deben encenderse para lo que queremos, se puede calcular muy bien con fórmulas o expresiones aritméticas. En definitiva, eso es lo que hemos hecho en los dos últimos ejemplos.

Otra manera es definirlo mediante matrices. Se define el valor decimal de cada fila para el dígito, carácter o gráfico que queremos visualizar. Observa el siguiente código, que muestra, en secuencia, los dígitos del 0 al 9.

Hacer un diseño en una matriz de 8×8 y calcular el valor numérico de cada fila a partir de los puntos (LEDs) que deben estar encendidos es un poco pesado. Para ayudarte puedes usar esta herramienta. Es una matriz de ocho x ocho celdillas. Pulsando en cada una se activa o desactiva. Cuando tengas el diseño que quieres, pulsas en CALCULAR FILAS y te da la matriz para copiar y pegar en tu sketck.

Y con esto dejamos los displays LED de lado. En el próximo artículo hablaremos de pantallas táctiles TFT.

 

     

Un comentario:

  1. Pingback: LA LIBRERÍA LedControl » eldesvandejose.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *