China proporciona por un pequeño precio una gran cantidad no solo de dispositivos electrónicos, sino también de sus componentes. Una pequeña matriz de diodos emisores de luz puede mostrar la información que necesita, presumiblemente números, ya que la resolución no es muy alta. 8 por 8 LED, cada diámetro 3mm. Esta matriz brilla en rojo, porque es el más visible y llama más la atención que otros colores.
Si tiene varias matrices de este tipo en LED, puede conectarlas para crear grandes paneles de información.
Pantalla de matriz: un dispositivo que consta de una matriz de LED de 8x8 y una placa de control basada en el chip MAX7219 con la tubería mínima requerida. En la foto ya puedes ver el dispositivo terminado, pero me llegó por correo de esta forma, así que tuve que tomar un soldador y soldar todo de la manera correcta.
La conexión básica a la placa Arduino Nano se muestra en el diagrama del circuito.
Como puede ver en el diagrama, todo es simple, solo necesita conectar los contactos de ambas placas con cables en el siguiente orden:
arduino nano | Matriz 8x8 |
PIN 12 | CLAVIJA DIN |
PIN 11 | CLK PIN |
PIN 10 | CS PIN |
PIN 5V | PIN 5V |
PIN TIERRA | PIN TIERRA |
Entonces, finalmente es hora de trabajar con el código, y para ejecutar la matriz LED, debe descargar e instalar la biblioteca LedControl. La biblioteca admite microcircuitos MAXIM 7221 y 7219. La matriz LED utiliza MAX7219 como controlador, esto es lo que necesitamos. Creo que deberíamos comenzar con un pequeño boceto que demuestre las funciones básicas de esta biblioteca. En el boceto, la función setRow() se usa para encender/apagar los LED. La sintaxis para llamar a la función setRow() es:
matriz.setRow(0, fila, columna, conjunto);
Dónde matriz- objeto de clase Led Control
0 - dirección del dispositivo en el bus SPI, en este caso solo hay un dispositivo y la numeración comienza desde la dirección cero
fila- fila(Posibles valores de 0 a 7)
columna- columna (los valores posibles son de 0 a 7)
establecer- fijando el valor( verdadero- encender, falso- apagar)
matriz.setRow(0, 1, 4, verdadero)
Encienda el LED en la matriz, ubicado en la 1ra fila y en la 4ta columna.
Otro ejemplo:
entero x = 1;
int y = 4;
matriz.setRow(0, x, y, verdadero);
matriz.setRow(0, x, y, falso);
Lo mismo ocurre solo con el uso de variables y el posterior apagado del LED encendido en las coordenadas dadas. Entonces, en el boceto, se reproducen varias animaciones usando la función setRow ().
#include "LedControl.h" //Sintaxis para crear la clase LedControl(dataPin,clockPin,csPin,numDevices) //Donde LedControl es un objeto de la clase //dataPin es el pin en la placa Arduino al que se conectará el pin DIN estar conectado //clockPin es el pin de la placa Arduino al que se conectará el pin CLK //csPin - el pin de la placa Arduino al que se conectará el pin CS //numDevices - el número de dispositivos en el bus / /Crear un objeto de la clase matrix en nuestro caso con un dispositivo conectado LedControl matrix = LedControl(12, 11 , 10, 1); //Tiempo de retardo para encender/apagar el LED en la matriz const int delayValue = 100; //Prototipos de funciones //Encendido/apagado secuencial void PointSerialSet(); //Serpiente de derecha a izquierda void PointRigthToLeft(); //Serpiente de abajo hacia arriba void PointDownToUp(); //Serpiente de izquierda a derecha void PointLeftToRigth(); //Serpiente de arriba a abajo void PointUpToDown(); //Efecto - pulso de desvanecimiento void PointFading(); //Efecto - pulso void PointPulse(); //Efecto - impulso creciente void PointClimbing(); //Efecto de torcer la espiral dentro de void PointToSpiralIn(); //Efecto de girar la espiral hacia afuera void PointToSpiralOut(); void setup() ( // El dispositivo con dirección 0 se activa por defecto matrix.shutdown(0, false); //Establece el brillo de la matriz Led en 8 //Los valores posibles son de 0 a 15 matrix.setIntensity( 0, 8) ; //Borrar matriz de visualización.clearDisplay(0); ) void loop() ( //Llamar funciones una por una PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading (); PointPulse() ; PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); ) //Cuerpos de función void PointSerialSet() ( //Usar la función setLed(address, row, col, set) //Encendido secuencial por filas para(int i = 0; i< 8; i ++) { for(int j = 0; j < 8; j ++) { //Включить светодиод matrix.setLed(0, i, j, true); delay(delayValue); //Выключить светодиод matrix.setLed(0, i, j, false); } } } void PointRigthToLeft() { //Используем функцию setLed(address, row, col, set) //Змейка справа - налево for(int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointDownToUp() ( //Utilice la función setLed(address, row, col, set) //Snake de abajo hacia arriba para (int i = 7; i >= 0; i --) ( for(int j = 7, n = 0; j >= 0, n< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointLeftToRigth() ( //Utilice la función setLed(address, row, col, set) //Snake de izquierda a derecha para (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, norte< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); ) else ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) ) ) ) void PointUpToDown() ( //Utilice la función setLed(address, row, col, set) //Snake de arriba a abajo para (int i = 0 i< 8; i ++) { for(int j = 7, n = 0; j >= 0, norte< 8; j --, n ++) { if((i % 2) >0) ( matrix.setLed(0, i, n, true); delay(delayValue); matrix.setLed(0, i, n, false); ) else ( matrix.setLed(0, i, j, true); delay(delayValue); matrix.setLed(0, i, j, false); ) ) ) ) void PointFading() ( //Utilice la función setLed(address, row, col, set) //Efecto de atenuación int upValue = 0 ; int downValue = 7; for(int i = 0; i< 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue --; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue ++; } } } void PointClimbing() { //Используем функцию setLed(address, row, col, set) //Эффект затухания int upValue = 4; int downValue = 4; for(int i = 0; i < 8; i ++) { if(i % 2) { for(int n = downValue; n >= upValue; n --) ( matrix.setLed(0, n, i, true); delay(delayValue); matrix.setLed(0, n, i, false); ) downValue ++; ) else ( for(int j = upValue; j< downValue + 1; j ++) { matrix.setLed(0, j, i, true); delay(delayValue); matrix.setLed(0, j, i, false); } upValue --; } } } void PointPulse() { //Используем функцию setLed(address, row, col, set) //Эффект пульса for(int i = 0; i < 8; i ++) { if(i == 4) { for(int climb = i; climb >= 0; subir --) ( matriz.setLed(0, subir, i, verdadero); retraso(valorderetraso / 4); matriz.setLed(0, subir, i, falso); ) for(int desvanecerse = 1; desvanecerse< 8; fade ++) { matrix.setLed(0, fade, i, true); delay(delayValue / 4); matrix.setLed(0, fade, i, false); } } else { matrix.setLed(0, 4, i, true); delay(delayValue); matrix.setLed(0, 4, i, false); } } } void PointToSpiralIn() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внутрь int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 0; int pointY = 0; int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 0; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= longitudX - 1 - desplazamiento) ( dir = 1; ) continuar; ) if(dir == 1) ( puntoY ++; if(puntoY ><= offset) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset + 1) { dir = 0; offset ++; pointY = offset; } continue; } } } void PointToSpiralOut() { //Используем функцию setLed(address, row, col, set) //Эффект спирали внаружу int lengthX = 8; // Ширина матрицы int lengthY = 8; // Высота матрицы int pointX = 3; //начать с этих координат int pointY = 3; //начать с этих координат int dir = 0; // Направление (0 - вправо, 1 - вниз, 2 - влево, 3 - вверх) int offset = 3; // Смещение // Перебираем всю матрицу for (int i = 0; i < lengthX * lengthY; i++) { matrix.setLed(0, pointY, pointX, true); delay(delayValue); matrix.setLed(0, pointY, pointX, false); if(dir == 0) { pointX ++; if(pointX >= longitudX - 1 - desplazamiento) ( dir = 1; ) continuar; ) if(dir == 1) ( pointY ++; if(pointY >= lengthY - 1 - offset) ( dir = 2; ) continue; ) if(dir == 2) ( pointX --; if(pointX<= offset - 1) { dir = 3; } continue; } if(dir == 3) { pointY --; if(pointY <= offset - 1) { dir = 0; offset --; pointY = offset; } continue; } } }
Vídeo del boceto:
Este artículo fue creado para aquellos que compraron una matriz 8x8 simple y registros de desplazamiento 74hc595 y no saben cómo conectarlo todo.
Busqué en Internet durante mucho tiempo instrucciones sobre cómo conectar los componentes anteriores, pero encontré que no eran para mis registros o con bocetos que no funcionaban, así que decidí que todavía tenía que trabajar con las manos y la cabeza para complacerme. con 8 * 8 imágenes.
Habiendo encontrado hojas de datos para la matriz y los registros de desplazamiento en Internet, dibujé el siguiente diagrama:
La pata 12 de ambos microcircuitos (latch pin), para salvar puertos es común, porque no tiene sentido enclavar los registros en momentos diferentes. Algunos de los pines de la matriz (ánodos) están conectados a través de resistencias limitadoras de corriente con un valor nominal de 220 ohmios. Todo lo demás según el esquema es extremadamente simple. Por si acaso, fotos con el pinout de la matriz.
Las imágenes deberán mostrarse línea por línea (de lo contrario con matrices similares no hay forma), con un pequeño retraso (el ojo humano prácticamente no distingue entre un retraso de 1ms).
Traté de explicar todo en el boceto. Al subir a la placa, en el display aparecerán los números que enviaremos al monitor del puerto arduino.(Ver video)
Foto del dispositivo terminado (en zigzag en la pantalla, en el boceto, su imagen se almacena en la matriz de imágenes)
En el futuro intentaré hacer algo interesante en esta pantalla.
Finalmente, llegaron módulos matriciales desde China. Cada módulo consta de un chip MAX7219 (), una matriz de LED, un condensador y una resistencia en el arnés.
Controlado por MAX7219 a través de la interfaz SPI.
Los microcircuitos en un grupo están conectados en serie. Leí en Internet que la máxima conexión en serie posible permite solo 8 piezas de MAX7219. No creas. 16 módulos conectados y todo funciona bien.
Los módulos presentados en Ali vienen en varias versiones. Los más populares son de 2 tipos: con microcircuito en DIP y en paquetes SOIC. El módulo de chip DIP es más grande y no tan conveniente cuando se conecta en un clúster. Tendrás que conectar un montón de cables.
Los módulos con un chip en un paquete SOIC son del tamaño de una matriz de LED y se conectan mediante soldadura o puentes. Resulta agradable y ordenado.
Las librerías más conocidas para trabajar con matrices y clusters son Panel MAX72xx de Mark Rice y Parola de MajicDesigns: La primera biblioteca es más fácil de usar, la segunda es más compleja y tiene más funciones. Lo escribiré con más detalle.
Se requiere la instalación de la biblioteca cuando se utiliza el panel MAX72xx Efectos especiales de Adafruit.
Para rusificar el texto, deberá descargar ESTE ARCHIVO y reemplace el archivo glcdfont.c predeterminado en el directorio Arduino/Libraries/Adafruit-GFX-Library-master. También en este archivo, además de las letras y números necesarios, se describen un montón de todo tipo de caracteres. No todos pueden ser útiles. La siguiente imagen explica cómo se forman los símbolos.
Si es necesario, puede crear sus propios símbolos y reemplazarlos con los que no se utilizan en el archivo. Casi todas las fuentes de mapa de bits utilizadas en varias bibliotecas se forman de esta manera.
Entonces, se instalan las bibliotecas MAX72xx Panel y Adafruit GFX, se reemplaza el archivo glcdfont.c. Inicie Arduino IDE, abra EXPEDIENTE. Hay una función utf8rus en el boceto. Proporciona la recodificación de la tabla de caracteres para el idioma ruso. Solo es necesario para la salida normal del programa, es decir, en el programa, el texto deseado está escrito en ruso. Si el texto se ingresa a través del puerto COM, los códigos de caracteres se corrigen en la función Serial_Read. En el IDE y en la consola, los desarrolladores utilizaron diferentes codificaciones.
Al comienzo del archivo hay líneas necesarias para que la biblioteca funcione.
int numeroDePantallasHorizontales = 1;
int número de pantallas verticales = 16;
Tengo módulos con chip en un paquete SOIC. Tienen una pequeña característica. La matriz de los módulos se instala girada 90 grados. Es una tarifa de conveniencia. Si ejecuta los bocetos que vienen con las bibliotecas, generarán texto de abajo hacia arriba en cada módulo. El texto se mostrará en zigzag. Para tratar esta dolencia, la biblioteca necesita que se le "diga" que hay 16 pantallas verticales (están ubicadas físicamente en forma horizontal). Y luego, en void Setup, especifique la línea para la biblioteca
matriz.setRotation(matriz.getRotation() + 1);
Volteará programáticamente cada matriz. Y todo se mostrará normalmente.
Los módulos con un paquete de chips DIP no tienen esto. Todo es hermoso, excepto por un montón de cables.
La biblioteca de paneles MAX72xx es bastante modesta. No hay efectos de salida visual. El clúster se percibe como un todo. Las cosas están mucho mejor con MD Parola.
Los propietarios de módulos con un chip en un paquete SOIC también enfrentarán el problema de orientar los módulos en un clúster. Solo que se ve un poco diferente que en MAX72xx. Aquí, los módulos aparecerán, por así decirlo, fuera de turno.
Boceto de HelloWorld a partir de muestras incluidas con la biblioteca.
Programáticamente en el boceto, no pude curar esta dolencia. Lo traté diferente. En el archivo Adruino/libraries/MD_MAX72xx_lib.h al final necesitas encontrar las líneas como en la imagen.
Y corrija la línea seleccionada seleccionada de 1 a 0. Guarde el archivo. Arduino IDE no necesita ser reiniciado. Vertimos, miramos.
Ahora puedes usar 24 efectos de animación. La animación se inicia con el comando P.displayText(“Texto a mostrar”, “alineación de texto”, velocidad, retardo de visualización, efecto de aparición gradual, efecto de desaparición gradual). Como puede ver, hay muchos ajustes.
Y lo que más gusta es la división del clúster en zonas virtuales. Trabajar con zonas no es muy difícil. No publico el boceto, está en las muestras que vienen con la biblioteca. Ahora puede mostrar el reloj al comienzo del clúster y el ticker de noticias en los módulos restantes sin ningún problema, casi.
Como ya puede adivinar, el problema está en las letras cirílicas. Ella también es resoluble. Junto al archivo anterior en el mismo directorio se encuentra el archivo MD_MAX72xx_font.cpp. Este es un archivo de fuente. Los caracteres que contiene se forman de manera similar al archivo de fuente GFX de la biblioteca. Hay una pequeña diferencia. Aquí el tamaño de los caracteres puede ser inferior a 5 puntos. En la biblioteca Adafruit GFX, el signo de exclamación, por ejemplo, ocupa los mismos 5 puntos del ancho que cualquier otro símbolo, solo se usa una fila de puntos. El resto no brilla, sino que se utiliza como símbolo. En Parola, el mismo signo de exclamación también ocupa una fila de puntos, solo que no hay puntos vacíos cerca, pero los caracteres adyacentes pueden estarlo. Será más claro entender la imagen.
No hay tiempo para complementar el archivo con caracteres cirílicos de manera similar al archivo de la primera biblioteca considerada. Si alguien hace esto y me envía un archivo, lo agregaré a este artículo, y tanto yo como los invitados de mi sitio se lo agradeceremos.
Salir. La biblioteca de paneles MAX72xx de Mark Rice es fácil de usar y comprender, pero tiene una funcionalidad deficiente.
La biblioteca Parola de MajicDesigns es más compleja y tiene capacidades suficientes para casi cualquier aplicación.
En lecciones anteriores, aprendimos con la ayuda de un registro de desplazamiento. Esto resultó ser un poco más difícil que directamente desde los pines de uso general. El problema que tuvimos que resolver entonces fue el número limitado de salidas controladas en el controlador Arduino. El apogeo de nuestra investigación fue el uso de la indicación dinámica para. Ahora toca complicar un poco más la tarea: estamos aprendiendo a trabajar con la matriz LED.