(на всякий случай, ссылка на видео: https://www.youtube.com/watch?v=N8NRuhs1RoU)
Однажды я подбирал себе новый монитор. Закончилось всё чудищем во всю стену из трёх телевизоров с ядерной 2318-зональной подсветкой 40000 люмен на STM32.
Список всех частей
Механическая видеостена с ядерным Ambilight на 2300 зон
Зачем?
Сейчас, когда подбираешь экран для максимального погружения, приходится выбирать между мониторами-сосисками 32:9 и телевизорами: производители внезапно и неожиданно заметили, что иногда телевизоры используют для игр, и стали пихать туда игромониторные функции. В первую очередь - это отключение всяческих улучшателей, уплавнялок и других функций: благодаря этому, картинка выводится оригинальная, плюс уменьшается задержка вывода изображения. И если качество картинки у такого телевизора хорошее (привет, OLED/QLED), то чем он тогда не монитор?
Для расширения обзора существует ещё вариант с тремя мониторами, который, из-за появления в продаже экранов 32:9, теряет популярность. В итоге ты выбираешь - либо у тебя экран большой, либо обзор.
Если говорить только о работе за ПК, без каких либо игр - то тут проблем нет, мы можем поставить кучу разных экранов, поворачивать их вертикально и размещать как угодно, расширяя место на рабочем столе столько, сколько нам нужно. В этом плане 4K и 8K телевизоры также хороши - они дают большую площадь рабочего стола без рамок и отличное качество изображения. Мы можем просто взять кучу хороших телевизоров и разместить их, как захочется.
Но вот с играми сложнее - игр, которые сознательно могут использовать несколько экранов, единицы. Исчерпывающее большинство игр работает только с одним монитором. Поэтому, у нас выбор - или один большой телевизор, или мониторососиска.
А есть ещё один вариант - три одинаковых экрана + специальный софт.
В этом случае, обычно, объединяют экраны в один виртуальный, и игра по-прежнему думает, что она запущена на одном мониторе, правда, очень-очень длинном, а драйвер-обманщик раскидывает картинку на три физических экрана. В 3D играх, при этом, картинка будет рендериться с очень большим углом обзора, и края картинки будут растянуты. Это немного непривычно, но не критично - когда играешь на трёх экранах, ты смотришь в центр, а боковые экраны отвечают за периферическое зрение. Хотя, конечно, если приложить усилия, растянутость и другие искажения картинки можно тоже убрать.
Если хочется и панорамности, и размера, и качества - то тут только три телевизора. Потому что мониторососисок с диагоналями 100-200 дюймов в продаже просто нет. Да и они бывают только с соотношением сторон 32:9, шире не выпускаются. А мы хотим 48:9.
Это не первая трёхэкранная конфигурация в моей жизни — до этого я сидел за тремя 24 дюймовыми TN‑мониторами, которые умели в стереоскопическое 3D. Как и 120 Гц, три монитора — это хорошо, и отвыкать от этого уже не захочется. Правда, новое железо, к сожалению, не умеет в стереоскопию (есть желание это исправить, правда, занятие обещает быть по сложности и боли сопоставимым с созданием подсветки).
Один из ключевых моментов — нынешние ТВ могут в задержку ~5 мс и честную частоту обновления 120 Гц. Человеческому глазу, конечно, достаточно 24 Гц, но увидеть мы можем и 1000, и даже 10 000 Гц, поэтому 120 Гц — весьма хорошая функция.
Три телевизора дают возможность получить максимум реализма, атмосферности и погружения, который можно получить без VR. Виртуальная реальность, при всех её бесспорных плюсах, на текущем уровне развития, имеет и минусы — ужасный угол обзора и пикселизацию. Плюс на тебе постоянно надеты всякие штуки. То качество, чёткость и углы обзора, который дают три 4K OLED HDR телевизора, даже близко не достижимо современными гарнитурами VR, к сожалению. В будущем, разумеется, эти минусы сойдут на нет, но пока этому препятствуют не только дисплейные технологии (хотя на горизонте маячит MicroLED), но и производительность видеокарт. Иными словами, три телевизора с подсветкой — не хуже и не лучше VR, это как‑бы отдельная, параллельная ветка эволюции. VR погружает тебя самого в виртуальный мир, а эта механическая простыня — всё помещение целиком, вместе с содержимым. На мой взгляд, в будущем, VR сможет это всё вытеснить, хотя появление голографических дисплеев этому будет противодействовать.
За компом можно работать не только в одиночку, но и вдвоём или даже втроём: три мышки, три клавиатуры и тул MouseMux дают три курсора на одном рабочем столе. Для моего поделия это более чем актуально — ширина экрана почти 4 метра. Курсоры не привязаны к телевизорам и могут ходить друг другу в гости. Можно открыть три VisualStudio и параллельно писать в них код на трёх клавиатурах. Фактически, это трёхместный комп.
Получилась механизированная HDR‑видеостена на 11 520×2160 пикселей с суровой двухконтурной подсветкой на 2318 независимых зон — она очень яркая и светит не только в стену, но и в пол, потолок и боковые стены. Заливает светом всё, до чего дотянется. По совместительству, эта подсветка — мой HelloWorld в мире контроллеров.
Краткие ТТХ
Экраны
3 x LG OLED C1 (4K 120 Hz HDR 10bit RGB HDMI 2.1)
Объединены в цельный виртуальный экран
Суммарное разрешение: 11520x2160
Экраны установлены на специально спроектированных кронштейнах
Время парковки/полного открытия боковых экранов - 12 сек, можно управлять независимо, можно двигать руками. Когда двигаются, громко стрекочут шестернями и бесят. Думаю, как решить проблему.
Подсветка Ambiknight
Ленты RGB (не RGBW) WS2812b, 144 диода на метр, без влагозащиты (охлаждение важнее)
Независимых зон подсветки: 2318
Пиковая яркость: ~40 000 люмен
Максимальное энергопотребление: ~440 Вт
Два контура. Один светит назад, второй в стороны. Подсветка может создавать градиенты от пола до потолка, например, имитировать зарево
Число цветов: 16,7 млн (8 бит/канал, RGB)
Максимальная частота обновления: 40 Гц (производитель говорит до 30, но по факту работает 40)
Число физических сегментов лент: 36
Число отдельно управляемых лент: 17 (некоторые сегменты цепляются друг за друга и работают как 1 лента)
Контроллер: STM32F072RB Discovery (да, я уже в курсе, что надо BlackPill :3 )
Питание: три блока по 5В 40А, каждый отвечает за подсветку на своем экране
Ленты размещены на специально спроектированных рамах
Как работает
Телевизоры подключены по оптическим HDMI кабелям к ПК через специальные переходники, и объединены драйвером видеокарты в единый виртуальный монитор. Игры разворачиваются на все три монитора, окна программ — нет, т.к. драйвер кое‑что меняет в поведении Windows + я использую софтину FancyZones/PowerToys чтобы поделить экран на 50 виртуальных областей и MouseMux чтобы можно было сидеть толпой за одним компом. В итоге и работать, и играть хорошо. Кино разворачивается на весь экран, насколько это для него возможно — есть мысли проработать этот вопрос нейросетями или чем‑нибудь в таком духе.
За управление приводами кронштейнов отвечает отдельный выделенный контроллер. С помощью хоткеев, GUI или пультов можно регулировать углы поворота боковых экранов — вместе или по отдельности. При запуске боковые телевизоры сами открываются, при выключении, или когда запускается экранная заставка — паркуются вдоль стены. Пока активна экранная заставка, подсветка плавно приглушается.
Ленты стоят на специально изготовленных рамах из алюминия. Неожиданным оказалось то, что моделил я эти рамы гораздо дольше, чем кронштейны для экранов, хотя рамы, как бы, вообще не шевелятся, и должны быть простыми. Пару железяк даже пришлось печатать. Подсветка хорошо работает при любом расстоянии до стены, и суммарно заполняет почти половину поверхностей в комнате, остальное покрывает отражённый свет. Контуры - дальний и ближний - работают независимо.
Концептуально, работает подсветка по классической схеме: на компе стоит софт, он анализирует картинку на экране и формирует данные для контроллера - какой цвет должен быть у каждого из 2318 диодов. Эти данные через гальваническую развязку по длинному USB проводу отправляются в STM32, а он уже раскидывает данные на 17 лент параллельно через DMA по коаксиальным проводам - и так 40 раз в секунду. Один контроллер централизованно обслуживает ленты на всех трёх оледах.
Поскольку это мой первый раз с контроллерами, подсветка - это много-много боли. Софт на компе и прошивки контроллеров пришлось делать полностью с нуля: всё, что существует готовое, вплоть до библиотек работы с лентами, не подходит под пару тысяч диодов и разрешение в 25 мегапикселей, не говоря уже о всяких готовых коробочках и приложениях.
Пробовал Arduino, потом Rasberry Pi 4B, писать драйверы под линукс со всякими блокировками прерываний, думал уже ставить RTOS или вообще руками на FPGA расшифровывать HDMI 2.1, или посадить каждую ленту на свой контроллер с WiFi и через отдельный роутер ими управлять. Но всё-таки, у меня не получилось так жестко тупить длительное время, и однажды я решил всё же попробовать STM32. Плюс ещё много проблем по питанию - больше 80 ампер как-никак. Сжёг 5 контроллеров и пару лент, припаял пару сотен проводов и уничтожил тонны канифоли с припоем. В конце концов, оно заработало.
Когда работаешь, подсветка не расширяет изображение, а просто выводит всякие плавные спокойные штуки - градиенты, радуги-переливы, вот это всё, чтобы не отвлекать. Запускаешь игру/кино/шейдер - тогда уже активируется анализ картинки.
В софте, по мере эксплуатации, я наделал кучу настроек для цветокора отдельно дальнего и ближнего цвета, и, разумеется, божественный дизайн, потому что делал для себя и по-быстрому :)
Написано на C#, для захвата используется DirectX OutputDuplication, потом картинка уменьшается в 400 раз через Direct2D, потом переходит в ОЗУ, дальше картинку подхватывает и крошит туча очень оптимизированного и многослойного unsafe кода, по итогу отправляет пакетик в 6954 байт по виртуальному COM-порту на 6 млн бод в STM32, оттуда через DMA всё разлетается по лентам. CPU оно не грузит (поэтому C++ тут нет), а вот видеокарте, всё равно, приходится несладко.
Тут важно понимать - оно не просто должно успевать переваривать более 750 мегапикселей в секунду - оно должно это делать в фоне, чтобы не мешать компу делать основное дело.
Заключение
В ходе постройки этого компа пришлось делать много разных штук из разных областей: подбор телевизоров, выгорание OLED, пляски с подключением, проектирование и изготовление рам и кронштейнов, механизация, пайка, электроника, программирование, монтаж, прошивка контроллеров, работа с DirectX и создание драйверов под линукс, 3д печать по металлу и ещё много всего - чем глубже в лес, тем толще партизаны.
Если хабрасообществу данная тема покажется интересной, то могу раскрыть её подробнее в следующих частях.