Не так давно в продаже появились т. н. умные светодиоды и производные от них — светодиодные ленты, матрицы, экраны и т. п. Об одном из таких изделий, а именно, о матрице 8х8 из светодиодов WS2812B мы и поговорим в этом обзоре. Разберёмся с тем, что это такое, проведём подробное тестирование и посмотрим как это можно применить на практике.
Что такое «умные» светодиоды
Умные светодиоды отличаются от обычных тем, что имеют в своём составе встроенный контроллер. Это позволяет индивидуально управлять каждым светодиодом в ленте или матрице, а это, в свою очередь, позволяет создавать потрясающе красивые эффекты, выводить цветной текст или пиктограммы и даже анимацию. В общем, умные светодиоды это совершенно замечательная вещь, в чём нам и предстоит убедиться в этом обзоре.
Номенклатура подобных компонентов широка и в продаже можно найти модели WS2811, WS2812, WS2812B mini, WS2812C и т. д., в этом обзоре речь пойдёт о WS2812B потому, что именно на них построена тестируемая матрица.
Упаковка
Поставляется матрица в запаянном антистатическом пакете который обеспечивает её защиту при транспортировке и хранении.
Вес
Матрица почти невесома, всего 18 грамм, что неудивительно, ведь по сути это не что иное как светодиодная лента, только выполненная в формате 8х8 и уложенная соответствующим образом.
Размеры
Размеры матрицы 8х8 см, в толщину её размер — это высота светодиода WS2812B. Сама плёночная основа очень тонкая. Вообще, не рекомендуется изгибать и подвергать механическим воздействиям ни основу матрицы, ни сами светодиоды, таким образом их можно легко повредить.
Комплект
В комплекте с матрицей идёт кабель с разъёмом для подключения её к управляющему контроллеру. В этом обзоре данный кабель не использовался, макетирование было удобнее проводить при помощи стандартных макетных проводов.
Кабель для подключения матрицы к управляющему контроллеру крупным планом. Хорошо видно устройство разъёма.
Крупным планом
Матрица во всей красе. Рядом со светодиодами видны распаянные SMD конденсаторы.
Крупным планом вид сверху на светодиоды WS2812B. Видно даже их внутреннее устройство. Кстати, прозрачная заливка это не пластик, а полутвёрдый компаунд, поэтому трогать пальцами и нажимать на поверхность светодиодов не рекомендуется.
Подключения
Обратная сторона матрицы с подписанными выводами. Подключение очень простое — к средним чёрному и красному проводам подключается источник питания матрицы с напряжением 5 В и током 2А. Забегая немного вперёд, скажу, что в процессе тестирования выяснилось, что потребление матрицы может превышать 2 А, поэтому, если есть такая возможность, то лучше использовать источник питания рассчитанный на ток не менее 2,5 А.
К нижнему разъёму (вилке) подключается выход управляющего контроллера, а верхний разъём (розетка) — это выход матрицы для подключения дополнительных сегментов.
Общий вид тестового стенда: лабораторный цифровой источник питания UnionTEST UT3005ED, микроконтроллер Arduino Uno, сама матрица и соединительные провода.
Подсоединения к матрице крупным планом: источник питания, микроконтроллер и, поскольку в экспериментах участвует только одна матрица, её неподключённый выход. Вообще, всё, что написано в этом обзоре можно экстраполировать на систему из нескольких матриц и тогда можно сделать целые строки или экраны для отображения информации.
К Arduino Uno матрица подключается при помощи трёх проводов: земли, 5 В и, собственно, сигнального. Причём подключение 5 В можно исключить и тогда матрица будет питаться только от источника питания.
Крупным планом подключение земли и 5 В к Arduino Uno.
Крупным планом подключение управляющего выхода от контроллера к матрице. Во всех примерах этого обзора используется подключение на 6 пин Arduino Uno.
Программное обеспечение
Для работы со светодиодами WS2812B на Ардуино существует несколько библиотек, самые популярные из которых Adafruit NeoPixel и FastLED. Какой из них пользоваться это дело вкуса, обе они имеют широкие возможности по управлению умными светодиодами. В этом обзоре мы будем работать с первой из них, Adafruit NeoPixel.
Вообще, у компании Adafruit есть две библиотеки для работы с умными светодиодами — Adafruit NeoPixel для управления лентами и Adafruit NeoMatrix для управления матрицами. Нам понадобятся обе, также нам понадобится вспомогательная библиотека Adafruit-GFX-Library. Поэтому вам нужно скачать все эти три библиотеки и установить у себя в среде Arduino стандартным образом.
Все примеры из этих библиотек нормально работают с обозреваемой матрицей, нужно только в скетчах поправить некоторые параметры, чтобы они соответствовали нашей матрице, например, число светодиодов нужно изменить на 64. Во всех примерах из указанных библиотек вход матрицы подключается 6 пин Arduino Uno.
Со стандартными примерами из библиотек вы можете поэкспериментировать самостоятельно, а здесь я приведу короткие скетчи, в которых ничего не нужно настраивать — они уже адаптированы под нашу матрицу.
Скетч test_current
Этот скетч предназначен для тестирования тока потребления матрицей. Изменяя значение переменной showType
от 0 до 6, можно задавать различные режимы работы матрицы.
- 0 - Выключена
- 1 - Красный 100%
- 2 - Зелёный 100%
- 3 - Синий 100%
- 4 - Белый 100%
- 5 - Белый 50%
- 6 - Белый 25%
#include <Adafruit_NeoPixel.h> Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, 6, NEO_GRB + NEO_KHZ800); int showType = 1; void setColor(uint32_t c) { for(uint16_t i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, c); } strip.show(); } void startShow(int i) { switch(i){ case 0: setColor(strip.Color(0, 0, 0)); break; case 1: setColor(strip.Color(255, 0, 0)); break; case 2: setColor(strip.Color(0, 255, 0)); break; case 3: setColor(strip.Color(0, 0, 255)); break; case 4: setColor(strip.Color(255, 255, 255)); break; case 5: setColor(strip.Color(127, 127, 127)); break; case 6: setColor(strip.Color(63, 63, 63)); break; } } void setup() { strip.begin(); strip.show(); } void loop() { startShow(showType); }
Инициализируется матрица строкой
Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, 6, NEO_GRB + NEO_KHZ800);
где 64
это количество светодиодов, 6
— пин Ардуино, на который подключена матрица, NEO_GRB
— флаг типа использующийся управляющей последовательности и NEO_KHZ800
это флаг использующийся частоты. Все эти параметры соответствуют нашей матрице.
Тесты
Потребление неподключённой матрицы около 60 мА, т. е. потребление каждого светодиода в этом режиме чуть меньше 1 мА.
Потребление выключенной матрицы с подключённым микроконтроллером около 110 мА, т. е. микроконтроллер Arduino Uno добавляет потребление примерно 50 мА.
Переходим к нагрузочным тестам. Сначала проверим потребление матрицы со включёнными на полную мощность красными светодиодами. Потребление примерно 850 мА
Теперь зелёные светодиоды и тоже на полную мощность. И тоже потребление около 850 мА
И, наконец, синие светодиоды и тоже около 850 мА. Первый вывод, который можно сделать, что потребление матрицы сбалансировано по цветам и каждый цвет потребляет примерно один и тот же ток.
Второй вывод, который можно сделать, это то, что каждый светодиод, работая в режиме R, G или B на полной мощности, потребляет ток около 12,5 мА.
Теперь протестируем потребление тока матрицей при включении белого цвета, т. е. при одновременной работе всех трёх цветов. Начнём с полной мощности.
2220 мА. Как видим, блока питания на 2 А может не хватить, поэтому с этой матрицей либо нужно использовать блок питания на 2,5 А, либо следить за тем, чтобы среди эффектов не было периодов включения белого цвета на полную мощность. Ток потребления каждого светодиода в этом режиме составляет примерно 34 мА.
Теперь протестируем потребление матрицей тока в режиме 50 % яркости белого цвета. 1160 мА и ток потребления каждого светодиода около 17 мА.
25 % яркости белого цвета. Общий ток 630 мА и ток каждого светодиода примерно 9 мА. Из трёх последних замеров можно сделать вывод, что потребление тока матрицей почти линейно.
Использование
Теперь переходим к непосредственному использованию матрицы — демонстрации на ней различных эффектов. Начнём со скетча, который формирует т. н. «театральные» эффекты и эффект радуги. На самом деле количество эффектов ограничено только вашей фантазией, здесь же мы только воспроизведём несколько примеров.
Скетч effects
Изменяя значение переменной showType
от 0 до 3, можно задавать различные эффекты.
- 0 - Выключена
- 1 - Театральный эффект белый
- 2 - Театральный эффект красный
- 3 - Радуга
#include <Adafruit_NeoPixel.h> Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, 6, NEO_GRB + NEO_KHZ800); int showType = 1; void theaterChase(uint32_t c, uint8_t wait) { for (int j = 0; j < 10; j++) { for (int q = 0; q < 3; q++) { for (int i=0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, c); } strip.show(); delay(wait); for (int i = 0; i < strip.numPixels(); i = i + 3) { strip.setPixelColor(i + q, 0); } } } } void rainbow(uint8_t wait) { uint16_t i, j; for (j = 0; j < 256; j++) { for(i = 0; i < strip.numPixels(); i++) { strip.setPixelColor(i, Wheel((i+j) & 255)); } strip.setBrightness(25); strip.show(); delay(wait); } } uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if (WheelPos < 85) { return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3); } if(WheelPos < 170) { WheelPos -= 85; return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3); } WheelPos -= 170; return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0); } void startShow(int i) { switch(i){ case 1: theaterChase(strip.Color(25, 25, 25), 50); break; case 2: theaterChase(strip.Color(25, 0, 0), 50); break; case 3: rainbow(20); break; } } void setup() { strip.begin(); strip.show(); } void loop() { startShow(showType); }
«Театральные» эффекты
Фотографии слабо подходят для демонстрации динамических эффектов на матрице, но если вы самостоятельно соберёте тестовый стенд и запустите прилагаемый скетч, то сами увидите очень красивые эффекты.
Момент работы «театрального» эффекта крупным планом.
Эффект радуги
Момент работы эффекта радуги крупным планом.
Библиотека Adafruit NeoMatrix
Теперь переходим к работе со второй библиотекой Adafruit NeoMatrix. Как видно из её названия, она предназначена для работы с матрицами. Небольшое пояснение: предыдущая библиотека Adafruit NeoPixel предназначена для работы со светодиодными лентами и при использовании её с матрицей все линейные эффекты как бы «заворачиваются» в соответствии с соединениями светодиодов на ней. Что само по себе не плохо и порождает иногда интересные эффекты. Но NeoMatrix изначально предназначена для работы с матрицами и работает с массивом светодиодов на ней именно как с двумерной матрицей.
Вывод текста
Работу с библиотекой NeoMatrix начнём с примера вывода текста, т. н. «бегущей строки». Работа данного скетча заключается в том, что он выводит на матрицу бегущую строку со словом «Arduino» (Слово или строка, разумеется, могут быть любыми). Для подобного эффекта лучше, конечно, использовать не одну, а несколько соединённых вместе матриц и при желании вы легко сможете это сделать.
Обратите внимание на три подключённые библиотеки в начале скетча и отдельно стоящую библиотеку <SPI.h>
. Эту библиотеку нужно подключить в начале скетча только в том случае, если у вас возникнут проблемы с его компиляцией.
#include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_NeoMatrix.h> #include <Adafruit_NeoPixel.h> #define PIN 6 #define BRIGHT 80 Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + 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)}; void setup() { matrix.begin(); matrix.setTextWrap(false); matrix.setBrightness(40); matrix.setTextColor(colors[0]); } int x = matrix.width(); int pass = 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); }
Инициализируется матрица строкой
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);
где 8, 8
это количество светодиодов по ширине и высоте матрицы, PIN
это пин Ардуино, на который подключена матрица, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG
это флаги физического расположения светодиодов на матрице и направления движения текста, а NEO_GRB + NEO_KHZ800
это флаги протокола взаимодействия с матрицей. Все эти параметры, как и в предыдущих примерах, соответствуют нашей матрице.
Две буквы «r» и «d» из слова Arduino в динамической бегущей строке. Если бы в примере использовалось больше одной матрицы, то текст было бы видно лучше.
Пиктограммы
Теперь переходим к самому интересному — формированию цветных (тут мы никак не ограничены) пиктограмм на матрице 8 на 8 светодиодов. В своей единичной ипостаси эта матрица так и просится для создания различных информеров по отображению каких-либо событий, например, прихода письма по электронной почте или срабатывания сигнализации и т. п.
Этот скетч циклически выводит на матрицу несколько пиктограмм. Это только тестовый пример, изменив который, вы сможете сформировать любую пиктограмму и любой их набор для использования в своих проектах.
#include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_NeoMatrix.h> #include <Adafruit_NeoPixel.h> #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: cross {0x000, 0x000, 0x060, 0x060, 0x060, 0x060, 0x000, 0x000, 0x000, 0x000, 0x060, 0x060, 0x060, 0x060, 0x000, 0x000, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x060, 0x000, 0x000, 0x060, 0x060, 0x060, 0x060, 0x000, 0x000, 0x000, 0x000, 0x060, 0x060, 0x060, 0x060, 0x000, 0x000,}, // 1: heart {0x000, 0x008, 0x008, 0x000, 0x000, 0x008, 0x008, 0x000, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x000, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x000, 0x000, 0x008, 0x008, 0x008, 0x008, 0x008, 0x008, 0x000, 0x000, 0x000, 0x008, 0x008, 0x008, 0x008, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, 0x008, 0x000, 0x000, 0x000,}, // 2: mail {0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x000, 0x000, 0x000, 0x000, 0x530, 0x530, 0x530, 0x000, 0x530, 0x000, 0x000, 0x530, 0x000, 0x530, 0x530, 0x000, 0x000, 0x530, 0x530, 0x000, 0x000, 0x530, 0x530, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 0x530, 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); display_rgbBitmap(2); delay(DELAY_SHOW); }
Формировать изображения очень просто — достаточно изменить любое из значений 0x000 в соответствии с правилом 0xBGR, где буквы представляют собой соответствующий цвет и записываются в шестнадцатеричной форме. Например, число 0x00F соответствует яркому красному свечению светодиода, а 0x080 половинной яркости свечения зелёного цвета и т. д.
Вот вывод первой пиктограммы из тестового скетча — зелёного креста.
Вторая пиктограмма — красное сердце. Видно, что формирование пиктограмм средней яркости требует очень небольшого тока и можно не использовать дополнительный источник и запитывать матрицу напрямую от Ардуино.
И наконец, очень актуальная пиктограмма письма электронной почты.
Применение
Спектр применения подобных матриц ограничен только вашей фантазией и вашими потребностями. Из них можно делать цветовые панно, бегущие строки, различные информеры и т. п. Их можно использовать в любых ваших DIY проектах, в том числе и на основе системы Arduino Mega Server и AMS Pro.
Итого, плюсы и минусы
+ Плюсы
- Широкие возможности
- Лёгкое использование в своих проектах
- Относительно невысокая цена
- Минусы
- Не найдены
Вердикт
Матрица 8x8 на умных светодиодах WS2812B является прекрасным компонентом для ваших проектов и если вам нужна индикация состояния каких-либо систем или вывод информации в виде бегущих строк, то она будет отличным выбором, тем более, что тестирование не выявило никаких недостатков в ней.