Модули цифры на WS2812

Физическая организация

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

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

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

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

Из 30 светодиодов 28 отображают саму цифру, а два дополнительных светодиода предназначены для индикации разделителей.

Управление модулями

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

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

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

Обратите внимание: по сути, модули представляют собой светодиодную ленту, «свёрнутую» в виде 7-сегментной матрицы цифр, поэтому прямой вывод на неё цифр при помощи стандартных библиотек WS2812 невозможен. Для этого нужно использовать специализированную библиотеку

Управление одним модулем


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

В этом примере на единственном подключённым к контроллеру (на GPIO6) модуле загораются разными цветами все имеющиеся пиксели (светодиоды), образуя 7-сегментную цифру 8, плюс ещё загораются два светодиода разделителей.

/*
  WS2812 one module example
*/

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel strip = Adafruit_NeoPixel(30, 6, NEO_GRB + NEO_KHZ800);

uint32_t black = strip.Color(0, 0, 0);
uint32_t white = strip.Color(25, 25, 25);
uint32_t red   = strip.Color(25, 0, 0);
uint32_t green = strip.Color(0, 25, 0);
uint32_t blue  = strip.Color(0, 0, 25);

void setup() {
  strip.begin();
  setColor(strip.Color(0, 0, 0));
  strip.show();
}

uint32_t randomColor() {
  uint32_t c = 0;
  byte n = random(0, 4);
  switch(n){
    case 0: c = white; break;
    case 1: c = red; break;
    case 2: c = green; break;
    case 3: c = blue; break;
   default: ; break;
  }
  return c;
}

void setColor(uint32_t c) {
  for(uint16_t i = 0; i < strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
  }
  strip.show();
}

void loop() {
  setColor(randomColor()); delay(2000);
  setColor(black); delay(1000);
}

Здесь задаются параметры подключённого модуля (количество светодиодов, номер управляющего GPIO, последовательность цветов и частота работы шины).

Adafruit_NeoPixel strip = Adafruit_NeoPixel(30, 6, NEO_GRB + NEO_KHZ800);

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

void loop() {
  setColor(randomColor()); delay(2000);
  setColor(black); delay(1000);
}

Управление несколькими модулями

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


Примечание: в случае создания дисплеев из нескольких модулей, физически все они соединяются последовательно, друг за другом.


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

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

/*
  WS2812 one module example
*/

#include <Adafruit_NeoPixel.h>

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_GRB + NEO_KHZ800);

#define DIG_LEN  30

uint32_t black = strip.Color(0, 0, 0);
uint32_t white = strip.Color(25, 25, 25);
uint32_t red   = strip.Color(25, 0, 0);
uint32_t green = strip.Color(0, 25, 0);
uint32_t blue  = strip.Color(0, 0, 25);

void setup() {
  randomSeed(analogRead(0));
  
  strip.begin();
  setColor(0, strip.Color(0, 0, 0));
  setColor(1, strip.Color(0, 0, 0));
  strip.show();
}

uint32_t randomColor() {
  uint32_t c = 0;
  byte n = random(0, 4);
  switch (n) {
    case 0: c = white; break;
    case 1: c = red; break;
    case 2: c = green; break;
    case 3: c = blue; break;
    default: ; break;
  }
  return c;
}

void setColor(uint16_t n, uint32_t c) {
  uint16_t p = DIG_LEN * n;
  for (uint16_t i = p; i < p + DIG_LEN; i++) {
    strip.setPixelColor(i, c);
  }
  strip.show();
}

void loop() {
  setColor(0, randomColor()); delay(2000);
  setColor(1, randomColor()); delay(2000);
  setColor(0, black); delay(1000);
  setColor(1, black); delay(1000);
}

Здесь управляющий объект инициализируется уже с 60-ю светодиодами (2х30), что позволяет работать с двумя модулями.

Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, 6, NEO_GRB + NEO_KHZ800);

Вначале очищаются оба доступных разряда (модуля).

  strip.begin();
  setColor(0, strip.Color(0, 0, 0));
  setColor(1, strip.Color(0, 0, 0));
  strip.show();

И поочерёдно и независимо друг от друга включается и выключается индикация на обоих модулях.

Заключение

Это руководство по модулям даёт общее представление о подключении их к контроллерам и приёмах и методах их программирования. Полноценное управление этими модулями возможно при помощи специализированной библиотеки

Купить

Купить модули цифры можно в наших магазинах: