Руководство по матрицам ELABORY WS2812 8х8

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

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

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

Матрицы состоят из т. н. «умных» полноцветных светодиодов WS2812 с индивидуальной адресаций. Это позволяет как отображать на них информацию в любых цветах, так и создавать на этих матрицах различные динамические эффекты.

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

Каждый модуль WS2812 8х8 содержит 64 светодиода WS2812, соединённых последовательно, а управление происходит всего по одной линии DATA (плюс две линии питания):

VCC — напряжение питания 5 В
IN — вход линии данных (DATA IN)
GND — «земля»

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

VCC — напряжение питания 5 В
OUT — выход линии данных (DATA OUT)
GND — «земля»

Управление матрицами WS2812 8х8

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

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

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

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


Для начала рассмотрим пример работы с одной матрицей WS2812 8х8. Схема соединения в этом случае очень проста — модуль матрицы подключается к микроконтроллеру при помощи двух линий питания (5V и GND) и одной линии управляющего интерфейса DATA (IN).

В этом примере на единственную подключённую к контроллеру (на GPIO6) матрицу WS2812 8х8 поочерёдно выводятся две цветные пиктограммы (смайлик и надпись «OK»).

/*
  ELABORY WS2812 8x8 matrix
  One module example
*/

#include 
#include 

#define PIN        6
#define MW         8
#define MH         8
#define BRIGHTNESS 20
#define DELAY_SHOW 5000

Adafruit_NeoMatrix *matrix = new Adafruit_NeoMatrix(MW, MH, PIN,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);

static const uint16_t PROGMEM RGB_bmp[][64] = {
  // 0: face
 {0x000, 0x000, 0x00F, 0x00F, 0x00F, 0x00F, 0x000, 0x000, 
  0x000, 0x00F, 0x000, 0x000, 0x000, 0x000, 0x00F, 0x000, 
  0x00F, 0x000, 0xF00, 0x000, 0x000, 0xF00, 0x000, 0x00F, 
  0x00F, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, 
  0x00F, 0x000, 0x0F0, 0x000, 0x000, 0x0F0, 0x000, 0x00F, 
  0x00F, 0x000, 0x000, 0x0F4, 0x0F3, 0x000, 0x000, 0x00F, 
  0x000, 0x00F, 0x000, 0x000, 0x000, 0x000, 0x00F, 0x000, 
  0x000, 0x000, 0x00F, 0x00F, 0x00F, 0x00F, 0x000, 0x000,},
  // 1: ok
 {0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 
  0x000, 0x060, 0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 
  0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 0x000, 0x060, 
  0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 0x060, 0x000, 
  0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 0x060, 0x000, 
  0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 0x000, 0x060, 
  0x000, 0x060, 0x060, 0x000, 0x000, 0x060, 0x000, 0x060, 
  0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000,},
};

void fixdrawRGBBitmap(int16_t x, int16_t y, const uint16_t *bitmap, int16_t w, int16_t h) {
  uint16_t RGB_bmp_fixed[w * h];
  for (uint16_t pixel = 0; pixel < w * h; pixel++) {
    uint8_t r, g, b;
    uint16_t color = pgm_read_word(bitmap + pixel);
    b = (color & 0xF00) >> 8;
    g = (color & 0x0F0) >> 4;
    r = color & 0x00F;
    b = map(b, 0, 15, 0, 31);
    g = map(g, 0, 15, 0, 63);
    r = map(r, 0, 15, 0, 31);
    RGB_bmp_fixed[pixel] = (r << 11) + (g << 5) + b;
  }
  matrix->drawRGBBitmap(x, y, RGB_bmp_fixed, w, h);
}

void display_rgbBitmap(uint8_t bmp_num) {
  static uint16_t bmx, bmy;
  fixdrawRGBBitmap(bmx, bmy, RGB_bmp[bmp_num], 8, 8);
  bmx += 8;
  if (bmx >= MW) {bmx = 0;}
  if (!bmx) {bmy += 8;}
  if (bmy >= MH) {bmy = 0;}
  matrix->show();
}

void setup() {
  matrix->begin();
  matrix->setBrightness(BRIGHTNESS);
  matrix->show();
}

void loop() {
  display_rgbBitmap(0);  delay(DELAY_SHOW);
  display_rgbBitmap(1);  delay(DELAY_SHOW);
}
Сначала задаются основные параметры подключённой матрицы и режимы её работы:
#define PIN        6
#define MW         8
#define MH         8
#define BRIGHTNESS 20
#define DELAY_SHOW 5000

Особое внимание стоит уделить «магической» формуле инициализации управляющего матрицей объекта:

Adafruit_NeoMatrix *matrix = new Adafruit_NeoMatrix(MW, MH, PIN,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);

Здесь задаётся множество параметров, таких как размер матрицы, расположение нулевых пикселей, последовательность цветовых сигналов, частота работы шины и т. д. В этом скетче указаны параметры, подходящие для модулей WS2812 8х8.

Далее определяются начертания пиктограмм и эти пиктограммы поочерёдно выводятся на единственную подключённую к контроллеру матрицу.

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

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

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



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

В этом примере на мини- бегущую строку из двух матриц WS2812 8х8 выводится надпись «Arduino».

/*
  ELABORY WS2812 8x8 matrix
  Multi modules example
*/

#include 
#include 

#define PIN    6
#define BRIGHT 80

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, 2, 1, PIN,
  NEO_TILE_BOTTOM   + NEO_TILE_LEFT   + NEO_TILE_ROWS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

const uint16_t colors[] = {matrix.Color(BRIGHT, 0, 0), matrix.Color(0, BRIGHT, 0), matrix.Color(0, 0, BRIGHT)};

int x = matrix.width();
int pass = 0;

void setup() {
  matrix.begin();
  matrix.setTextWrap(false);
  matrix.setBrightness(40);
  matrix.setTextColor(colors[0]);
}

void loop() {
  matrix.fillScreen(0);
  matrix.setCursor(x, 0);
  matrix.print(F("Arduino"));
  if(--x < -36) {
    x = matrix.width();
    if (++pass >= 3) {pass = 0;}
    matrix.setTextColor(colors[pass]);
  }
  matrix.show();
  delay(100);
}

Здесь тоже стоит обратить внимание на «магическую» формулу, инициализирующую управляющий объект: поскольку теперь речь идёт о более сложной конфигурации из нескольких матриц, то и формула стала сложнее и любая ошибка в «формуле» приведёт к полной нечитаемости выводимой на дисплей информации. В данном случае указанные параметры точно подходят для работы модулей WS2812 8х8.

Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, 2, 1, PIN,
  NEO_TILE_BOTTOM   + NEO_TILE_LEFT   + NEO_TILE_ROWS   + NEO_TILE_PROGRESSIVE +
  NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

Заключение

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

Купить

Купить модули матриц ELABORY WS2812 8x8 можно в наших магазинах: