169

Управление светодиодной лентой на Raspberry PI через websocket

Всем привет!

Продолжаем тему Raspberry PI и гирлянд. (Предыдущий пост)

Сейчас мы рассмотрим светодиодные ленты/гирлянды на чипах WS2811WS2812WS2812b и способы управления ими .

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

Сначала немного теории.

WS2811 и WS2812 работают на частоте около 800 кГц. Данные передаются с помощью широтно-импульсной модуляции.

Для передачи нуля или единицы используется различная скважность импульса.

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

Каждый отдельный светодиод принимает только 24 бита информации, все оставшееся биты пропускает на следующий светодиод.

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

биты передаются в таком порядке:

G7 G6 G5 G4 G3 G2 G1 G0    R7 R6 R5 R4 R3 R2 R1 R0    R8 B7 B6 B5 B4 B3 B2 B1 B0

Обратите внимание, что сначала передается зеленый, а не красный, как в RGB-системе.

То есть, чтобы зажечь светодиод оранжевым цветом (#FF8000), мы отправим:

| 1 0 0 0 | 0 0 0 0 | 1 1 1 1 | 1 1 1 1 | 0 0 0 0 | 0 0 0 0 |

|     8     |     0     |      F     |     F     |     0     |     0     |

Пауза в 50мс или дольше делает сброс. Светодиоды продолжают гореть в том состоянии, в котором их оставили раньше, но следующий блок данных будет снова считываться первым светодиодом. Чтобы погасить ленту, нужно отправить 24 нулевых бита каждому светодиоду, или же просто отключить ее от питания.

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

Один из способов управлять светодиодами - подключить управление ленты (DATA) к разъему SPI_MOSI (GPIO10). Затем включить драйвер SPI на частоте 3.2 мГц (в 4 раза выше частоты ленты) и передавать бинарные данные:

1000 - для передачи на ленту нуля

1100 - для передачи на ленту единицы

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

Очень похоже на графики выше, при этом мы отлично укладываемся в погрешность 0.15 микросекунд.

Таким образом у нас получается четырехкратная избыточность информации.

К сожалению, стандартный драйвер SPI имеет ограничение на 32767 байт в одном непрерывном сообщении, Поэтому максимальное число светодиодов, которыми мы можем управлять:

                (байт в сообщении) * (бит в байте) / (бит на светодиод) / (избыточность)

                                                 32767 * 8 / 24 / 4 = 2730

Мало? В принципе, достаточно, чтобы управлять 45-метровой лентой с частотой по 60 диодов на метр, или почти 19-метровой лентой с максимальной плотностью диодов (144 на метр)

Напряжение на портах GPIO составляет 0 и 3.3v, а лента требует 5v.

Чтобы поднять уровень сигнала до 5v, рекомендуют использовать сместитель уровня 74HCT125P или 74HCT125. Подключается он таким образом:

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

Но в моем случае ленточка заработала напрямую с порта GPIO, так что этот пункт считаем необязательным.

Теперь о том, как управлять ленточками удаленно через браузер.

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

Для манипуляции с адресной лентой проще всего использовать уже готовый драйвер. Мой выбор остановился на библиотеке rpi-ws281x-native для nodejs.

Я написал приложение, которое может управлять всеми лентами через вебсокеты.

Скопировать и установить его себе можно так:

git clone https://github.com/DPOH-VAR/pi-strip-websocket.git

sudo npm install node-gyp -g

cd pi-strip-websocket

sudo npm install

Теперь переходим в папку pi-strip-websocket, открываем config.json и настраиваем под себя:

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

В этом примере указано подключение трёх ленточек. Ими можно будет управлять по адресам:

ws://raspberrypi:4440/LED-RGB/

ws://raspberrypi:4440/LED-WS2812/

ws://raspberrypi:4440/LED-WHITE/

Запускаем приложение:

sudo node index

Теперь остается только подключиться по вебсокету по одному из адресов и отправить данные.

- Для RGB лент мы отправляем три байта, отвечающие за R,G,B компоненты.

- Для адресной ленты мы отправляем по три байта на каждый светодиод (порядок RGB)

На любом компьютере открываем гуглохром, на не https страничке заходим в консоль (F12) и пишем:

Управление светодиодной лентой на Raspberry PI через websocket Raspberry pi, Микроконтроллеры, Светодиодная лента, Javascript, Nodejs, Гирлянда, Гифка, Длиннопост

Этот скрипт будет каждый раз в 500 миллисекунд зажигать RGB ленту случайным цветом.

Вот и всё. Теперь наш Raspberry PI позволяет управлять ленточками из любого современного браузера в рамках домашней сети. В комментариях или следующем посте расскажу о том, как сделать веб-страничку с выбором цвета лент из палитры или простейшим алгоритмом для переливания.

0
Автор поста оценил этот комментарий

Автор, я не сильно понимаю, что вы написали, но все равно объясните, пожалуйста.  То есть на обычной RGB ленте можно включать разные цвета одновременно? Как так то?!!! 

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Посмотрите мой предыдущий пост, там показано, как подключить RGB ленту.


RGB лента имеет 4 контакта: +12v, G, R, B.

на +12v мы всегда подаем напряжение, остальные контакты управляются с помощью транзисторов, которые пропускают землю или обрывают цепь.

Raspberry PI с помощью портов gpio даёт команду открыть или закрыть транзистор. Таким образом мы можем управлять цветами R, G, B по отдельности.

Чтобы включить ленту не в полный накал, Raspberry PI должен очень быстро менять команду с 1 на 0, при этом мощность будет пропорциональна отношению продолжительности единицы к общему периоду. Яркость светодиодов квадратно-пропорциональна мощности.

Делается это с помощью драйвера pigpio.

Надеюсь все понятно объяснил.


UPD:

На обычной RGB ленте все светодиоды горят одинаковым цветом. 

В начале я рассказывал про адресные ленты, у них каждый светодиод можно зажечь независимо любым цветом, но они примерно раза в 3-4 дороже обычных RGB лент.

показать ответы
0
Автор поста оценил этот комментарий
расскажи как сделать чувствительность от проигрываемой музыки. программирование конечно хорошо, но мне нужно автоматом. мб через микрофон как это реализовано в клубных лазерах и стробоскопах
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Сейчас работаю над этим, пытаюсь сделать цветомузыку с помощью Web Audio API. 

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

показать ответы
0
Автор поста оценил этот комментарий

Нельзя питать ленту от gpio.

Если лента длинная, то gpio может не выдержать силу тока и сгореть.

По моим экспериментам над Ардуино, можно включить 10-15 светодиодов. Над малиной я так не экспериментировал, дорого выходит.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

... а вообще-то экспериментировал. Малина уходит в перезагрузку при сильном жоре. Но все равно не советую так делать.

0
Автор поста оценил этот комментарий

Про питание что то не понял... Т.е. вы запитали ленту от 3.3В GPIO? Или все таки с внешнего источника?


А вообще интересует питание ленты с GPIO. Можно ли напрямую запитаться с GPIO (через повышайку до 5В)? Лента обычная белая 5В.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Нельзя питать ленту от gpio.

Если лента длинная, то gpio может не выдержать силу тока и сгореть.

По моим экспериментам над Ардуино, можно включить 10-15 светодиодов. Над малиной я так не экспериментировал, дорого выходит.

показать ответы
0
Автор поста оценил этот комментарий

Хочу себе замутить аналог эмбилайта на WS2812. вот думаю на ардуине делать и к компу, на котором KODI (XBMC) стоит. или сразу можно на RPI поднять XBMC и WS2812??? 

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Не рекомендую держать медиа-сервер на Raspberry PI. Не справится он с воспроизведением потокового видео в Full-HD. Если только брать модель 2B.

1
DELETED
Автор поста оценил этот комментарий

Автор, Вам не приходилось работать с аналоговыми датчиками на Raspberry? Сейчас как раз стоит такая задача. Знаю о способе снятия сигнала через АЦП, с помощью I2С, но на опыте такого не делал, интересно было бы почитать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Мне не приходилось еще работать с I2C. Я встречал только один туториал, тут: http://raspberrypi.ru/blog/readblog/150.html

0
DELETED
Автор поста оценил этот комментарий

Я тут читал про эти светодиоды, но возник один вопрос, можно ли выключать конкретные единицы? @dpohvar

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В случае с WS2812 вы можете управлять каждым светодиодом отдельно.

Однако управляющая команда идет одна, на всю ленту, и содержит информацию для каждого светодиода по порядку