Ядерная подсветка для механической видеостены
- пятница, 4 апреля 2025 г. в 00:00:51
В предыдущей части я рассказал, как замоделил, построил и настроил себе видеостену на кастомных моторизированных кронштейнах, за которой можно работать не только в одиночку, но и толпой. Комп со 147-дюймовым панорамным монитором — это хорошо.
Ядерная подсветка для механической видеостены
Теперь речь пойдет про создание 2000-зонной подсветки мощностью 460 Вт вокруг этих экранов, какие у неё особенности и через что пришлось пройти, чтобы всё это родить и написать софт.
В 2004 году Philips выпустила телики с цветными лампочками сзади, отсвечивающими разноцветные ореолы на стене в такт картинке на экране. Эти ореолы сглаживают переход между картинкой и окружающим миром — погружение лучше, глазам легче.
Позже, через пару лет, гуляя после школьных уроков в каком‑то торговом центре, я нарвался на телевизор с этой подсветкой, очень впечатлился и загорелся желанием сделать что-то подобное на ПК.
Идея простая: сканируем картинку на рабочем столе и рулим яркостью обычной лампы, которую ставим за ЖК‑монитором. Получаем большой вкусный ореол в такт картинке. Да, про цвет речи не было — только яркость.
Софт я сделал тогда на VisualBasic 6 — при работе оно собирало примерно 60 образцов цвета со всего экрана и просто вычисляло среднюю яркость.
Полученная яркость отправлялась на разъём LPT. Работа с портом делалась через библиотеку dlportio.dll, протокола как такового не было вообще: я просто брал значение яркости и выставлял его биты на контактах порта функцией с лаконичным названием DlPortWritePortUchar.
Тут дело такое — в отличие от современных разъёмов, у LPT много контактов, и ими можно рулить напрямую, используя разъем в качестве GPIO (управляемые контакты у контроллеров). Понятие «GPIO» мне тогда было незнакомо, а контроллеры казались космическими технологиями.
А вот в железо в те времена я не умел — саму аппаратную часть мне тогда сделал отец. Устройство позволяло управлять мощностью двух своих розеток как вручную — встроенной крутилкой, так и с LPT‑порта. Уровней яркости было 256, преобразование цифры в аналог, как и оптрон, он сделал руками — качественно и надёжно. Железка спокойно запустилась спустя пару десятилетий простоя.
Оно работало, и работало хорошо, даже не смотря на медлительность лампы накаливания — Need For Speed Most Wanted 2005 года я прошёл именно с этой подсветкой. С некоторыми играми были проблемы: в них метод получения цвета с экрана WinApi/GetPixel либо ничего не видел, либо видел только часть картинки, и я так и не смог это решить.
Тем не менее, и впечатления, и опыт эта штука принесла отличные: никак, среди моих проектов это был первый программно‑аппаратный комплекс.
И вот, 15 лет спустя...
Обычно такая подсветка предполагает несколько десятков лампочек и довольно сложное ПО. Его задача — искать ключевые цвета на картинке и создавать заполняющий свет за экраном, чтобы периферическому зрению не было скучно.
В продукты Philips оно встроено и обмазано патентами, для остальных есть отдельные коробочки, цепляемые по USB или HDMI к компам, или даже самим теликам (ТВ нынче умные, и сами могут рулить подсветкой).
Руками такую штуку тоже делают: контроллер, светодиодная лента, библиотека, пара строчек — и вот оно работает.
Почти всегда софт такой самодельной подсветки не заморачивается и не ищет какие‑то там ключевые цвета, а просто усредняет краешки. В целом, если светодиодов достаточно много, это рабочий подход.
Я тоже решил сделать себе подсветку. Поскольку до этого мне приходилось заниматься исключительно софтом и графикой, а не железом, моё первое «мигание светодиодом на ардуино» получилось совсем без быстроты, простоты и пары строчек. Но оно того стоило :)
Рамы, подсветка, софт и прошивка контроллера сделаны с нуля. Некоторые куски рам напечатаны на 3D принтере, а компиляция софта, рулящего подсветкой длится полчаса и кушает 11 Гб ОЗУ. Даже протокол управления лент WS2812b пришлось реализовывать руками с осциллографом наперевес, потому что обычные библиотеки не вывезли. Но обо всём по порядку.
Путь ко всему вот этому вот начался с понимания, что для амбилайта теликовый зад обязательно должен быть на вменяемом расстоянии от стены, чтобы ореолы от лампочек смогли расплыться и слиться, но при этом оставались достаточно яркими. Слишком близко — не сольются, слишком далеко — потускнеют.
А у меня тут полный цирк: средний телевизор висит вплотную к стене, боковые вообще двигаются. А когда экраны стоят буквой П, до стен больше метра. Одним словом — надругательство над инструкцией к амбилайту.
И вообще — всё это делается, в основном, не для фильмов, а для игр. В мясных шутерах нужна динамика. Классический амбилайт генерирует слишком крупные пятна, которые не могут двигаться — только возникают, пропадают и меняют цвет. Да и экраны тут HDR, и отражённый от стены свет не должен уступать им по яркости. Поэтому покупные эмбилайты не подходят. В общем — делаем своё.
Все эти проблемы решаются увеличением разрешения, а именно — увеличением плотности и количества диодов. В обычном амбилайте они располагаются на расстоянии 3–5 см друг от друга, в большинстве моделей только с боков и сверху. Все четыре стороны — только во флагманских моделях.
В моей штуке диодов больше примерно в 50 раз, стоят они вплотную, причём, в два ряда. Фактически, это две подсветки, в каждой из которых более тысячи независимых зон.
Таким образом, у получившейся системы можно выделить три главных фичи.
Когда телик близко к стене — ореолы не рассыпаются на отдельные пятна, а когда далеко — ореол не тускнеет благодаря лютой, бешеной яркости. Когда выбегаешь из тёмного тоннеля на солнечную поляну, или рядом что‑то вспыхивает, яркость такая, что глаза не сразу привыкают. О снижении яркости задумываешься только когда тиммейт, с которым вы поднимаетесь в лифте, случайно роняет слепящую гранату.
По каким‑то причинам мне захотелось засунуть сюда ещё и поддержку HDR. В итоге подсветка умеет, если нужно, и если есть возможность, «светиться ярче 100%». Например, она может точно и качественно воспроизвести блик от очень маленького, но очень яркого объекта — этот блик может спокойно залить половину комнаты.
В отличие от обычного амбилайта, блики, цвет и тени тут не просто появляются и исчезают: они именно перемещаются вместе с картинкой по стене — спасибо количеству диодов и оптимизациям алгоритмов софта. Даже если пятно размытое — есть существенная разница между тем, когда оно движется, и когда просто возникает и пропадает в разных местах.
В шутерах ты часто смотришь по сторонам — пятна подсветки поворачиваются вместе с картинкой как одно целое, а под сенью деревьев на стене мелькают солнечные зайчики. Обычные эмбилайты так не делают, им приходится сильно усреднять картинку и цвета, и выдавать только общий фон — светодиодов мало, с динамикой не забалуешь.
Первый контур подсветки — ближний — направлен в упор в стену, и создаёт основной рисунок: небольшие, чёткие и яркие пятна цвета, света и тени, достаточно детально продолжающие края и динамику картинки и сглаживающие переход между экраном и стеной.
Второй — дальний контур — направлен вдоль стены и создаёт фон. Он менее чёткий, сильно размазывается по стене и светит ещё на пол, потолок и боковые стены, задавая общий тон и настроение в комнате и разных её частях крупными мазками, смягчая и дополняя контраст от ближней подсветки, продолжая её динамику.
Два этих контура света перекрывают и дополняют друг друга, таким образом, подсветка работает не только со светом, но и с градиентами. Переливами и вспышками заливает всё поле зрения — пол, стены, котов и потолок.
Поиграться с градиентом (это не 3D, а стакинг реальных фоток) можно ниже. Имхо наиболее годные градиенты получаются, если включить один канал сверху и один снизу, остальные обнулить, например, сверху только красный, а снизу только синий.
Обычные подсветки ограничены 256 дискретными уровнями свечения. Здесь же для описания и расчёта цветов используются дробные числа (32 bit float), поэтому подсветка способна регулировать яркость очень точно. Она может выдавать плавные градиенты и качественно работать с тёмными тонами, не «проваливая» их в чёрное.
Вместе с объёмным звуком, вся эта система превращает игровой процесс в шоу. Атмосфера и сюжет буквально выливаются из экранов и растекаются по реальности, полностью поглощая всё поле зрения, сознание и настроение. Особенно если поставить телики под 90° и поиграть пару часов.
Последний раз столько впечатлений и удовольствия от игр я получал в детстве. Одним словом, такая подсветка — что‑то типа очень мощной приправы, только не для вкуса, а для зрения.
Но как прикрепить ленты к теликам? Поклеить всю эту жесть прямо на телики — плохая идея: перегрев убьёт и OLED экран, и ленту. Нужны какие‑то рамы, которые будут держать ленты на небольшом расстоянии от телика и одновременно служить охлаждением.
А ещё экраны у меня шевелятся. Когда боковой ТВ запаркован у стены, лучше светить вдоль неё. Но если он откроется на 90°, то весь свет уйдет в потолок, и не попадёт на стены комнаты.
А если повернуть подсветку назад, то в открытом состоянии мы хорошо светим в стены, но когда телик запаркуется — у нас будет унылый маленький ореол на стене, вся остальная её часть, а также пол и потолок, будут тёмными.
Как решить проблему? Первая мысль — пусть оно тоже шевелится и поворачивает ленты синхронно с теликом!
Тогда около стены ленты будут светить вдоль неё, а как откроются телики — назад. Заодно повод добавить шестерёнки во все возможные и не очень места. Боковые вертикальные ленты тоже пусть шевелятся так, чтобы всегда смотреть в боковую стену комнаты.
Но у такой конструкции недостаток: светодиоды, которые ближе к петлям (на которых висят и крутятся экраны), находятся почти всегда недалеко от стены, расстояние там особо не меняется. Они работают как диоды за центральным экраном. А вот чем дальше диоды от петли и ближе к краю телика — тем дальше они отъезжают от стены при повороте. Как быть?
Первое, что мне пришло в голову — гибкие мечи уруми.
Вот наши рамы должны быть гибкими, как эти мечи, и не поворачиваться целиком, а скручиваться вдоль своей оси. Вместе с лентой.
Кончик около петли зафиксирован и всегда светит вдоль стены, а то, что дальше — постепенно поворачивается на 90 градусов. На вертикальных боковых рёбрах ленты пусть по‑прежнему просто поворачиваются, без закручивания.
Очевидно, что светодиодная лента, которую так жестко натягивают, будет в шоке, и быстро поломается. Она просто не рассчитана на такое издевательство. Можно, конечно, замотивировать её, порубив на кусочки, соединённые проводами и собрать механизм по типу ступенек из эскалаторов, но зачем?
Можно проще: два контура для разных положений экранов. Один светит назад, другой вдоль стен. И просто переключ… хотя зачем? Пусть светят вместе, это же веселее, ярче и вкуснее!
Так я пришёл к двухконтурной подсветке с независимым дальним и ближним светом. Яркости в два раза больше, светом залито всё что можно, скручивать ничего не надо, и крепить легко: берём стандартные алюминиевые уголки и клеим на них ленты.
Светодиоды на лентах греются, а ещё хотят кушать — добавим второй уголок в качестве радиатора и кабель‑канала. Вот и получился профиль, из которого сделаны все рамы подсветки.
Одно время думал сделать подсветку не в 2, а в 3 или даже 5 контуров, но габариты получались уже слишком толстые, да и охлаждать такое непросто. Поэтому вернулся к варианту с двумя контурами — с ним и замоделил рамы.
Экрана у меня три, а значит и рам тоже нужно три. При этом, внутренние вертикальные рёбра рам сделаны исключительно для прочности — смысла туда клеить ленты нет, всё равно их не будет видно за теликами.
Благодаря тому, что внешние углы боковых рам скошены 45°, свет равномернее растекается по комнате, и меньше шанс зацепиться за рамы, проходя мимо.
LG OLED серии «C» имеют довольно замороченную форму. В этом плане, конечно, G‑серия лучше — там просто тонкие параллелепипеды. Но их, в отличие от моих C‑шек, не повесишь внахлёст (уменьшение стыка между экранами с 20 до 10 мм). Толщина C‑шек же неравномерная — верхняя часть тонкая, нижняя толстая, и, чтобы было совсем нескучно, она ещё и скошена по краям.
При проектировании рам подсветки пришлось попотеть, чтобы учесть всю эту сложную геометрию, вписаться в щель между стеной и экранами, оставить место кронштейнам, на которых висит телевизор, и при этом рассчитать, чтобы экраны могли нормально двигаться и ничего не задевать.
Начнём с простого: рама подсветки центрального телика, который всегда стоит на месте и просто прикручен к стене. Рама прямоугольная, все четыре соединения лаконичны, никаких заморочек.
А вот у боковых теликов рамы сложнее. Во‑первых, надо учитывать их подвижность. Во‑вторых, у боковых рам наружные сегменты скошены, и аккуратно огибают всё геометрическое безобразие телевизоров C‑серии. Впрочем, внутренние углы этих рам устроены так же просто, как и у центральной рамы.
Моделирование всех этих рам у меня заняло больше месяца, а после отправки на производство результата я ждал несколько недель — работы там действительно много.
Деталей тут много: 16 сегментов (каждый из 2 профилей) + 8 соединителей.
Первоначально рамы моделировались под первую версию кронштейнов для ТВ: сверху для крепления использовались Г‑образные поддержки, вставляющиеся в вертикальные балки кронштейна, а нижняя часть вообще должна была огибать их.
Однако, я успел придумать новые кронштейны до того, как отправил рамы подсветки на производство, поэтому в релиз они пошли уже обновлённые — здесь у кронштейнов никаких вертикальных палок нет, поэтому нижний сегмент рам имеет лаконичную прямую форму.
Ширина и высота рам совпадает с размерами экранов, чтобы источники света были максимально близко к краям, но, при этом, не выглядывали из‑за ТВ — ни сбоку, ни сверху, ни снизу.
Чтобы лучше переотражать свет, рамы покрашены в белый, кроме внутренней поверхностей профиля рамы, к которой клеятся ленты. Эти вместо покраски отполированы — хорошему охлаждению нужен соответствующий тепловой контакт.
Изначально я заказал двадцать метровых лент, но после пары взрывных и не очень экспериментов, и осознания места, откуда у меня растут руки, решил пополнить запасы ещё десятью, на всякий случай. Ленты самоклеящиеся — отдираем синий слой и клеим, как скотч. Однако сильно гнуть не стоит — утоньшение дорожек не полезно при тех токах, которые тут текут.
Приклеивая две ленты рядом, важно не допустить их контакта — плюс и минус двух лент находятся на опасной близости в углу рамы. Метровая лента в 144 диода на самом деле не цельная, а состоит из двух кусков, спаянных на заводе. Место пайки — первый кандидат на КЗ между двумя лентами.
По‑хорошему стоило поклеить их так, чтобы в углу была одна полярность, и не париться. Однако, ленты адресные (ну почти), у них есть направление, и есть начало, куда надо подводить сигнал. И если клеить их навстречу друг другу, то сигнал придётся подводить к разным концам рамы. А это ещё больше запутает густую паутину проводов.
В торцах сегментов предусмотрены пары отверстий 3 мм для соединения винтами М2, с гаечками и шайбами — всё как положено. На практике там в одной точке оказались провода, светодиоды, ленты, и это всё настолько плотно скукожено и мешается, что в некоторых местах винты закрутить удавалось только с десятой попытки.
Увеличенные отверстия сделаны для того, чтобы при сборке сегменты могли немного наклоняться относительно друг друга — мало ли, где я опять накосячил с размерами.
.
Ширина теликов больше метра, и одной метровой ленты по горизонтали мало — поэтому в горизонтальных сегментах (которых всего 6) целые ленты на 144 диода дополняются бонусными хвостиками на 10–15 диодов.
Внутренние углы рам соединяются простыми деталями из железа, без скосов и прочих заморочек.
Верхние крепления — пирамидки, соединяющие сегменты рам в одной плоскости. На центральном телике эти пирамидки через магниты прикреплены прямо к экрану с обратной стороны. Да, телик магнитится.
Для соединения нижних сегментов используются вот такие Г‑образные детальки. Всё потому, что нижние ленты отодвинуты назад, чтобы огибать теликовую толстозадость.
С внешними углами рам сложнее: там вместо соединительных деталей полноценные мини‑сегменты, скошенные под 45°, с лентами и проводами.
Верхний скос довольно простой: делаем маленькие сегменты на 10–15 диодов, которые соединяют основные под углом, клеим туда ленты — всё как обычно.
Для левого и правого экранов эти детали одинаковые, никакой зеркальности. Ближний свет имеет на один диод больше, чем дальний, чисто в силу геометрических особенностей. В остальном всё лаконично и просто.
А вот снизу, на высоте где‑то метр от пола, толстозадый телик оставил нам пакость.
Простой вариант — отодвинуть нижний сегмент вниз, под телик. Не круто — из‑за теликов не должно ничего торчать. Можно вообще отказаться от скошенного угла внизу и сделать прямой. Тоже не круто, особенно когда эта штука воткнётся в ногу или руку, или, что хуже, не в ногу и не в руку.
Напомню: увесистые телики передвигаются самостоятельно на электроприводах. Атака может быть внезапной и беспощадной — например, когда мой комп простаивает больше 10 мин, он приглушает подсветку и паркует телики.
Мы трудностей не боимся, это они нас боятся. Пусть нижний скос суперточно огибает теликовые чресла - для этого воспользуемся третьим измерением, которым мы в изобилии располагаем.
Для этого понадобится хитрая деталь, как верхний уголок, только её нижний конец дополнительно сдвинут назад, на толщину телика.
После того, как я замоделил сие, оказалось, что такое сложно изготовить руками. Точнее, радиаторный уголок можно, а вот уголок для светодиодов — нет. Во мне проснулось любопытство, и обе модельки отправились (левая и правая — они зеркальные) на 3D печать из алюминия. Обратно прилетело вот такое чудо:
Выглядит как печёный порошочек, но нет — оно вполне себе литое. Просто поверхность такая.
По прилёту и первичному осмотру, эти штуки были отправлены на основное производство для тесного знакомства с остальными деталями.
Там квазипорошковый 3D‑уголок был спаян с рукотворным радиатором и покрашен, образовав прочный и цельный сегмент, хорошо огибающий толстозадую геометрию.
Итак, рамы готовы. Мы обогнули все острые и не очень углы, поклеили 16 метров лент. Теперь эти рамы надо прикрепить к теликам.
У верхних сегментов боковых рам есть два фланца для крепления к кронштейнам, описанным в предыдущей части — причём, как к старым, так и к новым. Тут всё просто.
А как быть с нижней частью? Там же рядом нет кронштейна. А легко: просто прикручиваем раму прямо к телику, в нишу для его ноги.
Изначально были планы поставить блоки питания в нишу между этим фланцем и углублением в корпусе, но БП таких габаритов нужной мощности я не нашёл, пересобирать готовый под новые габариты было лень, и ниша осталась пустой.
Да и охлаждаться блоку питания там будет сложновато, поэтому, на практике, эта ниша используется для хранения избыточно длинных проводов. А в перспективе я планирую поставить туда датчики расстояния до стены.
Весят pамы всего около двух килограмм — всё таки не зря был выбран алюминий, а не медь. Хотя медь смотрелась бы интереснее.
Рамы состоят из 32 профилей, 36 лент (полных и кусочков) общей длиной в 16 метров, 8 вспомогательных деталей и сотен винтиков, гаечек и прочей сопровождающей подобные штуки крепёжной шелухи.
С охлаждением изделие справляется прекрасно, если только не включать максимально яркий белый свет надолго — в этом случае подсветка за 10 минут может раскалиться до 70°C, что неполезно. В большинстве же случаев температура крутится вокруг 35°C, даже когда вокруг активно используются слепящие гранаты — тут подсветка уходит в максимум всего лишь на несколько секунд. Тем не менее, я размышляю над идеей воткнуть туда датчиков, чтобы система обрела чувство самосохранения и умела тускнеть при перегреве.
С следующей части будем обматывать всё это дело проводами и запускать. Девяносто ампер сами себя до лент не дотащат.