Матричный дисплей - устройство состоящее из LED матрицы 8x8 и платы управления на базе микросхемы MAX7219 c минимальной необходимой обвязкой. На фото вы уже видети готовое устройство, но мне оно пришло по почте вот в таком виде, так что пришлось взять в руки паяльник и спаять всё в нужном виде.

Базовое подключение к плате Arduino Nano показано на принципиальной схеме.

Как видно из схемы - всё просто, нужно лишь соединить проводами контакты обеих плат в следующем порядке:

Arduino Nano Matrix 8x8
PIN 12 PIN DIN
PIN 11 PIN CLK
PIN 10 PIN CS
PIN 5V PIN 5V
PIN GND PIN GND

Итак, наконец-то пришло время поработать с кодом, и для того чтобы запустить LED матрицу, нужно скачать и установить библиотеку LedControl. Библиотека поддерживает работу с микросхемами MAXIM 7221 и 7219. LED матрица в качестве драйвера использует MAX7219, это то что нам нужно. Я думаю что нужно начать с небольшого скетча, демонстрирующего базовые функции данной библиотеки. В скетче, для включения/ выключения светодиодов использована функция setRow(). Синтаксис вызова функции setRow():

matrix.setRow(0, row, col, set);

Где matrix - объект класса LedControl

0 - адрес устройства на шине SPI, в данном случае устройство одно, и нумерация начинается с нулевого адреса

row - ряд(Возможные значения от 0 до 7)

col - колонка(Возможные значения от 0 до 7)

set - значение установки(true - включить, false - выключить)

matrix.setRow(0, 1, 4, true)

Включить на матрице светодиод, находящийся в 1-м ряду и в 4-м столбце.

Еще пример:

int x = 1;

int y = 4;

matrix.setRow(0, x, y, true);

matrix.setRow(0, x, y, false);

То же самое только с использованием переменных, и последующим выключением зажженного светодиода по заданным координатам. Итак, в скетче проигрывается несколько анимаций, с использованием функции setRow().

#include "LedControl.h" //Синтаксис создания класса LedControl(dataPin,clockPin,csPin,numDevices) //Где LedControl - объект класса //dataPin - пин на плате Arduino к которому будет подключен пин DIN //clockPin - пин на плате Arduino к которому будет подключен пин CLK //csPin - пин на плате Arduino к которому будет подключен пин CS //numDevices - количество устройств на шине //Создать объект класса matrix в нашем случае с одним подключенным устройством LedControl matrix = LedControl(12, 11, 10, 1); //Время задержки включения/выключения светодиода на матрице const int delayValue = 100; //Прототипы функций //Последовательное включение/выключение void PointSerialSet(); //Змейка справа - налево void PointRigthToLeft(); //Змейка снизу - вверх void PointDownToUp(); //Змейка слева - направо void PointLeftToRigth(); //Змейка сверху - вниз void PointUpToDown(); //Эффект - затухающий импульс void PointFading(); //Эффект - импульс void PointPulse(); //Эффект - нарастающий импульс void PointClimbing(); //Эффект закручивание спирали внутрь void PointToSpiralIn(); //Эффект раскручивание спирали наружу void PointToSpiralOut(); void setup() { //Устройству с адресом 0 выйти из спящего режима по умолчанию matrix.shutdown(0, false); //Установить яркость Led матрицы на 8 //Возможные значения от 0 до 15 matrix.setIntensity(0, 8); //Очистить дисплей matrix.clearDisplay(0); } void loop() { //Вызываем функции поочередно PointSerialSet(); PointRigthToLeft(); PointDownToUp(); PointLeftToRigth(); PointUpToDown(); PointFading(); PointPulse(); PointClimbing(); PointToSpiralIn(); PointToSpiralOut(); } //Тела функций void PointSerialSet() { //Используем функцию setLed(address, row, col, set) //Последовательное включение по рядам for(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() { //Используем функцию 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, 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() { //Используем функцию setLed(address, row, col, set) //Змейка слева - направо for(int i = 0; i < 8; 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 PointUpToDown() { //Используем функцию setLed(address, row, col, set) //Змейка сверху - вниз for(int i = 0; i < 8; 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 PointFading() { //Используем функцию setLed(address, row, col, set) //Эффект затухания 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; climb --) { matrix.setLed(0, climb, i, true); delay(delayValue / 4); matrix.setLed(0, climb, i, false); } for(int fade = 1; fade < 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 >= lengthX - 1 - offset) { dir = 1; } continue; } if(dir == 1) { pointY ++; if(pointY > <= 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 >= lengthX - 1 - offset) { dir = 1; } continue; } 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; } } }

Видео работы скетча:


Пожалуйста, включите javascript для работы комментариев.


Китай предоставляет за небольшую цену огромное количество не только электронных устройств, но и их компонентов. Небольшая матрица, составленная из светоизлучающих диодов может показывать нужную вам информацию, предположительно это числа, так как разрешение не очень большое, 8 на 8 светодиодов , каждый диаметром 3 мм . Эта матрица светит красным цветом, ведь он наиболее заметен и привлекает внимание больше, чем другие цвета.


Использовать для управления этой матрицы удобнее всего Arduino , ведь он цифровой. Если написать несложную программку вы сможете выводить нужную информацию на этот светодиодный "экранчик". В продаже существуют более дорогие трехцветные матрицы, в которых комбинируя основные три цвета вы можете создать почти любой.


Данная матрица имеет 16 выводов, выше предоставлена схема, где ясно показано как подключены элементарные составляющие матрицы - светодиоды, ориентируясь по ней вы сможете правильно подключить модуль для воспроизведения информации как цифровым, так и аналоговым устройством. Не забудьте про токоограничивающие резисторы, будет печально, если выгорит какой-то из пикселей. Номинальный продолжительный ток одной точки равен 20 мА , пиковый прямой ток 100 мА, напряжения питания 2,1-2,1 В , длина волны 625-630 нм , максимальная рассеиваемая мощность 40 мВт, общий здесь анод, то есть плюс. Габаритные размеры светодиодной матрицы 37 на 37 на 8 мм . Паять нужно аккуратно, не прикасайтесь паяльником с температурой 260 градусов более 5 с, рекомендуемая температура эксплуатации -40 - +70 по шкале Цельсия.

Если у вас есть несколько таких матриц на светодиодах вы можете соединять их, создавая большие по площади информационные табло.

Эта статья создана для тех, кто купил голую матрицу 8х8 и сдвиговые регистры 74hc595 и не знает как это все подключить.

Я долго искал в интернете инструкции о том, как подключить вышеперечисленные компоненты, но находил либо не для моих регистров либо с нерабочими скетчами, поэтому решил, что все-таки придется поработать руками и головой, чтобы порадовать себя картинками 8*8.

Найдя в интернете даташиты к матрице и сдвиговым регистрам, нарисовал следующую схему:

12-я нога у обеих микросхем (latch pin), для экономии портов общая, т.к нет смысла защелкивать регистры в разное время. Часть пинов матрицы (аноды) подключены через токоограничивающие резисторы номиналом 220ом. Все остальное по схеме предельно просто. На всякий случай картинки с распиновкой матрицы.

Изображения придется выводить построчно (иначе с подобными матрицами никак), с маленькой задержкой (человеческий глаз практически не различает задержки в 1мс).

В скетче старался все пояснять. При загрузке в плату на дисплее будут отображаться цифры, которые мы отправим в монитор порта ардуино.(см. видео)

Фото готового устройства (на экране зигзаг, в скетче его изображение хранится в массиве pic)

В дальнейшем попробую сделать на этом дисплее что-нибудь интересное.