Динамическая подсветка монитора. Динамическая подсветка монитора на Arduino

03.05.2019

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



Для динамической подсветки нам понадобиться:
1) Адресная светодиодная лента.
2) Резистор от 200-500 Ом.
3) Ардуино.
4) Толстый и тонкий провод.
5) Припой.
6) Паяльник.
7) Флюс.
8) Изолента
9) Кусачки


Сборка и настройка:
1) Все подключать будем все как по схеме ниже. Сама схема проста до безобразия. Лента подключается от блока питания на 5V (автор этой самоделки будет её подключать к блоку питания компьютера), земля ленты и контакт DI подключаться к ардуино, причем контакт DI через резистор, всё. Таким образом, лента питается от блока питания компьютера, а ардуино от USB компьютера и через USB получает информацию для светодиодной ленты.


2) Для начала возьмём толстый провод, который пойдёт на блок питания и тонкий для ардуино, зачищаем, лудим и припаиваем все как на фото ниже.


3) Далее припаиваем два тонких провода к ардуино, не забывая резистор.


4) Теперь самое интересное, нужно закрепить ленту на мониторе. Число светодиодов слева и справа должно быть одинаковым, например двадцать слева и двадцать справа, то же самое сверху и снизу, например тридцать сверху и тридцать снизу, это очень важно.


5) Раскладываем ленту на столе. Прямоугольник с нужной длиной и шириной и с нужным количеством светодиодов как на фото ниже. Заметь те, что начало ленты с контактом DI находится в нижнем левом углу так же и конец ленты тоже находится в нижнем левом углу это тоже очень важно.


6) Ну и приклеиваем ленту к монитору и ардуино на двух сторонний скотч.


7) Теперь подключаем питание к ленте и ардуино через USB к компьютеру.

8) Прошиваем ардуино. Прошивку и инструкцию как это сделать, можно посмотреть на .


9) Далее открываем файл прошивки. Смотрим, куда вы подключили ардуино и запоминаем, далее переходим в «инструменты» и ищем «порт» и выбираем тот USB порт, к которому вы подключили ардуино и выбираем его. В нашем случае это порт номер пять.


10) Затем в первой настройки (выделена жёлтым, на фото ниже) указываем свое количество светодиодов. И завершаем прошивку.


11) Теперь устанавливаем программу AmbiBox, она будет в архиве с прошивкой. Там все просто. Но в конце при выборе устройства нужно указать «Adalight».


12) Запускаем. Сразу ставим русский язык. И автоматическое включение при запуске компьютера, также чтобы эта программа не мешала запуску компьютера, ставим задержку в 20с.


13) И теперь переходим в следующую вкладку и сразу жмём на «больше настроек».


14) Не пугаемся и вспоминаем номер порт USB, к которому подключено ардуино и выбираем нужный порт.


15) Далее в программе можем выбрать режим захвата цвета с экрана. У автора работают только первые шесть, но можете сами потыкать и выбрать тот режим, который вам подходит или просто работает. Автор выбрал режим «GDI FS Aero» отличительность этого режима в том, что на подсветке будут отображаться стандартные прозрачные окна.


16) Нажимаем «показать зоны захвата» и видим что они совсем, не настроены. Для начала выбираем количество ваших светодиодов.


17) Программа должна перезагрузиться. Затем жмём на мастер настройки зон. И подгоняем ваши параметры в программу, пример можете посмотреть на фото ниже. Также советую увеличить зоны схватывания цвета, так результат будет симпатичнее.


18) Вот и все, ставим галочку включить подсветку.


Итог:


Получилось довольно симпатично, особенно приятно смотреть фильмы с такой подсветкой. Также тесты показали прожорливость этой конструкции в среднем 750MA. И если ардуино подключено к компьютеру, то он не выключиться, приходиться каждый раз подключать и отключат ардуино от компьютера. Также можно посмотреть видео сборку этой самоделки.

Добрый вечер, дамы и господа.
Сегодня я расскажу вам как за пять-десять минут с помощью паяльника, трех проводков и матерного слова (ну еще и ардуино с лентой на ws2812b) собрать аналог Ambilight от филипс, который по некоторым параметрам будет превосходить его.

Внимание! Под катом очень много картинок!

Обновление 22.11.14: Настройка на Android, вроде как...

Обновление 26.11.16: Новый форк призматик с космической производительностью в играх и видео


К управляемым светодиодам ws2812b присматривался давно, покупал парочку «поиграться», но большой заказ делать не позволяла жаба, но тут я все-таки созрел, придушил свою жабу и заказал ленту 4 метра по 60 диодов на метр. Заказ пришел относительно быстро. Прием в китае 3.11 - получение 17.11.

Пришла посылка (а точнее мелкий пакет) весом 134г., упаковано все в бумажный пакет с пупырчатым слоем внутри, сама лента была упакована в стандартный для светодиодных лент серебристый пакетик с застежкой.

Сама лента выглядит вот так.

Клеящий слой.

К ленте с двух сторон припаяны разъемы. С одной стороны для подключения контроллера и питания, с другой для наращивания ленты в длину (ленты можно соединять цепочкой). В комплекте идут разъемы для подключения питания и контроллера.

Быстро подключив ленту к ардуино и подав питание, вдоволь намигался и насветился, решил что пора что-нибудь с ней сделать. Думал не очень долго, фоновую подсветку для своего 3D монитора собрать хотел уже очень давно, да и комплектующие под рукой, поэтому я быстро приступил к делу. Собирать мы будем немного модифицированную подсветку Adalight.

Данная фоновая подсветка будут работать в паре с персональным компьютером, либо медиаплеером на android, но в данной статье я рассмотрю только вариант подключения к ПК.

Для сборки своей собственной фоновой подсветки монитора или тв вам потребуется:

  • Arduino (Arduino Nano на ATmega328 будет идеальным вариантом)
  • Лента светодиодная на ws2812b (в моем случае ушло чуть больше 1 метра ленты на монитор 23")
  • Маломощный паяльник (флюс и припой)
  • Три проводка
  • Блок питания на пять вольт (один метр ленты потребляет максимум 14.4 ватт)
Ставим монитор спиной к нам. Путем прикладывания ленты к корпусу монитора с обратной стороны, отмеряем сколько ленты нам потребуется для каждой из сторон. Я решил делать подсветку только трех сторон, при этом низ оставить без подсветки, т.к. снизу находится не очень красивая подставка. Отмерять ленту нужно с левого нижнего края и по часовой стрелке (не забываем, что необходимо развернуть монитор к нам спиной) Если ваш телевизор или монитор висит на стене, то имеет смысл сделать подсветку по всему периметру. тогда отмерять нужно с центра нижней грани и по часовой стрелке (Так будет проще настроить программное обеспечение на последних этапах. Отрезаем обычными ножницами отрезки необходимой длины по линии отреза, ее вы можете определить по значку ножниц на ней. Резать начинайте со стороны разъемов для подключения контроллера, через них мы и будем подключать нашу подсветку. Места разреза спаяйте тремя проводками, восстанавливая контакт только что разрезанным дорожкам. Начало и конец ленты спаивать вместе не надо. Соблюдайте направление, не перепутайте! На ленте есть стрелочки, которые указывают на правильное направление сигнала от контроллера до конца ленты.

Получится вот так:

После того как вы спаяете все отрезки вместе, можно приклеивать нашу ленту по всему периметру монитора (с левой стороны и по часовой стрелке начиная с разъемов на ленте)

После данной процедуры вы должны получить это:

Красный провод (+5в) припаиваем, либо подключаем к пину +5в на ардуино, белый провод подключаем к земле, а зеленый (центральный) к пину D6

Блок питания подключаем ко второму комплектному разъему с двумя проводами: красный к +5в, белый к минусу. Важно чтобы напряжение питания находилось в пределах 5-5.2в. Длинную ленту лучше запитывать в нескольких точках, чтобы избежать большого падения напряжения на диодах.

Всё, основная физическая работа закончена.

Пользователь tidehunterrr советует использовать данный скетч если у вас возникает проблема с мерцающими диодами

Распаковываем Arduino IDE в любое удобное место, папку FastLED из архива с файлами внутри кидаем в папку libraries, которая находится в папке c ArduinoIDE. Запускаем файл с arduino.exe это создаст папку «arduino» в папке с документами, в ней создаем папку NeoPixel и кидем в нее наш скетч. Выходим из Arduino IDE.

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

Запускаем arduino.exe.

Видим следующее:

Открываем наш скетч

В меню Сервис-> Плата выбираем нашу нано
В меню Сервис -> Процессор выбираем ATmega328
В меню Сервис -> Порт выбираем виртуальный Com порт под которым числится наша ардуинка (обычно тот что не com1)

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

Жмем вот эту кнопку:

Это скомпилирует и загрузит скетч в нашу нано. Во время этой процедуры диодики на ардуине должны интенсивно мигать. После заливки скетча закройте IDE, отключите ардуино от компьютера, подключите её к ленте с помощью нашего разъема на 3 провода и подключите блок питания к ленте. Теперь вновь подключите нано к USB.

Скачайте замечательную программу Prismatik
От замечательного проекта «Лайтпак» и установите её.

Обновление: скачивайте новый форк отсюда

Практически нулевая нагрузка на процессор на рабочем столе, в видео и главное в играх!
При запуске увидите это:

Жмите «Next»

Выбираем Adalight и жмем «Next»

Здесь пишем номер нашего порта, а остальное не трогаем

Затем выбираем имя которое вам нравится

Тут нужно указать общее количество наших диодов

По периметру экрана вы увидите серые прямоугольники с номерами - это зоны ответственные за наши диоды. Нумерация диодов идет от разъема. Необходимо, расставить их соответственно нашим диодам. Также нажимая на кнопки с названиями созвездий можно переключать между готовыми пресетами.
Расставив зоны, идем дальше. В этот момент диоды должны уже светится.

В трее рядом с часами появится иконка с изображением солнышка, нажмите на нее правой кнопкой и перейдите в настройки.

Убедитесь, что выбран режим «Захват экрана»

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

ВСЁ! НАША ПОДСВЕТКА ГОТОВА! Поздравляю!

Потрясающий эффект от подсветки. Монитор стал казаться больше, глаза меньше напрягаются при просмотре видео в темном помещении.

На сборку подсветки у меня ушло 10 минут, еще десять я потратил на настройку софта.

Внимательный читатель в этот момент должен возмутиться и сказать что-нибудь вроде «Минуточку! А где же матерное слово?» а то самое слово у меня вырвалось, когда я начал проводить испытания моей подсветки и выражало оно исключительно восторг от увиденного.

Чем оно лучше Ambilight? У меня получилось 69 независимых зон подсветки, а это, насколько мне известно, много больше чем у philips.

Как можно улучшить? Взять диоды мощнее, например такие

Дополнительно наклеить ленту спереди и закрыть рамкой светорассеивающей и получить аналог Philips Aurea. Также я заметил, что диоды в моем случае используются неэффективно, было бы гораздо лучше развернуть их немного в стороны от монитора, направляя световой поток.

Как использовать данную подсветку с android? Вот тут парень дает ссылку на свой скрипт для XBMC под андроид. Возможны и другие варианты о которых я не знаю.

Работает ли она с играми? Да работает, но не со всеми. И необходимо отключать все оверлеи (steam, msi afterburner). Есть информация, что программа Ambibox справляется с играми лучше, но у меня она не заработала.

Что еще можно сделать с данной лентой? Можно собрать светодиодную матрицу (дисплей) и транслировать на нее gif с помощью программы glediator, скетч для arduino можно найти на сайте программы.

Внимание! Чем больше зон подсветки, тем больше нагрузка на процессор компьютера. На тестовой сборке на 240 диодов, зависала ардуино.

Обновление :

Замечательные новости! Проблем с производительностью больше нет! Я попробовал восхитительную и бесплатную программу Ambibox
и вот результаты тестирования производительности на планшете с intel baytrail

Как видите даже планшет свободно тянет подсветку с 300 диодами и скорость обновления больше 40fps!
У неё есть плагин для xbmc.
Также заявлена хорошая совместимость с играми, правда через платную playclaw.

К сожалению протестировать работу подсветки на андроид так и не смог, потому что ни у одного моего устройства нет драйверов на ардуину в ядре.

Обновление 21.11.14г.

Настройка Ambibox

Я окончательно перешел c Призматик на Ambibox и сейчас расскажу вам как настроить вашу подсветку на работу с ней.

Скачиваем последнюю версию программы отсюда

И устанавливаем её. В самом конце процесса установки появится вот такое окошко

Выбираем «Adalight» и процесс установки закончен. После установки запустите программу, в трее рядом с часами появится цветной квадратик, нажмите на него два раза, откроется окно настроек. Язык программы можно поменять в настрйках программы, а основные настройки подсветки находятся здесь

А теперь внимание! Вот почему я не смог в первый раз настроить программу? Да потому что настроек-то и нет нигде. Но оказалось, что они есть, но не влезли в окно, поэтому растягиваем за правый нижний край окно и жмем кнопку «Больше настроек»

И в появившихся настройках выбираем порт нашей ардуинки и количество диодов. Программа может перезапуститься при выборе порта. Здесь же можно выбрать режим работы для текущего профиля, и метод захвата, в играх выбирать их игровой режим с playclaw, а для кино режим windows 8 (самый быстрый, по моим ощущениям).
При включенных дополнительных настройках жмите кнопку «Показать зоны захвата», появятся цветные квадратики по периметру и дополнительные кнопки в меню, нажимаем «Мастер настройки зон».

В этом конфигураторе очень удобно настраивать большое количество зон, можно выбрать количество сторон с подсветкой, количество диодов по вертикали и горизонтали, задать смещение, выбрать формат области для захвата, размер выреза на нижней грани под подставку, монитор с которого производить захват, и даже формат 3d изображения (если вы выводите 3d сигнал на тв в формате side-by-side или over-under). Настроив, жмите «Применить», затем в главном меню сохраните настройки. Настройки для моей системы на скриншоте.

Все! На этом основная настройка программы закончена, но в этой программе еще ОЧЕНЬ большое количество настроек! Вы можете настроить подсветку регулируя цветовые каналы по отдельности для каждого диода, настроить сглаживание, гамму, динамику, и прочее… Можете создать отдельные профили для широкоформатного кино и переключаться на него сочетанием клавиш или автоматически при открытии программы, и даже включать по открытию винампа режим цветомузыки! Экспериментируйте!

Обновление 22.11.14г.

Настройка на android

Всю ночь пытался запустить подсветку на андроид… забегая вперед скажу, что итог изысканий: -1 ардуина мега, но какие-то результаты все-таки есть: выяснилось, что моя мега абсолютно не хочет стыковаться с лентой, ни на одном пине, ни с одним скетчем, и с программами на windows тоже, а в итоге под утро, основательно «клюя носом» спалил ее по глупости. Но при том что лентой она не могла управлять, все остальное работало нормально данные получались, программами подсветка определялась, именно поэтому я не могу с полной уверенностью утверждать, что подсветка работает.

Как я уже писал в комментариях, драйверов на ардуино нано, а точнее на чип ft232r в ядре моих андроид устройств нет, поэтому сняв с другого проекта «Мегу» и убедившись что мой смартфон корректно её определяет и подмонтировывает ее как ttyACM0, приступил к экспериментам. И да, нам потребуется root.

Для начала я скачал последнюю стабильную версию xbmc для android из и установил её.

Затем скачал скрипт у этого парня
к нему потребовался еще модуль libboblight.so, его я нашел в гугле, качал, кажется, отсюда

Откройте XBMC и зайдите в настройки -> Аддоны и установите аддон под названием boblight с официального репозитория, затем закройте XBMC

Файловым менеджером откройте папку Android/data/org.xbmc.xbmc/files/.xbmc/addons и замените папку script.xbmc.boblight папкой, которую мы взяли с ютюба. (Эту процедуру я произвел потому что не был уверен, что скрипт установится правильно, если я просто закину скачанную папку).

Файл libboblight.so кидаем в /system/lib/ и для верности я закинул его еще и в Android/data/org.xbmc.xbmc/files/.xbmc/addons/script.xbmc.boblight/resources/lib/

После запуска XBMC скрипт перестал выдавать ошибку (как когда я запускал его без подключенной ардуины), определил мою подсветку и судя по диодикам на rx/tx начал работать как и положено, но как я уже писал сама лента у меня так и не засветилась.

Конфигурируется этот скрипт в файле hyperion.config.json в папке скрипта, править его можно конфигуратором HyperCon.jar вот отсюда

Дополнительная информация от пользователя andryvlad :

Для тех, кому нужно под Андроид - заработало с платой Arduino Uno R3. Проверял на TV-Box с процессором Amlogic AML8726-M6(MX), Android 4.2.2, Kodi 14.2 Helix с плагином Boblight. Один нюанс - ардуина должна быть собрана по оригинальной схеме (с ATmega16U2 в качестве USB-Com) - она определяется в Андроиде как ttyACM0 (брал такую). Arduino Nano (с FT232RL) увы, не определяется. В утилите HyperCon.jar в первой вкладке прописываем:
Device Type: Adalight
Output: /dev/ttyACM0
Baudrate: 115200
ну и указываем расположение и количество светодиодов (при заливке скетча в ардуино нужно прописать такое же их количество), остальные параметры не трогал. Сформированный файл hyperion.config.json закидываем в папку скрипта. В самом плагине Boblight ничего не настраивал.
Теперь при запуске Kodi появляется сообщение, что плагин подключен и лента мигает по очереди тремя цветами (это типа тест такой, отключается в настройках Boblight). Включаем фильм, наслаждаемся!)

На этом пожалуй все… заказал на али новую «мегу» на замену старой и к ней еще uno r3 и буду продолжать эксперименты потом, ну а сейчас я вполне доволен своей подсветкой монитора управляемой через «нано» замечательной программой Ambibox, а и да… товар рекомендую к покупке;-)

P.S. по прошествии нескольких дней могу сказать, что для монитора плотность в 60 диодов на метр избыточна: слишком большая яркость и мелкие движения света немного утомляют. В настройках программы снизил яркость до минимума, поднял сглаживание и снизил динамику. Все-таки это фоновая подсветка а не продолжение монитора. С большого расстояния таких проблем нет и подсветка не мешает.
По поводу подсветки в играх: насколько я понял для подсветки в играх достаточно демо версии Playclaw 5, кроме окошка при запуске пока никаких ограничений на подсветку не увидел

Пользовательская галерея

Пользователь vre опубликовал небольшое видео со своей подсветкой (телевизор 42", подсветка 3х сторон, 125 диодов).

Пользователь ventura тоже поделился видео со своей системой

Пользователь chaloc прислал фото своего монитора с лентой ws2812b

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

110 диодов WS2812B + ARUINO Nano + AmbiBox 2.1.7.
Играет Foobar а картинку на 50" телевизор выдает плагин MilkDrop2…

Видео от пользователя Ernesto

WS2811+Arduino nano, установлено на Samsung 40" 81зона

Отличное видео с монитором пользователя l0lder

112 диодов на 27" монике…

Телевизор товарища nukezzz

- 120 пикселей на 29" телике (2 метра ровно),
- ленту брал с защитой IP65 (отличный вариант).
- arduino nano на CH340

Телевизор пользователя Fedor


Низ не стал делать. Телек 55 дюймов.

Красивое видео с подсветкой пользователя Bron888


Собрал уже давно, когда ещё не было этой темы, ох и помучился тогда разыскивая информацию)))Отличная статья и здесь есть новый скетч убирающий глюк с мерцанием диодов, у себя борол с помощью Watchdog) вот мой результат.

Еще один день и еще один довольный пользователь самодельной подсветки.
Пользователь lesha_01 прислал видео о своей подсветкой.
Сделал уже давно, использую в течение года - всё стабильно работает с Amnibox, метр ленты ровно на 3 стороны пошёл.

crazyrock прислал очень красивое фото своего монитора

AlexNerf тоже поделился своим монитором

Монитор 20", Windows 8, питание от БП системного блока, лента в изоляции

Телевизор пользователя Dante


вот что у меня получилось. на углах ленту сгибал, питание не дублировал, думаю и не надо. 60" панель, получилось 118 диодов и зон, внизу вырез для подставки. использовал скетч из коментов, т.к. скетч тс мерцает.

Монитор пользователя Alber

AVR ATmega32U4 - 1 pcs (~$3)
LED-strip ws2812b - 100 pcs (~$9)
PSU Xiaomi 5V 10W - 1 pcs
LCD Acer 24" - 1 pcs
Software - Ambibox

Себестоимость без имевшихся в наличии блока питания и монитора составила 12 баксов.

Снято на смарт с руки в условиях когда монитор стоит на кронштейне в 15 см от тюля белого цвета.


Монитор пользователя Aimo

ТС спасибо за подробный обзор, т.к. в гайде у adafruit некоторые нюансы были не указаны.
Ленту соединял уголками на 3 пина, очень удобно.
Питание + конденсатор на 1000мкФ 6.3v подключал через коннектор, опять таки очень удобно.
Аккуратно подключив все провода и припаяв резистор на 470ом - Arduino nano поместил в «яйцо» от киндер сюрприза.

И обновленный вариант настроек

Телевизор пользователя Tauntik

Я сделал себе для 55" из ленты 60 диодов на метр, вышло 233 диода (около 4 метров)

Вы тоже можете присылать свои видео и фото, я с удовольствием добавлю их в обзор

Планирую купить +605 Добавить в избранное Обзор понравился +305 +714

Добрый день.

Для своей первой статьи я выбрал одну из самых успешных своих поделок: HDMI-passthrough аналог Ambilight от Philips, далее я будут называть эту композицию «Атмосвет».

Введение
В интернетах не очень сложно найти готовые/открытые решения и статьи как сделать Амбилайт для монитора/телевизора, если ты выводишь картинку с ПК. Но в моей мультимедиа системе вывод картинки на телевизор c ПК занимает только 5% времени использования, большее кол-во времени я играю с игровых консолей, а значит нужно было придумать что-то свое.
Исходные данные:
  • 60" Плазменный телевизор
  • HTPC на базе Asrock Vision 3D 137B
  • Xbox 360
Большинство устройств используют HDCP для воспроизведения контента даже во время игры.
Требование:
Необходимо обеспечить централизованную поддержку Атмосвета для всех устройств подключенных к телевизору.
Реализация
Я не буду рассказывать, как я прикреплял 4.5м светодиодную ленту к телевизору и что нужно сделать с Arduino, в качестве базы можно использовать .

Единственный нюанс:
Я заметил, что внизу экрана идут странные мерцания, сначала погрешил на сигнал, перековырял дефликер, изменил ресазинг картинки и еще кучу всего перекопал, стало лучше, но от мерцания не помогло. Стал наблюдать. Оказалось, что мерцание было только в конце ленты и то при ярких сценах. Взяв мультиметр, я замерил напряжение на начале, середине и конце ленты и угадал с причиной мерцаний: в начале ленты было 4.9В(да китайский БП дает напряжение с отклонением, это не существенно), в середине 4.5 в конце 4.22 - Падение напряжение слишком существенно, пришлось решить проблему просто - к середине ленты я подвел питание от бп, провод пустил за телевизором. Помогло мгновенно, какие либо мерцания прекратились вообще.

Захватываем картинку вебкамерой
Первая тестовая версия для обкатки идеи и её визуализации была выбрана через захват картинки через вебкамеру) выглядело это как-то так:

Низкая цветопередача и высокий latency показал, что эта реализация не может быть никак использована.

Захват картинки через HDMI

В процессе исследования возможных вариантов была выбрана следующая схема, как сама надежная и бюджетная:

  • Сигнал со всех устройств подается на 5in-1out HDMI свитч , который поддерживает HDCP
  • Выходной сигнал подается на 1in-2out HDMI splitter , который мало того, что поддерживает HDCP, так еще отключайте его на выходе(слава китайцам).
  • Один из выходных сигналов идет на телевизор
  • Другой выходной сигнал идет на HDMI to AV конвертер
  • S-Video сигнал идет на коробочку захвата от ICONBIT
  • Коробочка захвата подключается к вечно работающему HTCP по USB, который подключен к Arduino контроллеру ленте на телевизоре.

Изначально выглядит дико и как костыли, но:

  • Это работает.
  • Сумарно все это дело, заказывая из китая, мне обошлось тысяч в 3-4 тыс. рублей.

Почему я не использовал плату для HDMI захвата? Все просто: самый дешевый вариант и доступный - это Blackmagic Intensity Shuttle, но она не может работать с сигналом 1080p/60fps, только с 1080p/30fps - что не приемлемо, т.к. я не хотел понижать фреймрейт, чтобы можно было захватывать картинку. + это дело стоило в районе 10 тыc. рублей. - что не дешево при неизвестном результате.

Потери на конвертации HDMI to S-video несущественны для захвата цвета в разрешении 46х26 светодиодной подсветки.

Изначально для захвата S-video я пробовал использовать EasyCap (у него много китайских вариаций), но суть в том, что используемый там чип крайне убог, и с ним нельзя работать при помощи openCV.

Единственный минус - выходной сигнал S-Video содержал черные полосы по краям срезающий реальный контент(около 2-5%), выходную картинку с платы захвата я обрезал, чтобы удалить эти полосы, сама потеря изображения в тех областях на практике не сказалась на результате.

Софт
Для меня это была самая интересная часть, т.к. с железками я не очень люблю ковыряться.

Для захвата картинки я использовал openCV и в частности его.NET враппер emgu CV .

Я решил также применить несколько разных техник постобработки изображения и его подготовки, прежде чем отдавать список цветов на контроллер.

Процесс обработки фрейма
1. Получение захваченного фрейма
2. Кроп фрейма, для исключения черных полос
Тут все просто:
frame.ROI = new Rectangle(8, 8, frame.Width - 8, frame.Height - 18 - 8);
Обрезаем 8 пикселей сверху, 8 справа и 18 снизу.(слева полосы нет)
3. Ресайзим фрейм в разрешение подсветки, незачем нам таскать с собой здоровую картинку
Тоже ничего сложного, делаем это средствами openCV:
frame.Resize(LedWidth - 2*LedSideOverEdge,
LedHeight - LedBottomOverEdge - LedTopOverEdge,
INTER.CV_INTER_LINEAR);
Внимательный читатель заметит, обилие переменных. Дело в том, что у меня рамка телевизора достаточно большая, занимая 1 светодиод по бокам, 1 сверху и 3 снизу, поэтому ресайз делается на светодиоды, которые находятся непосредственно напротив дисплея, а углы мы уже дополняем потом. При ресайзинге мы как раз получаем усредненные цвета, которые должны будут иметь пиксели светодиодов.
4. Выполняем мапинг светодиодов с отреcайзенного фрейма
Ну тут тоже все просто, тупо проходим по каждой стороне и последовательно заполняем массив из 136 значений цветом светодиодов. Так вышло, что на текущий момент все остальные операции проще выполнять с массивом светодиодов, чем с фреймом, который тяжелее в обработке. Также на будущее я добавил параметр «глубины» захвата(кол-во пикселей от границы экрана, для усреднения цвета светодиода), но в конечном сетапе, оказалось лучше без неё.
5. Выполняем коррекцию цвета (баланс белого/цветовой баланс)
Стены за телевизором у меня из бруса, брус желтый, поэтому нужно компенсировать желтизну.
var blue = 255.0f/(255.0f + blueLevelFloat)*pixelBuffer[k];
var green = 255.0f/(255.0f + greenLevelFloat)*pixelBuffer;
var red = 255.0f/(255.0f + redLevelFloat)*pixelBuffer;
Вообще я изначально из исходников какого-то опенсорс редактора взял цветовой баланс, но он не менял белый(белый оставался белым), я поменял формулы немного, опечатался, и получил прям то, что нужно: если level компонента цвета отрицательный(я поинмаю как - этого цвета не хватает), то мы добавляем его интенсивность и наоборот. Для моих стен это получилось: RGB(-30,5,85).

В кореркции цвета я также выполняю выравнивание уровня черного(черный приходит где-то на уровне 13,13,13 по RGB), просто вычитая 13 из каждой компоненты.

6. Выполняем десатурацию (уменьшение насыщенности изображения)
В конечном сетапе, я не использую десатурацию, но может в определенный момент понадобится, фактически это делает цвета более «пастельными», как у Филипсовского амбилайта. Код приводить не буду, мы просто конвертим из RGB -> HSL, уменьшаем компоненту Saturation(насыщенность) и возвращаемся обратно уже в RGB.
7. Дефликер
Так уж выходит, что входное изображение «дрожит» - это следствие конвертации в аналоговый сигнал, как я полагаю. Я сначала пытался решить по своему, потом подсмотрел в исходники Defliker фильтра, используемом в VirtualDub, переписал его на C#(он был на С++), понял, что он не работает, ибо он такое впечталение, что борется с мерцаниями между кадрами, в итоге я совместил свое решение и этот дефликер получив что-то странное, но работающее лучше чем ожидалось. Изначальный дефликер работал только с интенсивностью всего фрейма, мне нужно по каждому светодиоду отдельно. Изначальный дефликер сравнивал изменение интенсивности как суммы, мне больше нравится сравнение длинны вектора цвета, Изначальный дефликер сравнивал дельту изменения интенсивности по сравнению с предыдущим кадром, это не подходит, и я переделал на среднюю величину интенсивности в пределах окна предыдущих кадров. И еще много других мелочей, в результате чего от начального дефликера мало что осталось.
Основная идея: исходя из средней интенсивности предыдущих кадров, выполнять модификацию текущего кадра, если его интенсивность не выше определенного порога (у меня этот порог в конечном сетапе 25), если порог преодолевается, то производится сброс окна, без модификации.
Немного модифицированный (для читаемости вне контекста) код моего дефликера:
Array.Copy(_leds, _ledsOld, _leds.Length); for (var i = 0; i < _leds.Length; i++) { double lumSum = 0; // Calculate the luminance of the current led. lumSum += _leds[i].R*_leds[i].R; lumSum += _leds[i].G*_leds[i].G; lumSum += _leds[i].B*_leds[i].B; lumSum = Math.Sqrt(lumSum); // Do led processing var avgLum = 0.0; for (var j = 0; j < LedLumWindow; j++) { avgLum += _lumData; } var avg = avgLum/LedLumWindow; var ledChange = false; if (_strengthcutoff < 256 && _lumData != 256 && Math.Abs((int) lumSum - avg) >= _strengthcutoff) { _lumData = 256; ledChange = true; } // Calculate the adjustment factor for the current led. var scale = 1.0; int r, g, b; if (ledChange) { for (var j = 0; j < LedLumWindow; j++) { _lumData = (int) lumSum; } } else { for (var j = 0; j < LedLumWindow - 1; j++) { _lumData = _lumData; } _lumData = (int) lumSum; if (lumSum > 0) { scale = 1.0f/((avg+lumSum)/2); var filt = 0.0f; for (var j = 0; j < LedLumWindow; j++) { filt += (float) _lumData/LedLumWindow; } scale *= filt; } // Adjust the current Led. r = _leds[i].R; g = _leds[i].G; b = _leds[i].B; // save source values var sr = r; var sg = g; var sb = b; var max = r; if (g > max) max = g; if (b > max) max = b; double s; if (scale*max > 255) s = 255.0/max; else s = scale; r = (int) (s*r); g = (int) (s*g); b = (int) (s*b); // keep highlight double k; if (sr > _lv) { k = (sr - _lv)/(double) (255 - _lv); r = (int) ((k*sr) + ((1.0 - k)*r)); } if (sg > _lv) { k = (sg - _lv)/(double) (255 - _lv); g = (int) ((k*sg) + ((1.0 - k)*g)); } if (sb > _lv) { k = (sb - _lv)/(double) (255 - _lv); b = (int) ((k*sb) + ((1.0 - k)*b)); } _leds[i] = Color.FromArgb(r, g, b); } /* Temporal softening phase. */ if (ledChange || _softening == 0) continue; var diffR = Math.Abs(_leds[i].R - _ledsOld[i].R); var diffG = Math.Abs(_leds[i].G - _ledsOld[i].G); var diffB = Math.Abs(_leds[i].B - _ledsOld[i].B); r = _leds[i].R; g = _leds[i].G; b = _leds[i].B; int sum; if (diffR < _softening) { if (diffR > (_softening >> 1)) { sum = _leds[i].R + _leds[i].R + _ledsOld[i].R; r = sum/3; } } if (diffG < _softening) { if (diffG > (_softening >> 1)) { sum = _leds[i].G + _leds[i].G + _ledsOld[i].G; g = sum/3; } } if (diffB < _softening) { if (diffB > (_softening >> 1)) { sum = _leds[i].B + _leds[i].B + _ledsOld[i].B; b = sum/3; } } _leds[i] = Color.FromArgb(r, g, b); }
Пусть _leds - массив светодиодов класса Color, _ledsOld - значения кадра до конвертации, LedLumWindow - ширина окна предыдущих кадров, для оценки среднего изменения интенсивности, в конечном сетапе окно у меня было 100, что примерно при 30кад/с равняется 3-секундам. _lumData - массив значения интенсивности предыдущих кадров.

В конечном итоге данный механизм дал еще приятные неожиданные последствия на картинку, сложно описать как это воспринимается визуально, но он делает темнее где надо и ярче где надо, словно динамический контраст. Цель дефликера в итоге получилась широкая, не только устранение мерцаний, но и общее уравновешивание выводимого цвета, как и по компонентам, так и по времени в пределах окна.

8. Сглаживание светодиодов по соседям.
Вообще в конечном сетапе, сглаживание мне не очень понравилось, и я его отключил, но в некоторых случаях может пригодиться. Тут мы просто усредняем цвет каждого светодиода по его соседним.
var smothDiameter = 2*_smoothRadius + 1; Array.Copy(_leds, _ledsOld, _leds.Length); for (var i = 0; i < _ledsOld.Length; i++) { var r = 0; var g = 0; var b = 0; for (var rad = -_smoothRadius; rad <= _smoothRadius; rad++) { var pos = i + rad; if (pos < 0) { pos = _ledsOld.Length + pos; } else if (pos > _ledsOld.Length - 1) { pos = pos - _ledsOld.Length; } r += _ledsOld.R; g += _ledsOld.G; b += _ledsOld.B; } _leds[i] = Color.FromArgb(r/smothDiameter, g/smothDiameter, b/smothDiameter); }
9. Сохраняем текущий стейт, чтобы тред отправки пакетов схватил и отправил его на контроллер подсветки.
Я умышленно разделил процесс обработки кадров и отправки пакетов на контроллер: пакеты отправляются раз в определенный интервал(у меня это 40мс), чтобы ардуино спела обработать предыдущий, ибо чаще чем 30мс она захлебывается, таким образом выходит, что мы не зависим напрямую от частоты кадров захвата и не мешаем тому процессу(а ведь отправка пакета тоже тратит время).
Немного про ардуино
Нельзя просто так взять и отправить по сериалу здоровенный пакет на ардуино, ибо онв ыйдет за пределы дефолтного буфера HardwareSerial и ты потеряешь его конец.
Решается это довольно просто: выставляем значение размера буфера HardwareSerial достаточного размера, чтобы влезал весь отправляемый пакет с массивом цветов, для меня это 410.
UI
Сам софт был реализован в виде win службы, чтобы настраивать все параметры + включать/отключать я сделал Web UI, который связывался с службой через WebService на службе. Итоговый интерфейс на экране мобильника выглядит так:
Результат
В итоге результат оправдал все ожидания, и теперь играя в игры на консолях я получаю еще больше погружения в атмосферу игры.

Как общий результат работы я записал видео с работой атмосвета по моей схеме:

Испытуемый образец 1: Pacific Rim, сцена битвы в Шанхае, этот фильм хорошо подходит для тестирования и демонстрации, много ярких сцен и вспышек, ударов молнии и т.д.:

Испытуемый образец 2: Какой-то ролик из MLP, слитый с ютуба, очень хорошо подходит для теста сцен с яркими цветами(мне понравились полосы), а также быстро сменяющихся сцен(под конец виде можно разглядеть последствия задержки, видных только на видео, при реальном просмотре этого не заметно, пробовал измерить задержку по видео - получилось 10-20мс):

И на последок стоит заметить про потребление ресурсов от HTPC:
HTPC у меня ASRock Vision 3D на i3, служба атмосвета отжирает 5-10% CPU и 32MB RAM.

Спасибо за внимание, очень надеюсь, что кому-нибудь моя статья поможет.

Все наверное видели как работает динамическая подсветка в телевизорах Philips, называемая Amilight. В данной статье представлено устройство позволяющее сделать динамическую подсветку для телевизора или монитора. Телевизор/монитор должен быть подключен к компьютеру, на котором будет воспроизводится видеоконтент.

Итак, для сборки устройства понадобится:
1. Контроллер Arduino
2. с плотностью светодиодов 30шт на метр (для моего 32"" ТВ ушло 2 метра)
3. Светодиодный драйвер TLC5940
4. Источник питания 12 В

Ниже изображено схематичное изображение устройства подсветки:

Сзади телевизора наклеено 4 светодиодных ленты (левая, левая вверху, правая вверху, правая). Каждая лента подключена к LED-драйверу TLC4950 и источнику питания 12В. Светодиодный драйвер TLC4950 обеспечивает ШИМ управление яркостью каждого цвета: красного, зеленого и синего. LED-драйвером управляет контроллер Arduino, который в свою очередь получает команды от ПК. На компьютере запущена специальная программа, написанная на языке processing, которая анализирует каждый кадр видеоизображения и дает соответствующие команды Arduino.

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

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

Соединение Arduino и TLC5940:
Arduino TLC5940
Pin 2 ======= Pin 27 (VPRG)
Pin 3 ======= Pin 26 (SIN)
Pin 7 ======= Pin 25 (SCLK)
Pin 4 ======= Pin 24 (XLAT)
Pin 5 ======= Pin 23 (BLANK)
Pin 6 ======= Pin 19 (DCPRG)
Pin 8 ======= Pin 18 (GSCLK)

Остальные выводы TLC5940 присоединяем согласно следующей таблице:
Pin 22 (GND) === Arduino Ground
Pin 21 (VCC) === Arduino +5V
Pin 20 (IREF) === Arduino Ground через резистор 2кОм
Pin 1-15,28 === PWM Output (ШИМ выход на RGB-ленты)

От источника питания +12В я подключил к светодиодным лентам, а "общий" от источника питания к Arduino Ground.

На фотографиях ниже, установленные ленты на мой телевизор. Пока что временно закрепил светодиодную ленту изолентой, потом буду переделывать, чтобы был нормальный вид.

Программа, запускаемая на компьютере написана на языке Processing (официальный сайт http://www.processing.org). Программа постоянно делает скриншоты экрана, а затем вычисляет средние значения трех цветов (красный, зеленый, синий) для разных мест на экране (левое, левое верхнее, правое верхнее, правое). После вычислений, программа пересылает данные в порт, к которому подключен контроллер Arduino.

Программа для Arduino считывает приходящие ей данные с порта и дает управляющие команды для LED-драйвера TLC5940, какой уровень яркости нужен для красного, зеленого или синего цветов. А далее, TLC5940 выдает ШИМ-сигнал для управления светодиодами.

В этом уроке мы научимся создавать свою собственную подсветку ambilight для телевизора своими руками с помощью Arduino Nano.

Имейте в виду, что Эмбилайт Ардуино будет работать только на ПК с программным обеспечением Bambilight (скачать библиотеку на GitHub).

Вам понадобятся следующие компоненты:

  • Индивидуально адресуемая светодиодная лента RGB
  • Макетная плата небольшого размера
  • Несколько кабелей
  • 12V DC адаптер питания
  • Двусторонний скотч
  • 4-5 Скрепки
  • Затяжки (стяжки) пластиковые для проводов

Шаг 2. Тестирование светодиодной ленты

Будет неприятно, если вы сначала установите ленту на ваш телевизор, но потом поймете, что один светодиод не работает и вам придется удалять ленту и начинать всё сначала.

Поэтому неплохо припаять временные провода к вашей светодиодной ленте и протестировать ее с помощью Arduino, адаптера питания и файла.ino (можно загрузить на следующих шагах). Загрузите.ino в свой Arduino. Здесь вам пока еще ничего не нужно настраивать. Вы должны увидеть несколько меняющихся цветов светодиодной ленты.

Шаг 3. Схема подключения

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

Наша светодиодная лента использует IC WS2811 для управления 3 светодиодами в отдельности.

Шаг 4. Установка ambilight на монитор/телевизор

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

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

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

Важно!

Убедитесь, что стрелки на светодиодных полосах направлены вокруг вашего монитора! Если нет вам придется начать все заново!

Как только ленты на месте, вы сможете установить на тыльную сторону монитора. Не забудьте установить её в удобное место, потому что вам нужно будет подключить USB-кабель к компьютеру позже.

Шаг 5. Пайка всей электроники

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

Теперь подключите светодиодную ленту к Arduino, используя ту же схему, что и на шаге выше. Подключите USB-кабель, установите библиотеку FastLED (скачать на GitHub) и загрузите код, указанный на следующем шаге, в ваш Arduino. А далее вам останется только подключить адаптер питания, так как мы сделали всю проводку.

Шаг 6. Скетч Arduino Ambilight

Ниже вы можете скачать или скопировать код для нашей подсветки Ардуино Эмбилайт.

#include "FastLED.h" #define NUM_LEDS 38 #define LED_DATA_PIN 3 #define NUM_BYTES (NUM_LEDS*3) // 3 colors #define BRIGHTNESS 100 #define UPDATES_PER_SECOND 100 #define TIMEOUT 3000 #define MODE_ANIMATION 0 #define MODE_AMBILIGHT 1 uint8_t mode = MODE_ANIMATION; byte MESSAGE_PREAMBLE = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 }; uint8_t PREAMBLE_LENGTH = 10; uint8_t current_preamble_position = 0; unsigned long last_serial_available = -1L; uint8_t led_counter = 0; uint8_t byte_counter = 0; CRGB leds; byte buffer; // Filler animation attributes CRGBPalette16 currentPalette = RainbowColors_p; TBlendType currentBlending = LINEARBLEND; uint8_t startIndex = 0; void setup() { Serial.begin(115200); FastLED.clear(true); FastLED.addLeds(leds, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); } void loop() { switch (mode) { case MODE_ANIMATION: fillLEDsFromPaletteColors(); break; case MODE_AMBILIGHT: processIncomingData(); break; } } void processIncomingData() { if (waitForPreamble(TIMEOUT)) { Serial.readBytes(buffer, NUM_BYTES); /* DEBUG for (int i = 0; i < NUM_BYTES; i++) { Serial.write((char)buffer[i]); } */ while (byte_counter < NUM_BYTES) { byte green = buffer; byte blue = buffer; byte red = buffer; leds = CRGB(red, green, blue); } FastLED.show(); byte_counter = 0; led_counter = 0; } else { mode = MODE_ANIMATION; } } bool waitForPreamble(int timeout) { last_serial_available = millis(); while (current_preamble_position < PREAMBLE_LENGTH) { if (Serial.available() > 0) { last_serial_available = millis(); if (Serial.read() == MESSAGE_PREAMBLE) { current_preamble_position++; } else { current_preamble_position = 0; } } if (millis() - last_serial_available > timeout) { return false; } } current_preamble_position = 0; return true; } void fillLEDsFromPaletteColors() { startIndex++; // speed uint8_t colorIndex = startIndex; for(int i = 0; i < NUM_LEDS; i++) { leds[i] = ColorFromPalette(currentPalette, colorIndex, BRIGHTNESS, currentBlending); colorIndex += 3; } FastLED.delay(1000 / UPDATES_PER_SECOND); if (Serial.available() > 0) { mode = MODE_AMBILIGHT; } }

Шаг 7. Настройка программного обеспечения

Откройте файл.ino и отредактируйте следующие строки, чтобы они соответствовали вашей ситуации:

#define NUM_LEDS 38 // количество светодиодов #define BRIGHTNESS 100 // яркость

Теперь загрузите скетч в Arduino. Ранее вы должны были скачать библиотеку Bambilight, но если вы этого не сделали вы можете скачать библиотеку на GitHub сейчас.

Откройте Bambilight.exe, расположенную в:

[Местоположение, где вы сохранили папку Bambilight] \ Bambilight-master \ Bambilight-master \ Binary

Теперь настройте всё по своему усмотрению и протестируйте, используя тестовое видео, например, такое:

Как только вы будете удовлетворены результатом, вы можете минимизировать программу Bambilight.

В целом у вас должен быть такой результат работы подсветки ambilight для телевизора, которую вы сделали своими руками с помощью Arduino. Возьмите попкорн, пепси и наслаждайтесь результатом.