И что меня удивило — в качестве устройства отображения использовались древние одноцветные светодиодные матрицы 8х8 с шагом 5 миллиметров. Причём под них разводились сложные печатные платы, делалась софтовая динамическая индикация. И это в то время, когда уже давно доступны по цене в районе 10-20$ готовые полноцветные LED панели 64х32 с шагом 3 мм. А общий ассортимент подобных панелей очень большой и имеет шаг пикселя от 2 до 10 мм и практически любой размер.
В то же время использовать такие панели в DIY конструкциях достаточно непросто — готовые контроллеры стоят довольно больших денег и не имеют нормального API. Сделать же достаточно быстрое сканирование панели на обычно используемых в DIY микроконтроллерах достаточно сложно. Причём временные интервалы должны выдерживаться с высокой точностью — иначе начинается заметная неравномерность яркости.
Есть неплохие решения на Adafruit, но они все достаточно дорогие и сложные.
После некоторого раздумья возникла мысль — а почему бы не сделать предельно недорогую плату, которая будет мостом между обычной копеечной платой типа ардуино и LED панелью? После какой-то пары месяцев возни родилось что-то работающее.
В данной статье описана вторая, улучшенная версия контроллера.
Задача
В качестве базовой задачи хотелось иметь возможность управлять сборной панелью общим размером хотя бы 64х64, имея при этом возможность работы хотя бы в Highcolor (RGB565) с сохранением приемлемой частоты обновления экрана (не менее 50Гц). В первой версии контроллера базовая задача была полностью реализована, но возникла идея реализации задачи другим, весьма многообещающим методом, из чего и родилась вторая версия.
Базовые пояснение по устройству типовой LED панели
На входе интерфейс HUB75:
На каждом входе цвета стоит цепочка регистров типа HC595 (но специальные 16-ти канальные версии для светодиодов). Регистров столько, чтобы хватало на ширину панели. Входы клока, параллельной загрузки и разрешения выхода общие для всех регистров. Входы ABCDE — это выбор ряда — идут на обычный дешифратор.
Принцип работы:
- выставляем данные на RGB входы, щелкаем клоком CLK. Повторяем, пока не загрузим всю строку
- выключаем выходы OE = 1 (чтобы помех не было)
- выдаём на дешифратор номер загруженного ряда
- щелкаем параллельной загрузкой LAT — данные строки переносятся в выходные регистры
включаем выходы OE = 0 - повторяем для следующего ряда
То есть классическая динамическая индикация. Понятно, что при таком методе за один такой цикл мы можем каждый конкретный светодиод только включить/выключить.
Для того, чтобы получить градации яркости классическим PWM, такой цикл приходится повторять N-1 раз, где N — число градаций яркости (256 для RGB888). А учитывая, что при этом это всё еще и мерцает — всё это надо делать очень-очень быстро.
Есть обходной вариант — Bit Angle Modulation (BAM). При этом время свечения в каждом цикле пропорционально весу отображаемого бита. То есть для RGB888 надо всего 8 циклов отображения. Чуть более детально — здесь.
В первой версии контроллера использовался классический PWM, что накладывало жёсткое ограничение на количество циклов сканирования. Во второй версии реализован BAM, что дало огромный выигрыш в скорости.
Реализация
Совершенно очевидным было то, что обычный микроконтроллер тянет только маленькие панели — на большие просто не хватает скорости. Поэтому без CPLD или FPGA здесь не обойтись — выдавать десятки МБ/сек на недорогих микроконтроллерах физически невозможно.
В качестве памяти мне на форуме IXBT порекомендовали очень интересную FIFO память Averlogic AL422B, которая имеет примерно 400кбайт памяти и может работать на частотах до 50МГц.
Учитывая, что моим основным требованием была максимальная дешевизна компонентов, чтобы готовая платка была доступна самодельщикам — была выбрана Altera EPM3064 — CPLD c 64мя макроячейками. В то же время столь малое количество макроячеек не позволяет сделать динамически конфигурируемую плату — конфигурацию необходимо компилировать непосредственно в CPLD.
> Получившаяся схема лежит здесь
Детали:
- CPLD EPM3064ATC44-10 — цена на Ali примерно 13-15$ за десяток
- FIFO RAM AL422B — цена на Ali примерно 15$ за десяток
- Кварцевый генератор на 50МГц. На плате предусмотрена установка в корпусах DIP14/DIP8/7050. Цена на Ali примерно 6-7$ за десяток
- Стабилизатор на 3.3В в корпусе SOT223. Цена в Чип и Дип — 40р за штуку
- Разъем IDC-10MS. Цена в Чип и Дип — 3 р/штуку
- Разъем IDC-16MS. Цена в Чип и Дип — 8 р/штуку
- Разъём IDC-14MS. Цена в Чип и Дип — 7 р/штуку
- Конденсаторы 1мкФ 0805 — 8 штук примерно по 1 р/штуку
- Конденсатор 0,1мкФ 0805 — примерно по 1 р/штуку
- Резистор 10к 0805 — копейки
Итого по деталям получается 1,5+1,5+0,7=3,7$ и 40+3+8+7+8*1+1=67 р. Всё вместе в пределах 5$ — копейки.
> Исходный рисунок платы лежит здесь
> Подготовленные gerber файлы для заказа
Плата подготовлена для первой версии, в которой не было управления RE. Для использования её со второй версией надо разрезать перемычку между выводами 23 и 24 AL422B и бросить проводок от вывода 28 EPM3064 (он выведен на контактную площадку) на вывод 24 AL422B.
При пайке платы не забыть запаять перемычки на питание на обратной стороне платы.
Расчёты
Расчёты нужных параметров довольно сложны.
Дело в том, что в контроллере параллельно выполняются два процесса — загрузка данных следующей строки / индикация уже загруженной строки.
Запускаются процессы одновременно, но заканчиваются в разное время, поэтому процесс, выполненный быстрее, ждёт завершения работы более длинного процесса.
> Для расчёта была сделана Excel-табличка
Исходные данные:
- CRYSTAL_FRQ (MHz) — частота генератора (50 МГц)
- PIXEL_COUNT — количество пикселей в строке загрузки. Более детально в разделе коммутации
- RGB_INPUTS — количество RGB входов, используемых в HUB75E интерфейсе используемой панели. 1 или 2
- BYTES_PER_PIXEL — байт на пиксель. В нашем случае всегда 3 — RGB888
- SCAN_LINES — количество линий сканирования в используемой панели. 8/16/32
Подбираемые параметры:
- PRE_DELAY — задержка от сигнала LAT до включения OE, задаётся в тактах
- PRESCALER — прескейлер для основного счётчика. То есть если прейскейлер 8 и вес текущего бита 4, то OE будет включено на 8*4 = 32 такта
- POST_DELAY — минимальная задержка от выключения OE до следующего сигнала LAT, задаётся в тактах
Например, у нас панель 32х32, имеющая 8 линий сканирования и 2 RGB входа. Такая панель имеет два HUB75E разъема, то есть физически это две панели 32х16. Мы соединяем эти панели последовательно, то есть логически эта панель будет выглядеть как 64х16.
PRE_DELAY и POST_DELAY — это интервалы гашения до и после output enable (OE) для того, чтобы мультиплексоры успели переключить выходы и ключи открыться/закрыться. Без них будут «тянучки» от горящих пикселей на соседние строки. Значения подбираются экспериментально для конкретной панели. Обычно достаточно 15 тактов (задаются в тактах).
Тут возникает вопрос выбора prescaler — как его выбрать.
Малое значение прескейлера даёт малое время отображения кадра, но уменьшает общую яркость. Большое значение прескейлера увеличивает время отображения кадра, то есть при переборе приводит в мерцанию экрана.
Попробуем PRESCALER = 1
Получим:
OE_EFFICIENCY — 8,3% то есть панель будет работать всего на 8.3% от возможной максимальной яркости
FRAMES_PER_SECOND — 2034 к/с — зато частота обновления картинки будет огромной — больше 2000 к/с.
Потеря яркости уж очень большая.
Попробуем PRESCALER = 16
Получим:
OE_EFFICIENCY — 72,9% то есть панель будет работать на 72,9% от возможной максимальной яркости
FRAMES_PER_SECOND — 1117 — и частота обновления картинки очень хорошая — больше 1000 к/с.
Ну вот, вполне нормально — эффективность больше 50% вполне нормальная и частота кадров очень хороша.
Общее эмпирическое правило — PRESCALER примерно в 8 раз меньше произведения PIXEL_COUNT*RGB_INPUTS
Ну и дальше считать и проверять.
Коммутация LED панелей
Все панели соединяются последовательно. Схема соединения: сперва справа-налево, потом снизу-вверх. То есть сперва соединяем горизонтали последовательно, потом выход нижнего ряда ко входу второго снизу ряда и т.д. до верхнего ряда.
Контроллер цепляется к правой нижней панели.
Бывают панели, которые имеют по два входных и два выходных разъёма. Такие панели по сути являются просто механической сборкой двух панелей по вертикали. Коммутируются как две независимые панели.
После сборки надо посчитать общую длину цепочки в пикселях — для этого смотрим — сколько всего панелей получилось в цепочке и умножаем это число на ширину панели в пикселях. Это число потом надо будет вбить в значение PIXEL_COUNT при конфигурации CPLD и в калькулятор таймингов.
Прошивка FPGA
Все необходимые файлы лежат на github. Скачивать нужно прямо папкой.
С сайта Altera после регистрации необходимо скачать и установить Quartus II 13.0sp1. Качать надо ИМЕННО ЭТУ версию — более новые версии уже не поддерживают серию MAX3000. Ломать её не надо — достаточно Web edition (free) версии. При скачивании не забудьте поставить галочки на поддержке MAX3000 и Programmer. На всякий случай предупреждаю — пакет большой, порядка двух гигов. Еще понадобится Altera USB Blaster — обычная цена на ali порядка 3$.
Открываем проект al422_bam.qpf. Слева открываем закладку файл и открываем файл al422_bam.v — это основной файл проекта. В нём надо настроить параметры:
Сколько RGB входов на панели — на панелях со входом HUB75 может быть 1 или 2 входа RGB. Выяснить — сколько именно входов можно таким способом — берём количество пикселей на панели по вертикали. Делим её на число линий сканирования (указано в обозначении панели как 8S, например). Делим на количество входных разъёмов (1 или 2). Например — у меня панель 32х32, сканирование 8S и два входных разъёма — 32/8/2=2 — значит два входа RGB.
`define RGB_outs 2
Сколько линий сканирования на панели — так как поддерживается стандарт HUB75E, то может быть до 32х. Количество линий сканирования обычно есть в названии панели в виде 8S/16S/32S соответственно.
Должна быть раскомментирована только одна нужная строка:
`define SCAN_x8 1
//`define SCAN_x16 1
//`define SCAN_x32 1
Общее число пикселей по горизонтали в цепочке. Считаются пиксели во всей цепочке панелей — см. раздел выше «Коммутация LED панелей»
`define PIXEL_COUNT 64
Фазы выходных сигналов. Наиболее типичная конфигурация такая — OE активен по низкому уровню (коммент снят), CLK работает по фронту (коммент стоит), LAT активен по высокому уровню (коммент стоит). Возможны всякие странные варианты. Выяснять какой именно у вас только экспериментальным способом или снятием схемы и поиском даташитов на используемые микросхемы).
//`define LED_LAT_ACTIVE_LOW 1
`define LED_OE_ACTIVE_LOW 1
//`define LED_CLK_ON_FALL 1
Пред и пост задержки сигнала OE относительно LAT и прескейлер для основного счётчика. См. выше.
`define OE_PRESCALER 16
`define OE_PREDELAY 31
`define OE_POSTDELAY 31
Всё, нажимаем ctrl-L — проект компилируется. Если нигде не напортачили — будет несколько warnings, но не должно быть никаких ошибок. Дальше цепляем спаянную плату к USB Blaster, подаём питание на плату. В Quartus идём в tools — programmer. Выбираем в Hardware setup USB-blaster, нажимаем Start. Всё, CPLD запрограммирована.
Микроконтроллерная часть
Выдача данных на контроллер, в общем-то, предельно проста — сбрасываем адрес записи и потом последовательно выдаём байты данных, стробируя их сигналом WCLK. И вроде бы даже банальной ардуинки хватит для работы. Но есть две проблемы:
а) Надо много памяти. Даже небольшая панель 32х32 в режиме RGB888 требует 3кБайта памяти под экранный буфер. Обычные ардуино на базе Atmega328 содержат всего 2кбайта оперативки. Можно, конечно, использовать плату Mega на базе Atmega2560, которая содержит аж 8 кБайт оперативки, но даже этого мало для панелей нормального размера — панель 128х64 в режиме RGB565 требует 16кБайт памяти.
б) В процессе работы с AL422B вылез не документированный нигде глюк — при записи данных со скоростью меньше 2МБ/сек счётчик адресов работает некорректно и пишет данные «не туда». Возможно это глюк имеющейся у меня партии. Возможно нет. Но этот глюк приходится обходить. Учитывая, что AVR8 работает на 16МГц, то получить с неё данные на нужных скоростях почти нереально.
Предлагаемое решение — уйти на дешёвые платки на базе 32-х битного контроллера STM32F103C8T6. Такая платка стоит на Ali примерно 2.5$ поштучно или около 1.7$ при покупке десятком, то есть дешевле даже Arduino Nano. При этом мы получаем полноценный 32-х битный микроконтроллер, работающий на 72 МГЦ и имеющий 20 кБ оперативной памяти и 64 кБ флеша (сравните с 2кБ/8кБ Atmega328, которая стоит на Nano).
При этом такие платы вполне успешно программируются в среде Arduino. Про это есть неплохая статья на гиктаймс, поэтому я не буду её дублировать. В общем — делайте всё, как описано в статье.
В среде ардуино выбирайте плату Generic STM32F103C, variant STM32F103C8. Данные идут через DMA, поэтому можно использовать любой вариант оптимизации.
Коммутация происходит по следующей схеме:
Жёстко прибиты в библиотеке:
A0..A7 > DI0..DI7 AL422B
B0 > WCLK AL422B
B1 > WRST AL422B
Назначается в скетче на контроллер:
B10 > WE AL422B
Общий провод:
G > GND
Ну и не забудьте подать питание 5В/GND от панели на соответствующие пины контроллера.
Распиновку разъема на контроллере брать со схемы.
Программная часть
Так как ставилась задача сделать всё максимально просто и доступно, то весь софт сделан под среду Arduino и оформлен в виде библиотеки LED_PANEL.
Библиотека LED-PANEL активно использует библиотеку Adafruit GFX, поэтому она должна быть инсталлирована.
Я настоятельно рекомендую не ставить библиотеку LED_PANEL в каталог libraries, а оставить её в папке со скетчем. Дело в том, что там много железно привязанных параметров и если вы захотите перенести работу на более «жирный» микроконтроллер, то придётся много чего менять в самом коде.
Инициализация идёт примерно в таком виде:
#include "LED_PANEL.h"
#define width 32
#define height 32
#define bpp 3
#define scan_lines 8
#define RGB_inputs 2
#define we_out_pin PB10
LED_PANEL led_panel = LED_PANEL(width, height, bpp, scan_lines, RGB_inputs, we_out_pin);
то есть создаём экземпляр класса LED_PANEL, для которого указываем параметры:
width — общая ширина панели в пикселях (всего)
height — общая высота панели в пикселях (всего)
bpp — байт на пиксель, 3 для RGB888. BAM версия работает только в RGB888
scan_lines — количество линий сканирования — 8/16/32. Должно соответствовать режиму, прошитому в контроллер.
RGB_inputs — количество RGB входов в разъеме HUB75 — 1/2. Должно соответствовать режиму, прошитому в контроллер.
we_out_pin — пин, к которому подцеплен вывод WE
Обращаю внимание, что при инициализации задаётся только пин WE. Все остальные пины прописаны жёстко в коде, так как они привязаны к используемым каналам таймера и DMA и их изменение повлечёт существенные изменения в коде.
Запуск и очистка экрана в разделе setup:
led_panel.begin();
led_panel.clear();
begin инициализирует нужные пины на выход, подключает таймер и DMA
clear очищает буфер
Для рисования можно использовать все стандартные процедуры библиотеки Adafruit GFX — от простейшего drawPixel до вывода текста. Для выдачи нарисованного в буфер используется процедуры:
led_panel.show();
В таком виде show инициирует передачу данных на контроллер по DMA и немедленно возвращает управление. Узнать — закончилась ли передача можно с помощью функции led_panel.OutIsFree() — если она говорит true, то значит передача закончилась. Есть особенность — если вызвать show, когда передача еще не завершилась — она будет просто проигнорирована.
led_panel.show(false);
аналог show(), но если вызвать show(false), а передача еще не завершилась, то процедура подождёт завершения передачи, потом начнёт новую передачу и вернёт управление:
led_panel.show(true);
аналог show(false), но если вызвать show(true), то после начала новой передачи процедура не вернёт управления до завершения передачи.
В общем-то — всё.
Некоторые замечания по софту:
а) Гамма-коррекция вводится при пересчёте цвета из RGB565 (который использует библиотека) функцией ExpandColor. Во всех прочих случаях используется линейная трансфер-функция, то есть яркость прямо пропорциональна значению.
б) Софт позволяет подключать несколько LED-контроллеров к одной микроконтроллерной плате. Для этого надо отдать на контроллеры параллельно шину данных, линии RST и CLK. Нужный контроллер выбирается через линию WE. В софте нужно создать отдельный экземпляр класса LED_PANEL для каждого контроллера, при этом у каждого экземпляра при инициализации должны быть указаны разные линии WE (последний параметр).
TO DO
— Разобраться с «наводкой» цветов на соседние ряды. Похоже на плохую разводку самой панели (ключи мусорят), но надо проверить. Только приехала новая панель — буду проверять;
— Сделать новую версию платы — с уже разведённым RE и добавлением выходных преобразователей уровней в 5В;
— Сделать класс META_LED_PANEL, который позволит объединять несколько LED_PANEL в один виртуальный экран — это даст возможность создавать очень большие экраны с несколькими контроллерами;
— В перспективе уйти на более мощную серию CPLD, например CycloneIV. Это бы существенно расширило возможности при сохранении невысокой стоимости (EP4CE6E22 стоит у китайцев порядка 5$ штука, при этом там в 100 раз больше макроячеек и порядка 32 кБ встроенной памяти). Но этим я буду заниматься когда-нибудь потом. Если захочу. Так как подобные разработки отнимают уж слишком много времени.
Комментарии (45)
Javian
19.01.2018 12:02В общем-то — всё.
Ожидал в конце фото «DIY проекта матричных светодиодных часов»
NordicEnergy
19.01.2018 12:39Не увидел тут в принципе необходимости в ПЛИС, а самое главное непонятно зачем вообще смотреть на таких мамонтов как MAX3000 и циклон 4й? Есть же новые MAX V за 90 центов и Cyclone 10LP или MAX10.
А саму задумку можно прекраснейшим образом реализоваться и на MSP432 или STM32. 100+ МГц шины у них есть, просто может пора уйти с микроконтроллеров, которым уже 20 с лишним лет?An_private Автор
19.01.2018 12:54+1> есть же новые MAX V за 90 центов
А где можно купить за такие деньги? 5M40 стоит в farnell 1,98евро поштучно. И это 40 ячеек. Надо больше. 5M80 — 3.38евро.
Я делал плату, компоненты для которой любой желающий сможет купить на ali за 5$ в сумме.Tabke
19.01.2018 13:04Я делал плату, компоненты для которой любой желающий сможет купить на ali за 5$ в сумме.
Вот спасибо за это. Хоть кто-то понимает что в DIY важно не качество компонентов, а их доступность.NordicEnergy
19.01.2018 13:10А можете поведать мне дураку, чем заказ на Али отличается от заказа на mouser? Ну кроме того, что с mouser компоненты будут через 4-5 дней уже в квартире.
Tabke
19.01.2018 13:41+1Цены выше, зато компоненты оригинальные конечно.
Но у меня проблема, что всякие маузеры и дигикеи не заточены для работы с обычными людьми, им предприятия подавай. Пару раз заказывал, доставка и налоги увеличили цену покупки в два раза где-то. И я не в России нахожусь, если что.NordicEnergy
19.01.2018 13:46+2Цены ниже, просто современных компонентов на али почти нет, только старье типа 4-х циклонов. А если и есть новые камни, то ценник на уровне того же mouser.
В России есть ПМ электроникс, они и с физ. лицами работаю и система скидок от предприятий распространяется (не реклама))). Если не с России, то уже не подскажу. Хотя в Минск и Финку я таскал с digikey и особых проблем не было.
В СНГ просто уже сложилось так, что DIY весь сводится к алишке, но в остальном мире данная площадка лишь малая часть, особенно в электронике. Меня это несколько огорчает))Tabke
19.01.2018 13:52Как раз в России с этим проще чем в Европе. Есть много кто, кто продает обычным людям поштучно, потому что DIY развито. В Европе приходиться всё с Китая покупать, магазины работающие с DIY энтузиастами, заламывают нереальные цены.
NordicEnergy
19.01.2018 13:57Если брать diy в целом, то да. Для ЧПУ приходилось все в Китае покупать, но вот с электроникой все проще. Работал в Австрии и щас в Финке и постоянно заказываю с digikey. 2 рабочих дня и курьер мне посылку приносит. Никаких проблем. Ну только если лень декларацию заполнять, то DHL и UPL за эту услугу возьмут 15 евро.
Lando
19.01.2018 20:46>Хотя в Минск и Финку я таскал с digikey и особых проблем не было.
Все хорошо с DigiKey в Минске, кроме доставки в 50$ и 30% за превышение 22 евро.
Притянул одну посылку через решипперов в России, да дешевле и быстрее. Но +12-15$. И напиши росийской таможне объяснительную, приложи копию и скришоты всего чего можно. Не понравилось.NordicEnergy
19.01.2018 20:51Я так понимаю доставка была DHL-ем? У них в последние пол года какие-то свои причуды на СНГ, но все равно пока таскают. Лучше работать с UPL, более адекватный сервис и доставка 28$ за коробку 700 гр. Копию паспорта + заявление у них пишется 1 раз и дальше они сохраняют их в базе и с данными вопросами не пристают.
Если написать в поддержку digikey и узнать почту своего менджера, то можно написать ему и попросить написать в инвойсе сумму поменьше. Если заказ до 300$, то ни разу не отказывали.Lando
19.01.2018 21:09Я так понимаю доставка была DHL-ем?
Не помню. Вроде. Но все равно других опций небыло. На самом деле мне проще дождаться когда кто-нибудь из коллег в командировку в Сан-Хосе поедет. Только это и спасает. Ну и Али. Но там выбор не то чтобы большой.
NordicEnergy
19.01.2018 12:59На digikey, тот же UPL оттуда без проблем таскает. Если пугает кей, то можно на mouser (чуть дороже 1,5$). Опять же ПМ электроникс официальный представитель в России и таскает без наценки в принципе. Там вроде еще и доставка по России курьером бесплатная.
На али мир не заканчивается.
P.S. Что забавно — даже в ЧиДе есть и доставка 2 недели, что чаще быстрее Али.
xztau
19.01.2018 13:08MAX (3000, II, V) это CPLD
Cyclone IV это FPGA
FPGA знатно дороже и сложнее.An_private Автор
19.01.2018 13:14Да, там ошибка, я изначально хотел уйти на MaxII — это как раз CPLD. Но потом глянул на CycloneIV и они мне понравились тем, что там достаточно внутренней RAM и цена вполне человеческая. А CPLD на FPGA поменять уже забыл. Там to do вообще уже не сильно актуален — пока статья мариновалась на модерации я уже успел и плату новую развести и заказать, и кое-что другое сделать.
x893
19.01.2018 16:24Работа огромная проделана!
Я когда то делал на основе этого
github.com/Frans-Willem/LEDMatrixHUB75
хотя сейчас наверное и более продвинутые есть.An_private Автор
20.01.2018 13:30Да, я видел этот проект. STM32F4, 96х48 пикселей, то есть примерно в два раза больше пикселей, чем у меня сейчас.
Можно и так, конечно, хотя мне мой вариант нравится заметно больше — у меня выдал данные с процессора в контроллер и вообще забыл про панель до изменения картинки :)
Ну и по расчётам мой вариант должен вытянуть при частоте обновления 100 Гц панель примерно 128х128
madf
19.01.2018 16:52Зачем так усложнять:
- http://lightportal.info/publ/videoehkrany_2d/rgb_32x16_ili_kak_podkovat_kitajskogo_drakona/8-1-0-111
- Когда есть вообще ws2812.
An_private Автор
19.01.2018 17:211. Цитата: «матрицы 32х16 RGB светодиодов (протокол HUB75, маде ин Чина), разобрался с её управлением (читай — подковал), добился на Atmege-328 4 бита градаций BAM для каждого пикселя без мерцания, что в теории означает 4096 цветов». У меня сейчас матрица 64x32 сканируется в полном RGB888 с частотой выше 1 кГц. Есть разница? Простые табло я делал еще лет 5 назад на STM32F103 с выдачей через FSMC (до 512х32 там было, насколько я помню).
2. WS2812 в несколько раз дороже и минимальный шаг 10 мм.madf
19.01.2018 18:15- Ща есть мелкий типоразмер 3535 (не 5050). Да и всё зависит от руки разводки.
An_private Автор
19.01.2018 20:44Есть. Еще в два раза дороже. Готовых панелей на них нет. Паять самому пару тысяч диодов? Причём с зазором меньше миллиметра? И получить панель с шагом 4.5мм, при этом готовые LED панели сейчас доступны от шага 2мм. Оно того стоит?
madf
20.01.2018 10:11Ну если руки из Ж и делать ничего не хотите (терпение), то нет.
На счет габаритов это неправда, все ваши панели под HUB гигантских размеров, причем стоят не копейки, а мытаринья с ними по обмену — куча.
Для FPGA нужен ещё программатор (не бесплатный) и опыт не малый для их применения (пока разберешься в этих финшуйских убеждениях (производитель/язык) — туча времени нужна (проходили).
На счет дорого — это всё голословно и относительно. Один ходит по помойкам побирается, другой топовое железо имеет (причем на халяву). В общем эту тему можно вообще не обсуждать, каждый делает как ему доступно. А обсуждать с стороны линии сборки — там всё дешевле выходит, от количества. :D Вот если бы всё было сделано на одной FPGA — может имело смысл.
Если разговор о телодвижениях, то проще на WS делать, причем там же из-за протокола/времени будет ограничение на количестве, можно многоканальный вывод делать одновременно… и панели круче смотрятся. Один недостаток — потребление, но чтобы его решить, проще самому делать с нуля матрицу.An_private Автор
20.01.2018 10:55+1> все ваши панели под HUB гигантских размеров
Что-то я стал сомневаться, что Вы с ними дело хоть когда-нибудь имели.
У меня на столе сейчас панель 64х32 с шагом 3 мм, это 192х96мм. Это огромная панель? Её цена с доставкой — 21$. Светодиоды там — 2121, кстати.
Теперь смотрим. WS2812B в версии 3535 стоят около 60$ за 1000 штук. Чтобы собрать аналогичную панель надо 2048 светодиодов, то есть где-то 130 баксов только на светодиоды. Если же берём самые маленькие на сегодняшний день APA102 2020, то 1000 штук их стоят каких-то 200$. То есть на 64х32 уйдёт всего-то каких-то 400$
Ну и мне очень хочется посмотреть — во сколько обойдётся соответствующая плата, шаблон для термопасты для неё, термопрофильная печь и всё прочее развлечение. Что-то подозреваю, что самодельная единичная панель 64x32 на APA102 2020 в итоге обойдётся примерно баксов так в 600-700.
И альтернатива — готовая панель с шагом 3мм за 22$ + платы (2$ за десяток при первом заказе на jlcpcb) + 5$ на детали + USB blaster за 3$. Итого 32$. Ну да, ну да, однозначно проще и дешевле на WS2812B делать, ну кто бы спорил :)dernuss
20.01.2018 15:35Насчёт размеров. Уж очень толстые они. С другой стороны можно свою плату внутрь засунуть.
Кстати какая толщина панели?An_private Автор
20.01.2018 15:42Там толстая рамка прикручена шурупчиками к обычной плате. Никто не мешает её открутить.
Моя плата сделана так, что на неё можно напаять разъем HUB75E мамой и воткнуть её прямо в плату панели. Тогда получается очень компактный бутерброд — плата оказывается внутри.
Точный размер рамки сейчас не скажу — панель лежит на работе сейчас.
mpa4b
19.01.2018 20:44Наводки цветов на соседние ряды могут быть из-за того, что в самой панельке ключи — это биполярные транзисторы и работают в режиме насыщения (эмиттер на шину питания или землю, в базу управляющий ток и на коллекторе нагрузка) и как следствие — медленно выключаются. Чтоб избавиться от наводок, надо сначала погасить ряд, потом переключиться на другой, потом зажечь новый. Ну или как-то так.
Это исходя из первого предположения (о том, что там биполярные транзисторы в режиме насыщения).An_private Автор
19.01.2018 20:45Цитирую статью:
PRE_DELAY и POST_DELAY — это интервалы гашения до и после output enable (OE) для того, чтобы мультиплексоры успели переключить выходы и ключи открыться/закрыться. Без них будут «тянучки» от горящих пикселей на соседние строки. Значения подбираются экспериментально для конкретной панели.
Psychosynthesis
20.01.2018 00:29Ну, кстати, круто! Выложите куда-нить новые платы, пожалуста.
An_private Автор
20.01.2018 09:46+1В смысле? Всё лежит на github
Герберы для самостоятельного заказа
Разводка в шестом sprint layout
Там еще добавлены выходные буферы 74HCT245PW — две штуки на плату. Платы заказаны, но еще не пришли, поэтому на практике не проверены.
Как придут — спаяю, проверю, выложу фотки и результаты проверки.
Hellsy22
Статья интересная и познавательная, но по-моему, автор ставит себе задачу подобную той, в которой укорил оппонентов — зачем решать проблемы с памятью и скоростью древнего Arduino, если более современные и при этом дешевые микроконтроллеры? Например: esp8266 или даже esp32 (хотя у него библиотеки сыроваты) — они обойдутся даже дешевле, чем получилось у автора.
An_private Автор
Более современные и дешёвые микроконтроллеры даже близко не догонят по производительности FPGA (CPLD). Например, максимальная скорость выдачи данных из STM32А103 по DMA, которую мне удалось получить — всего 5 МБ/сек. На CPLD я читаю 50МБ/сек без проблем. Понятно, что можно уйти на более жирные процессоры, но там и цены другие.
Кроме того, управление даже небольшой LED панелью съедает практически все ресурсы микроконтроллера. У меня была задача — сделать отдельную платку, в которую послал данные и забыл про обслуживание экрана.
NordicEnergy
Проблема не в МК, а в том, что вы ограничены в своих познаниях. Любой дешманский stm с FSMC + внешний сериализатор это 36 МГц * 16 бит или 72 Мб/с. И простешая работа как с внешней SRAM. И это все еще серия F1, если же взять самый дешевый F7, то все еще проще.
Можете показать хоть один проект, который у вас съел 64 кБ ОЗУ и 256 кБ флеша? Просто интересно увидеть такой код. Или это просто «диванная экспертиза»?
An_private Автор
И толку от этого комбайна? FSMC — это уже жирные чипы серий HD и XL. 6 каналов сериалайзеров обойдутся как несколько 3064.
Вы просто не понимаете саму задачу — сделать использование LED панелей не сложной задачей с использованием F4 или F7 процессоров, сложной настройкой FSMC и т.д., а типичной ардуино-задачей — подоткнуть десяток интерфейсных проводов к плате класса ардуины, скачать готовую библиотеку и использовать как угодно не заморачиваясь.
NordicEnergy
6$ за МК серии F1 это конечно дорого. Особенно если учесть, что все влезет в 50 строк кода. Про сложность настройки FSMC улыбнуло)) 6 регистров настроить это сверхзадача.
«Скачать готовую библиотеку» — не понятна суть. Чем отличается скачивание библиотеки с github-а для CPLD и для МК? В плане простоты и доступности оба варианта одинаково просты.
vagran
Вот тут есть подобный проект. Есть желание тоже попробовать реализовать, про такие панели только сейчас узнал, но с fpga заморачиваться не хочу. Там, кстати, автор пришёл к выводу, что FSMC ему не подходит и лучший вариант — DMA на GPIO.
NordicEnergy
Я честно говоря никогда не испытывал насколько шустро могут дергаться ноги у STM32 и подобных кортексов. Если скорости хватает, то DMA+GPIO тоже вполне себе метод. Просто я не очень люблю ногодрыг софтовый, но это мое мироощущение и не более)) FSMC позволяет минимизировать количество кода, а значит сделать проект более понятным для новичков DIYщиков.
Sun-ami
An_private Автор
Это впритирочку. То есть 32х32 еще выдадим с частотой порядка 50 Гц (а это мало для светодиодов — так как у них нет инерционности, то частоту лучше иметь не ниже 100Гц). А вот 64х32 уже частота падает ниже неприличности.
А мой контроллер на 100Гц тянет панель 128х128 в полном RGB888.
Sun-ami
Этот расчёт — для матрицы 64х64. Можно и 100Гц получить, со снижением яркости на 3%. А ещё BAM-метод можно использовать для уменьшения мерцания, если светить разные биты цвета в разных фазах, то есть сделать не 1 цикл перебора фаз за кадр, а несколько.
An_private Автор
А, да. Понял. Тут есть одна тонкость.
Когда я делал эту железяку, то мне очень не хотелось делать bit shuffling, который обязательно надо делать для режима «для бита с минимальным весом нам нужно защёлкнуть 6-битные данные цвета».
В таком режиме данные, относящиеся к одному пикселю, разбросаны побитно в 8 разных байтах экранного буфера. Поэтому, чтобы поставить одну точку надо считать из экранного буфера 8 байт, изменить в них по 3 бита и положить обратно в память. У меня данные одного пикселя лежат в трёх последовательных байтах, поэтому для защёлкивания 6-ти битных данных цвета надо забрать из памяти 6 байт. Поэтому при 50МГц выборке из памяти мы получаем частоту защелкивания данных в строку всего 50/6 = 8,3 МГц, что всего в два раза больше, чем может отдавать STM32.
Зато имеем очень простую, быструю и прозрачную работу с экранным буфером.
В общем-то, сделать версию, которая будет отдавать данные именно в таком видео и повысить скорость задвигания данных в буфер до полных 50МГц — как два пальца. Тогда размер обслуживаемой панели можно будет увеличить еще в 6 раз. То есть на 100Гц будет уже не 128х128, а 384х256, например.
Если вдруг кому-то будет сильно надо — сделаю — это можно сделать на том же железе легко :)
An_private Автор
опечатка «в таком виде», конечно, не «видео».
Sun-ami
Однако, даже если выводить на матрицу 64х64 видео 25 кадров/с — полнокадровый bit shuffling займёт всего лишь около 15% процессорного времени STM32F103, работающего на 72 Мгц. То есть можно просто формировать изображение в буфере вашего формата, а потом делать bit shuffling каждые 2 кадра — и всё равно в STM32F103 останется больше памяти и вычислительной мощности, чем в arduino. А можно сделать отдельный контроллер LED-матрицы на STM32F030, и подключить его к arduino по SPI. А для часов вообще непонятно, для чего нужна высокая скорость перерисовки. Но для панелей 128х128 или 384х256 — хорошее решение, только они пока стоят дорого.
Sun-ami
Ошибся, потеря яркости будет не 1,5%, а 7,8%. Но такая потеря яркости тоже на мой взгляд не критична. А уменьшить мерцание практически до уровня, который будет при частоте 100Гц, с той же потерей яркости можно, если светить старшие 4 бита с частотой 100Гц (то есть разбить их свечение на 2 цикла по фазам индикации), а младшие — с частотой 50Гц.