Руководство по матрицам ELABORY R/G/B 8х8

Общие сведения

Матрицы ELABORY R/G/B 8х8 имеют миниатюрные размеры (28х28 мм) и предназначены для использования в различных гаджетах и приборах в качестве многофункциональных индикаторов. Например, на них можно отображать буквы, цифры и мнемонические знаки, информируя пользователей о тех или иных состояниях устройства.

Матрицы R/G/B 8х8 можно также использовать в т. н. «бегущих строках» для вывода различной информации, а также в мини-дисплеях, состоящих из нескольких матриц R/G/B 8х8, сгруппированных по горизонтали и вертикали.

Матрицы выпускаются в трёх основных цветах: красном, зелёном или синем. Это монохромные матрицы, которые могут отображать информацию в заранее определённом цвете и не могут менять цвет своего свечения.

Технические подробности

Каждый модуль R/G/B 8х8 содержит 64 светодиода, управляемых специализированной микросхемой MAX7219, а управление происходит по 5 линиям:

VCC — напряжение питания 5 В
GND — «земля»
DIN — вход линии данных (DATA IN)
CS — линия «CHIP SELECT»
CLK — линия импульсов синхронизации

В случае создания дисплея из нескольких матриц, последующие модули подключаются к выходному разъёму модуля:

VCC — напряжение питания 5 В
GND — «земля»
DOUT — выход линии данных (DATA OUT)
CS — линия «CHIP SELECT»
CLK — линия импульсов синхронизации

Управление матрицами R/G/B 8х8

К микроконтроллерам модули R/G/B 8х8 подключаются при помощи интерфейса SPI, а управление выводом осуществляется соответствующим программным обеспечением. Это может быть ваш собственный код для любого микроконтроллера, либо можно использовать готовые библиотеки для управления матрицами на чипах MAX72XX.

В этом руководстве мы рассмотрим примеры работы с матрицами R/G/B 8х8 при помощи популярной системы Arduino.

Поскольку светодиодные модули на MAX72XX очень популярны, то и библиотек для работы с ними существует множество. Все эти библиотеки отличаются как набором функций, так и их реализацией. Мы будем рассматривать примеры работы с библиотекой LedControl.

Управление одной матрицей


Для начала рассмотрим пример работы с одной матрицей R/G/B 8х8. Схема соединения в этом случае очень проста — модуль матрицы подключается к микроконтроллеру при помощи двух линий питания (5V и GND) и трёх линий управляющего интерфейса DIN, CS, CLK.

DIN — GPIO11
CLK — GPIO13
CS — GPIO10

В этом примере мы выводим на матрицу слово «Arduino» по отдельным буквам, одну за другой.

/*
  ELABORY MAX72XX
  One module example
*/

#include "LedControl.h"

//                       DIN, CLK, CS, modules
LedControl lc = LedControl(11, 13, 10, 1);

unsigned long delayWord = 2000;

void setup() {
  lc.shutdown(0, false);
  lc.setIntensity(0, 1);
  lc.clearDisplay(0);
}

void writeWord() { // Word "Arduino" (need at least 5x7 leds)
  byte a[5] = {B01111110, B10001000, B10001000, B10001000, B01111110};
  byte r[5] = {B00111110, B00010000, B00100000, B00100000, B00010000};
  byte d[5] = {B00011100, B00100010, B00100010, B00010010, B11111110};
  byte u[5] = {B00111100, B00000010, B00000010, B00000100, B00111110};
  byte i[5] = {B00000000, B00100010, B10111110, B00000010, B00000000};
  byte n[5] = {B00111110, B00010000, B00100000, B00100000, B00011110};
  byte o[5] = {B00011100, B00100010, B00100010, B00100010, B00011100};

  lc.setRow(0, 0, a[0]); lc.setRow(0, 1, a[1]); lc.setRow(0, 2, a[2]); lc.setRow(0, 3, a[3]); lc.setRow(0, 4, a[4]); delay(delayWord);
  lc.setRow(0, 0, r[0]); lc.setRow(0, 1, r[1]); lc.setRow(0, 2, r[2]); lc.setRow(0, 3, r[3]); lc.setRow(0, 4, r[4]); delay(delayWord);
  lc.setRow(0, 0, d[0]); lc.setRow(0, 1, d[1]); lc.setRow(0, 2, d[2]); lc.setRow(0, 3, d[3]); lc.setRow(0, 4, d[4]); delay(delayWord);
  lc.setRow(0, 0, u[0]); lc.setRow(0, 1, u[1]); lc.setRow(0, 2, u[2]); lc.setRow(0, 3, u[3]); lc.setRow(0, 4, u[4]); delay(delayWord);
  lc.setRow(0, 0, i[0]); lc.setRow(0, 1, i[1]); lc.setRow(0, 2, i[2]); lc.setRow(0, 3, i[3]); lc.setRow(0, 4, i[4]); delay(delayWord);
  lc.setRow(0, 0, n[0]); lc.setRow(0, 1, n[1]); lc.setRow(0, 2, n[2]); lc.setRow(0, 3, n[3]); lc.setRow(0, 4, n[4]); delay(delayWord);
  lc.setRow(0, 0, o[0]); lc.setRow(0, 1, o[1]); lc.setRow(0, 2, o[2]); lc.setRow(0, 3, o[3]); lc.setRow(0, 4, o[4]); delay(delayWord);
  lc.setRow(0, 0, 0);    lc.setRow(0, 1, 0);    lc.setRow(0, 2, 0);    lc.setRow(0, 3, 0);    lc.setRow(0, 4, 0);    delay(delayWord);
}

void loop() { 
  writeWord();
}

Здесь мы указываем номера используемых GPIO и задаём работу с одной подключённой матрицей.

LedControl lc = LedControl(11, 13, 10, 1);

Затем инициализируем и настраиваем матрицу.

  lc.shutdown(0, false);
  lc.setIntensity(0, 1);
  lc.clearDisplay(0);

Далее в бинарном формате создаём начертание букв слова «Arduino».

  byte a[5] = {B01111110, B10001000, B10001000, B10001000, B01111110};
  byte r[5] = {B00111110, B00010000, B00100000, B00100000, B00010000};
  byte d[5] = {B00011100, B00100010, B00100010, B00010010, B11111110};
  byte u[5] = {B00111100, B00000010, B00000010, B00000100, B00111110};
  byte i[5] = {B00000000, B00100010, B10111110, B00000010, B00000000};
  byte n[5] = {B00111110, B00010000, B00100000, B00100000, B00011110};
  byte o[5] = {B00011100, B00100010, B00100010, B00100010, B00011100};

И выводим по буквам само слово на матрицу.

Управление несколькими матрицами

Теперь рассмотрим более сложный вариант работы с несколькими матрицами. В этом случае мы будем использовать два модуля матриц R/G/B 8х8, но этот же принцип можно экстраполировать и на большее количество модулей.

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

Схема подключения первого модуля такая же, как и схема подключения единственного модуля, а последующие модули подключаются своими входными разъёмами на выходные разъёмы предыдущих модулей.


В этом примере мы выведем два разных процесса на первую и вторую матрицы отдельно. Первая матрица будет построчно заполняться точками, а во вторую матрицу мы будем выводить хаотическое заполнение точками. Это два разных процесса и этот пример демонстрирует принцип независимого вывода информации в различные подключённые матрицы.

DIN — GPIO11
CLK — GPIO13
CS — GPIO10

Физическое соединение микроконтроллера и матрицы такое же как в предыдущем примере, разница состоит только в том, что в данном случае мы подключили сборку из двух модулей R/G/B 8х8.

/*
  ELABORY MAX72XX
  Multi modules example
*/

#include "LedControl.h"

//                       DIN, CLK, CS, modules
LedControl lc = LedControl(11, 13, 10, 2);

bool statePnts = true;
bool stateRndm = true;

unsigned long delayTime = 3;

int row = 0;
int col = 0;

void setup() {
  int devices = lc.getDeviceCount();

  for (int addr = 0; addr < devices; addr++) {
    lc.shutdown(addr, false);
    lc.setIntensity(addr, 1);
    lc.clearDisplay(addr);
  }
}

void points() {
  row++;
  if (row > 7) {
    row = 0;
    col++;
    if (col > 7) {
      col = 0;
      if (statePnts) {statePnts = false;}
                else {statePnts = true;}
    }
  }
  lc.setLed(0, row, col, statePnts);
}

void rndm() {
  int col = random(0, 8);
  int row = random(0, 8);
  if (stateRndm) {stateRndm = false;}
            else {stateRndm = true;}
  lc.setLed(1, row, col, stateRndm);
}

void loop() { 
  points(); delay(delayTime);
  rndm();   delay(delayTime);
}

Здесь мы инициализируем и настраиваем матрицы в мульти-режиме (в данном случае это 2 матрицы). Обратите внимание, что инициализация одной матрицы из прошлого примера и инициализация сборки из нескольких матриц отличаются.

void setup() {
  int devices = lc.getDeviceCount();

  for (int addr = 0; addr < devices; addr++) {
    lc.shutdown(addr, false);
    lc.setIntensity(addr, 1);
    lc.clearDisplay(addr);
  }
}

Далее мы создаём функцию построчного заполнения первой матрицы:

void points() {
  row++;
  if (row > 7) {
    row = 0;
    col++;
    if (col > 7) {
      col = 0;
      if (statePnts) {statePnts = false;}
                else {statePnts = true;}
    }
  }
  lc.setLed(0, row, col, statePnts);
}

И функцию хаотического заполнения второй матрицы:

void rndm() {
  int col = random(0, 8);
  int row = random(0, 8);
  if (stateRndm) {stateRndm = false;}
            else {stateRndm = true;}
  lc.setLed(1, row, col, stateRndm);
}

И выводим разную информацию о двух разных процессах в две разные подключённые в сборку матрицы R/G/B 8х8.

Заключение

Это руководство по матрицам ELABORY R/G/B 8х8 даёт общее представление о подключении их к контроллерам и приёмах и методах их программирования. Кроме библиотеки LedControl существует ещё множество библиотек для работы с матрицами светодиодов на чипе MAX72XX и вы можете выбрать ту из них, которая больше соответствует вашим задачам или создать собственное ПО для работы с R/G/B 8х8.

Купить

Купить модули матриц ELABORY R/G/B 8х8 можно в наших магазинах: