Notice: Memcache::get(): Server localhost (tcp 11211) failed with: Connection refused (111) in /home/a146/www/we.easyelectronics.ru/engine/lib/external/DklabCache/Zend/Cache/Backend/Memcached.php on line 134
LED-кубы: новая технология / Деталька / Сообщество EasyElectronics.ru

LED-кубы: новая технология

Наткнулся случайно на интересную разработку в LED: WS2812B — Intelligent control LED integrated light source
Она будет интересна всем, кто работает с большим кол-вом светодиодов.
Суть новшества в том, что каждый светик, условно, является 24-битовым сдвиговым регистром. Состояние этого регистра задает цвет светика в режиме RGB: по 8 бит на каждый цвет (всего 16М цветов). Т.к. регистр сдвиговый, светики можно соединять последовательно каскадом и управлять всеми по ОДНОЙ(!) линии.
Схема соединения:

И рекомендуемая схема включения:


Протокол передачи данных:

Тайминги сигналов


Частота сканирования светиков — не менее 400Hz. Скорость передачи данных 800Kbps.
Т.е. сейчас можно элементарно сделать LED-куб 4х4х4 на одном контроллере. А при желании и 10x10x10.
Форма-фактор: SMD 5050.
Datasheet: www.adafruit.com/datasheets/WS2812B.pdf
На ebay продают 1000штук за $110.

Комментарии (80)

RSS свернуть / развернуть
Светодиоды крутые и во многом помогут сократить платы управления. Взять хотя бы тот же ambilight для телевизоров и мониторов. Lightpack, если мне память не изменяет, его конструкция заметно упрощается, причем количество светодиодов можно сделать очень большим.
А вот в случае с LedCube немного не то: в кубе обычно применяют обычные светодиоды с прозрачным корпусом, ведь надо чтобы каждую точку видно было и чуть «снизу»…
+1
Согласен. Вообще, для куба советуют матовые круглые диодики. Лучше обзор и нижние диодики не засвечивают верхние.
В прозрачных RGB я вообще смысла не вижу. Они тупо светят тремя отдельными кристаликами без намёка на смешение цветов.
0
в тот то и разница что прозрачные светят, а матовые светятся.
0
есть такие светики и в 5мм кормусе — погуглить алли можно
0
А можно пример запроса? Не могу сообразить как найти.
0
Не подскажу. мне они попадались «пипоходом» когда я искал микросхемы.
0
Нашел по «Addressable 5mm LED» вот www.sparkfun.com/products/12986 те/нете что я видел не скажу. даташит там есть, ещё и матовый как на заказ. Спрос есть — будут и предложения. с таких светиков легче экраны собирать — вот и спрос.
0
Единственное что попадалось это 5мм RGB светодиод припаяный к маленькой платке с одной из подобных микросхем, впрочем относительно диода плата не такая уж и маленькая.
0
Есть таке дело, но были и со встроенным кристалом.
0
Воистину феномен Баадера-Майнхофа работает, только начали с другом делать имба-гирлянду на 5 метровой ленте с этими сид, так сразу кругом появлятся их упоминания в статьях)

А вообще эта заметка в блог Деталька хорошо впишется.
+1
А вообще эта заметка в блог Деталька хорошо впишется.
Спасибо. Перенес.
0
хм. до нового года еще пол года. видимо действительно имба будет xD
0
не. в любом случае за принцип «не откладывать все на последний день» выражаю уважение xD
0
Ну типа «готовь сани летом» и все такое :)
0
одобрямс. а то по жизни в середине декабря «а не сделаете ли нам вот такую хрень, чтоб мигала красиво»
0
Я ничего особо не хочу сказать, но эти диоды уже пипец как давно на рынке есть. Ну года три точно
+1
гораздо интереснее на мой взгляд APA102
0
Там довольно невнятное описание протокола. И сам он немного странный — посылка для белого цвета будет 0xFFFFFFFF — то есть, стоп-фрейм. Логичней было бы, если бы поле флагов выглядело не как 111ggggg, а, скажем, 110ggggg.
0
Вот тут есть детальный анализ протокола.
0
А, любопытно. Особенно любопытен момент с end frame. «Не верь китайским датаишитам» :D
0
Да, кстати, весьма симпатичные штучки. Гораздо более внятный протокол, высокая частота PWM и нормальный SPI. С учетом того, что формат данных вполне пригоден и для обработки в памяти, можно запихивать весь буфер в одно касание через DMA.
0
Только однопроводной протокол все же удобнее в трассировке. В принципе, поскольку у них протокол односторонний, могли бы и не изобретать, а взять обычный UART с примерно той же логикой — 3 байта жрем, остальное передаем дальше, пакеты разделяются паузами.
0
Там практически никакой разницы в удобстве трассировки. Между выводами чипа пускаем землю и питание, входы следующего чипа совпадают в выходами предыдущего. Ну и как по мне, то SPI удобнее и делает протокол нечувствительным к таймингам.
0
Мне они не нравятся большим кол-вом контактов, не очень удачно расположенных. WS2812B позволяет сделать такую решотку на основе голых медных проволочек:

Про вертикальным, опорным линиям подаем питание, по горизонтальным передаем сигнал.
И трех-мерная структура будет соблюдена и лишних барьеров для света нет (получается, светики «висят в воздухе»).
0
От нарисованного отличие будет совсем небольшое — оба питания с одного края (то есть светодиод будет расположен ровно, а не под углом) и горизонтальных соединений будет два, а не одно.
0
Но прямыми проволочками их уже не соединишь, нужны фигурные дорожки. Или я чего-то недопонял? Но тогда проиллюстрируй.
0
Прямыми проволочками, думаю, можно, только П-образные изгибы в местах пайки прийдется делать. Ну или (если провод изолированный) то и полностью прямыми можно (только зачистить в местах пайки).
0
Это уже не прямые проволочки, а гнутые :) Что несколько более трудоемко.
0
Мне вот что интересно. У этих светодиодов свой, ни с чем не совместимый протокол. Все реализации на МК что я видел либо требуют много процессорного времени либо памяти больше чем 24 бита на пиксель. А есть ли для них некий PHY который из чегото стандартного сам сформирует всю эту последовательность с необходимыми таймингами? Видел статью на хабре где это сделали на рассыпухе и микросхемах 74 серии, но получилось несколько громоздко.
0
Можно реализовать через UART, примерно как на нем делается 1-wire. В случае STM32 можно формировать в памяти буфер и кормить UART из него, обновляя буфер в прерываниях (экономит память, но несколько загружает ядро) или заводя полный буфер (тогда нужно дофига памяти — по 12-24 байта на СИД). На AVR можно сделать передачу в UART на прерываниях, загрузка будет приличной, но все же лучше, чем delay-циклы.
0
С 1-wire работать не доводилось, но как я понял при эмуляции через uart тоже используется не прямая передача а формирование требуемых интервалов последовательностью бит. Такой способ я видел, но там требуется передать 4 бита на каждый бит посылки. А светодиоду нужно 24 бита, итого 96 бит на светодиод, которые или хранить или считать на лету. В той же схеме на рассыпухе 1 бит spi соответствовал 1 биту посылки, тоесть отправил три байта и они прямо целиком в светодиод легли.
0
Гм, тут, похоже, даже можно 3 бита на бит. Надо попробовать, я пока только на NOPах игрался
0
Да, я об этом и говорю. Но можно же найти подходящий компромисс между размером буфера посылки и частотой его обновления. Иначе — да, придется лепить что-то аппаратное. Я бы поковырял каталог производителя этого чипа, врядли кто-то другой будет лепить преобразователь под чужой протокол, а стандартным он не выглядит.
0
А через SPI его не прогнать? Конечно будет по байту на бит, но зато гнать можно не отвлекаясь почти.
0
А какая разница между SPI и UART в этом плане?
0
А уарт разве по скорости проходит тут? Он вроде бы в тайминги не укладывается.
0
UART'ы разные бывают, иные и до нескольких мегабит спокойно выдают. Там, правда, полярность старт-стоповых бит неудобная. Можно и через SPI, если через UART на каком-то камне не канает.
0
а мне кажется, легче просто ШИМ один выделить. На Атмегах там с таймерами напряг конечно, но вот для STM — вообще милое дело.
0
А не слишком ли часто его перезагружать придется? Через UART/SPI можно гнать 2-3 бита выходных данных на на байт входных, у таймера будет 1-2 байта на бит выходных данных в зависимости от разрядности ШИМа.
0
ну разрядность шима делать больше чем 8 бит- не вижу смысла. Второе: В прерывании делаем сдвиг значения влево и в зависимости от результата выставляем либо одно число в шим, либо другое. Не нужно никакой памяти и кеша. Да, может быть это покажется затратным, но как по мне — самый верный способ, без извратов с внешними компонентами а так же с кодом. После поди разберись что здесь имели ввиду, когда накодили непойми что в случае с SPI или USART
0
Ну так с UART все то же самое — читаем бит и выставляем соответствуюшее число в регистр UART. Только в случае UART'а больше простор для оптимизаций — скажем, можно читать три бита и, соответственно, выставлять одно из 8 чисел. И точно так же, если хочется проредить прерывания — создаем буфер и кормим таймер или UART данными оттуда. Но я не помню, есть ли в том же STM32 восьмибитные таймеры, а для 16-битного потребуется и буфер заводить по ворду на бит, а не по байту.
0
В STM пишется число ARR 255 и все, дальше 16-ти битный ОП! превращается…
ну вы поняли. Вот именно если по три бита читать да буфер рисовать, то вот здесь начинаются проблемы с адекватностью кода. Это сродне тому как
if Length(IntToStr(n)) = 1 then
  begin
  ...
  end
Поди разбери для чего это было написано, а главное, каким образом это решено? И почему это работает?
0
А это уже зависит от того, как закодируешь. Но UART можно использовать как таймер (UDR = next_bit? 0b11111000: 0b11100000 в прерывании), а вот таймер выдавать по два-три бита разом не заставишь. Что до буферизации и DMA — для таймера и UART'а этот код будет абсолютно идентичен.
В STM пишется число ARR 255 и все, дальше 16-ти битный ОП! превращается…
ну вы поняли.
Регистр-то остается 16-битным. Хотя, наверное, можно настроить DMA так, чтобы он обновлял только младший байт.
0
if Length(IntToStr(n)) = 1 then
Пожалуйста, только не говорите про срач в комментах, ладно?
0
паскаль?
0
Ох ты ж, а в Паскале это легальное сравнение?
0
угу. а присваивание :=
0
Лажанулся.
0
Не только. В нем еще и присваивание не возвращает результат, так что := вызовет ошибку.
0
Так ведь и функция — не lvalue?
0
В паскале/дельфи — нет.
0
Впрочем, насчет последнего уже не уверен. Кажется, где-то в районе XE3 проскакивало что-то насчет first-class functions.
0
у USART старт-стоп биты имеются, так-что… имеется гемор. А если кидать целый байт, то как минимум — полярность старт-стопа не та…
0
Если сигнал инвертировать (один транзистор, а у некоторых UART'ов, возможно, и встроенный инвертор есть) — то они будут как раз нужной полярности, выставив 7-битный байт (9 бит со старт-стопом) можно передавать по три бита за раз. Конечно, нужен UART, поддерживающий 7-битный байт и 2.4МБод.
0
Как правило, в современных мк есть dma и куча памяти, так что можно вполне аппаратное решение получить связав dma с таймером или интерфейсом каким-нибудь. Ну и еще как вариант для экспериментов внешнюю память попробовать прикостылить, но вряд ли это будет эффективнее какого-нибудь кортекса из нижнего ценового сегмента.
0
беда в том что гирлянда получается на камне, который минизвездолет осилить может.
0
Не вижу в этом особой проблемы. Оверкил, не оверкил — это субъективно. Главное чтобы было получено эффективное решение задачи)
0
ну в данном случае не «оверкил» по причине того, что более красиво сделать не получится. «оверкил» потому что контроллер используется далеко не полностью. эффективным решением назвать язык не поворачивается. эффективным будет только железная поддержка протокола, однако увы.
0
Ну а что поделать, если сейчас даже младшие контроллеры по параметрам превосходят Apollo Guidance Computer.
0
ну так у меня вопрос как всегда в цене:) получается что из-за популярных недорогих и «простых» в использоыании светодиодных можулей приходится ставить дорогой контроллер. Ситуация из разряда ставить 1-wire температурный датчик или городить из рассыпухи да на аналоге.
0
Дорогой? STM32F030F4 имеет все необходимое, чтобы рулить этими светодиодами, и при этом он дешевле, чем ATTINY13 (по крайней мере мне они обошлись в 21р, а тиньки в 26р).
0
хм. Я их в последний раз за полтинник брал.
0
Кого «их»? Ну и это было до декабрьского кризиса.
0
Stm32F030f4 за долго до декабря. Даже не помню когда и для чего x_x
0
Ну, мне пришлось немного поискать адекватную цену) Но, насколько я помню, даже неадекватные с атмегами сравнимы.
0
У меня тоже, и этот критерий я тоже рассматривал перед тем как назвать решение эффективным. Vga уже пояснил.
0
выше написал про APA102. там проще с затратами.
0
Как я понял, защёлки в них нету? Все разом переключить не получится?
0
Судя по даташиту — каждый СИД защелкивается, как только получит 24 бита данных после ресета, все остальные данные просто байпасит на выход. Так что нет.
А вообще, могли бы сделать обычный сдвиговый регистр и защелкивание вместо ресета.
0
а не при ресете защелкивается? честно, даташит не читал, но по беглому обзору статей понял что пропускаются все данные, пока не придет таймаут достаточный для ресета.
0
Судя по даташиту, поймав ресет, диод жрет первые 24 бита, защелкивает их, а все остальное гонит дальше по цепочке.
0
ну тогда вдвойне странный протокол. собственно и ты выше описал тот принцип, который я понял. более удобный и очевидный имхо.
0
Вообще, если подумать, в моем варианте проблема с передачей ресета по цепочке. В том варианте, что реализован — тишина на месте сожранных предшествующими диодами данных воспринимается как ресет.
0
почему проблема? Пока по цепочке ничего не пришло — висим на ресете. Как только данные появляются и идут — суем их в регистр сдвига и передаем дальше при переполнении, как только кончились данные — защелкиваемся (при чем это все будет синхронно) и начинаем ждать следующей пачки
0
Как я понял они данные защёлкивают получив 24 бита, но выводят их как цвет именно после ресета, так что должны разом переключиться. Но всёже стоит проверить.
0
О, как по заказу статья на Хабре, о том как реализовать этот протокол используя программируемую логику встроенную в некоторые PIC.
0
Забавно. Прочем логика там простая, можно заменить парой одногейтовых микросхем серии 74LVCxx1G (или даже рассыпухой в духе DTL). Правда, мне не очень нравятся тайминги (например, единичка вместо рекомендуемого 0.8/0.45 будет 0.62/0.62), но, видимо, работает.
0
также можно заменить абсолютно любым 8ми ногим МК и тогда интерфейс любой, 1wire, uart, i2c, spi…, и так как ему больше заняться нечем будет, пусть хоть ногодрыганием и NOPами тайминги выдерживает какие угодно, хоть через spi, хоть по прерыванию от таймера на каждый бит.

а если именно на логике, то для преобразования из SPI (чтобы по биту на бит) наверное можно обойтись вообще единственным 74xx74 и RC цепочкой.
0
когда придет байт по последовательному интерфейсу и вызовется прерывание нопы могут слететь к чертям
0
а в некоторых PIC ( pic16f182x )даже есть DSM (Data Signal Modulator)!!!
— задается сигнал для «1» (допустм ШИМ1)
— задается сигнал для «0» (допустм ШИМ2)
— задается сигнал данных (допустим от — SPI)
и вуаля только успевай загружать SPI!!!

еще не пробовал, но планирую добыть светики и в путь
pic16f1825 уже есть
(внутри довольно навороченный и всего soic14)
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.