Авторизация
Зарегистрироваться

avatar RSS блога Подписка

Светодиоды WS2812b в матрице 16х16 (256 светодиодов).


Приветствую всех муськовчан. После экспериментов на ленте на адресуемых светодиодах WS2812b заказал гибкую матрицу на этих же светодиодах WS2812b, 16х16 (256 пикселей). Посылка с Bangood пришла неожиданно быстро –за десять дней.
Технические данные от поставщика.
Напряжение: DC5V
LED чип: SMD5050
Тип IC: WS2812B (IC Built in LED)
LED количество: 256 пикселей
LED цвет: многоцветный, цифровой RGB, каждый LED индивидуальный контроль
Водонепроницаемость: нет
Режим работы: внешний контроллер Arduino
Подключение: VCC: красный; GND: белый; DAT: синий
Размер: 16 * 16 см, 8 * 32 см
Не буду загружать шелестящими распаковками, треками, взвешиваниями и т. д, (кому надо могут посмотреть видео). В общем те же светодиоды как и в ленте, только грубо говоря смонтированные на квадратной матрице размером 16х16 см, по зигзагу слева на право (если смотреть с от левого нижнего угла матрицы где идет подключение к Ардуино). Управлять матрицей можно как с Ардуино, так и с STM32, всевозможных контроллеров типа T-1000S и т.п.
Я подключал к Arduino Uno. Управление осуществляется по одному проводу с пина Ардуино. Необходим источник питания 5вольт, до 3ампер. Я подключил от самодельного БП через понижающую плату с индикацией выходного напряжения.
Фото.платы

Внимание — при загрузке скетчей с компьютера источник питания светодиодов самой матрицы должен быть отключен! Пин управления матрицей подключаем через резистор 500 Ом.
С обратной стороны матрицы находятся провода для подключения –вход, дополнительный вход по питанию, выход для подключения следующей матрицы( для сборки более большого экрана). То есть можно из таких матриц собрать матрицу 16х32, 32х32 и т.д. Питание 5 вольт (чтобы исключить падение напряжения на светодиодах расположенных в конце матрицы) нужно также подключить и к выходу матрицы.
Cхема, и обратная сторона матрицs

Матрицы разных размеров.

На этой матрице можно получить огромное количество световых эффектов, анимацию, бегущую строку, собрать рекламное панно и т.д. Из этих готовых матриц можно собрать экраны большего размера.Для начала загрузил скетч бегущей строки для теста матрицы 16х16 на светодиодах WS2812b. В нем нужно правильно установить параметры NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT – НИЖНИЙ ЛЕВЫЙ УГОЛ NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG — СТРОКИ ЗИГЗАГ. Подключаем к ардуино, загружаем скетч текста, настраиваем параметры бегущей строки и вводим нужный вам текст.
Скетч бегущей строки.
Дополнительная информация
[code]
// Adafruit_NeoMatrix example for single NeoPixel Shield.
// Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation.

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
#define PSTR // Make Arduino Due happy
#endif

#define PIN 6

// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
// NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
// Position of the FIRST LED in the matrix; pick two, e.g.
// NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
// NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
// rows or in vertical columns, respectively; pick one or the other.
// NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
// in the same order, or alternate lines reverse direction; pick one.
// See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

// Example for NeoPixel Shield. In this application we'd like to use it
// as a 5x8 tall matrix, with the USB port positioned at the top of the
// Arduino. When held that way, the first pixel is at the top right, and
// lines are arranged in columns, progressive order. The shield uses
// 800 KHz (v2) pixels that expect GRB color data.
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);

const uint16_t colors[] = {
matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };//цвет текста

void setup() {
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(30);//яркость букв
matrix.setTextColor(colors[0]);
}

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

void loop() {
matrix.fillScreen(10);//Яркость фона
matrix.setCursor(x, 5);//Расположение текста-выше, ниже
matrix.print(F(«TEST MATRIZI16x16 Proverka raboti»));
if(--x < -184) { //184 -зависит количество букв
x = matrix.width();
if(++pass >= 3) pass = 0;
matrix.setTextColor(colors[pass]);
}
matrix.show();
delay(100);//скорость текста
}

[/code]

Примеры световых эффектов на матрице в 256 пикселей.






Для создания эффектов на таких матрицах существует много программ (одна из них Glediator).


Сейчас считается обычным проведение дискотек и вечеринок с помощью компьютера, но их роль сводится максимум к музыкальному сопровождению. С компьютера программой Glediator можно управлять онлайн светодиодной матрицей. Это отличный способ добавить впечатляющий объем цвета при сохранении в состоянии индивидуально контроля по каждому светодиоду.
Программа Glediator очень хорошо подходит для анимирования светодиодных матриц на вечеринках дома. Она способна управлять матрицей, состоящей до 512 светодиодов WS2812/NeoPixels, формируя до 24 кадров/сек — этого вполне достаточно для нашего дисплея, можно даже выводить на него простые анимационные гифы. Микшер позволяет делать плавные переходы между анимациями.
Недостатков матрицы я не вижу, кроме цены — но надо учитывать что здесь установлено 256 светодиодов WS2812В. Плюсом считаю этой матрицы что она дает большой простор для творчества даже в домашних условиях при применении платформы Ардуино.
Кому интересно подробнее можно посмотреть в видео youtu.be/sQ-bmsHLhWY
Всем желаю здоровья и удачи по жизни и в покупках!
Планирую купить +27 Добавить в избранное +19 +39
свернуть развернуть
Комментарии (27)
RSS
+
avatar
  • kayuda
  • 10 февраля 2018, 19:45
+3
Спасибо за обзор. Познавательно.
+
avatar
  • kayuda
  • 10 февраля 2018, 19:55
+1
Вы пишете, что программа Glediator позволяет управлять 512 светодиодами, а если подключить 513, то крайний не будет работать или будет повторять цвет первого? Спрашиваю ради любопытства.
+
avatar
+2
Не будет работать.
+
avatar
  • kayuda
  • 10 февраля 2018, 20:14
+1
спасибо.
+
avatar
  • heckby
  • 10 февраля 2018, 20:15
+2
в 513й ничего не придет и он будет черным
+
avatar
  • kayuda
  • 10 февраля 2018, 20:17
+1
спасибо.
+
avatar
+5
Необходим источник питания 5вольт, до 3ампер
3 ампера? Каждый такой диод потребляет до 60 мА от 5 В, итого 256*0.06 = 15.36 А! В случае чисто белого цвета.
+
avatar
  • AlekseyM
  • 10 февраля 2018, 22:25
+1
Подтверждаю, 3 А блок питания у меня не тянет даже матрицу 8 на 8 на чистом белом. При замерах от «лабораторного» потребление в пике 4.2 А
+
avatar
  • alex722
  • 11 февраля 2018, 02:15
+1
Абсолютно верно. И питание на панель лучше подавать от отдельного источника и уж никак не через ножки Ардуины.
+
avatar
  • abyrwalg
  • 11 февраля 2018, 15:12
0
у автора на третьей картинке («Примеры световых эффектов») одновременно все пиксели светятся, что видимо и создаёт иллюзию низкого потребления тока, а на самом деле — *½ 'неполная яркость' *½ 'не полный белый цвет'; ну и ещё если ток до понижайки померять, то 3А будет точно хватать с запасом)

насколько же серьёзнее приходится питание организовывать на «неумных»;) лентах, чтобы не было просадки по яркости в середине
+
avatar
+1
У меня есть обычная RGB 12 В диодная лента длиной 15 м, установленная по периметру небольшой комнаты. Питание подключается к ней в начале и в конце, т.к. эти точки соединены. Дополнительно, параллельно ленте идут 4 провода — общий сечением 4 кв. мм. и 3 цвета по 1.5 кв. мм. Провода эти подключаются к ленте через каждые 50 см (да, я дико замучался их паять =). В принципе, на обычной работе разница в яркости подключенного угла ничем не отличается от противоположного, но вот на малых значениях яркости (когда диоды чуть светятся), разница в яркости есть. Но я склонен считать, что это из-за индуктивности проводов, т.к. я использую достаточно высокую частоту PWM — около 8 КГц. На более низкой частоте разницы на глаз не видно (но там и минимальная яркость поднимается).

В этом плане, кстати, 2812 удобней, т.к. в них есть встроенный стабилизатор тока через диоды, благодаря чему их яркость не падает, даже если напряжение питания упадет до 4 В. Но зато они требуют в три раза больший ток по питанию.
+
avatar
  • Faint
  • 10 февраля 2018, 21:47
0
Существует ли в природе рассеиватель для таких матриц?
+
avatar
0
думаю, его достаточно просто изготовить из битого ЖК монитора ;)
+
avatar
  • kirich
  • 11 февраля 2018, 00:11
+2
из битого ЖК монитора ;)
Осталась мелочь, найти битый ЖК монитор, где Вы их берете? :)
+
avatar
  • Lagros
  • 11 февраля 2018, 00:48
+1
Все зависит от размера. Обратитесь в сервисный центр. Там их как грязи. По крайней мере у меня осталось штук 10 битых матриц ноутбука. Периодически их выбрасываю. Оставляю только платы управления и светодиоды подсветки.
+
avatar
0
у тех кто ремонтирует ноутбуки должно быть много
+
avatar
  • alex722
  • 11 февраля 2018, 02:09
+1
Программа Glediator очень хорошо подходит для анимирования светодиодных матриц на вечеринках дома. Она способна управлять матрицей, состоящей до 512 светодиодов
Сама программа Glediator не имеет ограничений в 512 пикселей. Ограничение появится при использовании Ардуино в качестве интерфейса между ПК и светодиодной панелью. Для UNO 500 пикселей, для MEGA — 1000 пикселей
+
avatar
0
а как управлять например бегущей строкой с текстом на панелях 8*32 на 18 штук (6ти метровая строка)?
+
avatar
+2
Протокол WS2818B требует 1250 нс для передачи одного бита. Это значит, что в секунду можно передать 800 КБит, что позволяет обновлять с частотой 50 Гц до 660 светодиодов на одной линии. Если вам достаточно 25 Гц, диодов может стать 1320. Таким образом, в вашем случае надо от 4 до 7 отдельных линий (в зависимости от желаемой частоты обновления). Arduino UNO такое количество линий не потянет, да и оперативной памяти просто не хватит (там 2 Кб).

У меня получалось на Atmega328 (та, что в основе УНО) сделать два варианта вывода — с использованием USART выводить 1 канал, но на прерываниях (т.е. вывод идет параллельно с основной программой) и выводить 5 каналов сразу с запрещенными прерываниями. Я сократил цветность до 8 бит на светодиод с использованием таблицы цветов в ПЗУ (по факту, хоть диоды и имеют по 256 градаций цвета на каждом канале, толку от них не так много, ведь они изменяют яркость линейно. А в мониторах, например, используется гамма 2.2, в итоге получается по 4 «настоящих» бита на канал).
+
avatar
  • abyrwalg
  • 11 февраля 2018, 15:59
0
на хабре несколько раз возникала тема «рациональной» палитры, учитывающей восприятие близких оттенков человеческим глазом, там обычно в 6 бит укладываются

а в частоту ШИМ (2 кГц для 2812) вам не приходилось упираться, какие-нибудь странные артефакты не проявлялись на сотнях диодов?
+
avatar
0
6 бит — это (грубо говоря) по 2 бита на канал. Т.е. каждый канал сможет воспроизводить только 4 уровня. На мой взгляд, это мало, да и написание кода при 8-битах чуть проще (AVR оперирует байтами). Единственное, 6 бит позволит сэкономить 25% «видеопамяти», и 600 диодов потребуют 450 байт вместо 600.

В идеале было бы использовать по 4 бита на канал, тогда каждый канал обеспечит как раз 16 градаций яркости, что является практически пределом при гамме 2.2 с балансом белого (об этом ниже). Но это дает 1.5 байта на канал, что увеличивает размер экрана из 600 диодов до 900 байт, т.е. практически до половины ОЗУ микроконтроллера. У себя я использовал по 6 градаций яркости на канал (0 = выключено, 5 = полностью включено), это дает 216 цветов, один цвет, транслирующийся в 0xFFFFFF (поясню ниже), 23 неиспользуемых (пока) цвета и 16 градаций серого. 6 градаций яркости требуют двукратного умножения на 6 для формирования индекса цвета, но это не так сложно, т.к. результат умещается в одном регистре:
4 команды на умножение
mov	R16, R17
lsl	R16
add	R16, R17
lsl	R16
Для чего нужен цвет, превращающийся в 0xFFFFFF? Дело в том, что яркость красного канала в 2812 недостаточна для формирования белого цвета при равных значениях в регистрах скважности, поэтому во всей палитре я применяю корректировку баланса белого. Т.е. цвет (5, 5, 5) у меня транслируется не в 0xFFFFFF, а, например, в 0xFF8080. А вот этот дополнительный цвет в палитре как раз позволяет включить диоды «на полную», если это вдруг понадобится.

Вообще, оригинальная идея была такая — я заказал две 5 м катушки ленты по 300 диодов каждая, из которых хотел сделать матрицу 30х20 с шагом между диодами 16.67 мм. На полученном экране можно было бы сделать, например, игру в тетрис =) Но пока экран не реализован из-за нехватки времени, есть только код, выводящий «изображение» на линию из 600 диодов 50 раз в секунду.

Да, на счет частоты шима — нет, не упирался. 2 КГц — это весьма много, получить артефакты можно только если выводить какое-то быстромигающее изображение. Если изменение яркости будет плавным, вряд ли глаз заметит какие-то артефакты.
+
avatar
+1
Но зато я столкнулся с другого рода артефактами — поскольку у меня вывод сделан на прерываниях, он идет параллельно с работой программы. И получается эффект, знакомый многим спектрумистам — например, я запускаю вывод, после чего начинаю обновлять экран программно. Какая-то часть пикселей успевает быть переданной в 2812 в необновленном виде, а какая-то — уже в обновленном. Таким образом, первая часть отображает «предыдущий кадр», в то время как остальная — текущий. Это выглядит как неприятный «излом» в бегущей строке, например. Можно, конечно, организовать два frame buffer'а, и выводить и рисовать всегда в разные, но это потребует еще 600 байт ОЗУ, оставив для самой программы лишь 848 байт.

С этой точки зрения мой второй вариант вывода (5 линий сразу по 120 диодов каждая) лучше, т.к. обновление экрана и работа программы никогда не приходятся на одно и то же время, но он требует полного запрещения прерываний, что не позволяет, например, опрашивать ИК-приемник или работать с другими interrupt-driven устройствами.
+
avatar
0
Я на esp32 с другой проблемой столкнулся: там у стандартной библиотеки адафруитовской начинаются глюки с цветами: передает, видимо, через буфер кусками и у начального бита очередного куска ползет тайминг…

Фаст лед тупо вешает контроллер.

Найденная альтернативная библиотечка — использует кусок api для ик-передатчика и у того из-за ограничения на расшариваемую память ограничение — после 22 пикселя ошибка по памяти…

Как итог — плюнул и впаял промежуточный контроллер на атмеге для экрана.
+
avatar
0
передает, видимо, через буфер кусками и у начального бита очередного куска ползет тайминг…
Может как раз дело в прерываниях? Начинает передавать, и в этот момент приходит прерывание, тайминги нарушаются.
Я бы поковырял исходный код библиотеки (если он доступен).
+
avatar
  • alex722
  • 12 февраля 2018, 00:05
-1
По факту, подобные матрицы только для «поиграться». Как только появляется серьезный проект, всё глохнет на этапе проектирования из-за огромных проблем с управлением большим количеством пикселей.А также низкой ремонтопригодностью. Альтернатива — стандартные ледпанели, которые уже обозревались на Муське. Например за те же 25долл можно купить прекрасную панель размером 16х32см разрешением 16х32 (Р10) или 32х64 (Р5) пикселей.
+
avatar
  • Win95CIH
  • 12 февраля 2018, 09:13
0

Вроде вот так рекомендуют подключать, т.е. питание разделять.
Можете привести пример, как прикрутив датчик, выводить его показания на матрицу?
P.S. У вас схема питания неверно нарисована, вывод IOREF тут совсем не причём…
+
avatar
0
Да, вы правы, такой вариант лучше( я его после применял)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.