Pull to refresh

Учим три телевизора делать солнышко

Level of difficultyEasy
Reading time29 min
Views52K

Видео работы кронштейнов (длинная подробная версия тут)

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

Список всех частей

Вешаем

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

Если поставить экраны в ряд, то на большом расстоянии всё будет хорошо видно, а вот на маленьком — трей или меню пуск придётся рассматривать чуть ли не в бинокль. Напротив, если поставить экраны под 90° буквой П, то тогда близко всё будет хорошо, а вот при просмотре издали картинка на боковых экранах будет искажена.

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

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

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

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

Да, всё это умеет шевелиться самостоятельно
Да, всё это умеет шевелиться самостоятельно

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

Brateck PLB-M03G
Brateck PLB-M03G

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

В комплекте привод, железки, БП, крепёж, пульт, ИК датчик — ничего необычного. На этом можно было бы остановиться и просто повесить боковые экраны, как предлагает производитель: шесть маленьких дюбелей, чтобы держать тушу в 20 кг, да ещё и с рычагом больше метра. Как-то опасно.

Как оказалось, из этого всего нужен только привод
Как оказалось, из этого всего нужен только привод

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

Казалось бы — сделал пластину и всё, можно вешать — но уже маячит следующая проблема: зазоры между экранами. Я задумал вешать телевизоры не просто рядом, а вообще рамками внахлёст. И если просто повесить их на кронштейны, то зазоры будут больше персонажа из начала статьи, и ни о каких «нахлёстах» речи не будет. Более того, зазоры будут меняться в зависимости от положения кронштейнов. А если всё‑таки попытаться сблизить экраны, то они будут задевать друг за друга. Можно, конечно, вместо пластины сделать прямоугольную трубу, отодвинув экраны от стены, но это лишь приближает нас к цели, а не решает проблему полностью. Настало время велосипедов.


Строим кронштейны

Кронштейн нужно поместить не ЗА телевизором, а ПОД телевизором
Кронштейн нужно поместить не ЗА телевизором, а ПОД телевизором

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

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

Пару недель экспериментов в Inventor, и я таки родил модельки, чтобы отправить их на производство, которое, к слову, заняло не слишком много времени. Для того, чтобы размеры подгонять было удобно, сначала я замоделил телевизор, упрощённо, но с соблюдением размеров, и уже вокруг этой модели делал всё остальное. И да — мои 2D «чертежи» оказались не нужны, достаточно было 3D‑файлов. Благо, чертежи делаются из 3D моделей буквально пару кликов.

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

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

Недочертежи
База, которая крепится к стене
База, которая крепится к стене
Пластина, которая фиксируется на базе на определённом расстоянии. На неё уже крепится кронштейн
Пластина, которая фиксируется на базе на определённом расстоянии. На неё уже крепится кронштейн
Вертикальная балка, к паре которых крепится телевизор
Вертикальная балка, к паре которых крепится телевизор
Дополнительная прокладка между П-образной деталью кронштейна и вертикальными балками, задача которой сдвинуть вертикальные балки на 20 мм назад обратно к стене
Дополнительная прокладка между П-образной деталью кронштейна и вертикальными балками, задача которой сдвинуть вертикальные балки на 20 мм назад обратно к стене
База, пластина и кронштейн в сборе
База, пластина и кронштейн в сборе
Вид спереди
Вид спереди
Вид сверху основных элементов
Вид сверху основных элементов

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

Главную роль в конструкции играет пара пластин, к одной из которых намертво приварено 6 стержней с резьбой — её вешаем на стену. На стержни пластины прикручиваем пластину поменьше, а на неё уже — сам кронштейн. На него вертикально вешаем две метровые балкопалки (квадратные трубы 30×30 с толщиной стенки 3 мм с кучей пазов во всех возможных местах), и уже на них — сам ТВ.

В частности, нужно было досверлить д̶ы̶р̶к̶и̶отверстия для крепления привода, и не забыть прикрыть основную пластину от опилок, чтобы она не поцарапалась :(
В частности, нужно было досверлить д̶ы̶р̶к̶и̶отверстия для крепления привода, и не забыть прикрыть основную пластину от опилок, чтобы она не поцарапалась :(
Прикручиваем привод
Прикручиваем привод
Теперь садим всё это на стержни
Теперь садим всё это на стержни
Чтобы оно ну уж точно не открутилось, с двух сторон ставятся пружинные шайбы
Чтобы оно ну уж точно не открутилось, с двух сторон ставятся пружинные шайбы
Мягкая столешница - это прекрасно, даже если тряпочке 200 лет
Мягкая столешница - это прекрасно, даже если тряпочке 200 лет

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

Помогите Даше найти пузырьковый уровень, врущий на 2 градуса
Помогите Даше найти пузырьковый уровень, врущий на 2 градуса

Из двух изготовленных комплектов я протестировал только один. Свою задачу эта штука выполняла исправно: край телевизора стоял на месте, зазора не было, стык был минимально узким, рабочий стол стал в два раза больше. Однако, поэксплуатировав сие некоторое время, я пришёл к выводу, что оно мне не подходит.

До калибровки
До калибровки
Кое-что пришлось потом отпилить
Кое-что пришлось потом отпилить

Под экраном теперь плавает квадратно‑гнездовой лангольер, беспощадно жрущий пространство для своего перемещения, пугающий котов и мешающий будущей подсветке делать своё подсветковое дело. Кстати — в этой версии уже предусматривалось крепление рам светодиодной подсветки. Это были Г‑образные детали, по паре на каждый телевизор, которые вставлялись вверху и регулировались по высоте.

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

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


Строим ещё кронштейны

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

Больше недочертежей
Левый, открыт на 90°, вид сбоку
Левый, открыт на 90°, вид сбоку
Левый, открыт на 90°, вид спереди
Левый, открыт на 90°, вид спереди
Левый, открыт на 90°, вид сверху
Левый, открыт на 90°, вид сверху
Левый кронштейн, открыт на 90°
Левый кронштейн, открыт на 90°
Левый кронштейн, открыт на 90°
Левый кронштейн, открыт на 90°
Верхняя петля левого кронштейна, когда он открыт на 90°
Верхняя петля левого кронштейна, когда он открыт на 90°
Нижняя (!) петля левого кронштейна, когда он открыт на 90°, вид снизу
Нижняя (!) петля левого кронштейна, когда он открыт на 90°, вид снизу
Левый кронштейн открыт на 90°, вид снизу-сбоку
Левый кронштейн открыт на 90°, вид снизу-сбоку
Левый кронштейн открыт на 90°, вид снизу-с-другого-боку
Левый кронштейн открыт на 90°, вид снизу-с-другого-боку
Левый кронштейн с разных ракурсов и его ключевые узлы
Левый кронштейн с разных ракурсов и его ключевые узлы

Какие мысли роились в голове

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

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

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

Ага, вот эти ребята
Ага, вот эти ребята

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

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

Скорее всего оно издавало бы какой-нибудь прикольный звук
Скорее всего оно издавало бы какой-нибудь прикольный звук

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

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

Что в итоге получилось

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

Вся конструкция выполнена из стали Ст3. Белый цвет в кронштейне, как и в телевизорах, выбран не случайно - ему надо с максимальным КПД переотражать ту часть света от подсветки, которая полетела не в стену, а в телевизор, чтобы дать ей новый шанс переотразиться в нужную сторону
Вся конструкция выполнена из стали Ст3. Белый цвет в кронштейне, как и в телевизорах, выбран не случайно - ему надо с максимальным КПД переотражать ту часть света от подсветки, которая полетела не в стену, а в телевизор, чтобы дать ей новый шанс переотразиться в нужную сторону

К простыне крепятся петли, на которых крутится несущая рама из квадратных труб. На несущую раму сбоку крепится телевизор, а сверху — рама подсветки. Привод вешается на стену отдельно.

Я вот подумал - а что если реально его так покрасить
Я вот подумал - а что если реально его так покрасить
Всё равно на экраны обычно смотрят с другой стороны
Всё равно на экраны обычно смотрят с другой стороны
Немножко проекций
Правый кронштейн открыт на 80°
Правый кронштейн открыт на 80°
Верхняя петля правого кронштейна, когда он запаркован вдоль стены
Верхняя петля правого кронштейна, когда он запаркован вдоль стены
Привод правого кронштейна, когда он запаркован вдоль стены
Привод правого кронштейна, когда он запаркован вдоль стены
Правый кронштейн открыт на 45°, вид с торца рамы
Правый кронштейн открыт на 45°, вид с торца рамы
Правый кронштейн открыт на 45°
Правый кронштейн открыт на 45°
Правый кронштейн открыт на 90°, вид сверху
Правый кронштейн открыт на 90°, вид сверху
Правый кронштейн запаркован к стене, вид сверху
Правый кронштейн запаркован к стене, вид сверху
Различные проекции правого кронштейна в полуоткрытом на 45° положении
Различные проекции правого кронштейна в полуоткрытом на 45° положении
Различные проекции правого кронштейна в открытом на 90° положении
Различные проекции правого кронштейна в открытом на 90° положении
Различные проекции правого кронштейна в запаркованном положении
Различные проекции правого кронштейна в запаркованном положении
Процедура открытия всей системы на 90°, вид сверху, сечение на уровне рельса
Процедура открытия всей системы на 90°, вид сверху, сечение на уровне рельса
Сборка из трёх телевизоров в полуоткрытом на 60° наверное состоянии, вид сверху
Сборка из трёх телевизоров в полуоткрытом на 60° наверное состоянии, вид сверху
Сборка из трёх телевизоров в полностью открытом на 90° состоянии, вид сверху
Сборка из трёх телевизоров в полностью открытом на 90° состоянии, вид сверху
Сборка из трёх телевизоров в запаркованном состоянии, вид сзади
Сборка из трёх телевизоров в запаркованном состоянии, вид сзади
Сборка из трёх телевизоров в полуоткрытом на 45° состоянии, вид сзади сверху
Сборка из трёх телевизоров в полуоткрытом на 45° состоянии, вид сзади сверху

Сборка из трёх телевизоров в полуоткрытом на 45° состоянии
Сборка из трёх телевизоров в полуоткрытом на 45° состоянии
Сборка из трёх телевизоров в открытом на 90° состоянии
Сборка из трёх телевизоров в открытом на 90° состоянии
Сборка из трёх телевизоров в полуоткрытом на 45° состоянии
Сборка из трёх телевизоров в полуоткрытом на 45° состоянии
Сборка из трёх телевизоров в полностью открытом на 90° состоянии
Сборка из трёх телевизоров в полностью открытом на 90° состоянии

Правый кронштейн открыт на 45°
Правый кронштейн открыт на 45°
Вид всей сборки с установленными телевизорами сбоку в состоянии полной запаркованности
Вид всей сборки с установленными телевизорами сбоку в состоянии полной запаркованности
Правый кронштейн с установленным телевизором в запаркованном состоянии, вид сверху
Правый кронштейн с установленным телевизором в запаркованном состоянии, вид сверху
Сборка из трёх телевизоров в открытом на 90° состоянии, вид сзади
Сборка из трёх телевизоров в открытом на 90° состоянии, вид сзади
Ой всё
Ой всё

Ключевой узел кронштейнов — петли. Стационарные части петель сделаны из стали 12 мм, внутри сидят радиальноупоротые подшипники. В них ставятся втулки, а сверху — вторая часть петель, потоньше. Вся петля — 19 мм в высоту и 40 мм в диаметре — получилась немножечко больше зубочистки. На фоне самих экранов это немного, но всё равно глаз цепляется. Сделать петли незаметнее можно, поместив им зеркало на нижнюю грань. Ну, или, какой‑нибудь круглый дисплей для умных часов, хотя здесь надо будет поставить ещё один контроллер и повозиться с синхронизацией картинок.

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

Радиальные подшипники держат нагрузку поперёк оси, например, в автомобиле. Упорные подшипники держат нагрузку вдоль оси т. е. они лежат плашмя, на них ставят тяжёлую штуку, и она на них крутится. А радиальноупорные подшипники — это смесь обоих видов, оно одинаково хорошо переносит оба вида нагрузок — именно то, что создаёт крутящийся телевизор. Подшипники обычно рассчитаны на что‑нибудь в духе 100'000 оборотов в минуту, а не на ленивый экран, ползущий 90 градусов 10 секунд, но в петлях они хороши: околонулевой люфт, отсутствие трения, износа и скрипа, поэтому почему бы и нет.

Пока вы пишите код, за вами наблюдают
Пока вы пишите код, за вами наблюдают

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

Подвижная часть кронштейна — не монолит, и состоит из трёх частей: основная труба, к которой крепятся несущая конструкция и Г-образная надстройка для рам светодиодных лент и их блока питания 40А 5В.

Это правый, просто он неестественно выгнут на 180° влево. Большая чёрная штука - это кронштейн центрального экрана
Это правый, просто он неестественно выгнут на 180° влево. Большая чёрная штука - это кронштейн центрального экрана
Моделирование по Мизесу для разработки такой простой конструкции избыточно, но позволяет примерно увидеть, где оно хочет кукожиться, и как оно хочет это делать
Моделирование по Мизесу для разработки такой простой конструкции избыточно, но позволяет примерно увидеть, где оно хочет кукожиться, и как оно хочет это делать

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

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

Во время парковки подшипник путешествует примерно на 200 мм
Во время парковки подшипник путешествует примерно на 200 мм

Да, подшипник с рельсом генерируют люфт, но на фоне люфта самого привода это мелочь. Подшипник сверху так и задуман непопадающим в свой верхний рельс, он запасной, на случай, если основной сломается :3.

Всё собирается в кучу болтами М8 различной длины, каждое соединение с обеих сторон снабжается обычной и пружинной шайбами, чтобы не было сюрпризов, для телевизоров же сделаны пазы, в которые, на этот раз, проходят болты М6.

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

ИК-приёмники светят красным во время работы механики
ИК-приёмники светят красным во время работы механики

Стоит упомянуть, что привод, хоть он и достаточно умный, не знает, что у него огромные люфты, а также то, какую роль он играет в данной поделке. Поэтому каждая парковка телевизоров сопровождается попыткой убить телевизор об стену — оно как‑бы, формально, притормаживает в конце, но только чуть‑чуть, и инерция экрана вместе с рамой явно превышает его ожидания. Можно, конечно, влезть в конструкцию привода и устранить люфты, но здесь я последовал принципу «если это тупо, но работает, то это не тупо».

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

Аудиоспектр шума работающего привода
Аудиоспектр шума работающего привода

Интересно, насколько возможно провести хотя бы приблизительный реверс‑инжиниринг механизма по спектру его шума и вибраций. Ведь, теоретически, каждая полоска в спектре — это шум, издаваемый двумя соприкасающимеся зубьями шестерней/зубчатых колёс или других трущхися частей, а по частоте этого шума можно примерно представить число соприкосновений зубьев в секунду. Дело пахнет нейросетями. А ещё можно добавить исходные данные в духе скорость/крутящей момент на входе и выходе и само изображение механизма. И потом сделать AR‑приложение с «рентгеновским зрением», которое будет в реальном времени накладывать на видеокартинку с работающим устройством 3D‑реконструкцию того, что, предположительно, творится внутри.


Система централизованного управления кронштейнами

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

Me and the boys
Me and the boys

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

В штатном режиме приводы управляются через ИК пульты последовательным нажатием двух кнопок, в духе «нажал влево», потом «ок» — оно поехало, нажал ещё раз «ок», оно остановилось. Нам нужно сделать очередной симулятор ИК‑пультов, коих уже было сделано тысячи, то есть особым образом мигать ИК светодиодом и обманывать ИК‑приёмник, чтобы он думал, что мы — пульт. Единственная незначительная особенность — у нас будет два ИК‑светодиода для двух приёмников отдельно, потому что приводы не умеют в адресность. А так, всё стандартно: приложение, RS232, контроллер, светодиоды.

Да, можно было бы отключить ИК‑датчики от приводов и подцепиться к ним напрямую, или вообще влезть внутрь, но смысла в этом я не видел. Прятать пары ИК приёмник‑передатчик я также не стал, чтобы можно было продолжать пользоваться пультами, если что. Была мысль снять корпус с приёмника и ввести светодиод передатчика прямо ему в конструкцию, но практика показала, что это не работает: он перестаёт видеть сигнал, поэтому оставил так. Предположу, что корпус выполняет функцию линзы.

Поскольку основной STM32 и так на 100% занят подсветкой, и с трудом переваривает проходящий через него объём информации (2 Мбит/с), управление приводами я решил сделать через отдельный контроллер. И, разумеется, как следует всё обдумав, поразмыслив над этим и руководствуясь логикой и здравым смыслом, я выбрал для мигания двумя диодами Arduino Mega.

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

От ПК до контроллера идёт очень длинный и очень экранированный USB кабель, а от контроллера к светодиодам — два метровых акустических провода (продавец сказал звук будет отличный — почти не соврал). Светодиоды сидят максимально близко к ИК‑приёмникам.

Программная часть

Как и все подобные штуки, эта начинается с реверс‑инжиниринга протоколов управления. Берём осциллограф с фотодиодом и записываем на него все команды, которые нам нужны, заодно сразу на месте мерим длительность импульсов — протокол управления у кронштейнов банален, это не кондиционеры с их выносящими мозг протоколами. И вот только после этого вспоминаем, что существует флипер. Собственно, тут вообще вся система управления не представляет из себя что‑то сложное.

На стороне ПК, в минималистичном солнечном окошке, ответственном за управление подсветкой, добавляем блок управления кронштейнами. На каждую команду подключение COM инициируем заново, передаём данные, затем тут же отключаемся.

Нет ничего более постоянного, чем временное
Нет ничего более постоянного, чем временное

Каждая команда состоит всего из трёх байт: номер первого пина, номер второго пина и ID сигнала, который нужно отмигать одновременно на двух этих пинах. Готовые последовательности миганий заранее вбиты в контроллер, и каждому присвоен соответствующий ID. То есть, технически, ПК может указать вообще любые два пина, которыми контроллер должен помигать, а вот как именно мигать — только один из готовых наборов сигналов. Сделано это на случай, если нужно будет переподключить светодиоды на другие пины, если я опять чего‑нибудь там сожгу.

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

Код передачи команд со стороны ПК (C#, .NET 6)
public async Task SendCommand(TVMechanicCommand command)
{
    int comIndex = COMPort;
    var s = new SerialPort("COM" + comIndex); //Берём нужный компот
    await Task.Run(() => //Всё асинхроним, чтобы интерфейс точно не затупил
    {
        try
        {
            lock (getComPortLocker(comIndex))//Чтобы не вести перекрёстный огонь по одному компоту
            {
                s.Open(); //Открываем
                try
                {
                    var bytes = new byte[]
                    {
                        (byte)IR_Pin1,
                        (byte)IR_Pin2,
                        (byte)command
                    };
                    s.Write(bytes, 0, bytes.Length); //Заливаем
                }
                finally
                {
                    s.Close(); //Закрываем
                }
            }

            //Запоминаем последнее положение
            //Не все положения телевизоров надо запоминать
            if (command
            is TVMechanicCommand.Wide
            or TVMechanicCommand.Narrow
            or TVMechanicCommand.Park
            or TVMechanicCommand.Full)
                TeoreticalCurrentState = command;

            //Запускаем эвент если надо
            var e = AfterSendCommand;
            e?.Invoke(this, command);
        }
        //В релизе стойко переносим тяготы и эксепшены
#if !DEBUG
        catch(Exception er)
        {
            LogWriter.LogErrorAsync("Кронштейны спят, не будите, уходите", er);           
        }
#endif
        //Чтобы компилятор не ныл в дебаге про одинокий try
        finally
        {

        }
    });
}

Код приёма и обработки команд со стороны Arduino (не для перфекционистов)
const int button_right = 1;
const int button_1_and_ok = 2;
const int button_ok = 3;
const int button_2_and_ok = 4;
const int button_left = 5;

int IR_PIN = 12;
int CONTROL_PIN = 13;

//Установить уровень и подождать сколько-то
void SET(int value, int ms, int mcs)
{
	digitalWrite(IR_PIN, value);
	digitalWrite(CONTROL_PIN, value);

	if (ms > 0)
	  delay(ms);
	  
	if (mcs > 0)
	  delayMicroseconds(mcs);
}

//Разные вариации вкл-выкл с интервалами и без
void ON(int ms, int mcs){SET(1, ms, mcs);}
void OFF(int ms, int mcs){SET(0, ms, mcs);}
void ON(int ms) { ON(ms, 0); }
void OFF(int ms) { OFF(ms, 0); }
void ON() { SET(1, 0, 0); }
void OFF() { SET(0, 0, 0);}

//Команды управления
void bracketButtonLeft()
{
  int small = 6, big = 36;
   for (int i = 0; i < 2; i++)
   {
    ON(big); 
    OFF(small);
    ON(small); 
    OFF(small);
    ON(small);
    if (i == 0) 
      OFF(big);
    else
      OFF();
   }
}

void bracketButtonOk()
{ 
    ON(25, 00); 
    OFF(5, 00);
    ON(5, 000); 
    OFF(5, 00);
    ON(5, 000);
    OFF(5, 00);                                             
}

void bracketButtonRight()
{ 
  int big = 41, small = 5, pause = 30;
  ON(big);
  OFF(small);
  ON(small);
  
  OFF(pause);

  ON(big);
  OFF(small);
  ON(small);
  OFF();
}

void bracketButton2andOk()
{ 
  
  ON(21);
  OFF(11); //11?
  ON(5);
  OFF(10);
  ON(5);
  
  OFF(36);

  ON(21);
  OFF(11); //11?
  ON(5);
  OFF(10);
  ON(5);
  
  OFF();
}

void bracketButton1andOk()
{ 
  
  ON(21);
  OFF(20); //11?
  ON(16);
  OFF(30);
  ON(20);
  OFF(20);
  ON(16);
  OFF(10);
}


void doCommand(int cmd)
{
	  if (cmd == button_right) bracketButtonRight();
	  if (cmd == button_1_and_ok) bracketButton1andOk();
	  if (cmd == button_ok) bracketButtonOk();
	  if (cmd == button_2_and_ok) bracketButton2andOk();
	  if (cmd == button_left) bracketButtonLeft();
}

void loop()
{
    //В цикле подключаемся
	 Serial.begin(9600);
    
	 while (Serial.available() < 3) //Ждём пока накопится 3 байта
	  delay(1);
	 
	 
	  int pin_1 = Serial.read(); //Кушаем 1 байт - номер 1 пина
	  int pin_2 = Serial.read(); //Кушаем 2 байт - номер 2 пина
	  int command = Serial.read(); //Что в эти пины нужно послать
	  
      if (pin_1 > 0)
	  {
		IR_PIN = pin_1; //Да, это бест практикс, ес
		doCommand(command);
	  }
  
	  if (pin_2 > 0)
	  {
		IR_PIN = pin_2;
		doCommand(command);
	  }
	 
	 Serial.end(); //Отключаемся, потому что что ещё нужно
 }

У привода есть команды «двигайся назад», «двигайся вперёд», «стоп», а также «прими положение 1» и «прими положение 2» — два запоминаемых положения, которые я с помощью пультов настроил на примерно 30° и 60°. Если приводу дать команду двигаться куда‑то, и не останавливать его, то он дойдет до крайнего положения и остановится сам. Из всего этого можно получить 4 положения: полная парковка вдоль стены, 30°, 60° и 90°.

Если надо установить какое‑то промежуточное состояние, то просто говорим «открывай себя полностью», и в нужный момент останавливаем привод. И да, обратной связи тут нет — солнечное окошко не знает, в каком положении кронштейны, но помнит, в какое положение последний раз они были поставлены, благодаря чему, при необходимости, может восстановить телевизоры в исходное положение. Вначале я хотел поставить ультразвуковые дальномеры, чтобы комп мог получать обратную связь и понимать, где сейчас телевизоры, но практика показала, что отсутствие обратной связи почти не создаёт проблем, поэтому оно до сих пор машет экранами вслепую.

Солнечное окошко лежит в автозагрузке. При запуске оно автоматически отдаёт команду «стоп» на оба канала (на случай, если они сейчас двигаются), после чего следует команда «поставить на 30°». При закрытии отдаётся команда парковки. Когда комп выключается, Windows командует всем программам закрыться, в том числе и солнечному окошку, а оно, выключаясь, командует запарковать телевизоры.

Да, без резисторов
Да, без резисторов

У данных телевизоров заставка «чёрный экран» — это отключение экранов, а отключение экранов — это заставка. Потому что при отсутствии сигнала они начинают показывать всякие картины, в то время как от «чёрного экрана» OLEDы перестают светиться полностью.

При отсутствии сигнала телевизоры показывают картины
При отсутствии сигнала телевизоры показывают картины

Поэтому отключение экранов отключаем, заставку ставим. Солнечное окошко следит за этим делом, и, видя запущенную заставку, паркует экраны, а когда заставка внезапно исчезает — ставит экраны обратно.

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


Соединяем телевизоры с видеокартой

Теперь надо заставить работать сами экраны. Наша цель — единый ультрасосисочный панорамный экран, показывающий картинку с вот такими ТТХ:

Топовая видеокарта здесь ощущается как средняя. Если на обычном мониторе (который 1280×1024 @ 60 Гц) видеокарте надо считать 80 МПикс/сек, на FullHD — 125 МПикс/сек, то здесь ей придётся обрабатывать 3 миллиарда пикселей в секунду. И да, современные игровые видеокарты больше нельзя объединять по 2–3 штуки.

Идём дальше. Чтобы вой рендерящего системного блока с армией вентиляторов был абсолютно неслышим, он обитает в отдельном помещении. Поэтому, провода нам понадобятся длинные. Тут в дело вступают законы физики, которые я не буду тут расписывать, скажу просто: чем больше данных нам надо передать через провод, тем хуже у него с помехоустойчивостью и длиной. Быстрые данные боятся помех и длинных кабелей. А тут три картинки по 30 ГБит/с.

Итак, нам нужны три проводка HDMI самой суровой на сегодняшний день версии 2.1 и длиной 10 метров.

Заходим в магазины и видим, что предел наших мечтаний — 1 метр. Физика. Бывает и 3 метра сомнительного качества. А надо нам 10 метров. Что делать? Выручить нас может такое чудо, как оптический HDMI‑кабель, в котором сигнал временно превращается из электрического в свет. Такие кабели бывают даже стометровыми.

Питаются эти модуляторы от самого HDMI
Питаются эти модуляторы от самого HDMI

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

Обратную сторону покусали коты, поэтому только анфас
Обратную сторону покусали коты, поэтому только анфас
Оптические HDMI утончённые и нежные, и очень не любят перегибов, буквально
Оптические HDMI утончённые и нежные, и очень не любят перегибов, буквально

К телевизорам кабели подключаем без проблем — разъёмов здесь HDMI 2.1 много. А вот у компьютера, точнее, видеокарты, нас ожидает сюрприз — у неё только один нужный HDMI 2.1 (48 ГБит/с), всё остальное — это три DisplayPort 1.4 со скоростью 26 Гбит/с (из физических 32 только 26 Гбит/с используется под данные). А нам надо 30 Гбит/с. Дело плохо.

Три DisplayPortа, которые не подходят, и один HDMI, который подходит
Три DisplayPortа, которые не подходят, и один HDMI, который подходит

На помощь приходит такая штука, как Display Stream Compression (DSC) — сжатие сигнала, похожее на цветовую субдискретизацию YCbCr, но более умное, и визуально картинку оно не портит, даже шрифты, по официальным заявлениям.

Что ещё за Display Stream Compression и YCbCr

Между прочим, у DSC странные взаимоотношения с жёлто‑оранжевыми мелкими штуками на чёрно‑серых фонах. В том числе, в буквах — именно такие цвета у меня установлены в IDE.

Правый телевизор реагирует суровее всего — оранжевые и жёлтые буквы на тёмно‑сером фоне на нём выглядят тусклее, чем на центральном и правом, если установлен масштаб 100%. Все остальные цвета, при этом, нормальные. На двух других телевизорах таких заметных проблем нет. А вот фишка с этим жёлтым квадратиком срабатывает на всех трёх.
Правый телевизор реагирует суровее всего — оранжевые и жёлтые буквы на тёмно‑сером фоне на нём выглядят тусклее, чем на центральном и правом, если установлен масштаб 100%. Все остальные цвета, при этом, нормальные. На двух других телевизорах таких заметных проблем нет. А вот фишка с этим жёлтым квадратиком срабатывает на всех трёх.

DSC работает с группами по 3–6 пикселей — считывание кадра не требуется, а потому задержки нет. Первым делом, оно переводит цвет из RGB красный+зелёный+синий» в «яркость+цветоразностные».

Классический пример такого пространства — цветовая модель YCbCr — это яркость Y, разница яркость‑синий Cb и разница яркость‑красный Cr. Поскольку глаз различает детали по цвету хуже, чем по яркости, разрешение цветоразностных можно порезать, уменьшив число данных — и человек этого почти не заметит. Это и называется цветовой субдискретизацией.

Вот эти цифры в конце у всяких YCbCr 4:2:0 как раз и обозначают степень порезанности разрешения (не разрядности!) цветоразностных, в данном случае — в 4 раза. Если взять картинку YCbCr 4:2:0 с разрешением 1920×1080, то у неё только яркость будет 1920×1080, цвет же будет иметь разрешение 960×540.

Помимо YCbCr, есть более специфичная штука YCoCg. Здесь у нас яркость Y, разница яркость‑оранжевый Co и разница яркость‑зелёный Cg. Принцип похожий, просто YCoCg генерирует менее заметные артефакты. И вот у этого YCoCg есть разновидность с порезанной разрядностью — YCoCg‑R. Именно она применяется в DSC.

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

Всё это как бы не должно создавать заметных артефактов, и почти всегда это так, но вот жёлто‑серые переходы DSC не осиливает.

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

DisplayPort 1.4 превращается в HDMI 2.1
DisplayPort 1.4 превращается в HDMI 2.1

Хорошо, DisplayPort 1.4, всё же, справится с нашей картинкой. Но телевизоры и кабели у нас HDMI. Нужны переходники, и не простые, а способные переварить нашу картинку. Единственный, который я нашёл — это Club3D CAC-1085. Два таких я заказал в известном немецком магазине. Ждём доставки, собираем, запускаем.

Если сделать так, оно может заработать, но без HDR
Если сделать так, оно может заработать, но без HDR
Особенности объединения телевизоров в виртуальный экран

В игровых картах Nvidia объединение делается через функцию Surround, в профессиональных — через Mosaic. Первая может ставить до 5 экранов и только в ряд, вторая, более профессиональная, может 2×2, 3×4 и ещё кучу всего, и вообще очень гибкая. У AMD эта штука называется EyeFinity. Ещё есть софт SoftTH, который программно объединяет экраны без привязки к железу, а также разные железные коробочки вроде TripleHead2Go. В моём случае лучше всего подойдёт Nvidia Surround.

Заходим в «Панель управления Nvidia» в блок «Настройка Surround, PhysX», жмём «Настройка...».

У AMD это всё тоже есть
У AMD это всё тоже есть

При объединении экранов, крайне желательно, чтобы они были одинаковыми. Если какая‑то функция/фишка (будь то GSync, HDR или 120 Гц) отсутствует хотя бы у одного экрана, то единый виртуальный экран её не унаследует.

Драйвер Nvidia упорно хочет думать, что 4096×2160 для этих телевизоров - родное разрешение
Драйвер Nvidia упорно хочет думать, что 4096×2160 для этих телевизоров - родное разрешение

Отмечаем все наши телевизоры в списке, располагаем их в правильном порядке, жмём «Включить Surround». Экраны гаснут, и вся комната погружается во тьму. Все три монитора «LG TV SSCR2» исчезают из системы, а заместо них появляется новый монитор «NV Surround», после чего картинка возвращается.

После этого, если надо, добавляем/удаляем разрешения экрана, а нам надо, потому что драйвер упорно хочет думать, что у телевизоров родное разрешение 4096×2160, а не 3840×2160, из‑за чего картинка сплющивается по горизонтали, шрифты убиваются.

Скрин в натуральную величину 11520х2160
Скрин в натуральную величину 11520х2160

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

Благодаря этому, развёртывание обычных оконных приложений на весь экран по‑прежнему происходит только на одном мониторе (хотя Photoshop всё равно разворачивается в сосиску, ему так нравится), то, что это единый экран ощущается только в играх и багах когда панель задач опять улетела на потолок, а меню пуск открывается в трёх метрах (буквально) от неё >:(

Игра, запущенная полноэкранно, заполняет собой весь виртуальный экран. Дальше уже зависит от игры, насколько она будет адекватно со всем этим работать. Большинство моих любимых высокоинтеллектуальных игр, вроде DOOM и Serious Sam, работают с этим нормально, хотя HUD почти всегда разбегается по углам.

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

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

Чтобы стыки между экранами были как‑бы не вставлены в картинку, разделяя и раздвигая её, а перед картинкой, создаётся дополнительное виртуальное разрешение, чуть шире, которое используется только в играх (хотя рабочему столу тоже можно его поставить, но смысла особого нет). И да, те области, которые «за» рамками, мы не видим, но комп тратит на них вычислительные ресурсы, честно их обсчитывая, но это очень мало в процентах. Функция называется «Коррекция рамки», или «Bezel correction».

Теперь надо обеспечить вменяемую цветопередачу, разрешение, разрядность, частоту кадров и диапазон вывода. Для проверки режима RGB/YCbCr можно использовать замечательный тест, придуманный Dmitry_Dor.

4:4:4 видно, а 4:2:2 почти нет? Всё хорошо.
4:4:4 видно, а 4:2:2 почти нет? Всё хорошо.

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

Добро пожаловать в квест
Добро пожаловать в квест

После объединения экранов, всё работает, кроме HDR. Потому что экраны разные, по мнению драйвера. У нас недостаточно одинаковости, всё должно быть одинаковым, одинаковые экраны одинаково подключенные одинаковыми кабелями через одинаковые переходники в одинаковые разъёмы, иначе мы работать не будем. Мы же игровая видеокарта, а не профессиональная. Спасибо Yolenzo с форума thg.ru, который помог мне разобраться в этом вопросе.

Ну ок, берём третий переходник. Ждём. Привезли. Ура, HDR заработал. Из видеокарты теперь торчит целый початок переходников. И греются они не слабо. «Во избежание перегрева, явно лучше держать их подальше от горячего выхлопа видеокарты», подумали разработчики и сделали переходникам максимально короткий проводок подключения. Думал приколхозить туда вентилятор 120мм, но оказалось, что достаточно не давать им прижиматься друг к другу.

Было много веселья с тем, что после объединения оно упорно не хотело видеть то 120 Гц, то HDR, то 10 бит, то ещё что‑нибудь. Стабильно всё заводилось только на драйвере версии 497.09. Чуть обновился — всё, вот тебе 60 Гц, YCbCr и SDR. Я долго‑долго с этим воевал, пока, наконец, не обратился в техподдержку переходника, которая молниеносно ответила мне новой прошивкой, заливаемой в переходник через то самое USB‑питание.

Работает
Работает

После этого, при подключении экранов без Surround иногда случались всякие баги (например, «данный экран не поддерживает 120 Гц, в отличие вот того, который точно такой же, и работает точно также, и тоже поддерживает 120 Гц»), но после объединения и они исчезли. Единственное, чего не хватает — G‑Sync — данная функция не поддерживается переходником.

Эта штука спасает контрастность OLEDов
Эта штука спасает контрастность OLEDов

Когда возня с железом была закончена, откалибровал отображение HDR операционной системой. По умолчанию, в режиме HDR Windows выдаёт пересвеченный ужас на гамме 2.2 — засвечивает все тёмные оттенки, лишая OLEDы всей своей прелести. Качаем бесплатный Windows HDR Calibration app и настраиваем гамму как положено.

Тащим окно, удерживая Shift - и оно примагнитится. Если зоны перекрывают друг друга, то выбирается та, чей центр ближе к курсору в данный момент
Тащим окно, удерживая Shift - и оно примагнитится. Если зоны перекрывают друг друга, то выбирается та, чей центр ближе к курсору в данный момент

Для дополнительного удобства поставил Microsoft FancyZones — тул, который позволяет разбить рабочее пространство на области и раскидывать по ним окна. Области могут перекрывать друг друга: можно сделать сразу несколько вариантов деления экрана, что, собственно, я и сделал — областей получилось аж 51 штука. Каждый телевизор делится две, четыре и шесть частей. В последнем случае каждая область имеет размер 1280×1080 пикселей, и всего таких областей 18 штук. В случае с четвертинками получаем классические 12 экранов FullHD.

Три мышки на рабочем столе

В качестве вишенки на торте установил MouseMux — и комп стал трёхместным. Буквально, можно сидеть вдвоем/втроём за одной машиной. Получается такой себе мини‑офис, только с единым рабочим пространством — очень хорошо подходит для задач, требующих кооперации. То есть, это не просто какие‑нибудь там реальные/виртуальные машины с отдельными экранами, это именно один рабочий стол на три пользователя. Если тупой C++ опять не линкуется, можно буквально протянуть окно соседу и попросить помочь.

- Никто не видел моё окно? Передайте пожалуйста
- Никто не видел моё окно? Передайте пожалуйста

Всё просто: сколько мышек — столько курсоров на рабочем столе. Курсоры работают одновременно и независимо, и довольно хорошо. Можно напасть сразу двумя курсорами на одно окно, схватить двумя мышками за бока и потянуть в разные стороны — это его раскукожит, хотя оно будет испуганно вырываться. Жизнь WndProc к такому не готовила.

Можно превращать мышки в «пальцы» или «стилусы», делать призрак курсора, дублирующего действия на расстоянии, и прочие довольно интересные штуки
Можно превращать мышки в «пальцы» или «стилусы», делать призрак курсора, дублирующего действия на расстоянии, и прочие довольно интересные штуки

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

Поскольку это единый комп, следует осторожно обращаться с вычислительными ресурсами. Квот тут нет — это не докеры и не виртуальные машины, это рабочий стол. Если кто‑то «случайно» запустит компиляцию Eigen из 1200 проектов в солюшене, или какой‑нибудь страшный рендеринг, то соседи могут незамедлительно прописать незадачливому товарищу в диспетчер задач. Но диспетчер задач один на всех, и его еще надо успеть утащить:)


Собственно, на этом всё: теперь у нас большой самошевелящийся 24-мегапиксельный рабочий стол c отличными цветами и очень узкими стыками. И он работает.


Заключение

Покрутить 3D модели получившихся кронштейнов в браузере можно тут. Они исправно функционируют уже больше года, и нареканий никаких нет. К surroundу привыкаешь не быстро, а очень быстро. Уровень погружения, за счёт панорамного вида, чёткости и качества картинки, запредельный, особенно если открыть экраны на 90°.

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

Tags:
Hubs:
Total votes 285: ↑282 and ↓3+328
Comments97

Articles