Комментарии 53
PS. Мне действительно было интересно как это реализовано.
Все оказывается просто.
Спасибо!
Контроллер (находящийся в диоде) включает светодиоды когда 50 микросекунд не идут никакие пакеты, то есть пока вы пихаете данные в вашу ленту, контроллеры будут принимать информацию и передавать дальше по цепочке остальным контроллерам в диодах, но как только наступит тишина длящаяся более 50 микросекунд, контроллеры зажгут светодиоды исходя из информации которую получили.
После того как контроллеры включили диоды вы можете отключить микроконтроллер от ленты и диоды будут продолжать светиться. Но как только вы станете снова посылать данные, контроллеры в диода снова начнут их запоминать, и когда вы прекратите посылать, снова после 50 микросекунд простоя контроллеры зажгут светодиоды.
Вот собственно и весь протокол работы.
Это можно увидеть просто рассматривая устройство ленты. Видны отдельные микросхемы, припаянные к гибкому шлейфу, видны соединения: микросхемы соединены последовательно всего тремя проводами, при этом два из них это питание и землясудя по описанию, это не последовательное, а параллельное соединение (последовательное расположение и последовательное соединение — разные вещи)
Круто, давно было интересно как происходит адресация в светодиодной ленте. Все гениальное просто.
А то потом пользователи должны голову ломать, как сеё поделье запустить на каком-нибудь stm32f100 через DMA чтобы процессорного времени не тратить на передачу.
1. В 2 раза больше проводов для сигналов. Для узкой ленты это критично.
2. Имеет меньшую скорость.
3. В добавок к предыдущему ещё и накладные расходы на передачу адреса устройства (при передаче по 3 байта на устройство будет как минимум 25% пропускной способности уходить на адреса).
3. Ограниченное и не очень большое количество адресов (127, 255 или 1023, причём последний вариант дополнительно повысит накладные расходы на передачу адресов). Светодиодов в ленте может быть больше.
4. Эти адреса нужно как-то конфигурировать. Каждый светодиод джамперами не обвесишь, потребуется какой-то велосипед для автоконфигурации адресов и я даже с ходу не могу его придумать. Насколько надёжным будет такой велосипед — тоже большой вопрос.
5. Сигнал мастера должен проходить всю длину светодиодной ленты, со всеми её паразитными ёмкостями и индуктивностями, что накладывает на эту самую длину ограничения и ощутимо повышает чувствительность ко всяким наводкам и помехам, либо выдвигает существенные требования и к мастеру, и к самим светодиодам.
6. От светодиодов требуется немножко более сложная логика, что потенциально может повысить их стоимость, а поскольку в лентах могут быть тысячи светодиодов это критично. Логичнее перенести это удорожание на необходимость поставить более мощный МК или даже дополнительный МК в помощь основному, преобразующий UART/SPI/I2C в этот протокол. Ведь он будет 1 на всё устройство, а не тысяча.
7. К тому же более сложная логика повышает и вероятность глюков. Я встречал I2C устройства, которые при некорректных сигналах I2C могли притянуть к земле SCL и уже больше никогда не отпустить до перезагрузки по питанию, парализовав всю шину. На многометровой шине вероятность ошибочных сигналов сильно выше из-за помех и т. д. (не забываем, что мастеру нужно управлять всей длинной шины)
Текущий же протокол не содержит явных ограничений ни на количество светодиодов (адресов нет, можно влить сколько-угодно бит), ни на длину ленты (ведь каждый светодиод по сути выступает ретранслятором). Можно хоть миллионами светодиодов так управлять, озаботится придётся только подводом питания, ну и частота обновления упадёт. В данном конкретном приложении использовании нестандартного протокола вполне обоснованно.
1. В 2 раза больше проводов для сигналов. Для узкой ленты это критично.
Да ладно. В том же ws2815 две линии сигнала. И ничего, на ленту влезают, никто не жаловался.

2. Имеет меньшую скорость.
0.9 + 0.35us = 1.25us -> 800khz /bit
i2с — позволяет работать на 3.4Мгц
3. В добавок к предыдущему ещё и накладные расходы на передачу адреса устройства (при передаче по 3 байта на устройство будет как минимум 25% пропускной способности уходить на адреса).
что? не вижу проблемы передавать в bulk режиме:
|address| data_led1 | data_led2 | data_led3 |… data_led_100500|
передать один раз адрес и пачкой данные.
4. Эти адреса нужно как-то конфигурировать.
Зачем? они также будут соеденены последовательно. mcu -> led1 -> led2 -> led3… -> led100500 пусть будут на одном же адресе. Тут без разницы.
5. Сигнал мастера должен проходить всю длину светодиодной ленты,
См. предыдущий ответ про последовательное соединение.
6. От светодиодов требуется немножко более сложная логика, что потенциально может повысить их стоимость
Вот тут частично согласен, но не думаю что от доп. нескольких тысяч транзисторов существенно возрастет цена. она больше от техпроцесса зависит а не от количества pn-переходов.
Скорее тут китайцам было лень лицензию на i2c покупать у филипса.
А адрес то чего вначале? какого устройства?
Вы прикалываетесь? Это в даташите обычно пишут.
как первый после передаст второму? без адреса?
Каждый предыдущий будет master для последующего. И передавать на тот же адрес, что в даташите.
+ ещё 2 резистора в вашей схеме для i2c на каждый светодиод
Их можно прямо в светодиод встроить как pullup. Там токи не большие
можно DMA
Та реализацию, которую я видел здесь память жрет как свинья. И не факт что в какой-нибудь stm32f100 вообще этот буфер влезет.
Если у вас есть более элегантное решение, я готов его выслушать.
При отсутствии передачи более 50 микросекунд лента переходит в исходное состояние, готова принимать пиксели начиная с первого.
Что означает «лента переходит»? У нее же нет общего «мозга», на сколько я понял. Тут имеется ввиду первый светодиод?
Еще такой вопрос: контроллер может как-то определить сколько светодиодов в ленте?
Контроллер не может определить количество светодиодов. Нет для этого никаких возможностей.
Еще такой вопрос: контроллер может как-то определить сколько светодиодов в ленте?
Если только закольцевать сигнал с последнего светодиода обратно на контроллер
Прикольно, но интереснее было бы реализовать передачу по двум проводам вместо трёх (данные по линии питания).
К примеру, я питал ленту от компьютерного блока питания и полную яркость с трудом удавалось зажечь — начинала глючить.
Каждый светодиод в кластере кушает 12 мА. Учитываем худший вариант — белый свет при максимальной яркости, т.е. 36 мА на светодиод.
Для пятиметровой ленты 60 LED/m это 10,8 А при 5 В.
Для пятиметровой ленты 144 LED/m это уже 26 А.
Там дорожки и разъемы столько не вытянут.
На их основе каждый может изобрести что-то свое:

Я раньше думал, что в лентах управление идет по какой-нибудь параллельной шине, по которой передается что-то вроде адреса светодиода и команда. Но такой способ оказался намного проще и универсальнее (в теории можно подключить любое количество светодиодов)
очевидно что команда передаёца последовательно через все микросхемы и последний светик поменяет немного позжэ чем первый. чтобы это проверить нужна достаточно длинная лента и 2х канальный быстродействующий осцылограф.
Как работает адресная светодиодная лента?