Roshni: контроллер для управления адресуемыми светодиодами на Teensy 4.1

Roshni LED controller dashboard showing dual output configuration and performance metrics ИТ

# Roshni: контроллер LED, когда стандартных решений недостаточно

Когда вы собираете амбилайт для домашнего кинотеатра, управляете декоративной подсветкой в нескольких комнатах или работаете со светодиодными инсталляциями в коммерческих проектах, возникает проблема, которую потребительские контроллеры не решают: управление двумя независимыми LED-системами с одной платы, прием данных из нескольких источников без перепрошивки, и все это со стабильностью, о которой можно забыть.

Вот что делает Roshni.

Roshni — это production-готовый контроллер светодиодов, построенный на Teensy 4.1 (ARM Cortex-M7 на 600 МГц). Он позволяет управлять двумя независимыми светодиодными лентами одновременно, каждая с собственным типом микросхемы, настройками цвета и питанием. Контроллер принимает данные из трех источников в порядке приоритета: TPM2 по USB, UDP Raw по Ethernet или встроенные эффекты. Каждая функция доступна через REST API, поэтому Roshni интегрируется в Home Assistant, Node-RED или любую другую систему, которую вы используете.

Он разработан для людей, которые посмотрели на WLED, QuinLED или различные коммерческие наборы для амбилайта и подумали: «Мне нужна гибкость, и я готов потратить время, чтобы сделать это правильно».

## Что отличает Roshni

Большинство контроллеров LED заставляют выбирать: либо вы управляете одной лентой с одним протоколом, либо собираете что-то сами и потом это поддерживаете. Roshni вмещает весь стек в одну прошивку, которую вы прошиваете один раз и настраиваете через браузер.

### Два независимых выхода

Вы можете управлять двумя совершенно разными светодиодными системами с одной платы.

**Выход 0** управляет лентами APA102 или SK9822 (до 600 светодиодов) по SPI с отдельными линиями данных и тактирования. Они работают быстро, хорошо переносят длинные кабели и подходят для применений, где нужна высокая частота обновления или большие расстояния между контроллером и лентой.

**Выход 1** управляет лентами WS2812B или SK6812 (до 574 светодиодов) по одному GPIO пину. Дешевле за светодиод, чем APA102, но требует точных импульсов и лучше подходит для коротких расстояний.

Вы не ограничены независимой работой. Можно:
— Зеркалировать оба выхода на одни данные (двойная лента амбилайта удваивает яркость)
— Зеркалировать с разворотом (ленты смотрят в разные стороны)
— Объединить в один логический дисплей на 1200 светодиодов
— Запустить их полностью независимо с разными источниками данных и эффектами

Каждый выход имеет независимые настройки: тип микросхемы, порядок цветов (RGB, GRB, BGR и т.д.), яркость, гамма-коррекция и направление. Если у вас две партии светодиодов с немного разной цветопередачей, Roshni это обработает автоматически.

### Три источника данных с приоритизацией

Большинство LED-контроллеров слушают один протокол. Roshni слушает три одновременно и автоматически переключается по приоритету.

1. **TPM2 по USB** — стандартный протокол HyperHDR. Подключите USB-кабель от ПК или телевизора, и Roshni получит 50–60 FPS амбилайт-данных сразу же. Используйте это, если захватываете видео с исходного устройства.

2. **UDP Raw на порту 5568** — вариант по Ethernet, предпочтителен при стабильном доступе в сеть. HyperHDR, WLED и другие контроллеры говорят на UDP Raw нативно. Как только приходит UDP-пакет, он берет управление из любого активного встроенного эффекта.

3. **Веб-интерфейс / встроенные эффекты** — когда нет внешних данных, можно запустить встроенные эффекты: FULL (все светодиоды белые), Fire, Breathing, Plasma, Cylon, Matrix, Rainbow, Solid (однотонный), Strobe или Random. Плюс палитра и ввод hex-кода.

Модель приоритета простая: приходят TPM2-данные, они становятся активными. TPM2 прекращается, UDP Raw берет управление. Оба источника молчат, возобновляются встроенные эффекты. Вам никогда не нужно перепрошивать или перестраивать систему. Просто начните отправлять данные, и Roshni переключится сам.

### Оборудование: Teensy 4.1 + официальный Ethernet Kit

Teensy 4.1 — это ARM Cortex-M7 на 600 МГц с 1 МБ ОЗУ и 8 МБ флэша. Примерно в 2.5 раза быстрее, чем платы на ESP32, которые используют большинство LED-контроллеров.

Это означает:
— Реал-тайм производительность без потери кадров
— Достаточно CPU для диагностики и мониторинга при отправке пиксельных данных
— Аппаратный Ethernet через официальный PJRC Ethernet Kit (без помех Wi-Fi)
— Несколько каналов DMA для параллельной передачи данных
— Стабильная температура (68–69 °C в устойчивом состоянии)

Рекомендуемая сборка использует промышленный металлический корпус IP66 с внешними 5 В блоками питания (2× 20 А или 3× 30 А в зависимости от плотности LED и выбора цветов), отдельную защиту на каждый выход и опциональную гальваническую развязку между зонами. Включены схемы и таблицы распиновки CAT5.

### Реальные показатели производительности

Это данные из production-инсталляции автора: rooted LG C9 OLED с HyperHDR, захватывающий 574 WS2812B светодиода по TPM2.

— 50 FPS (синхронизирован с частотой видео)
— 68875 кадров обработано за 2138 секунд работы
— 0 ошибок
— 100% успешных кадров
— ~1 мс задержки на кадр TPM2
— ~9800 Гц частота основного цикла под нагрузкой потока
— 68–69 °C температура CPU

Встроенный тест производительности измеряет до 1000 FPS в loopback-тесте (тестирование выходного драйвера без внешних данных). Это валидирует пиксельный конвейер в идеальных условиях.

## Термика (важно для больших инсталляций)

Если вы управляете 1000+ адресуемыми светодиодами, тепловой менеджмент — не опция. Это разница между стабильной 5-летней инсталляцией и преждевременной деградацией LED.

Один светодиод APA102 потребляет примерно 60 мА при полной белизне (20 мА на каждый RGB-канал), рассеивая около 0.3 Вт. На полосе из 574 светодиодов с плотностью 60 пикс/метр (9.57 метров), это 172 Вт электрической мощности в пике, из чего около 130 Вт становится теплом в самой ленте.

На голой flex-PCB при 13.5 Вт/метр постоянного тока температура поверхности достигает 70–90 °C. Это разрушает 3M-клей за месяцы и ускоряет старение люминофора. Стандартные способы защиты:

1. **Установка на алюминиевый профиль.** Снижает температуру на 20–30 °C. Необходимо при такой плотности.
2. **Ограничение глобальной яркости.** Реальный амбилайт редко нуждается в 100% белизне. Ограничение на 80% снижает пиковое тепло примерно на 20% без видимой разницы для большинства контента.
3. **Снизить бюджет тока.** Планируемый блок питания 3× 30 А оставляет примерно 30% запаса. На практике вы вряд ли превысите 40–50% постоянного потребления.

Для текущей сборки 2× 20 А (574 WS2812B), тепловая нагрузка остается в безопасных пределах на алюминиевом профиле с удобным запасом.

## Типовые сценарии (13 реальных конфигураций)

Roshni работает лучше всего, когда вы думаете о том, какие данные входят и куда они выходят. Вот 13 реальных конфигураций, которые люди используют:

| Конфигурация | Входные данные | Выходы | Когда использовать |
|—|—|—|—|
| Полная независимость | 2 разных потока | 2 разных выхода | Амбилайт ТВ (выход 0) + подсветка кухни (выход 1). Одна плата заменяет два контроллера. |
| Линейное объединение | 1 поток | Оба выхода подряд | Одна длинная лента превышает лимит 600 LED одного выхода. 1000+ светодиодов в ряд. |
| Зеркалирование | 1 поток | Оба выхода (одни данные) | Двойная полоса амбилайта. Ленты смотрят в одну сторону, яркость удваивается без роста частоты обновления. |
| Зеркало с разворотом | 1 поток | Выход 0 прямо, выход 1 развернут | Симметричные инсталляции. Ленты по бокам ТВ или окна, каждая получает свое зеркало данных. |
| Разные типы микросхем | 1 поток | APA102 (выход 0) + WS2812B (выход 1) | Разные компромиссы производительность/цена в разных зонах. APA102 в зоне камеры (без мерцания), WS2812B в декоративных зонах. |
| Разные источники, разные зоны | 2 разных потока | 2 выхода, разные микросхемы | Профессиональная инсталляция. Выход 0 получает амбилайт из одной системы, выход 1 из другой. |
| Гальваническая развязка | Любые | Выходы на разных фазах/автоматах | Коммерческие проекты, требующие соответствия электрокодексу или большого потребления тока. |
| Прототип + production | Любые | Выход 0 (тест), выход 1 (боевая) | Разработка и отладка без прерывания боевой инсталляции. |
| Резервирование | 1 поток | Оба выхода (идентичные) | Одна лента резервирует другую. Если одна выходит из строя, вторая показывает контент. |
| Debug-оверлей | 1 поток | Выход 1 (контент) + выход 0 (диагностика) | Живая отладка. Выход 0 показывает графики FPS или тепловую карту ошибок, выход 1 показывает обычный контент. |
| Масштабирование за лимит одного выхода | 1 поток | Оба выхода объединены | Превышен лимит по длине кабеля или по току одного выхода. Раздел на две системы питания и распределения. |
| Распределение мощности | Любые | 2 выхода (выбор по мощности) | Выше 40 А один блок питания становится непрактичным. Раздел естественно дает две независимые электрические области. |
| Зонирование по времени | Любые | Выход 0 (день), выход 1 (вечер) | Расписание для разных зон в разное время. Управление из Home Assistant или cron. |

Большинство пользователей начинают с зеркалирования (двойная полоса амбилайта) или полной независимости (отдельные зоны). Вы скоро обнаружите, что матрица гибкости полезна способами, которые вы не планировали.

## Сеть и веб-интерфейс

Roshni раздает полную панель управления прямо из контроллера. Никакого отдельного приложения, никаких облачных зависимостей. Откройте браузер на `http:///` и вы получите три панели.

**LED-конфигурация** — выберите тип микросхемы, количество светодиодов, порядок цветов, яркость и смещение на каждый выход. Настройки сохраняются в EEPROM.

**Управление и эффекты** — вкл/выкл светодиодов, выбор из 10 встроенных эффектов (FULL, Fire, Breathing, Plasma, Cylon, Matrix, Rainbow, Solid, Strobe, Random), выбор цвета из палитры или ввод hex-кода. Мониторинг телеметрии: FPS, количество кадров, процент ошибок, время работы, температура CPU.

**Управление** — загрузчик OTA-обновления прошивки, логи EEPROM (если включены), кнопки прямого доступа к API, тест производительности.

Каждое действие в UI отображается на REST-endpoint. Вам не нужен UI для Home Assistant, Node-RED или пользовательских дашбордов. Просто делайте HTTP-запросы:

«`
GET /api/mode?name=fire # Включить эффект Fire
GET /api/power?on=1 # Включить питание светодиодов
GET /api/solid?color=FF0000 # Однотонный красный
GET /api/led?chipset=apa102 # Переключиться на APA102
POST /ota -F file=firmware.hex # OTA-обновление
«`

Полный API reference включает все endpoints, параметры и схемы ответов.

## Архитектура: матрица входов × выходов

Реальная мощь Roshni в том, как входы и выходы развязаны друг от друга. Вы выбираете независимо.

**Что входит:** TPM2 (USB), UDP Raw (Ethernet), встроенные эффекты или ничего.

**Сколько источников:** до трех одновременно (преимущество по приоритету).

**Что выходит:** APA102 (быстрый SPI, до 600 LED), WS2812B (дешевле, одна линия, до 574 LED), или любой тип микросхемы в FastLED.

**Как маршрутизируется:** независимые срезы буфера на 1200 LED, зеркалирование, объединение, разворот или комбинация.

**Настройки на выход:** тип микросхемы, порядок цветов, яркость, гамма, направление, смещение.

Эта гибкость позволяет Roshni работать и с простыми сборками (вставь, настрой, забудь) и со сложными (арт-инсталляции, коммерческие проекты, многокомнатные сценарии). Вы покупаете одну плату и она адаптируется к вашим потребностям, а не наоборот.

## Быстрый старт (5 минут)

1. **Прошейте прошивку** — загрузите последний `.hex` из Releases и используйте Teensy Loader, или OTA-обновление, если у вас уже есть рабочая версия.

2. **Подключите Ethernet** — вставьте кабель. Roshni запросит DHCP при загрузке и выведет IP по серийному порту.

3. **Откройте веб-интерфейс** — перейдите на `http:///` в браузер.

4. **Настройте свою полоску** — выберите тип микросхемы (APA102 или WS2812B), количество светодиодов, порядок цветов (RGB/GRB/и т.д.) и яркость. Нажмите Apply. Настройки сохранятся.

5. **Укажите ваш источник данных:**
— По Ethernet: HyperHDR → Add LED Device → `udpraw` → `:5568`
— По USB: HyperHDR → Add LED Device → `tpm2` → серийный порт, baudrate 2000000

Все. Эффекты из веб-интерфейса будут автоматически вытеснены, когда придут внешние данные.

## OTA-обновления и диагностика

Обновления прошивки идут по HTTP. Никакого Teensy Loader, никакого USB после первоначальной установки. Загрузите новый `.hex` файл через панель OTA-обновления в веб-интерфейсе.

Встроенная диагностика:

— **Performance Test** — запуск loopback-теста на пинах 20/23, измерение реального распространения пиксельных данных и обнаружения ошибок до 1000 FPS
— **Continuous Test** — мультимодовой диагностический цикл для стресс-тестирования
— **Boot Logs** — сохранение событий загрузки в EEPROM (опционально, отключено в MEM-OPT для экономии памяти)
— **Live Status** — реал-тайм FPS, количество кадров, процент ошибок, успешность, время работы, Гц цикла, температура CPU

## Примеры интеграции

### Home Assistant

Для домашней автоматизации Roshni интегрируется как простое REST-устройство. Определите команды в `configuration.yaml`:

«`yaml
rest_command:
leds_fire:
url: «http://10.0.1.59/api/mode?name=fire»
leds_off:
url: «http://10.0.1.59/api/power?on=0»
leds_solid_red:
url: «http://10.0.1.59/api/solid?color=FF0000»
«`

Затем создавайте автоматизации или скрипты, которые их вызывают. Подробнее в нашем [гайде по настройке Home Assistant](/articles/it/smart-home-setup/).

### Node-RED

Простой HTTP request node на `http:///api/mode?name=` дает вам полный контроль внутри своего flow. Комбинируйте с MQTT, вебхуками или времени-основанными триггерами. Этот подход хорошо работает с другими стратегиями оркестровки домашней автоматизации из нашего [гайда по DIY IoT](/articles/it/diy-iot-automation/).

### HyperHDR (Ambilight)

Roshni — это полноценное HyperHDR-устройство. Добавьте его как `udpraw` по Ethernet (рекомендуется, низкая задержка) или `tpm2` по USB. Автор запускает HyperHDR прямо на rooted LG C9 OLED, захватывая видео-конвейер ТВ и отправляя TPM2 в Roshni без внешнего оборудования. Это самый низкозадержный подход для ТВ-амбилайта.

## Известные ограничения и компромиссы

— **WS2812B критичен к импульсам.** Расстояния свыше 2 метров требуют аккуратной терминации линии. Используйте CAT5 с правильной дифференциальной терминацией близко к ленте.
— **APA102 быстрее, но дороже.** Примерно 50–70¢ за светодиод против 10–15¢ для WS2812B.
— **Лимиты на выход:** APA102 до 600 LED, WS2812B до 574 LED. Для больших полос объедините выходы или используйте второй контроллер.
— **Teensy 4.1 не имеет Wi-Fi.** Планируемый ESP32 Wi-Fi bridge решит это (пункт roadmap).

## Roadmap

Долгосрочное видение Roshni — стать платформой здоровья и обслуживания для больших адресуемых LED-инсталляций, а не просто контроллером отправки пиксельных данных.

**Ближайшие:**
— ESP32 Wi-Fi bridge (сопроцессор для инсталляций без Ethernet)
— Основы телеметрии (RAM/PSRAM/SD time-series с Prometheus, InfluxDB, MQTT, JSON)
— Непрерывный мониторинг целостности сигнала (расширение 1000 FPS loopback в production watchdog)
— Тепловой мониторинг (I²C датчики температуры по ленте, зонная коррекция яркости)
— Автоматическая защита линии (управляемое отключение per-output 5 В релеем)

**Среднесрочные:**
— Мониторинг деградации пиксель-за-пикселем (энергетические аккумуляторы, проекция L70 в стиле IES TM-21)
— Anti burn-in рутины (пиксельный сдвиг, расписания освежения, восстановление залипших пикселей из OLED playbook)
— Алертинг (webhook, MQTT, Telegram, Home Assistant с debouncing)
— Installation-specific модели деградации
— Home Assistant HACS интеграция (нативные entities, не REST-обертки)

**Долгосрочные:**
— Расширение протоколов (E1.31/sACN, Art-Net, DDP, WLED JSON, OSC, MQTT pixel frames)
— Примитивы для арт-инсталляций (зоны, сцены, расписания, переходы, GPIO триггеры, SD воспроизведение)
— mDNS/Bonjour zero-config discovery

Полные технические спецификации для каждого пункта roadmap есть в документации проекта.

## Сборка из исходного кода

«`bash
git clone https://github.com/razqqm/Teensy.git
cd Teensy/LED
pio run -e teensy41 # компиляция
pio run -e teensy41 -t upload # прошивка
pio device monitor # просмотр логов
«`

Требуется PlatformIO + board-definition для Teensy 4.1. Arduino IDE сборки тоже работают.

## FAQ

**В: Почему Teensy 4.1, а не ESP32?**

О: Teensy 4.1 — это 600 МГц Cortex-M7 с real-time гарантиями и без Wi-Fi стека, конкурирующего за прерывания. ESP32 примерно в 2.5 раза медленнее и документально имеет потолок по частоте кадров на инсталляциях среднего размера. Архитектура Roshni использует headroom производительности Teensy для диагностики, OTA обновлений и веб-хостинга без ущерба пиксельной пропускной способности.

**В: Могу ли я использовать кастомные эффекты кроме встроенных?**

О: Прошивка open-source и построена на PlatformIO. Вы можете изменить `src/effects.cpp` и добавить новые эффекты. Смотрите существующие Plasma, Fire, Matrix как шаблоны, потом перекомпилируйте. OTA делает развертывание мгновенным.

**В: Минимальное количество светодиодов?**

О: Один пиксель на выход. Roshni отлично работает с 10 светодиодами, если это ваш случай. Архитектура масштабируется от одного пикселя до 1200 LED.

**В: Как обеспечить гальваническую развязку для коммерческих инсталляций?**

О: Каждый БП независимый со своим автоматом и предохранителем. Вы можете подвести выходы к разным входам сети, если электрокодекс требует развязки. Сам контроллер развязан от LED блоков питания. `/api/power?on=0` деэнергизирует ленты через внешний контактор без потери сетевого соединения.

**В: Работает ли с WLED или другими LED-контроллерами?**

О: Roshni говорит на HyperHDR протоколах (TPM2, UDP Raw). WLED и другие контроллеры могут отправлять в Roshni как в стандартное HyperHDR устройство. Обратное (Roshni отправляет в другие устройства) не поддерживается.

**В: Какова задержка от входа до изменения пикселя?**

О: Примерно 1 мс для полного цикла TPM2-кадра (получение, обработка, выход). При нормальном видеовоспроизведении на 50 FPS это незаметно.

## Готовы собирать?

Roshni лицензирован под MIT и свободен для использования, изменения и распространения. Полный исходный код, схемы, таблицы распиновки CAT5 и детальный API reference на [GitHub](https://github.com/razqqm/Teensy).

Если вы собираете амбилайт, управляете multi-zone LED инсталляциями или работаете со светодиодами в коммерческом контексте, Roshni дает вам контроль и стабильность, которые нет в стандартных решениях.

Загрузите последний release прошивки, прошейте в Teensy 4.1, подключите Ethernet кабель, и у вас будет production-готовый LED-контроллер за 5 минут.

Для вопросов, вклада и обсуждений проект открыт для issues и pull request. Документация включает глубокие дайв-даун в архитектуру, тепловые расчеты и примеры интеграции со всем: от Home Assistant до Node-RED.

*Roshni (रोशनी) означает свет, сияние и освещение на хинди и урду. Подходящее имя для проекта, построенного надежно отправлять фотоны в мир.*

## Schema.org Markup

«`json
{
«@context»: «https://schema.org»,
«@type»: «FAQPage»,
«mainEntity»: [
{
«@type»: «Question»,
«name»: «Почему Teensy 4.1, а не ESP32?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Teensy 4.1 — это 600 МГц Cortex-M7 с real-time гарантиями и без Wi-Fi стека, конкурирующего за прерывания. ESP32 примерно в 2.5 раза медленнее и документально имеет потолок по частоте кадров на инсталляциях среднего размера.»
}
},
{
«@type»: «Question»,
«name»: «Могу ли я использовать кастомные эффекты?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Прошивка open-source и построена на PlatformIO. Вы можете изменить src/effects.cpp и добавить новые эффекты. Смотрите существующие как шаблоны, потом перекомпилируйте.»
}
},
{
«@type»: «Question»,
«name»: «Минимальное количество светодиодов?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Один пиксель на выход. Roshni отлично работает с 10 светодиодами. Архитектура масштабируется от одного пикселя до 1200 LED.»
}
},
{
«@type»: «Question»,
«name»: «Как обеспечить гальваническую развязку?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Каждый БП независимый со своим автоматом. Вы можете подвести выходы к разным входам сети. Контроллер развязан от LED блоков питания.»
}
},
{
«@type»: «Question»,
«name»: «Работает ли с WLED?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Roshni говорит на HyperHDR протоколах (TPM2, UDP Raw). WLED может отправлять в Roshni как в стандартное HyperHDR устройство.»
}
},
{
«@type»: «Question»,
«name»: «Какова задержка?»,
«acceptedAnswer»: {
«@type»: «Answer»,
«text»: «Примерно 1 мс для полного цикла TPM2-кадра. При видеовоспроизведении на 50 FPS это незаметно.»
}
}
]
}
«`

Оцените статью