Первое знакомство с LED матрицами 8х8.

01.10.2016 19:27

jazon



Доброго времени суток всем от автора статьи. В этот раз мы начинаем знакомство с LED матрицами 8х8. Вот так выглядит устройство в готовом собранном виде.


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



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



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


Arduino NanoMatrix 8x8
PIN 12PIN DIN
PIN 11PIN CLK
PIN 10PIN CS
PIN 5VPIN 5V
PIN GNDPIN 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. Описание различных датчиков и модулей. Советы и наставления начинающим. Пишите и размещайте свои статьи в соответсвующей ветке форума.