Делаем дисплей из адресуемых светодиодов

Если вам нужно сделать гирлянду, где переливается десяток-сотня светодиодов, то эта статья будет вам мало полезна. А вот если у вас несколько десятков тысяч светодиодов и вы еще собираетесь показывать кино с их помощью — тогда вам эта информация определенно сгодится. Тем более, что других источников вы, скорее всего, просто не найдете.

Для начала — объект управления. Уже всем набившие оскомину адресуемые светодиоды, которых уже очень много разных типов. Чисто китайская разработка, все остальное, если и имеется — дешевые подделки.



Много лет назад Nokia мечтала получить светодиоды с интеллектуальным управлением. Со светодиодами тогда не срослось, но кое-что она получила — это была микросхема LP5521, которая потребляя очень мало энергии, моргала светодиодиком по программе внутри, не требуя никакого внимания со стороны основного процессора телефона.
В итоге почти все производители телефонов ставили такую микросхему и она побила все рекорды продаж. Года за 2-3 было продано 100 миллионов микросхем.
Фирма разработчикам с таких барышей даже по кофточке выдала :)



Кофточка, кстати, оказалась очень хорошей — теплая и уютная.

Если помните, во многих телефонах в дежурном режиме переливался всеми цветами тускленький светодиодик, по-разному индицирующий разные события — это как раз та микросхема и работала.

Адресуемые светодиоды — это, конечно, совершенно другое. Просто цепь светодиодов, которыми можно управлять по одному проводу.



Очевидный недостаток — если один светодиод умирает — то все, что следуют за ним, перестают светится тоже. Вы наверняка такую ситуацию видели на рекламных дисплеях. Картинка ниже не надерганная из интернета, это один из наших дисплеев сдох.



В WS2813 эта проблема до какой-то степени решена с использованием двух линий данных — одна от выхода предыдущего светодиода, а вторая — от его входа. Если от выхода ничего нет — считаем, что предыдущий светодиод сдох и используем сигнал от его входа с задержкой на 1 пиксель. В итоге на экране будет одна неработающая точка — терпимо. Но если подряд умрет 2 светодиода — то погаснет вся линия.



Ставить конденсатор и резистор около каждого светодиода — головная боль. Но у производителя есть решение — светодиод со встроенным резистором и конденсатором. Но тут другая головная боль — как узнать при заказе, есть внутри конденсатор или нет? На названии светодиода наличие конденсатора никак не сказывается. Светодиоды размером 2020 с высокой вероятностью будут иметь конденсатор внутри.



Для программирования каждого пикселя нужно 24 бита — 8 бит на цвет. Управление яркостью производится с помощью ШИМ с частотой 2 кГц.



Светодиоды обычно бывают с двух типов по току — около 15-18 мА на светодиод или 5-7 мА. Для дисплеев 5мА подходят лучше, 15мА — слишком ярко. Приходится убирать лишнюю яркость за счет ШИМ. В итоге от 8 битов на цвет остается 6-7. Плюс человеческое зрение логарифмическое, а регулировка линейная. Для того, чтобы не искажать цвета при снижении яркости, необходимо использовать гамма-коррекцию.



От цветовой разрешающей способности вообще ничего не остается.



Недавно эта проблема была решена дико избыточно. Появились новые светодиоды — WS2816. У них уже 16 бит на цвет, частота ШИМ 10 кГц и впридачу ко всему встроенная гамма-коррекция. Но получается, что загружать их можно в 2 раза медленнее — при прежней скорости обмена передать уже нужно 48 бит вместе прежних 24.
Если было бы 10 бит на цвет со встроенной коррекцией — меня лично это устроило бы гораздо больше.

Еще одна проблема со светодиодами. Не знаю, обращали вы внимание или нет, но очень часто в холодную погоду изображение на рекламных дисплеях слегка краснеет. Дело в том, что световая отдача светодиодов зависит от температуры. И зависимость разных светодиодов разная. Зеленые и синие имеют более-менее одинаковую зависимость, а красные сильно другие. Если кому интересно, можете здесь прочитать, десятая страница.



Если вдруг соберетесь дисплей такого типа делать — выбирайте адекватного производителя панелей. Вот что пишут в спецификации:



Многие на это внимания не обращают, но это очень серьезно. Из-за влажности могут быть дефекты пайки. А когда последовательно стоит тысяча светодиодов и отказ любого из них приведет к отказу всей панели, причем, не сразу, а через какое-то время — панель придется демонтировать и ремонтировать. Это грустный опыт.

Теперь начнем считать. Скажем, мы хотим отображать 30 кадров в секунду. Значит, у нас есть время для загрузки линии 33.3 мсек. Частота сигнала для светодиодов — 800кГц. Для одной точки нужно 24 импульса — по 8 на каждый цвет. На загрузку пикселя уходит 30 микросекунд. Значит, за время отображения кадра можно загрузить 1111 пиксель. С учетом возможных временнЫх допусков, реально я использовал в линии до 1300 светодиодов.

Если используем готовые панели 16х16 точек — можно подключить к одной линии до 5 панелей — 1280 светодиодов. Можно и 4-мя ограничиться — будет 1024 точки.

Теперь поговорим про управление. Я с товарищем несколько лет назад делал систему управления такими дисплеями. Самый большой был вморожен в лед, размер — 9 на 9 метров, но разрешающая способность довольно низкая — 288х288 пикселей. Были дисплеи меньше размерами, но с бОльшим разрешением. Каждый микроконтроллер управлял или 8 или 16 линиями светодиодов, одновременно работало несколько контроллеров. Самый тяжелый случай был — 14 контроллеров по 8 линий. Но это была разработка на заказ, поэтому дополнительной информации по ней не будет. Кое-что без деталей реализации можно почитать здесь:
Большой дисплей. Замороженный проект



А сейчас вернемся к моей недавней статье про 5-баксовый Raspberry Pi Pico на базе RP2040. Может, припоминаете — мне хотелось сделать именно управление дисплеем на ее базе, из-за наличия возможности программирования машины состояния для управление вводом-выводом на собственном ассемблере, мне показалось, что реализовать управление таким дисплеем будет не просто, а очень просто. В деталях повторяться не буду, обзор можно прочитать тут

Будем делать систему управления для 16 линий — этого хватит для 20480 светодиодов. Если мало — добавляем микроконтроллеры, благо копейки стоят. Для небольшого рекламного дисплея должно хватить.
Не забудьте про блок питания — если у вас светодиоды на 15мА, то понадобится чуть больше 900 ампер — обычной USB зарядки может не хватить :), все-таки почти 5 киловатт. А если взять 5 миллиамперные светодиоды — то каких-то 1.5 киловатт. Если белым светом не злоупотреблять, то мощность можно существенно уменьшить.

Под спойлером самое важное в статье, остальное все — от лукавого и можно не читать. А этот код — это все, что действительно надо, остальное любой разработчик легко сам доделает.

Дополнительная информация
Итак, код для PIO:

.define public T1 2
.define public T2 5
.define public T3 3

.wrap_target
    out x, 32
    mov pins, !null [T1-1]
    mov pins, x     [T2-1]
    mov pins, null  [T3-2]
.wrap


Все!

Забираем из входного регистра данные — до 32 бит, реально надо только 16. Выбрасываем в 16-разрядный порт все единицы и задержка. Выбрасываем на выход содержимое введеное из входного регистра — и задержка. И, наконец, выбрасываем нули и задержка.
Все это будет работать абсолютно независимо от процессора и сформирует сигналы управления светодиодом для всех (у нас будет их 16) линий.
Вместе с загрузкой программы PIO и настройкой выводов это будет выглядеть так (файл ws2812.pio)


.program ws2812_parallel

.define public T1 2
.define public T2 5
.define public T3 3

.wrap_target
    out x, 32
    mov pins, !null [T1-1]
    mov pins, x     [T2-1]
    mov pins, null  [T3-2]
.wrap

% c-sdk {
#include "hardware/clocks.h"

static inline void ws2812_parallel_program_init(PIO pio, uint sm, uint offset, uint pin_base, uint pin_count, float freq) {
    for(uint i=pin_base; i<pin_base+pin_count; i++) pio_gpio_init(pio, i);
    pio_sm_set_consecutive_pindirs(pio, sm, pin_base, pin_count, true);

    pio_sm_config c = ws2812_parallel_program_get_default_config(offset);
    sm_config_set_out_shift(&c, true, true, 32);
    sm_config_set_out_pins(&c, pin_base, pin_count);
    sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);

    int cycles_per_bit = ws2812_parallel_T1 + ws2812_parallel_T2 + ws2812_parallel_T3;
    float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit);
    sm_config_set_clkdiv(&c, div);

    pio_sm_init(pio, sm, offset, &c);
    pio_sm_set_enabled(pio, sm, true);
}
%}

Идем сюда и воспользуемся онлайн компилятором

Скомпилированный текст сохраняем в файле ws2812.pio.h


// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //

#pragma once

#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif

// --------------- //
// ws2812_parallel //
// --------------- //

#define ws2812_parallel_wrap_target 0
#define ws2812_parallel_wrap 3

#define ws2812_parallel_T1 2
#define ws2812_parallel_T2 5
#define ws2812_parallel_T3 3

static const uint16_t ws2812_parallel_program_instructions[] = {
            //     .wrap_target
    0x6020, //  0: out    x, 32                      
    0xa10b, //  1: mov    pins, !null            [1] 
    0xa401, //  2: mov    pins, x                [4] 
    0xa103, //  3: mov    pins, null             [1] 
            //     .wrap
};

#if !PICO_NO_HARDWARE
static const struct pio_program ws2812_parallel_program = {
    .instructions = ws2812_parallel_program_instructions,
    .length = 4,
    .origin = -1,
};

static inline pio_sm_config ws2812_parallel_program_get_default_config(uint offset) {
    pio_sm_config c = pio_get_default_sm_config();
    sm_config_set_wrap(&c, offset + ws2812_parallel_wrap_target, offset + ws2812_parallel_wrap);
    return c;
}

#include "hardware/clocks.h"
static inline void ws2812_parallel_program_init(PIO pio, uint sm, uint offset, uint pin_base, uint pin_count, float freq) {
    for(uint i=pin_base; i<pin_base+pin_count; i++) pio_gpio_init(pio, i);
    pio_sm_set_consecutive_pindirs(pio, sm, pin_base, pin_count, true);
    pio_sm_config c = ws2812_parallel_program_get_default_config(offset);
    sm_config_set_out_shift(&c, true, true, 32);
    sm_config_set_out_pins(&c, pin_base, pin_count);
    //sm_config_set_set_pins(&c, pin_base, pin_count);
    sm_config_set_fifo_join(&c, PIO_FIFO_JOIN_TX);
    int cycles_per_bit = ws2812_parallel_T1 + ws2812_parallel_T2 + ws2812_parallel_T3;
    float div = clock_get_hz(clk_sys) / (freq * cycles_per_bit);
    sm_config_set_clkdiv(&c, div);
    pio_sm_init(pio, sm, offset, &c);
    pio_sm_set_enabled(pio, sm, true);
}

#endif


Теперь в основной программе инициализируем DMA — все будет работать автоматом, безо всякого участия процессора. Простите уж мой французский — не привык комментировать программы на русском.


#include <Arduino.h>
#include "ws2812.pio.h"
#include "hardware/dma.h"
#include "hardware/pio.h"

#define LEDS_IN_STRING 1280

#define DMA_CHANNEL 0

uint16_t DataArray[LEDS_IN_STRING*24];
// 30720
void dma_init(PIO pio, uint sm) 
{
  // (X/Y)*sys_clk, where X is the first 16 bytes and Y is the second
  // sys_clk is 125 MHz unless changed in code
  // we need 800 kHz - divider 156.25 x=4   y=625( 0x271)
  dma_hw->timer[0] = 0x00040271; 
  dma_channel_config c = dma_channel_get_default_config(DMA_CHANNEL);
  channel_config_set_dreq(&c, 0x3b);  // 0x3b -> Select Timer 0 as TREQ
  channel_config_set_transfer_data_size(&c, DMA_SIZE_16);
  channel_config_set_read_increment(&c, true);
  channel_config_set_write_increment(&c, false);
  dma_channel_configure(
                        DMA_CHANNEL,    // Channel to be configured
                        &c,  // The configuration we just created
                        &pio->txf[sm],  // The initial write address
                        NULL,           // The initial read address - set later
                        LEDS_IN_STRING*24,    // Number of transfers;
                        false           // Start immediately?
                        );
}

void setup() 
{
  PIO pio = pio0;
  int sm = 0;
  uint offset = pio_add_program(pio, &ws2812_parallel_program);
  ws2812_parallel_program_init(pio, sm, offset, 0, 16, 800000);
  dma_init(pio, sm);
  // здесь заполните буфер чем-нибудь сами
}

void loop() 
{
  dma_hw->ch[DMA_CHANNEL].al3_read_addr_trig = (uintptr_t) DataArray;
  delay(50);
}



В реальном времени использовать такой дисплей вряд ли получится. Никакого входа для видео тут нет.
Отображаемые данные нужно подготовить заранее, вытащив данные из изображения, учесть место расположения каждой точки — здесь у нас не как в телевизоре — строка за строкой.



Если есть видео — его надо разложить по кадрам. При необходимости добавить переходные эффекты по вкусу. У меня этим занимается написанная на Python программа — но это уже выходит за рамки статьи, иначе она никогда не кончится.



Раньше у меня была проблема — в гараже стояло несколько больших светодиодных панелей, место занимали. Не так давно все-таки удалось их отдать хозяевам. Естественно, спустя небольшое время такая панель понадобилось. Пришлось заказать пару дешевых панелей на Али. Размер 16х16, итого 256 светодиодов. За 10 евро неплохо — всего 4 цента за точку и паять ничего не надо. Я как-то покупал готовые ленты — там цена вообще получалась 3 цента за светодиод.
Сколько отдельно стоят светодиоды в небольших партиях (в районе 100 тысяч штук) — я точно не знаю, заказывал не я. Думаю, что в районе 2 центов.



К платке Raspbery Pi Pico понадобилось подключить только SD карточку. По хорошему, на выход нужно ставить преобразователь уровня в худшем случае или драйвер дифференциальной линии в лучшем. Но для теста программного обеспечения и так сойдет.



Новая система управления в окружении предшественников:



Совершенно случайно нашелся рояль в кустах старый переделаный источник питания, он может 60 Ампер по 5 Вольтам выдать. А двум панелям в динамике 10 ампер хватает. Системы выглядит даже как-то убого:



Две панели — 512 точек. Панель реально маленькая для такой системы управления — на каждую линию можно подключить до 5 таких панелек, имеем 16 линий — итого 80 панелей. А у меня всего 2 :( — только попробовать хватит. Вот что получилось:



Как я говорил, яркость избыточна. Видео снималась в ярко освещенной комнате, изображение просто по глазам бъет яркостью. А камера воспринимает, как съемку в темноте.

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



Видео с одним из старых дисплеев:



В моей старой системе данные, кадр за кадром, гонятся по проводному Ethernet.
Сейчас я попробовал скопировать блок данных на SD. Вылезла обычная ардуиновская проблема — все работает абы как. Быстро чтение данных не работает, я не могу считывать 30 кадров в секунду. Все можно переделать — когда я делал оригинальную систему, то тоже использовал Ethernet библиотеки, заимствованные из Ардуино. Ethernet работал, но очень медленно. Пришлось весь код перерывать — ошибки нашлись в очень мелких деталях. Сейчас копать библиотеки просто не хочется, да и нужды нет. Я хотел проверить только, как вывод на светодиоды работает, функционирующее изделие никому не нужно. «Будет хлеб — будут и песни» — как говорил дорогой Леонид Ильич.

Ну господь с ней, с Ардуиной. Есть же компания, которая продвигает этот проект. Должна же быть у Raspberry поддержка SD карт в их SDK. Как бы не так, как они пишут:

The pico_sd_card code is SDIO only at the moment. It is not really yet in shape for prime-time unless you are feeling brave.
ссылка

Файловой системой там даже не пахнет — сам прикручивай.
Нет, я не трус, но я боюсь. Бежать впереди паровоза — не самое благодарное занятие. Мне не к спеху, подожду, пока они допилят свои библиотеки. Или для Ардуино кто-то допилит, на что надежда очень маленькая. Какая-то библиотека есть, а для большинства применений достаточно и низкой скорости доступа.

P.S. Если меня сильно заносит на поворотах и я уже совсем в сторону ушел от темы шопоголизма — дайте знать в комментариях, постараюсь исправиться :)
Добавить в избранное +253 +362
+
avatar
+24
Охренеть!
Аплодирую стоя
:-)
+
avatar
  • Yurissum
  • 05 февраля 2022, 06:32
+1
Аплодирую стоя
Я тоже. Ведь дорогого Леонида Ильича вспомнили. Будет хлеб — будут и песни…
+
avatar
  • bdfy63
  • 04 февраля 2022, 10:23
+1
Спасибо за статью. А что за переделка бп на повышение ампеража на 5в?
+
avatar
  • donBaton
  • 04 февраля 2022, 10:37
+2
Убрал все, касающееся 12 и 3.3 Вольт. Давно переделывал, деталей уже не помню.
+
avatar
0
В компьютерных БП должны быть такие напряжения, а токи там обычно большие.
+
avatar
  • ksiman
  • 04 февраля 2022, 13:01
+2
Но без переделки большой ток по одной линии +5V не получить
+
avatar
  • stupic
  • 04 февраля 2022, 11:07
+2
без перемотки транса не обойтись
+
avatar
  • ksiman
  • 04 февраля 2022, 11:10
0
Можно обойтись без перемотки транса, обмотка +5V обычно организована отводом от +12V. Но вот ДГС желательно перемотать
+
avatar
  • donBaton
  • 04 февраля 2022, 11:13
0
Дело давнее, но точно ничего не перематывал.
+
avatar
  • ksiman
  • 04 февраля 2022, 11:18
0
Значит БП был совсем древний — там это прокатывало
+
avatar
  • donBaton
  • 04 февраля 2022, 11:21
0
Да, более новые хотел позднее переделать — открывал и тут же закрывал, овчинка выделки не стоит. Так и валяются в гараже.
+
avatar
  • stupic
  • 04 февраля 2022, 13:41
0
Я знаю, но автор пишет про 60 Ампер! Вот достал из запчастей транс из 400-вт(настоящий!) БП на TL494, ну там 3x0.8 намерил на обмотке 5 и12
+
avatar
  • ksiman
  • 04 февраля 2022, 14:09
0
Но у автора БП 550W. Если он типа ATX 1.3 и ранее, то вполне может выдать по +5V большой ток
+
avatar
  • stupic
  • 06 февраля 2022, 18:35
0
Если 550W, то явно не ATX 1.3, там только до 300W и по 3,3 и 5 вольт общая мощность до 200 только, т.к. снимаются с одной обмотки. Так что не сочиняйте, реально без перемотки не получить такой ток долговременно, надо удалять 12-вольтовую обмотку и вместо её мотать еще одну 5-ти.
+
avatar
  • donBaton
  • 06 февраля 2022, 19:07
0
Согласно шильдику, выдает 28+28А, реально — 60А. Что уж я там наделал много лет назад — не помню, но обмотки точно не трогал, объединил 5 и 3.3 Вольта, выкинул кучку ненужных деталей :) Не исключено, что при понижении сетевого напряжения он столько и не выдаст. И маленькая тонкость — сетевое напряжение отличается от принятого в России, 230 вместо 220 — может, здесь собака и порылась.
+
avatar
  • ksiman
  • 06 февраля 2022, 20:20
0
объединил 5 и 3.3 Вольта
Вот это уже странно…
+
avatar
  • donBaton
  • 06 февраля 2022, 21:23
0
Не просто так, естественно :) — магнитный усилитель, или как он называется, убрал.
+
avatar
  • sav1812
  • 07 февраля 2022, 03:07
0
В России давно уже принят стандарт 230 вольт…
+
avatar
  • vanenzo
  • 04 февраля 2022, 10:24
0
Класс.
Всегда была мечта сделать светодиодный экран метров 10 по диагонали )
+
avatar
+10
Надо начать с 10см по диагонали.
+
avatar
  • virgil
  • 04 февраля 2022, 22:39
+3
Чтобы мечта испарилась достаточно посчитать цену, ленты достаточно дорогие.
Потом прослезиться о разрешении, для хорошего эффекта нужно городить матовый слой и колодцы.
Если мечта ещё жива — считаешь необходимые частоты\задержки. Понимаешь, что нужны быстрые контроллеры и очень быстрый самописный код. И всё равно получится дёрганая картинка и артефакты из-за длинных сигнальных линий.
+
avatar
  • sancho86
  • 07 февраля 2022, 08:57
0
Для себя — слишком дорого. Ищи заказчика и начинай ваять)
+
avatar
0
Охренеть. Обзор отличный, спасибо.

Но не понятно, почему не взять STM, где есть и фс и avi onfly render и DMA и не сделать на нормальном проце? А если это коммерческое — почему не взять нормальную raspberry, где уже есть и sd и ethernet и куча всего вместе с OS?
Ну и самое главное — если хочется качества — почему не забить на WS и не взять HD диоды например (HD107 чтоли, не помню точно маркировку, тоже пиксельные),. Да, будет дороже, зато куда качественней.

Через DMA отсылать данные в ленты получается куда стабильней, однако при такой здоровой тактовой у STM можно хоть bitbang-ом это слать. И код будет не сильно больше вашего. Ибо у вас оно же и используется.
При этом под STM это все уже есть в виде готовых библиотек.

Raspberry Pico получилась у них морской свинкой — те ни к морю, ни к свиньям.
С одной стороны она попыталась залезть в нишу arduino, ESP и STM — и там она нафиг не нужна, а с другой — не дотягивает до нормального одноплатника. Смысла в ней — ноль.
+
avatar
  • donBaton
  • 04 февраля 2022, 10:44
+1
Но не понятно, почему не взять STM, где есть и фс и avi onfly render и DMA и не сделать на нормальном проце? А если это коммерческое — почему не взять нормальную raspberry, где уже есть и сд и куча всего вместе с OS?
В статье есть ссылка на мою статью на Хабре — Вы там все это и найдете.
А здесь я просто с Raspberry Pico баловался — у Вас, видимо, описка насчет Zero
Физика на Pico оказалась гораздо проще, чем на STM, кое-какие интересные плюшки в Pico есть, не стоит ее сходу хаить. Я подозреваю, что она разработана в основном одним человеком — я имею в виду кремний. Что очень неплохо.
+
avatar
0
Да, Pico конечно, исправил.

А что за плюшки? Не поделитесь?
Я имел ввиду по сравнению с STM.
+
avatar
  • donBaton
  • 04 февраля 2022, 10:52
+1
Так про них и статья — ввод-вывод со своей state machine, Вы посмотрите, насколько простой код получается!
+
avatar
0
Статью почитаю — интересно. Что до стейтмашины — имхо, у стм дма не хуже) А при такой огромной тактовой можно и свою стейт поставить. При этом цена ниже примерно в два раза.
+
avatar
  • donBaton
  • 04 февраля 2022, 11:01
+2
Поверьте, я использовал и то, и другое. Да, на STM все прекрасно, но код на Pico намного проще. А насчет ниже цены — Вы ошибаетесь. Там оперативки нужно очень много.
+
avatar
+5
Смотрите, на STM DMA будет вам выводить данные напрямую из памяти в порт, без преобразований. То есть, на 1 бит выходных данных для диодов вам придется в памяти 3 бита подготавливать. Или 9 байт на 1 диод (против 3-х байт тут). Для 20К диодов это будет 180КБ против 60КБ, достаточно ощутимо. И это при том, что пока один буфер (кадр) выводится, следующий надо готовить, значит, еще х2 памяти (нет, можно, конечно, соблюдая тайминги и в тот же писать, но это еще сложнее).

Наверное, можно найти STM32 с 512 КБ ОЗУ (я верхние модели не смотрел у них), наверняка он все успеет, т.к. имеет колоссальную производительность для МК, да и библиотеки там все будут. Но это будет уже совсем другой процессор. Для коммерческих разработок, конечно, лучше такой поставить. Но это менее спортивно.

А на данном процессоре, действительно, получается, что управлять адресными диодами проще.

Только, вот, рядовому самодельщику это все ни к чему — ни стм, ни пико. Я хотел сделать дисплей из 600 таких диодов (20х30) еще года три назад, когда только ленты с ними начали на Али продаваться относительно дешево. Даже панель металлическую достал 50х32 см (диоды на ленте через 16 мм стояли), хотел на стену повесить и в «тетрис» играть на ней. Потом оценил яркость (20 мА на канал, 60 мА на диод, 36 А на всю панель) и понял, что смотреть на фару автомобиля я не очень-то хочу. А снижение яркости, как автор правильно тут описал, упирается в разрядность диодов и отсутствие аппаратной гамма-коррекции. В итоге, насколько я помню, с диода можно полноценных только 4 бита получить (если программный дизеринг не использовать).

А так, код у меня даже для атмеги ардуиновской был — один вариант выводил параллельно 5 каналов, но занимал в это время 100% процессора (то есть, никаких прерываний, значит, никаких пультов и т.д.), другой — 1 канал, но полностью на UART и прерываниях. Он занимал примерно 50% процессора и позволял ту самую тысячу светодиодов обслужить 30 раз в секунду, не мешая в это время основной программе и другим прерываниям. Там тогда все уже в ОЗУ упиралось — в атмеге её всего 2 КБ, даже при 8 бит на пиксель два экрана больше половины уже занимали.

То есть имхо дома применение 2812 — это елочные гирлянды и цветная подсветка. Дисплеи дома такие не нужны, если только в окно поставить и перед соседями выпендриваться.
+
avatar
  • donBaton
  • 04 февраля 2022, 19:06
+2
Смотрите, на STM DMA будет вам выводить данные напрямую из памяти в порт, без преобразований. То есть, на 1 бит выходных данных для диодов вам придется в памяти 3 бита подготавливать.
Не так все плохо для STM с памятью. Я просто использовал 3 DMA — первый выкидывал всегда единички, второй — реальное слово, третий — все нули. Только 2 слова лишней памяти, но вот с их синхронизацией пришлось маленько помудрить. После этого на Pico настолько все проще…
И обходился одним буфером — просто начинал его выкидывать еще не до конца заполненный. Но опять таки — любые ошибки в программировании не прощаются, никаких кубов и библиотек — все на регистрах.
+
avatar
+1
Хм. А вот это интересное решение, чем-то спектрум напомнило, где при ограниченных возможностях пытались добиться результата несколько нестандартными способами.

И обходился одним буфером — просто начинал его выкидывать еще не до конца заполненный.
Мне кажется, современные разработчики о таком даже и не подумают )
+
avatar
  • Mahagam
  • 04 февраля 2022, 11:01
0
сюда вообще FPGA + любая плата с HDMI(DVI) выходом. принимаем HDMI на FPGA и выдаём картинку хоть на 128 каналов. можно будет просто видео крутить, безо всяких конверсий
+
avatar
  • donBaton
  • 04 февраля 2022, 11:03
0
То, что серийно делается — примерно так и есть. Только там ASIC.
+
avatar
  • u3712
  • 04 февраля 2022, 12:13
0
Так, для затравки — в серии G (как корабль назовете ...) в STM шина GPIO вынесена в отдельный хвост без доступа DMA (в угоду ардунщиков). Теперь ногодрыг DMA+GPIO невозможен в-принципе.
+
avatar
  • Diject
  • 04 февраля 2022, 15:49
0
В G4 все с этим нормально. К слову, DMA не имеет доступа к GPIO еще и в L0 серии
+
avatar
+5
Самый большой был вморожен в лед, размер — 9 на 9 метров
это не дий, а высокооплачивамый заказ
+
avatar
  • donBaton
  • 04 февраля 2022, 10:50
+2
Это пример использования, а код Pico — это не заказ, а от нечего делать.
Насчет высокооплачиваемого — Ваши слова бы да Богу в уши.
+
avatar
  • Cremator
  • 04 февраля 2022, 10:53
+1
Вряд ли я смогу себе заказать такой масштаб ко дню рождения, даже продав квартиру) Это к слову о оплате.
+
avatar
  • donBaton
  • 04 февраля 2022, 10:58
+4
Если тот вариант, что описан на Pico — 25 евро не разорит.
А то, что сделано на стадионе — наверно, тоже, если у Вас есть свой стадион. Но мне кажется, что цена меньше, чем Вы думаете.
+
avatar
  • AlexG
  • 05 февраля 2022, 01:02
0
Ну китайцы на открытии Олимпиады своим самым большим экраном в истории LED технологий удивили всех

Площадь 10552 кв. м, состоит из более чем 40000 светодиодных модулей.
+
avatar
  • kirich
  • 05 февраля 2022, 01:24
+3
китайцы на открытии Олимпиады своим самым большим экраном в истории LED технологий удивили всех
Скорее не экраном, а тем, сколько они денег туда вбухали, потому как технологии довольно отлажены и чтобы такое сделать по большей части надо просто хорошо раскошелится.
+
avatar
  • AlexG
  • 05 февраля 2022, 02:08
+1
Это да. Часть объектов до открытия посещал Денис Васильев. У него на канале есть несколько выпусков по теме.
+
avatar
  • kirich
  • 04 февраля 2022, 11:26
0
Пришлось заказать пару дешевых панелей на Али. Размер 16х16, итого 256 светодиодов. За 10 евро неплохо — всего 4 цента за точку и паять ничего не надо.
Что-то все равно очень дорого выходит, я заказывал панели 64х64 по 25 долларов (около 20 евро), там получается 0.6 цента за пиксель. Но это панели с обычными RGB светодиодами и контроллером, странно что с адресуемыми так дорого выходит.
+
avatar
  • Cremator
  • 04 февраля 2022, 11:41
0
Человек в Финляндии находится, думаю в этом кроется разница цен. Возможно есть таможенные пошлины и т.п. (могу ошибаться).
+
avatar
  • donBaton
  • 04 февраля 2022, 15:29
+6
У меня толщина имеет значение. На катке, например, толщина льда 4-5 см. Из них сантиметра 3 коньками пропахивают. И, кроме того, попробуйте обычные панели залить водой и заморозить. И провода еще от них вытянуть подо льдом больше 10 метров. Ну а в окне обычные модули просто свет перекрывают, из комнаты темнушка получается. Иногда вес важен. Короче, каждому овощу свой фрукт :)
+
avatar
  • kirich
  • 04 февраля 2022, 15:32
0
Вопрос в цене, почему модуль с 16х16 адресными светодиодами (256шт) стоит всего в два раза меньше чем с 64х64 (4096шт) и контроллером.
+
avatar
  • donBaton
  • 04 февраля 2022, 15:35
+3
Просто деньги нужны :)
+
avatar
0
Может из-за разности в стоимости самих диодов? Могу предположить, что обычных RGB налепили уже давно и много, теперь они практически не нужны, вот и продаются дешево.
+
avatar
  • donBaton
  • 05 февраля 2022, 08:33
+1
Скорее всего причина намного прозаичнее. Светодиоды еще на пластине тестируются, есть бины, которые ни один серьезный покупатель не возьмет — эффективность мала или длина волны отъехала. Их или придется выбросить, или корпусировать по самому дешевому варианту и продать дядюшке Ляо в подвал или нам с вами на Али.
+
avatar
  • Lvenok
  • 05 февраля 2022, 00:40
+1
само железо, думаю, стоит недорого. Значимую часть стоимости составляет продажа, пересылка, реклама магазина, офис итд, что закладывается в стоимость покупки…
+
avatar
  • sav1812
  • 04 февраля 2022, 11:29
+2
Познавательно. спасибо. :)
Заносов не замечено… :))
+
avatar
-1
Есть же 12В диоды, в чем смысл мучений с пятивольтовыми?
+
avatar
  • ksiman
  • 04 февраля 2022, 11:58
+1
в чем смысл мучений с пятивольтовыми?
В энергоэффективности. 12V светодиоды имеют такой-же ток потребления.
+
avatar
0
При неизменной мощности, ток при повышении напряжения должен быть меньше.
+
avatar
  • ksiman
  • 04 февраля 2022, 13:03
+1
Не в этом случае, напряжение на самом светодиоде остаётся в районе 2-3В, а остальное падает на линейном стабилизаторе тока.
+
avatar
-2
Руководствуясь простейшей формулой:
90W / 5V=18A
90W / 12V=7,5A

По факту, для 10.4 п/м 5V ленты мне потребовался БП на 40А (200W). А для 13.5 п/м 12V ленты — 20А. Не говоря уже о сечении подводимых проводов и количестве точек дополнительного подвода питания, чтобы минимизировать потери.
+
avatar
  • ksiman
  • 04 февраля 2022, 14:18
0
У Вас адресная лента?
+
avatar
0
Конечно. И проверял просадку в разных точках на ленте, в каждом цвете отдельно.
+
avatar
0
глупость сказал :)
+
avatar
  • ksiman
  • 05 февраля 2022, 22:47
0
Только этим и занимаюсь :)
+
avatar
  • donBaton
  • 05 февраля 2022, 23:00
+4
Это не к Вам относилось, просто An_private написал сообщение, потом передумал и заменил его этой фразой, он имел ввиду не Вас, но получилось двусмысленно.
+
avatar
  • Sidula
  • 04 февраля 2022, 11:39
0
А почему Вы не используете готовые панели, типа таких:

Их ведь только собрать надо и контроллеры готовые есть.
Или с ними дороже выходит?
+
avatar
  • donBaton
  • 04 февраля 2022, 15:01
0
Толщина разная. Ограничение — для оконных они должны быть полупрозрачные. Для катка — тоньше 10 мм и выдерживать заливку водой и замораживание.
+
avatar
  • fps
  • 04 февраля 2022, 12:20
0
Знакомые макетки на фотках )
+
avatar
  • kosandry
  • 04 февраля 2022, 16:00
0
Спрошу не совсем по теме — но, наконец, есть тема о лентах.

На светодиодных лентах (одноцветных), рассчитанных на 12В/24В в группе светодиодов всегда(я не видел исключений у китайцев) стоит резистор. Если я верно понимаю — он корректирует ток через светодиоды, подстраивая его оптимальное значение. Эти ленты делаются километрами. На каждой есть резисторы, греющие атмосферу. Почему нельзя подобрать(разработать) светодиоды, которые бы в группе 3,4… штук обеспечили нужное падение напряжение (например 12В).

+
avatar
  • bulyga
  • 04 февраля 2022, 16:28
+8
У диодов (и светодиодов в частности) экспоненциальная вольт-амперная хар-ка (ВАХ) на прямом участке, т.е. при малом измениении напряжения ток меняется очень сильно. Также при нагревании эта хар-ка «уползает» влево. т.е. при фиксированном напряжении и нагревании ток расчёт. Всё это не позволяет безопасно питать диоды от источника напряжения, используют источники тока или последовательно с диодом ставят резистор, чтобы сделать общую ВАХ диод + резистор более пологой.

+
avatar
  • xpm
  • 04 февраля 2022, 16:51
0
Ленты делаются не километрами, а сегментами 50см, потом сегменты спаиваются в 5 метровые катушки. У светодиода ток растет лавинообразно, с повышением напряжения и температуры, в лентах без резисторов не вариант, возможно использовать токовые стабилизаторы, как на фото ленты, светодиоды возможно использовать группами, с токовыми драйверами, но там тоже много нюансов.
+
avatar
  • ksiman
  • 04 февраля 2022, 17:22
+4
а сегментами 50см, потом сегменты спаиваются в 5 метровые катушки
Есть ленты целиковые по 5м
+
avatar
  • ksiman
  • 04 февраля 2022, 17:23
+4
Почему нельзя подобрать(разработать) светодиоды, которые бы в группе 3,4… штук обеспечили нужное падение напряжение (например 12В).
Есть такие ленты, но питаются они драйвером, а не источником постоянного напряжения.
+
avatar
+6
Почему нельзя подобрать(разработать) светодиоды, которые бы в группе 3,4… штук обеспечили нужное падение напряжение (например 12В).
Во-первых, падение напряжения на светодиоде зависит от материала его изготовления и никак не «регулируется» при производстве. Так же как литий-ионный аккумулятор всегда на 4.2 В, падение на кремниевом переходе 0.7 В и т.д. То есть, сделать светодиод на 3 или 4 вольта попросту невозможно. Это первое.

А второе и главное — то, что светодиоды, по сути, питаются током, на не напряжением. То есть, на самом деле задача не обеспечить на них 2, 3 или 3.3 В, задача обеспечить через них заданный ток (например, 20 мА через диод). По большому счету, для этого надо ставить отдельный драйвер на каждую цепочку. Это дорого, поэтому в лентах драйвер просто заменяется резистором, на котором падает порядка 20% мощности (для белых лент 12 В). Такой компромисс.
+
avatar
+3
Чисто китайская разработка, все остальное, если и имеется — дешевые подделки.
Отличный слог. Я бы даже написал «Все остальное, если и имеется — дешевые европейские и американские подделки».
+
avatar
  • kovax
  • 04 февраля 2022, 16:45
0
Прикольно, даже мысль возникла замутить рекламный стенд)))
+
avatar
  • Sintetik
  • 04 февраля 2022, 16:54
+1
donBaton, а будет третья статья, как дома собрать LED телевизор?
+
avatar
  • donBaton
  • 04 февраля 2022, 17:01
+4
Это без FPGA не пролезет :) Да и бессмысленно, разве что если экран на соседнем доме повесить и смотреть в окно :) Слишком ярко.
+
avatar
  • stupic
  • 05 февраля 2022, 11:47
0
Слишком ярко.
— а мы затонируем, пятёркой :)
+
avatar
0
абв
+
avatar
  • donBaton
  • 04 февраля 2022, 17:52
+1
Про Pico — вряд ли. А так в тексте есть ссылка на мою статью на хабре — там, скорее всего, и видели. Там STM32F407.
+
avatar
  • Zhendai
  • 04 февраля 2022, 17:58
+5
Вот, тоже что-то подобное. Сохранил к себе, вдруг когда пригодится…

+
avatar
  • donBaton
  • 04 февраля 2022, 18:11
0
Не совсем подобное, это готовый 15-баксовый контроллер K-1000C ссылка. Если достаточно чтобы красиво моргало — самое то.
+
avatar
  • Lagros
  • 05 февраля 2022, 00:09
0
По ссылке K-1000C — 37-баксовый контроллер…
+
avatar
  • Lagros
  • 05 февраля 2022, 12:38
0
Есть еще такое:
+
avatar
0
Не перестаю восхищаться. Браво.
+
avatar
  • Boing
  • 05 февраля 2022, 02:12
+3
А я как это чудо увидел, куда вагон труда вбухано, потерял веру в то, что индивидуально такая красота реализуема, если ты только не олигарх какой
+
avatar
  • donBaton
  • 05 февраля 2022, 12:16
-2
Олигархом тут не пахнет, компонентов на несколько сотен долларов, но вот труда — даже не вагон, а целый состав.
Хотя иногда люди делают и намного более странные вещи неизвестно зачем.

Подозреваю, что соседи очень недовольны таким шоу :)
+
avatar
  • Boing
  • 05 февраля 2022, 13:45
+3
вы посмотрите в видео в профиле его инфо. В итоге он начал выпускать девайсы и ПО под это всё дело. Как я понял из его сайта/комментариев, его дистрикт очень доволен такими шоу. Время его заранее сообщается и люди свободно могут приехать вне поля зрения камеры посмотреть и поснимать. У него бывают благотворительные шоу и коммерческими тоже занимается. Я даже не представляю сколько там труда вложено. Кстати было и фото серверной. Там целая стойка этим управляет. Только недавно он поставил 8 прожекторов. а вообще начиная с самых старых видео смотреть интересно развитие.
+
avatar
  • donBaton
  • 05 февраля 2022, 14:09
0
На прожекторы обратил внимание — красивое :)

Думаю, с таким проектом бы справился — но мне оно точно не надо. Да и по крышам лазить — это занятие не для инвалида, мне обычную лампочку вкрутить — и то супругу звать приходится, иначе навернусь вместе с этой лампочкой. Так что только в компании с кем-то. Хотя может быть и интересно, пенсионеру делать-то особо нечего.

Мои самые большие дисплеи управляются дохлым по производительности лаптопом с Линуксом, купленным по дешевке на интернет-барахолке и малиной. Ну и куча контроллеров-драйверов и всякая дешевая сетевая требуха.
С таким явно побольше железа понадобится. А ту картинку, что у него на фоне гаражных ворот — это совсем легко с тем, что у меня есть, изобразить, даже сильно избыточно. Но, наверно, даже красивее будет — тогда можно и кино «в воздухе» показывать, не только эффекты.
+
avatar
  • kirich
  • 05 февраля 2022, 14:33
0
Время его заранее сообщается и люди свободно могут приехать вне поля зрения камеры посмотреть и поснимать.
Отчасти ключевое здесь то, что у них там обычно нет заборов, представьте реализацию такого шоу у нас, хотя если превратить сам забор в экран…
+
avatar
  • Boing
  • 05 февраля 2022, 14:44
+1
думаю да, но в «коттеджных посёлках », где может быть охраняемый въезд и забор или в общественных местах это можно реализовать. На такую «ёлку» я бы пошел)
Кстатиу автора видео даже координата дома есть. типа приезжайте смотрите
+
avatar
+3
В одном из ТЦ в Лондоне, заснял в октябре 2021го:


Подхожу поближе:
+
avatar
0
Шикарно! Впрочем, как всегда.
Моё почтение!