Опубликовано: 01.10.2016 19:27
Автор: jazon
Доброго времени суток всем от автора статьи. В этот раз мы начинаем знакомство с LED матрицами 8х8. Вот так выглядит устройство в готовом собранном виде.
Матричный дисплей - устройство состоящее из 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 >= lengthY - 1 - offset)
{
dir = 2;
}
continue;
}
if(dir == 2)
{
pointX --;
if(pointX <= 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;
}
}
}
Видео работы скетча:
Если у Вас есть опыт в работе с Arduino и собственно есть время для творчества, мы приглашаем всех желающих стать авторами статей публикуемых на нашем портале. Это могут быть как уроки, так и рассказы о ваших экспериментах с Arduino. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.