Teléfonos móviles y gadgets

Teléfonos móviles y gadgets

» control de matriz 8x8

control de matriz 8x8


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.


Es más conveniente usar esta matriz para controlar arduino porque es digital Si escribe un programa simple, puede mostrar la información necesaria en esta "pantalla" LED. Hay matrices de tres colores más caras a la venta, en las que al combinar los tres colores principales puede crear casi cualquiera.


Esta matriz tiene 16 pines, se proporciona un diagrama arriba, que muestra claramente cómo se conectan los componentes elementales de la matriz: los LED, guiados por él, puede conectar correctamente el módulo para reproducir información mediante dispositivos digitales y analógicos. No se olvide de las resistencias limitadoras de corriente, será triste si alguno de los píxeles se quema. La corriente continua nominal de un punto es igual a 20mA, corriente directa máxima 100 mA, tensión de alimentación 2,1-2,1 V, longitud de onda 625-630 nanómetro, la disipación de potencia máxima es de 40 mW, el ánodo es común aquí, es decir, una ventaja. Dimensiones totales de la matriz LED 37 sobre el 37 sobre el 8 milímetro. Debe soldar con cuidado, no toque el soldador con una temperatura de 260 grados durante más de 5 s, la temperatura de funcionamiento recomendada es de -40 a +70 Celsius.

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 nanoMatriz 8x8
PIN 12CLAVIJA DIN
PIN 11CLK PIN
PIN 10CS PIN
PIN 5VPIN 5V
PIN TIERRAPIN 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:


Habilite javascript para que funcionen los comentarios.

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.

Panel MAX72xx

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.

Parola por MajicDesigns.

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.

1. Indicador de matriz

Como ya sabemos, los indicadores de segmento, ya sean escalas o números, consisten en LED individuales conectados entre sí. Por ejemplo, un grupo de LED puede tener todos los cátodos conectados. Dicho indicador tiene una posdata "con un cátodo común", de lo contrario, "con un ánodo común". ¿Y qué pasará si colocamos los LED no en forma de número o escala, sino en forma de cuadrícula? Resultará ser un indicador bastante gráfico. Es decir, uno en el que puede mostrar no solo un número, sino también algún tipo de imagen. Tal cuadrícula se denomina indicador de matriz y, en el caso de los LED, matriz de LED. La resolución de un indicador de matriz es el número de puntos horizontales y verticales. Por ejemplo, los indicadores más comunes tienen una resolución de 8×8 píxeles. Si se requiere una matriz de LED de mayor resolución, simplemente se compone de varios indicadores de 8x8. Cómo hacer esto, lo veremos más adelante. Mientras tanto, averigüemos cómo están conectados los 64 LED dentro de la matriz. Por supuesto, sería posible, como en el caso de un indicador de siete segmentos, conectar todos los LED con un cátodo o ánodo común. En este caso, necesitaríamos 64 pines del controlador u 8 registros de desplazamiento. Ambas opciones son muy derrochadoras. Una opción más correcta es combinar los LED en grupos de 8 piezas con un cátodo común. Sean estas las columnas de la matriz. Luego, los LED paralelos en estas columnas se combinan nuevamente en grupos de 8 piezas que ya tienen un ánodo común. Obtienes el siguiente esquema:
Supongamos que la tarea es encender el LED R6C3. Para hacer esto, necesitamos aplicar un nivel de señal alto al pin R6 y conectar el pin C3 a tierra. Sin apagar este punto, intentemos encender otro: R3C7. Conecte el pin de alimentación positivo a R3 y tierra a C7. ¡Pero en este caso, las filas R6 y R3 se cruzarán con las columnas C3 y C7 no en dos, sino en cuatro lugares! En consecuencia, no se encenderán dos, sino cuatro puntos. ¡Problema! Obviamente, lo mismo puede ayudar. Si activamos los puntos R6C3 y R3C7 a su vez muy rápidamente, podemos usar la persistencia de la visión, la capacidad de interpretar imágenes que cambian rápidamente como un todo.

2. Matriz LED y registros de desplazamiento

En nuestra lección, conectaremos la matriz LED roja de 8 × 8 más simple a Arduino Uno. La numeración de pines comienza en la esquina inferior izquierda. Al mismo tiempo, la numeración de las patas 1-16 no está conectada por ninguna lógica con la numeración de las columnas y filas C y R.
Centrándonos en la lección sobre la indicación dinámica, intentemos usar registros de desplazamiento de 8 bits en el esquema de control del indicador de matriz. Conectamos un registro a las salidas del indicador responsables de las columnas y el segundo a las salidas de fila. diagrama de circuito
Nota importante #1. Es necesario que las resistencias de este circuito estén en las líneas provenientes del primer registro de desplazamiento. Este registro de desplazamiento es responsable de las columnas. Con esta conexión, cada resistencia establecerá la corriente para un solo LED en cada paso del algoritmo dinámico. Por lo tanto, todos los LED brillarán uniformemente. Nota importante #2. El diagrama anterior es solo para fines informativos. Sería más correcto incluir un microcircuito de potencia adicional en el espacio entre el segundo registro y la matriz, por ejemplo, el ensamblaje del transistor ULN2003.

3. Programa

Para hacerlo más divertido, intentemos resaltar un emoticón en el indicador. Como ya se mencionó, para mostrar la imagen en la matriz, usaremos la indicación dinámica. Es decir, resaltaremos nuestra imagen línea por línea. Primero, encendemos las columnas necesarias en la fila superior, luego en la segunda, en la tercera, y así sucesivamente para las 8 filas. El primer registro de desplazamiento se encargará de las columnas y el segundo de las filas. Por lo tanto, la salida de una cadena constará de dos escrituras consecutivas en el registro: primero pasamos el código de la cadena, luego el código de los puntos de esta cadena. En este programa, también utilizaremos una versión acelerada de la función digitalWrite. Esto es necesario para que el proceso de indicación dinámica avance muy rápidamente. De lo contrario, veremos un notable parpadeo de la matriz. Fuente const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; tiempo largo sin firmar, next_flick; const unsigned int to_flick = 500; línea de bytes = 0; datos de bytes constantes = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; // pasar código de línea fill(~(1<<(7-line))); // зажигаем точки в строке № line fill(data); // открываем защелку latchOn(); } } Основная часть этой программы, включая переменные data_pin, sh_pin, st_pin, next_flick, to_flick y función llenar ya conocido por nosotros de las lecciones sobre y sobre. formación datos almacena ocho líneas de nuestra imagen. Para ahorrar memoria, registramos cada combinación de puntos en forma binaria. Función adherirse abre el pestillo del registro. Esto solo debe hacerse después de que se hayan llenado ambos registros de desplazamiento. Después de cargar el programa en Arduino, aparecerá un emoticón en el indicador.

4. Animación en la matriz LED

Y ahora finalizaremos el programa de tal manera que la imagen en el indicador cambie cada medio segundo. Para ello, recordemos de nuevo. const byte data_pin = PD2; const byte st_pin = PD3; const byte sh_pin = PD4; tiempo largo sin firmar, next_flick, next_switch; const unsigned int to_flick = 500; const unsigned long to_switch = 500000; línea de bytes = 0; trama de bytes = 0; const byte data = ( ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ), ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10000001, 0b10111101, 0b01000010, 0b00111100 )); void latchOn()( digitalWriteFast(st_pin, HIGH); digitalWriteFast(st_pin, LOW); ) void fill(byte d)( for(char i=0; i<8; i++){ digitalWriteFast(sh_pin, LOW); digitalWriteFast(data_pin, d & (1<next_flick)( next_flick = tm + to_flick; line++; if(line == 8) line = 0; fill(~(1<<(7-line))); fill(data); latchOn(); } tm = micros(); if(tm >next_switch)( next_switch = tm + to_switch; frame = !frame; ) ) Cargamos el programa Arduino y observamos el resultado.

5. Escalado de matriz LED

Una matriz LED de 8×8 es adecuada para mostrar dos números o un carácter simple. Si desea mostrar una imagen más o menos útil en el indicador, debe combinar las matrices. Esto se hace agregando nuevos registros de desplazamiento tanto vertical como horizontalmente. Cabe señalar que la velocidad del controlador Arduino Uno junto con los registros de desplazamiento solo es suficiente para una pantalla de 16 × 16. Aumentar aún más el tamaño de la pantalla LED dará como resultado un parpadeo notable.

Tareas

  • Hipnosis. Programe el controlador de tal manera que aparezcan círculos concéntricos con un radio en constante aumento en la matriz de LED con un período de 1 segundo.
  • Juego de serpientes. Implementar un juego tan conocido como la serpiente en una matriz LED de 8×8. Es necesario agregar cuatro botones al circuito para controlar la dirección del movimiento, así como un zumbador para señalar el evento de comer manzanas (o lo que coma la serpiente allí ...).
  • Nivel electrónico. Agregue un acelerómetro al circuito. Escriba un programa que muestre un punto en la matriz de LED, cuyas coordenadas dependen de la inclinación de todo el dispositivo. Por ejemplo, cuando el dispositivo se fija paralelo al suelo (perpendicular al vector de gravedad), entonces el punto está en el centro. Cuando el nivel electrónico se inclina hacia la izquierda, el punto se desplaza proporcionalmente hacia la derecha.

Conclusión

Habiendo ensamblado el circuito de control de matriz, muchos pueden tener una pregunta: "Bueno, ¿nadie ha encontrado una forma más simple de trabajar con la matriz en 30 años?" En realidad, se dieron cuenta. Existen microcircuitos especializados para trabajar con diferentes tipos de pantallas, incluso para trabajar con una matriz de LED. En una de las siguientes lecciones, aprenderemos cómo controlar el indicador utilizando el chip MAX7219. Este método nos permitirá combinar fácilmente varias matrices con una gran pantalla, sin necesidad de complicar mucho el circuito eléctrico.