Подсветка телевизора

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

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

Конечно, некоторые производители пытались реализовать нечто похожее в рамках своей продукции. В основном этим занимались малоизвестные торговые марки. Впрочем, судебные тяжбы всегда заканчивались в пользу компании, запатентовавшей эту технологию. Поэтому, в лучшем случае, телевизоры Ambilight от других компаний появятся после 2027 года. Однако это будет возможно только при условии, что Philips не продлит патент.

Содержание

Делаем Ambilight для любого ТВ

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

Сегодня можно сделать Ambilight для любого телевизора своими руками. Можете не переживать, за ваш энтузиазм наказание со стороны Philips не последует. Стоимость реализации этого проекта относительно небольшая. Например, на ТВ с диагональю 42 дюйма можно уложиться в символическую сумму в размере 1000 рублей. В среднем рабочий процесс занимает всего лишь несколько часов.

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

Комплектующие ambilight arduino

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

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

  • светодиодная лента;
  • контроллер Arduino Nano;
  • макетная плата незначительного размера;
  • несколько кабелей;
  • блок питания 12V DC;
  • двусторонний скотч;
  • пластиковые затяжки;
  • скрепки.

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

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

Планируете создать медиасервер? Тогда купите более мощную микросхему, например, ASUS Tinker Board.

Выбор светодиодной ленты – ещё очень важный аспект. У вас не так много вариантов. Можно взять оригинальную ленту АPA102 или более дешёвый аналог SK9822. Понятное дело, что второй вариант является более экономичным. Многие эксперты рекомендуют приобрести Black IP67 30 – одного метра будет достаточно. Стандарт IP67 свидетельствует о наличии силиконовой защиты, соответственно, на поверхности не появится со временем налёт, желтизна, не будет скапливаться пыль и грязь.

Количество диодов – ещё один важный критерий выбора ленты. 30 диодов на 1 метр будет более чем достаточно. Что касается блока питания, то можно подобрать модуль, который изначально был предназначен для ноутбука. На 48-дюймовый телевизор потребуется около 3 метров светодиодной ленты.

Откажитесь от идеи приобретения ленты ws2801. Тщательно изучив отзывы пользователей на тематических форумах, можно прийти к выводу, что лента обладает несколькими существенными недостатками:

  • медленный отклик;
  • низкий уровень частоты обновления;
  • искажённая палитра цветов;
  • диоды мигают произвольно;
  • со временем чипы отпадают от ленты.

Выбор блока питания во многом зависит от конфигурации светодиодной ленты. Например, можно взять модуль 5V 8A. Чтобы было проще выбрать, рассмотрим наглядный пример расчёта мощности. Светодиодная лента на 30 диодов потребляет 9 Вт. Если у вас трёхметровая лента, то с резервом ей потребуется адаптер на 33 Вт. Предложенный выше блок питания будет обеспечивать 40 Вт. Этого достаточно.

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

Можно также настроить Ambilight Arduino через HDMI, но это менее эффективный способ. Оптимальный метод реализации динамической подсветки сводится к установке именно светодиодной ленты.

Тестирование светодиодной ленты

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

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

Схема подключения

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

Например, если вы используете в качестве микросхемы «малину», то её нужно соединить с питанием светодиодной ленты общим заземлением. Это позволит избежать появления помех. Используйте ферритовые фильтры.

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

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

Оптимальная дистанция от стены – не больше 20 см. Что касается микросхемы, то она также может быть закреплена на задней панели. Можно использовать для фиксации «малинки» обычную липучку с одежды. Это позволит при необходимости демонтировать микросхему. Самодельная подсветка для телевизора Эмбилайт собрана.

Установка Ambilight на телевизор

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

Фиксировать самодельную подсветку можно даже с помощью обычного двустороннего скотча. Обязательно удостоверьтесь в том, что стрелки светодиодной ленты направлены вокруг монитора, в противном случае вам придётся всё переделывать. Если вы используете контроллер Arduino Nano, то расположите его рядом c USB портом, поскольку он будет подключаться к ТВ через этот интерфейс.

Несколько полезных дополнительных рекомендаций от профессионалов:

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

Если вы поняли, что самостоятельно не сможете собрать подсветку, то тогда купите для телевизора или компьютера Paintpack. Это готовый аналог Ambilight.

Пайка всей электроники

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

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

Скетч Arduino Ambilight

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

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

Существует множество различных систем, позволяющих настроить подсветку для телевизора Амбилайт. Нет смысла в подробностях рассматривать абсолютно все существующие способы реализации поставленной задачи. Для наглядности рассмотрим реальный пример. Можно использовать Raspberry в качестве медиасервера. Такую возможность мы уже рассматривали ранее. Установите образ OSMC. Также подойдёт классическая сборка Raspbian. Сам процесс установки образа во многом напоминает запись ISO на флешку.

Необходимо активировать SPI интерфейс микросхемы Raspberry. Это осуществляется с помощью команды «sudo raspi-config». Зайдите в раздел «Interfacing Options». Активируйте поддержку SPI и SSH. Инсталляция и настройка Hyperion осуществляется с помощью утилиты HyperCon. Для корректной работы потребуется JAVA SDK. Установка HyperCon осуществляется не на микросхему, а на ПК. Настройка выполняется удалённо с помощью SSH. Воспользуйтесь командой «java -jar HyperCon.jar».

Несколько слов нужно сказать об обязательной настройке конфигурации системы:

  1. RGB Byte Order – определяется типом используемой ленты, возможны отличия. В рамках нашего примера нужно выбрать BGR. Проверьте, чтобы цвета соответствовали задаваемым командам.
  2. Bottom Gap – параметр, свидетельствующий об отсутствии ленты на определённом участке корпуса телевизора.
  3. First LED offset – необходимо добиться, чтобы в правой нижней части отсчёт начинался с нуля. Примените параметр, чтобы понять его принцип действия.
  4. На вкладке Process отображаются стандартные настройки, попробуйте изменить задержку и частоты, поскольку это влияет на плавность изменения цветовой палитры. Обязательно откалибруйте цвета, это особенно актуальная рекомендация, если за ТВ небелая стена.
  5. External – ещё один раздел со стандартными параметрами.

Переходим к следующему этапу программной настройки. Переключитесь для этого на вкладку SSH. Введите имя пользователя и пароль, а также IP-адрес микросхемы. Для «малинки» логин и пароль pi/raspberry. Нажмите на кнопку «Connect», чтобы начать подключение. Выберите «Install or Update Hyperion». Сохранение конфигурации осуществляется путём нажатия на «Save» и «Create Hyperion Configuration». Выберите путь расположения директории, в которой находится HyperCon.

Нажмите на кнопку «Send Config», чтобы отправить сохранённые конфигурации на микросхему. Если всё было сделано в соответствии с инструкцией, тогда вы можете удалённо управлять цветовой палитрой, используя Colorpicker. Если появилась ошибка, зайдите в разделы Get Log, Show Traffic – в них будет описана причина неудачи.

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

Подсветка от ТВ каналов

Чтобы адаптировать подсветку к работе телевизионных каналов, нужно заметно расширить функциональные возможности системы. Скорее всего, для этого вам потребуется SCART-переходник. Установите адаптер в режиме OUT. Вставьте USB в микросхему, RCA в SCART-переходник.

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

Теперь необходимо поработать с параметрами, чтобы добиться максимально возможного качества. Уберите бордеры чёрного цвета. Удостоверьтесь, что изображение отображается корректно, а оригинальная цветопередача не сбилась. Особое внимание нужно уделить настройке Priority. Преимущественно данный параметр есть во всех программах.

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

Управление Ambilight другими способами

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

Теперь вы знаете, как своими руками сделать подсветку Ambilight для телевизора любой марки и модели. Стоит признать, что реализация этой идеи – не самая простая задача, но, если придерживаться рекомендаций, можно добиться положительного результата.

Наверняка каждый хоть раз в жизни сталкивался с технологией Ambilight от компании Philips. Большинство людей она не оставляет равнодушными. На фоне безликих чёрных прямоугольников телевизоры Philips привлекают покупателей яркой и разноцветной тыльной подсветкой, которая «расширяет» границы дисплея. В этом материале вы узнаете, как провернуть подобное с абсолютно любым монитором или телевизором, поэтому скорее кликайте «Под кат!»

Вступление

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

Нам на тест попал гаджет под названием Paintpack. Paintpack – девайс для создания того самого эффекта Ambilight на любом мониторе. Кроме этого, Paintpack предлагает целый ряд режимов работы и функций по управлению подсветкой. Но обо всём по порядку.

Установка

Paintpack представляет собой чёрную коробочку, в которой собран весь «мозг» системы, к ней подключаются диоды, обеспечивающие подсветку и кабеля питания и связи с компьютером. Без компьютера Paintpack работать не будет. Всё дело в том, что софт, отвечающий за управление гаджетом, придётся устанавливать на ПК, с него же вы будете настраивать устройство.

Монтаж девайса незатейливый, но у особо щепетильных перфекционистов он займёт несколько часов. Светодиоды Paintpack разбиты по «щупальцам». Да, именно такая ассоциация приходит в голову, когда видишь конечный результат. Будто бы хэдкраб захватил дисплей, не иначе. Щупальца эти прикрепляются по периметру тыльной стороны монитора, где-то по центру располагается чёрная коробочка, к ней подключается два кабеля, и всё – устройство готово к настройке и последующей работе.

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

Настройка

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

Первый – расположение светодиодных лент и так называемых «Зон захвата». Они должны совпадать, тщательно проверьте это. Благо, с помощью AmbiBox этот процесс занимает не больше десяти минут.

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

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

Режимы работы

Конечно, самым главным работы Paintpack является «Захват экрана» – так здесь называется Ambilight. После того как вы настроили порядок цветов и местоположение «Зон захвата», AmbiBox сможет корректно считывать цвета, которые отображаются в данный момент времени по периметру дисплея. Программа передаёт эти данные на чёрную коробочку, а та, в свою очередь, включает нужные светодиоды подходящим цветом. В результате мы получаем желанный эффект Ambilight. В настройках программы можно выставить скорость, с которой будет обновляться информация о картинке на мониторе, я выбрал максимальную – 60 кадров в секунду.

Кроме «Захвата экрана» Paintpack умеет работать в таких режимах: «Статический фон», «Динамический фон», «Цветомузыка» и «Плагины». В «Статическом фоне» можно включить подсветку монитора определённым цветом, который не будет меняться в зависимости от изображения. В режиме «Динамический фон» подсветка начинает переливаться всеми возможными цветами, предусмотрена возможность выбора скорости изменения цвета. «Цветомузыка» превращает Paintpack в новогоднюю гирлянду. Светодиоды мигают в такт музыке, светятся они при этом самыми кислотными цветами – работать в таких условиях не получится, а вот для вечеринки вариант в самый раз. К AmbiBox можно подключать «Плагины» – функция для самых отчаянных энтузиастов.

Версии

Производитель предлагает три версии Paintpack: на 10, 30 и 60 светодиодов. Кроме количества «фонариков» эти версии отличает длина кабелей и шлейфов, так как предназначены разные Paintpack’и для разных диагоналей мониторов и телевизоров. На сайте производителя говорится, что младшая модель идеально подойдёт для мониторов с диагональю до 22″, средняя рассчитана на дисплеи диагональю до 27″, а старшая предназначена для работы с 55″ монстрами.

Но если 60 светодиодов вам не хватит, то предусмотрена возможность соединения нескольких Paintpack’ов в один. Осуществляется это с помощью специального порта на верхней боковой грани устройства.

Цена Paintpack варьируется от $35 до $45 – на первый взгляд немного, но когда начинаешь пользоваться этим гаджетом, голову не покидает мысль, что ты переплатил. За время тестирования мне понравилось возиться с этой штукой, постоянно настраивать её, находить всё новые и новые возможности. Я бы хотел, чтобы этот девайс остался с моим монитором, если бы он у меня был, конечно. Но в магазин за Paintpack’ом я бы не пошёл. Посему можно сделать вывод, что сегодня Paintpack может стать отличным подарком для гика, но никак не покупкой образцового семьянина для облагораживания семейного очага.

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

Световая ТВ LED лента для телевизора поставляется с пультом RF Wireless, которые отличается от всех других, тем, что он не требует прямого наведения. Пульт быстро срабатывает на любые переключения режимов освещения, регулировки цвета, яркости и скорости. Выберете и настройте свой любимый цвет чтобы установить романтическую атмосферу. Легкий, окружающий свет снижает нагрузку на глаза, тем самым давая возможность более продолжительное время просмотра ТВ.

Светодиоды с питанием от USB имеют длительный срок службы (более 50 000 часов), отличаются низкой стоимостью, энергоэффективностью и экологичностью, имеют яркие и насыщенные цвета, обеспечивает достаточное смещение света, дабы телевизионный дисплей выглядел более четким, а цвета — более яркими.

BRT USB light Strip идеально подходит для подсветки 42-60-дюймового HDTV, зеркал для макияжа, обеденного стола, полок, гардеробных и коммерческих помещений, кроватей и все, что только придумает ваша фантазия и где, есть возможность подключения с помощью USB. Данная LED лента может работать от любых устройств с выходом 5 В USB-порт. Такая Светодиодная LED лента станет отличным подарком для вашей семьи и друзей.

Легкая установка. Для установки и подключения Led ленты не нужно ничего докупать, так как все поставляется в одном комплекте. Открыв коробку вы найдете гибкую RGB светодиодную ленту (2 метра), с USB-приемником, темя коннекторами для соединения углов 90 градусов и пультом дистанционного управления. Очень сильный клей 3М, легко наносится и крепко держится на разных типах поверхностях.

Советы по установке:

  1. Очистите и обезжирьте поверхность.
  2. Приложите ЛЕД ленту для того, чтобы определится с размерами и местом, где она будет установлена.
  3. Наклейте ленту на задней панели телевизора. Подсоедините все коннекторы и переходники.
  4. Воспроизведите фантастический свет с помощью пульта дистанционного управления.

Технические характеристики:

  • Характеристики светодиодной ленты: SMD 5050 5В;
  • Количество светодиодов: 30 LED на метр;
  • Энергопотребление: 2.88W/метр;
  • Угол пучка: 120 градусов;
  • Класс защиты: IP20;
  • Размеры ленты: 2 метра;
  • Возможна резка через каждые 33мм.

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

Введение

В интернетах не очень сложно найти готовые/открытые решения и статьи как сделать Амбилайт для монитора/телевизора, если ты выводишь картинку с ПК. Но в моей мультимедиа системе вывод картинки на телевизор c ПК занимает только 5% времени использования, большее кол-во времени я играю с игровых консолей, а значит нужно было придумать что-то свое.

Исходные данные:

  • 60″ Плазменный телевизор
  • HTPC на базе Asrock Vision 3D 137B
  • Xbox 360
  • PS3
  • PS4
  • WiiU

Большинство устройств используют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;
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.R*_leds.R; lumSum += _leds.G*_leds.G; lumSum += _leds.B*_leds.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.R; g = _leds.G; b = _leds.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 = Color.FromArgb(r, g, b); } /* Temporal softening phase. */ if (ledChange || _softening == 0) continue; var diffR = Math.Abs(_leds.R — _ledsOld.R); var diffG = Math.Abs(_leds.G — _ledsOld.G); var diffB = Math.Abs(_leds.B — _ledsOld.B); r = _leds.R; g = _leds.G; b = _leds.B; int sum; if (diffR < _softening) { if (diffR > (_softening >> 1)) { sum = _leds.R + _leds.R + _ledsOld.R; r = sum/3; } } if (diffG < _softening) { if (diffG > (_softening >> 1)) { sum = _leds.G + _leds.G + _ledsOld.G; g = sum/3; } } if (diffB < _softening) { if (diffB > (_softening >> 1)) { sum = _leds.B + _leds.B + _ledsOld.B; b = sum/3; } } _leds = 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 = Color.FromArgb(r/smothDiameter, g/smothDiameter, b/smothDiameter); }

9. Сохраняем текущий стейт, чтобы тред отправки пакетов схватил и отправил его на контроллер подсветки.

Я умышленно разделил процесс обработки кадров и отправки пакетов на контроллер: пакеты отправляются раз в определенный интервал(у меня это 40мс), чтобы ардуино спела обработать предыдущий, ибо чаще чем 30мс она захлебывается, таким образом выходит, что мы не зависим напрямую от частоты кадров захвата и не мешаем тому процессу(а ведь отправка пакета тоже тратит время).

Немного про ардуино

Нельзя просто так взять и отправить по сериалу здоровенный пакет на ардуино, ибо онв ыйдет за пределы дефолтного буфера HardwareSerial и ты потеряешь его конец.
Решается это довольно просто: выставляем значение размера буфера HardwareSerial достаточного размера, чтобы влезал весь отправляемый пакет с массивом цветов, для меня это 410.

UI

Сам софт был реализован в виде win службы, чтобы настраивать все параметры + включать/отключать я сделал Web UI, который связывался с службой через WebService на службе. Итоговый интерфейс на экране мобильника выглядит так:

Сейчас планирую прикрутить голосовое управление через Kinect for Windows подключенном к HTCP.

Результат

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

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

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