170

Управление светодиодной лентой на 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 позволяет управлять ленточками из любого современного браузера в рамках домашней сети. В комментариях или следующем посте расскажу о том, как сделать веб-страничку с выбором цвета лент из палитры или простейшим алгоритмом для переливания.