RGB LED матрица 64x32

 
+
-
edit
 

Balancer

администратор
★★★★★
Пришла китайская RGB-матрица :)

Free shipping Led Display P5 32*64 Pixles 320*160mm 64x32 1/16 scan indoor rgb full color hub75 SMD p5 led display module-in LED Displays from Electronic Components & Supplies on Aliexpress.com | Alibaba Group

Cheap led display module, Buy Quality smd p5 directly from China led display p5 Suppliers: Free shipping Led Display P5 32*64 Pixles 320*160mm 64x32 1/16 scan indoor rgb full color hub75 SMD p5 led display module //  www.aliexpress.com
 

Неплохо, дошла за 15 дней с момента заказа.

Буду вешать в коридоре для всякой инфо при выходе из дома. Погода, напоминалки, предупреждения, что газ не погашен и т.п. :) Сейчас прицепил для теста через Arduino Mega. На Uno не хватает памяти, на ESP8266 — выводов (нужно 13).

В реальной работе, наверное, подключу к STM32 и буду связь держать через ESP8266.
Прикреплённые файлы:
 
 44

  • Balancer [19.05.2017 20:20]: Назначено лого темы: /files.balancer.ru/forums/attaches/2017/05/19-4993117-photo-2017-05-19-20-19-20.jpg
+
-
edit
 

Balancer

администратор
★★★★★
Коротко впечатления по матрице.

Запитывал от внешнего лабораторного БП. Жрёт в режиме ожидания (все светодиоды чёрные) 70мА. При работе с простым текстом, в среднем, порядка 600мА. Если засвечивать все светодиоды, то потребляет до ~1.7А и перестаёт. Этого тока не хватает и вместо полной яркой белой заливки получается полутонная жёлтая :) Заявлена пиковая потребность 5В 4А, у меня БП выдаёт 5А при напряжении до 32В, но тут всё почему-то утыкается на ~1.7А. Может, провода питания?

Но при отсутствии полной заливки, с обычным текстом, как писал, ток редко превышает 600мА и почти никогда — 1.2А. Т.е. старого телефонного БП 5В 2А должно хватить.

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

Вот нормально заставить её работать с Arduino Uno так и не смог. Примеры для мелких матриц, типа 32x16 работают, но изображение расползается. 64x32 ни в одном тесте не завелось. Только потом уже прочёл (а сам не догадался, отвык уже от особенностей такой мелочи) 64*32*3 = 6144 байт, так что полноценный RGB-буфер по байту на канал в Arduino Uno с его 2кБ не запихнуть. В то время, как 32*16*3 = 1536 байт, что уже влезает. А без буферизации примеры не заработали. Может, там в самой библиотеке без буфера никак? Не разбирался. Поэтому, как и писал в топикстарте, для теста перешёл на Arduino Mega. Там завелось почти сразу.

Теперь буду пытаться подключить к STM32 :) Скорее всего, придётся ставить преобразователи уровней. Матрица может не завестись на 3.3В сигналах. Но буду ещё экспериментировать.
 44
+
-
edit
 

Monya

опытный

Balancer> Буду вешать в коридоре для всякой инфо при выходе из дома. Погода, напоминалки, предупреждения, что газ не погашен и т.п. :) Сейчас прицепил для теста через Arduino Mega. На Uno не хватает памяти, на ESP8266 — выводов (нужно 13).
Balancer> В реальной работе, наверное, подключу к STM32 и буду связь держать через ESP8266.
О, все хотел у кого-нибудь спросить - а как она на улице против яркого солнышка смотрится?
У меня как раз мыслишки были на ней табло сделать цифровое, чтоб когда показания в норме - цифры зеленые, за предупредительную уставку вышли - желтые, за аварийную - красные. Только висеть эта штука должна на улице, причем вечером на эту стенку солнышко светит.
 49.0.2623.11249.0.2623.112
+
-
edit
 

Balancer

администратор
★★★★★
Monya> О, все хотел у кого-нибудь спросить - а как она на улице против яркого солнышка смотрится?

Теоретически должно быть хорошо видно. Светит ярко, поверхность чёрная, каждый светодиод под козырьком сверху. Но конкретно у меня исполнение для внутреннего использования, не для уличного. Без водостойкости.

Monya> причем вечером на эту стенку солнышко светит.

Как осилю соединение с STM32 (а работы там непочатый край, библиотека сильно под Arduino заточена, много придётся переписывать и ещё больше — разбираться с самим STM32 :)) — могу попробовать на улице под солнцем сфотографировать :)
 44
+
-
edit
 

Monya

опытный

Balancer> Теоретически должно быть хорошо видно. Светит ярко, поверхность чёрная, каждый светодиод под козырьком сверху. Но конкретно у меня исполнение для внутреннего использования, не для уличного. Без водостойкости.
Так это не проблема, тем более мне все равно придется изделие в коробку взрывозащитную ставить - там категорийная зона. (уже присмотрел по габаритам с прозрачной крышкой, а она по защите от внешних воздействий так вообще IP65)
Monya>> причем вечером на эту стенку солнышко светит.
Balancer> Как осилю соединение с STM32 (а работы там непочатый край, библиотека сильно под Arduino заточена, много придётся переписывать и ещё больше — разбираться с самим STM32 :)) — могу попробовать на улице под солнцем сфотографировать :)
Умгу, было б неплохо
 49.0.2623.11249.0.2623.112
+
-
edit
 

Monya

опытный

Balancer> Запитывал от внешнего лабораторного БП. Жрёт в режиме ожидания (все светодиоды чёрные) 70мА. При работе с простым текстом, в среднем, порядка 600мА. Если засвечивать все светодиоды, то потребляет до ~1.7А и перестаёт. Этого тока не хватает и вместо полной яркой белой заливки получается полутонная жёлтая :) Заявлена пиковая потребность 5В 4А, у меня БП выдаёт 5А при напряжении до 32В, но тут всё почему-то утыкается на ~1.7А. Может, провода питания?
А померять напругу при полной нагрузке прям на матрице и прям на блоке питания нечем? Вот и увидишт падение на проводе. Хотя может она как-то в коротких пиках жрет большие токи - тогда может большая емкость прям на матрице спасет отца русской демократии?
Balancer> Теперь буду пытаться подключить к STM32 :) Скорее всего, придётся ставить преобразователи уровней. Матрица может не завестись на 3.3В сигналах. Но буду ещё экспериментировать.
Ну если совсем для эксперимента, то можно обойтись диодами с резистором, если преобразователей уровня нет и перейти надо. Так, на скорую руку, для проверки. Навсовем, конечно, я б так не делал, но для макетирования подходит. Когда надо проверить срочно, а микросхем нет, вполне работает. Если интересно - вот (диод любой слаботочный ВЧ, 1N4148 вполне пойдет, он же КД522, без VD2 в принципе можно обойтись, он есть на любом входе КМОП микросхемы по определению, на схеме просто для страховки):
Прикреплённые файлы:
LogicLevel.jpg (скачать) [1236x1035, 86 кБ]
 
 
 49.0.2623.11249.0.2623.112
+
-
edit
 

Balancer

администратор
★★★★★
Monya> Ну если совсем для эксперимента, то можно обойтись диодами с резистором, если преобразователей уровня нет

Да есть, давно накуплено и с запасом, благо, они копейки стоят :)
 44
+
-
edit
 

Balancer

администратор
★★★★★
Для переписывания Arduino-библиотеки под сабж на STM32 разбираюсь с ней. Открыл совершенно новую для себя вещь :D

Матрица не имеет встроенного управления яркостью. Фактически она получает в несколько проходов битовые массивы вкл/выкл для каждого светодиода. 2048 светодиодов в 16 блоков, по 128 значений в каждом. Как передаётся конкретное значение — пока не разбирался. Интересное не в этом :)

Регулировка яркости осуществляется через PWM (ШИМ). Но 2048 светодиодов рулить через ШИМ/PWM — это ж сколько ресурсов нужно!

Так вот, в библиотеке матрицы используют некую модификацию PWM — Binary Code Modulation:

Batsocks - LED dimming using Binary Code Modulation - Introduction

Page 1/5 of the "LED dimming using Binary Code Modulation" article. This page introduces the "LED Binary Code Modulation" article. It introduces the fact that a rapidly blinking LED will appear dimmed to the eye. It also introduces the term "Duty Cycle".. //  www.batsocks.co.uk
 

На пальцах всё понятно. Вместо того, чтобы, как в PWM выставлять 1, ждать период скважинности, выставлять 0 и ждать полный период мину период скважинности, мы выставляем значение бинарного бита с выводимого уровня и ждём время, пропорциональное значению этого бита:

Для 4-х битного числа 0b1101 = 0xD = 13 (и, соответственно, скважинность 13/15):

При высокой частоте повторения это ничем для глаза не отличается от PWN с линейной скважинностью, но заявляется, что так нагрузка на процессор не зависит от числа каналов.

То есть, у PWM нагрузка на процессор:

- Не зависит от разрешения
- Зависит от числа каналов

У BCM:

- Не зависит от числа каналов
- Зависит от разрешения

Практика показывает, что Arduino отлично справляется. У матрицы 64x32 и 2048 светодиодов максимальная частота обновления где-то на уровне 100Гц.

Но почему получается независимость от числа каналов я пока не понимаю :) В моём представлении всё равно задержка на каждый канал же должна рассчитываться индивидуально. Что-то я недопонимаю...

Ещё ссылки по этому методу (на русском — нет)

Using Binary Code Modulation to control LED brightness

Pulse Width Modulation is definitely the preferred method of dimming an LED with a microcontroller, but we were interested in hearing about a different method called Binary Code Modulation. BCM do... //  hackaday.com
 

4-bit angle modulating 16 LEDs using Arduino and shift registers

So in this article we’re extending the previous example where we learned how to drive 16 LEDs using three pins of the Arduino. //  medium.com
 

BCM and Exponential Duty Cycle improve LED intensity levels

Having seen great success with my Larson Scanner I wanted to look around and see if there was room for improvement. I want to make it expandable and I knew I needed to work on the timing to get eno... //  jumptuck.com
 
 44
RU Balancer #20.05.2017 15:21  @Balancer#20.05.2017 15:17
+
-
edit
 

Balancer

администратор
★★★★★
Ага, вижу первый упущенный ранее момент. Для честного PWM при 16 градациях сигнала при выводе массива нужно переключать состояние 16 раз за период. И выводить массив, соответственно, 16 раз. При BCM нужно 4 раза, хотя и с разной периодичностью.

При 256 градациях, соответственно, 256 раз и 8 раз.
 44
RU Balancer #20.05.2017 15:40  @Balancer#20.05.2017 15:21
+
-
edit
 

Balancer

администратор
★★★★★
И, да, понятно также, почему нужно много памяти. Потому что вся работа идёт с буфером памяти и его содержимое сбрасывается периодически на матрицу для организации BCM. Без регулировки яркости можно бы было обновлять только отдельные плоскости. 2 пиксела в высоту, 64 в ширину, по биту на каждый цветовой канал, памяти нужно было бы только 2*64*3/8 = 48 байт :)

Можно будет спортивного интереса ради потом попробовать написать такую примитивную библиотечку. Хотя практического смысла мало, всё равно, как я понял, Adafruit GFX, через которую выводят тексты и фигуры, работает только с байтовым массивом. Хотя, нет, как-то же оно работает с цветными LCD-дисплеями 320x240 на Arduino Uno :)
 44
+
-
edit
 

Balancer

администратор
★★★★★
Monya> А померять напругу при полной нагрузке прям на матрице и прям на блоке питания нечем?

У меня там как — к БП крепятся крокодилы, крокодилами я подцепился на провода питания матрицы. Измерил сейчас на крокодилах — 4.65В при обычной нагрузке и... 2.8В при пиковой! Вот такие проводочки у БП :D

Прикрутил провода матрицы сразу на выход БП — 4.99В и 3.98А на максимальном белом цвете. Впервые услышал, что БП какой-то звук издаёт :) Даже интересно, насколько круглое число, почти точно заявленные 4А :)
 44
+
+1
-
edit
 

Monya

опытный

Balancer> У меня там как — к БП крепятся крокодилы, крокодилами я подцепился на провода питания матрицы. Измерил сейчас на крокодилах — 4.65В при обычной нагрузке и... 2.8В при пиковой! Вот такие проводочки у БП :D
Balancer> Прикрутил провода матрицы сразу на выход БП — 4.99В и 3.98А на максимальном белом цвете. Впервые услышал, что БП какой-то звук издаёт :) Даже интересно, насколько круглое число, почти точно заявленные 4А :)
Ну так 4 А - вполне себе нехилый ток уже. Если провода достаточно длинные - то сечение хотя б 1 квадрат надо брать
А источник наверняка ж импульсный. Вот и запел, когда на нормальную мощность заработал. Ток, я так понимаю, обычным тестером мерялся. В пичках может и поболе быть - возможно (без осциллографа хрен увидишь), что токовая защита у источника начинает подрабатывать. Вот источник и поет.
 49.0.2623.11249.0.2623.112
+
-
edit
 

Balancer

администратор
★★★★★
Разбираюсь с низкоуровневым программированием матрицы. Это жесть! :D

Логика работы такая.

Матрица фактически разделена на два блока, верхние 16 строк и нижние 16 строк. В первые пишут через R1, G1 и B1, во вторые, соответственно, через R2, G2 и B2.

Одновременно светится только одна строка. Для полноценного свечения нужно просто организовывать развёртку. Фактически памяти там в каждой половине экрана — один сдвиговый регистр + выбор адреса, куда ему светить.

Сигналом LAT (пиком высокого уровня) сигнализируем, чтобы сдвиговый регистр принял строку данных. Дальше в цикле 64 раза выставляем данные (R1,G1,B1,R2,G2,B2) и запихиваем их низким импульсом CLK. Сразу в оба сдвиговых регистра.

Входами A, B, C, D выбираем строку, в которой светится этот сдвиговый регистр. Точнее, будут светиться две строки, в первой и второй половинах.

Для того, чтобы избегать мерцания и призраков, высоким уровнем OE на время манипуляций можно гасить отображение.

Т.е. полный цикл выглядит примерно так:

code cpp
  1.  
  2. // Цикл по строкам в каждой половине экрана
  3. for(int row=0; row<16; row++)
  4. {
  5.     // Вырубаем отображение
  6.     digitalWrite(OE, HIGH);
  7.  
  8.     // Указываем принять данные
  9.     digitalWrite(LAT, HIGH);
  10.     digitalWrite(LAT, LOW);
  11.  
  12.     // Цикл вывода светодиодов в строке
  13.     for(int i=0; i<64; i++)
  14.     {
  15.         // Выставляем биты включения светодиодов
  16.         digitalWrite(R1, r1);
  17.         digitalWrite(G1, g1);
  18.         digitalWrite(B1, b1);
  19.         digitalWrite(R2, r2);
  20.         digitalWrite(G2, g2);
  21.         digitalWrite(B2, b2);
  22.  
  23.         // Отправляем выставленное значение
  24.         digitalWrite(CLK, LOW);
  25.         digitalWrite(CLK, HIGH);
  26.     }
  27.  
  28.     // К этому месту строка светодиодов загружена
  29.  
  30.     // Выставляем адрес для отображения
  31.  
  32.     digitalWrite(A, row & B00000001);
  33.     digitalWrite(B, row & B00000010);
  34.     digitalWrite(C, row & B00000100);
  35.     digitalWrite(D, row & B00001000);
  36.  
  37.     digitalWrite(OE, LOW);
  38. }


Правда, в таком виде цикл вывода будет работать ОЧЕНЬ медленно (digitalWrite работает медленно!), экран будет очень тёмный и будет мерцать, т.к. заполнение матрицы будет происходить бОльшую часть времени.

Для ускорения работы нужно делать запись сразу всего блока цветов одной записью в регистр. Например, в случае MEGA вешаем R1,G1,B1,R2,G2,B2 на, соответственно, 24,25,26,27,28 и 29 пин. И тогда это будут биты со 2 по 7 регистра PORTA. А CLK пусть висит на 11 порту, это 5 бит PORTB. Внутренний цикл станет примерно таким:

code cpp
  1.     // Цикл вывода светодиодов в строке
  2.     for(int i=0; i<64; i++)
  3.     {
  4.         // Выставляем биты включения светодиодов (младшие два бита обнуляются)
  5.         PORTA = (r1<<2) | (g1 << 3) | (b1 << 4) | (r2 << 5) | (g2 << 6) | (b2 << 7);
  6.  
  7.         // Отправляем выставленное значение
  8.         PORTB &= ~0x20; // pin 11, bit 5
  9.         PORTB |= 0x20; // pin 11, bit 5
  10.     }


Вот в таком виде оно будет выводиться очень быстро! Хотя яркость будет не максимальной, так как заметную часть времени экран будет погашен через OE. Можно после включения OE добавлять небольшую паузу, тогда мерцания будет чуть больше, но и яркость станет выше. Тут надо будет ещё поэкспериментировать :)

Например, если потребна максимальная яркость, можно вообще не использовать гашение по OE.

...

Конечно, всё это уже реализовано в готовой библиотеке, но под STM32 её надо радикально переписывать :) Так что пришлось разобраться, как оно работает.
 44
+
-
edit
 

Balancer

администратор
★★★★★
Balancer>> Матрица может не завестись на 3.3В сигналах. Но буду ещё экспериментировать.
Monya> Ну если совсем для эксперимента, то можно обойтись диодами с резистором

Похоже, 3.3В, таки, не тянет :) Слепил простенький тест для STM32 — моргает всяким мусором, но не осмысленной информацией. С подтяжками экспериментировать не буду, в дороге идут 2x8 канальных преобразователя. На самом деле есть штук 10 4-х канальных, но неохота городить огород из 4-х таких штук :)
 44
+
-
edit
 

Monya

опытный

Balancer> Разбираюсь с низкоуровневым программированием матрицы. Это жесть! :D
Balancer> Логика работы такая.
Ага, еще чуть чуть и до ассемблера дойдет :D:D:D
 49.0.2623.11249.0.2623.112
+
-
edit
 

Balancer

администратор
★★★★★
Monya> Ага, еще чуть чуть и до ассемблера дойдет :D:D:D

Даже до чистого С++ вряд ли. Смысл? :) Я от чистого ассемблера ещё где-то во времена 80486 отказался, когда понял, что хорошие компиляторы Си/Си++ создают код сравнимый с моим. Понятно, что я могу написать код более оптимальный. Но на написание такого кода требуется даже не на порядок, а на два порядка времени больше, чем на ЯВУ. А выигрыш составляет от десятка процентов до «единиц раз». При чём в тот период производительность процессоров сама росла вдвое за два года :) А сейчас с однокристаллками такая же фигня. Пока будешь заниматься оптимизацией под какой-нибудь ESP8266, уже ESP32 выходит :D И всегда можно вместо гипероптимизации какого-нибудь Atmega168 тупо взять STM32 :D
 44
+
-
edit
 

Monya

опытный

Balancer> Даже до чистого С++ вряд ли. Смысл? :)
Роман, если шо, это сарказм был. Я ж блин не всерьез :) . Уже и приколоться нельзя.
 49.0.2623.11249.0.2623.112
+
-
edit
 

Balancer

администратор
★★★★★
Возиться с STM32 так руки и не доходят. В результате сегодня плюнул, и спаял шилд к Arduino Mega. В смысле, готовое решение «воткнул и включай». Лучше пока данные на Мегу буду скармливать по NRF24L01 или даже через ESP8266 :) А потом когда-нибудь, может, и на STM32 сделаю.
 44
Последние действия над темой

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru