Светодиодная панель с Arduino

Светодиодные матрицы не содержат на борту микроконтроллеров, памяти и контроллеров ШИМ. По принципу своей работы панели рассчитаны на использования технологии «CPLD» или «FPGA». Arduino Mega 2560 удалось адаптировать для управления матрицей, но для полной раскачки панели вам необходимо найти более высокоскоростной контроллер.

Видеообзор

Что понадобится

Подключение и настройка

Шаг 1

Подключите 16-проводной шлейф к входному сигнальному разъёму матрицы DATA IN.

Шаг 2

С помощью проводов «папа-папа» подключите второй конец шлейфа к платформе Arduino Mega 2560.

Номера пинов изменять нельзя

Вывод шлейфа Вывод Arduino Mega
R1 24
G1 25
B1 26
GND GND
R2 27
G2 28
B2 29
GND GND
A A0
B A1
C A2
D A3
CLK 8
OE 9
LAT 10
GND GND

Шаг 3

Подключите питание на светодиодную матрицу через силовой шнур. Один конец провода к блоку питания, а второй — в разъём POWER на матрице. Каждая LED панель питается строго от 5 вольт. Потребление тока зависит от вида матрицы.

Рекомендуем использовать блок питания с выходным напряжением 5 вольт и током не менее 4 ампер. Идеально подойдёт блок питания с выходным напряжением 5 вольт и током 5 ампер.

При подключении нескольких светодиодных панелей, соответственно увеличивайте запас по току в N-раз, где N — количество матриц в цепочке.

На схеме матрицы нет встроенного регулятора напряжения. При подаче напряжения более 5 вольт — вы убьёте LED панель.

Железо собрано. Теперь можно переходить к примерам работы.

Примеры работы

Для работы примеров скачайте и установите библиотеки RGBmatrixPanel и Adafruit GFX через менеджер библиотек Arduino.

Тест матрицы

Для начала сделаем простой тест светодиодов «битых пикселей» на матрице.

fillColorTest.ino
// библиотека для работы с матрицей
#include <RGBmatrixPanel.h>
// установите и скачайте также библиотеку «Adafruit GFX Library»
// «RGBmatrixPanel» наследуется от «Adafruit GFX Library»
 
// управляющие пины матрицы
#define CLK   11
#define OE    9
#define LAT   10
#define A     A0
#define B     A1
#define C     A2
#define D     A3
 
// объявляем объект для работы с матрицей 64х32
// включаем двойную буферизацию
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, true, 64);
 
int color;
 
void setup() {
  // инициируем работу с матрицей
  matrix.begin();
}
 
void loop() {
  // закрашиваем матрицу в красный цвет
  matrix.fillScreen(matrix.Color888(255, 0, 0));
  // выводим цвет из буфера на экран
  matrix.swapBuffers(false);
  delay(1000);
  // закрашиваем матрицу в зелёный цвет
  matrix.fillScreen(matrix.Color888(0, 255, 0));
  // выводим цвет из буфера на экран
  matrix.swapBuffers(false);
  delay(1000);
  // закрашиваем матрицу в синий цвет
  matrix.fillScreen(matrix.Color888(0, 0, 255));
  // выводим цвет из буфера на экран
  matrix.swapBuffers(false);
  delay(1000);
  // закрашиваем матрицу в белый цвет
  matrix.fillScreen(matrix.Color888(255, 255, 255));
  // выводим цвет из буфера на экран
  matrix.swapBuffers(false);
  delay(1000);
}

Вывод геометрических фигур

Методы библиотеки легко позволяют выводить геометрические фигуры.

geometricFigures.ino
// библиотека для работы с матрицей
#include <RGBmatrixPanel.h>
// установите и скачайте также библиотеку «Adafruit GFX Library»
// «RGBmatrixPanel» наследуется от «Adafruit GFX Library»
 
// управляющие пины матрицы
#define CLK   11
#define OE    9
#define LAT   10
#define A     A0
#define B     A1
#define C     A2
#define D     A3
 
// объявляем объект для работы с матрицей 64х32
// включаем двойную буферизацию
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, true, 64);
 
// выводимая строка на матрицу
const char textStr[] = "Hello, World!";
// переменная с X-координатой текста
int textX = matrix.width();
 
// минимальное значение координаты текста
// количество символов в строке умноженное на ширину одного символа,
// после которой текст начнёт повторно выводиться
int textMin = sizeof(textStr) * -6;                  
 
void setup() {
  // инициируем работу с матрицей
  matrix.begin();
  int width = matrix.width();
  int height = matrix.height();
  // рисуем две диагонали
  matrix.drawLine(0, 0, width - 1, height - 1, matrix.Color333(7, 0, 0));
  matrix.drawLine(0, height - 1, width - 1, 0, matrix.Color333(7, 0, 0));
  // рисуем окружность в центре дисплея и радиусом 12
  matrix.drawCircle(width / 2, height / 2, 12 , matrix.Color333(7, 7, 0));
  // рисуем диск (закрашенную окружность) в центре дисплея и радиусом 8
  matrix.fillCircle(width / 2, height / 2, 8, matrix.Color333(0, 7, 7));
  // выводим текст из буфера на матрицу
  matrix.swapBuffers(false);
}
 
void loop() {
 
}

Анимация шариков

Заставим фигуры двигаться и отталкиваться от стен.

movingCircles.ino
// библиотека для работы с матрицей
#include <RGBmatrixPanel.h>
// установите и скачайте также библиотеку «Adafruit GFX Library»
// «RGBmatrixPanel» наследуется от «Adafruit GFX Library»
 
// управляющие пины матрицы
#define CLK   11
#define OE    9
#define LAT   10
#define A     A0
#define B     A1
#define C     A2
#define D     A3
 
// объявляем объект для работы с матрицей 64х32
// включаем двойную буферизацию
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, true, 64);
 
// массив с начальными координатами кругов и значениями смещения
// первые две координаты в каждой строке — координаты трёх кругов
// вторые две — координаты смещения кругов
int ball[3][4] = {                                                   
  {  6,  6,  1,  1 },                                                  
  { 17, 15,  1, -1 },                                                   
  { 27,  6, -1,  1 }                                                    
};
 
// цвет кругов
static const int ballColor[3] = {
  matrix.Color333(3, 0, 0),
  matrix.Color333(0, 3, 0),
  matrix.Color333(0, 0, 3)
};
 
// радиус кругов
static int const ballRadius = 3;
 
void setup() {
  // инициируем работу с матрицей
  matrix.begin();
}
 
void loop() {
  // очищаем экран
  matrix.fillScreen(0);
  // запускаем счётчик для смены координат кругов
  for (int i = 0; i < 3; i++) {
    // рисуем три круга с одинаковыми радиусами
    // разными начальными координатами и цветами
    matrix.fillCircle(ball[i][0], ball[i][1], ballRadius, ballColor[i]);
    // обновляем Х-координату кругов
    ball[i][0] += ball[i][2];
    // Обновляем Y-координату кругов
    ball[i][1] += ball[i][3];
    // если круг по Х дошёл до границы экрана
    if ((ball[i][0] == ballRadius) || (ball[i][0] == (matrix.width() - ballRadius))) {    
      // инициируем движение в обратную сторону
      ball[i][2] *= -1;
    }
    // если круг по Y дошёл до границы экрана
    if ((ball[i][1] == ballRadius) || (ball[i][1] == (matrix.height() - ballRadius))) {
      // инициируем движение в обратную сторону
      ball[i][3] *= -1;
    }
  }
  // выводим объекты из буфера на экран
  matrix.swapBuffers(false);
}

Вывод текста

Матрицы идеально подходят для объявлений и рекламных вывесок. Выведем цветной и яркий текст.

printString.ino
// библиотека для работы с матрицей
#include <RGBmatrixPanel.h>
// установите и скачайте также библиотеку «Adafruit GFX Library»
// «RGBmatrixPanel» наследуется от «Adafruit GFX Library»
 
// управляющие пины матрицы
#define CLK   11
#define OE    9
#define LAT   10
#define A     A0
#define B     A1
#define C     A2
#define D     A3
 
// объявляем объект для работы с матрицей 64х32
// включаем двойную буферизацию
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, true, 64);
 
// выводимая строка на матрицу
const char textStr[] = "Hello, World!";
// переменная с X-координатой текста
int textX = matrix.width();
 
// минимальное значение координаты текста
// количество символов в строке умноженное на ширину одного символа,
// после которой текст начнёт повторно выводиться
int textMin = sizeof(textStr) * -6;                  
 
void setup() {
  randomSeed(analogRead(A5));
  // инициируем работу с матрицей
  matrix.begin();
  // отключаем перенос текста на следующую строку
  matrix.setTextWrap(false);
  // устанавливаем размер текста
  matrix.setTextSize(1);
  // очищаем экран
  matrix.fillScreen(0);
  // выставляем курсор
  matrix.setCursor(10, 0);
  // печатаем первую строку
  matrix.println("Amperka");
  // выставляем курсор
  matrix.setCursor(0, 15);
  // выводимая вторая строка
  char strText[] = "LED MATRIX!";
  // перебираем по очереди каждый символ
  for (int i = 0; i < strlen(strText); i++) {
    // генерируем случайное число от 0 до 1536
    int hue = random(0, 1536);
    // устанавливаем случайный цвет по шкале «HSV»
    matrix.setTextColor(matrix.ColorHSV(hue, 255, 255, false));
    // печатаем символ текущего цикла
    matrix.print(strText[i]);
  }
  // выводим текст из буфера на матрицу
  matrix.swapBuffers(false);
}
 
void loop() {
}

Бегущая строка

Добавим тексту движения — сделаем бегущую строку.

runningString.ino
// библиотека для работы с матрицей
#include <RGBmatrixPanel.h>
// установите и скачайте также библиотеку «Adafruit GFX Library»
// «RGBmatrixPanel» наследуется от «Adafruit GFX Library»
 
// управляющие пины матрицы
#define CLK   11
#define OE    9
#define LAT   10
#define A     A0
#define B     A1
#define C     A2
#define D     A3
 
// объявляем объект для работы с матрицей 64х32
// включаем двойную буферизацию
RGBmatrixPanel matrix(A, B, C, D, CLK, LAT, OE, true, 64);
 
// выводимая строка на матрицу
const char textStr[] = "Hello, World!";
// переменная с X-координатой текста
int textX = matrix.width();
 
// минимальное значение координаты текста
// количество символов в строке умноженное на ширину одного символа,
// после которой текст начнёт повторно выводиться
int textMin = sizeof(textStr) * -6;                  
 
void setup() {
  // инициируем работу с матрицей
  matrix.begin();
  // отключаем перенос текста на следующую строку
  matrix.setTextWrap(false);
  // устанавливаем размер текста
  matrix.setTextSize(1);
}
 
void loop() {
  // очищаем экран
  matrix.fillScreen(0);
  // устанавливаем цвет текста
  matrix.setTextColor(matrix.Color888(255, 0, 255));
  // указываем начальную координату вывода текста {textX; 12}
  matrix.setCursor(textX, 12);
  // выводим текст
  matrix.print(textStr);
  // сдвигаем текст на один пиксель при каждом выполнении цикла
  textX--;
  // если был отображён весь текст
  if (textX < textMin) {
    // начинаем выводить текст заново
    textX = matrix.width();
  }
  // выводим текст из буфера на матрицу
  matrix.swapBuffers(false);
}

Ресурсы