Например TDA7294

РадиоКот > Схемы > Цифровые устройства > Игрушки

Шлем виртуальной реальности. Теория и прототип

Автор: Serj_K
Опубликовано 13.09.2016.
Создано при помощи КотоРед.

        Давным давно, когда на ПК из операционных систем были только несколько вариантов ДОС, аббревиатура 3D только-только появилась, начали выходить первые компьютерные игры с поддержкой вывода стереоскопических изображений. Для их использования в таком режиме появились и первые шлемы ВР. Наиболее известный – VFX-1. Как-то я зашёл в ближайший игровой клуб и попросил ребят показать мне его в работе. Впечатления от увиденного были отрицательные. Изображение визуально воспринималось маленьким на большом чёрном фоне, как телевизор в темноте, разрешение экранов маленькое, была видна крупнозернистая сетка из пикселей. Ужас. И стоило такое «удовольствие» по тем временам не малых денег. Единственные два достоинства – достаточно малый вес и гироскоп для отслеживания перемещения головы. Но никакой виртуальной реальности данное изделие не предоставляло. В те времена я подрабатывал, переделывая советские ч/б мониторы стандарта CGA (помните такой?) на VGA. Помимо отсутствия цвета они давали очень чёткое и мягкое изображение, так как у них отсутствовала RGB маска. И вот у меня возникла мысль – изготовить свой шлем ВР с использованием маленьких ч/б кинескопов. Задумал – сделал. Шлем был достаточно крупный и достаточно тяжёлый, но давал отличное изображение, которое занимало всё видимое поле зрения. Хоть оно и было в разрешении всего 640х480, но за счёт инерционности люминофора картинка немного сглаживалась и была очень приятная. Проверку работоспособности шлем проходил в игре Descent. Если не крутить головой, то эффект присутствия был очень хороший. Этот шлем прожил не долго – однажды он упал со стола и разбился, но опыт по изготовлению такого устройства был получен и не пропит. Также я на собственном опыте увидел отличия в восприятии нескольких методов формирования стереоскопических изображений и выбрал наиболее оптимальный на тот момент.

        Сейчас появилась возможность применять современные дисплеи с достаточно большим разрешением, которые можно приобрести как в розницу, так и разобрав какой-нибудь современный смартфон. В свете возобновления общего интереса к виртуальной реальности я опять решил изготовить себе новый шлем. Как минимум, для оценки требуемых минимальных параметров устройства, которые удовлетворят меня. Разные люди имеют свои критерии для оценки качества восприятия визуальной  информации. Кому-то более чем достаточно Full HD, кому-то нет. Кроме того, в контексте данной статьи под виртуальной реальностью будем подразумевать применение шлема для компьютерных игр. Для этого нужен эффект погружения, а не просто объёмное изображение. Это требует растяжки наблюдаемого изображения на всё поле зрения.

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

        Кстати, сделал поиск по «Радиокоту» на предмет шлемов ВР – нашёл всего несколько сообщений на форуме с началом обсуждения теоретических вопросов но без какой-либо практической реализации. Ну что же, буду первым.

        Начну с теории, так как  это важно для понимания того, что от чего зависит.

Выбор метода формирования 3D изображения

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

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

 2) Одновременная передача двух изображений в одном кадре. Изображения располагаются рядом друг с другом по горизонтали (SideBySide (SBS))  или чередуются чересстрочной коммутацией каналов (Interlace). Воспринимаемая зрителем картина при этом визуально имеет меньшее разрешение по горизонтали или вертикали. Первый способ сейчас применяется в  различных вариациях шлема ВР Oculus Rift, включая Google Cardboard. Для второго способа используются пассивные очки с поляризационными стёклами. При таких способах эффект мерцания изображения отсутствует в принципе.

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

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

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

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

        Итак, для примера выберем одно из стандартных разрешений экрана, например 1920х1080 при частоте развёртки 60Гц – Full HD формат. При таких параметрах развёртки видеосигнала с учётом длительности синхроимпульсов и полей гашения по кадрам и строкам, точки на экран выводятся с частотой 74.25МГц (взято из стандарта СЕА).

        При использовании первого метода – вывода каналов через кадр с удвоенной частотой кадров – частота вывода точек будет 148.5МГц. Для изготовления электроники в любительских условиях такая частота потребует применения соответствующих электронных  компонентов и соответствующего качества исполнения печатной платы. На мой взгляд это не реально для единичного экземпляра. Поэтому в таком виде данный метод не применим. Кроме того, для формирования 3D картинки с большим разрешением и большой кадровой частотой требуется соответствующий уровень производительности компьютера, а это не самый дешёвый компонент системы. Многие не готовы выложить кругленькую сумму на обновление своего ПК ради очень виртуальной реальности, я в их числе. Но использовать сам метод возможно – использовать не удвоенную частоту кадров, а просто немного большую, например 75Гц. Это сработает, так как каждый независимый экран на время вывода другого канала будет сохранять свою картинку. Мерцания не будет в принципе, но на изображении могут возникнуть тянучки за подвижными элементами, так как на каждом экране частота обновления будет в два раза меньше.

        Анаглифический метод при использовании двух независимых экранов не имеет смысла.

        При использовании методов SBS и Interlace вывод на экран происходит при обычных параметрах развёртки, поэтому данные методы пригодны для реализации. Рабочая частота примерно до 80МГц вполне приемлема для любительской конструкции. Метод Interlace немного проще реализовать и я его уже использовал в своём первом шлеме. Для данной конструкции я остановился именно на этом методе. Но одной из причин выбора этого метода было отсутствие подходящего кварца для реализации метода SBS, а для Interlace кварц нашёл. Во многих источниках пишут, что наблюдаемое вертикальное разрешение изображения при методе Interlace уменьшается в два раза. На самом деле это не совсем так. По крайней мере не в два раза, так как мозг очень хорошо дополняет и усредняет выпавшую информацию от каждого глаза. При использовании одного экрана и пассивных очков качество картинки может зависеть от качества изготовления самого экрана, очков и размещения наблюдателя относительно экрана. При использовании двух экранов проблем меньше, так как исключаются несколько влияющих факторов.

Выбор экранов

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

        Когда мы смотрим в даль, угол между осями зрения каждого глаза стремится к 0. По мере приближения наблюдаемого объекта этот угол увеличивается. Если принять межзрачковое расстояние 65мм, то на расстоянии до объекта 50см угол будет 7.5 градусов. При этом, чем ближе объект, тем меньше межзрачковое расстояние. Это нужно учитывать, так как в шлеме за счёт применения линз визуально экраны могут быть и на меньшем расстоянии. При этом центры изображений каждого экрана будут на меньшем  расстоянии, чем межзрачковое расстояние и его нужно будет подобрать. Как это просто сделать расскажу ниже. От правильности установки этого расстояния будет зависеть утомляемость зрения и возможность увидеть одно цельное изображение в принципе.

        Теперь рассмотрим возможные варианты пространственного расположения экранов с разными размерами относительно глаз (с учётом наличия соответствующих линз). При этом считаем, что видимый размер изображения во всех случаях получается одинаковый и ограничен углом зрения системы глаз-линза. На рисунке приведены три возможных варианта: 1) маленькие экраны , 2) средние экраны, 3) большие экраны.

        Как видно, при использовании экранов с размерами меньше средних между ними есть зазор. Это даёт достаточно широкий выбор возможных моделей экранов, так как они точно конструктивно не налезут друг на друга в корпусе шлема. Кроме того, габариты и масса шлема будут минимальными. При использовании экранов среднего размера зазор между ними отсутствует. Это предельный случай, при котором нужно очень точно подбирать размеры всех конструктивных элементов. При использовании больших экранов их не возможно разместить в одной плоскости без потери части изображений по бокам в месте их перекрытия. А это дополнительная потеря видео информации. Но данная потеря будет в периферической области зрения и реально она практически не заметна. Это я утверждаю по собственному опыту. Считаю, что процентов 10-15 по ширине каждого изображения можно потерять практически без заметного эффекта, а для эксперимента можно и больше. Кроме того, если сознательно пойти на такую потерю на маленьких и средних экранах, то можно будет использовать заведомо бОльшее разрешение изображения, что увеличит размер картинки для каждого экрана по вертикали и суммарно по горизонтали. Я выбрал этот вариант.

        Теперь нужно определится с разрешением экранов и, соответственно, с разрешением выводимого изображения. Так как я решил применить режим Interlace, то на каждый экран будет выводиться в два раза меньше строк. Но при выводе полной длины строки есть одна проблема – искажение геометрии по вертикали. Если просто выводить только нужные строки полностью, то картинка сожмётся по вертикали в два раза. Чтобы этого избежать, придётся проредить строки по горизонтали через одну точку. При этом, для частичной компенсации выпавшей информации, в левом и правом канале будут выводиться точки разных столбцов. Например, в правом канале нечётные, а в левом чётные. То есть нужно подбирать экраны с разрешением по узкой стороне в два раза меньше предполагаемого разрешения изображения или чуть меньше (с учётом потери части изображения сбоку). Но при таком способе вывода будут выпадать мелкие детали изображения и выводимая текстовая информация может стать не читаемой. В таком случае может оказаться предпочтительным переход на вариант использования метода SBS, который, кроме прочего, требует меньшей тактовой частоты, чем Interlace из за меньшего разрешения по вертикали. Данный метод я так же планирую опробовать в дальнейшем для сравнения.

        Какие же стандартные разрешения экранов доступны? Если планируется вывод изображений с разрешением около 1000 строк, то нужен экран с числом точек по узкой стороне около 500. Реально из стандартных достаточно доступных экранов есть экраны с разрешением 480 точек. При этом по длинной стороне они имеют 800 точек. Меньшее разрешение по узкой стороне будет уже 320 точек, что слишком мало. Экраны с бОльшим разрешением имеют бОльшие габариты и цену, что мне для эксперимента не подходит. То есть, на экран с разрешением 480х800 можно вывести изображение с разрешением 960х960 точек без потери части картинки или 1024х1024 с потерей 6% по ширине или 1080х1080 с потерей 12.5% по ширине. Я выбрал разрешение 1024х1024, как менее требовательное, и занялся поиском конкретного экрана. Так как визуальный результат мог быть не таким хорошим, как я рассчитывал, то одним из основных критериев выбора экрана была цена. Так же я выбирал экраны с минимальными размерами из возможных. На Алиэкспрессе подходящего ничего не нашёл – или цена большая или размер. Продолжил поиски на местных интернет аукционах и частных объявлениях в разделе б/у телефонов/смартфонов. Выбор пал на Samsung SCH-U960. Экран у него типа AMOLED, 3.1”,  разрешение 480х800, плотность точек на дюйм 301. Таких телефонов было в наличии три, все  у разных продавцов. Выбрал два подешевле и купил. Абсолютно рабочие телефоны (даже с аккумуляторами) обошлись по цене меньше, чем один неизвестный экран на Али и доставкой в течении нескольких дней. Наличие рабочих телефонов давало шанс снять протокол обмена с экраном.

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

Кратко об экране от SCH-U960.

        Для работы данного экрана ему на входы кроме RGB видео информации должны приходить следующие сигналы: сброс, кадровые и строчные синхроимпульсы отрицательной полярности, сигнал разрешения вывода Е, тактовый сигнал CLK. После сброса сначала производится инициализация экрана по шине SPI и только потом подаются остальные сигналы. После инициализации на время первых 2 кадров сигнал Е запрещает вывод информации на экран, после чего выводятся ещё 8 «холостых» полноценных кадров. Это нужно для включения внутренних преобразователей напряжения самого экрана. После этого может выводится реальная информация.

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

        Осциллограммы основных сигналов  в процессе работы на два экрана следующие:

        Вся управляющая логика реализована в ПЛИС. Для коммутации каналов в пределах двух выводимых строк и одного общего выходного синхроимпульса используются отдельные сигналы Е, которые разрешают вывод видеоинформации в нужные моменты. Для проверки и первичного запуска экрана я изготовил маленькую платку на микроконтроллере с программным формированием всех сигналов. На ней я всё проверил, однако после изготовления данного прототипа, я столкнулся с проблемой правильного вывода цветов в зависимости от формируемых управляющих сигналов. Это выражалось в следующем – или один экран выводил правильные цвета, а другой менял местами красный и синий или другой выводил правильно, а первый вообще терял цвет, выводя ч/б изображение. В результате экспериментов подобрал режим, при котором оба экрана выводили одинаково, но с переставленными красным и синим цветами. Поэтому пришлось порезать дорожки на VGA разъёме и поменять R и B сигналы местами. Это не правильно, но причину такого поведения экранов я пока не выяснил, по осциллографу все сигналы формировались правильно. Возможно в дальнейшем я найду причину, но на данном этапе это не важно.

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

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

Подбор и позиционирование линз

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

        Линзы можно начать подбирать ещё до покупки экранов, что также позволит выбрать наиболее подходящий экран из предполагаемых. Это делается очень просто. Зная размер рабочей области экрана и желаемое разрешение, рисуем на бумаге квадрат с размерами, соответствующими выбранному разрешению и с крестом в центре. В моём случае это квадрат с размерами 43х43мм (для разрешения 1024х1024). Если есть выбор экранов с разными размерами, то рисуете несколько квадратов. Теперь с этой бумажкой идёте в место, где есть выбор линз. Глядя на крест в центре квадрата через линзу и изменяя расстояние от линзы до квадрата настраиваетесь на лучший фокус и выбираете вариант, при котором ваше периферическое зрение совсем немного  захватывает грани квадрата. При этом расстояние от глаза до линзы желательно держать минимальным, так как на большем расстоянии линза может не перекрыть весь угол зрения и будет ограничивать видимое изображение. Определились с выбором линз и размерами экрана – приобретаете.

        Можно купить линзы на Алиэкспрессе, но тогда их проверка будет по факту получения. Выбирать лучше линзы с бОльшим диаметром, например 37мм. Пара таких линз стоит 1$, их и продают как для Google Cardboard, то есть для шлемов ВР. Для начала сойдёт. Но если есть линзы большего диаметра, то они предпочтительнее. По крайней мере диаметром менее 37мм брать не стоит. При этом лучше иметь линзы плоско-выпуклые, чем двояковыпуклые, так как они дают меньшие искажения геометрии по краям. Я покупал себе линзы на Али. Мне пришли двояковыпуклые линзы с фокусным расстоянием 50мм (если считать от боковой кромки).  Эти линзы довольно не плохо подошли для моих экранов. Но к сожалению они оказались не асферическими и дают достаточно большие искажения геометрии по краям.

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

        Когда определились с экранами и линзами - переходим к первому этапу проработки механической составляющей конструкции. Для этого нужно знать несколько важных параметров: расстояние между линзами, расстояние от линз до экранов и расстояние между центрами изображений. Именно изображений, так как на экраны будет выведено не полное изображение (если уже забыли почему - см. выше). Для определения правильного расстояния между центрами изображений понадобятся два бумажных квадрата с крестиками посередине, а также некая коробка для крепления линз с вырезом для носа. Между центрами линз расстояние должно быть немного меньше межзрачкового. Под линзы помещаются оба квадрата с крестиками. Теперь, глядя через линзы на крестики начинаем  двигать один из них. При этом легко ловится момент совпадения двух изображений и формирование одной цельной картинки. Это и будет оптимальное расстояние между центрами изображений. Причём, это расстояние будет зависеть от расстояния между линзами. Например, для моего межзрачкового расстояния около 65мм при расстоянии между центрами линз 67мм расстояние между центрами изображений получилось 59мм, а при 59мм – 50мм. Это видно на следующих фотках (вот такая у меня была конструкция).

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

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

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

Подбор параметров развёртки экрана

        Все мониторы, телевизоры и проекторы должны соответствовать стандарту VESA, который описывает их основные параметры и формат их описания, которое хранится в памяти EDID монитора. Так как изготавливается не стандартное изделие, то можно в принципе отойти от стандартных параметров, но лучше по возможности их соблюдать. В частности, нужно придерживаться стандартных значений кадровой частоты и разрешения по горизонтали. Чтобы начать выбор параметров развёртки, нужно выбрать кварцевый резонатор с подходящей частотой и все расчёты проводить отталкиваясь от неё. Как было указанно выше, эта частота должна быть примерно до 80МГц, но чем меньше, тем проще. Согласитесь, 60МГц и 80МГц - это большая разница. Оперировать нужно следующими параметрами: разрешение рабочей части экрана (1024х1024) – фиксированная величина - мой выбор, переднее и заднее поля гашения для кадра и строки, длительности синхроимпульсов. Для получения минимальной тактовой частоты выбирается минимальная стандартная частота кадров – 60Гц. Для упрощения подбора я создал простой Excel файл, в котором изменяя параметры строки и кадра получил нужные значения параметров развёртки. Файл вложен в архив. Для понимания, что это за параметры, читайте документацию по VESA и EDID, находящуюся в архиве. Теперь из полученных значений нужно сформировать правильное содержимое EDID. Для этого есть несколько доступных программ. Когда я формировал EDID , то пользовался программой Phoenix (тоже есть в архиве). Запускаем, извлекаем EDID информацию об имеющемся мониторе из реестра – чтобы не вводить вручную информацию о цвете. Можете взять в архиве мой вариант dat-файла с EDID конфигурацией под мой кварц. Включается режим редактирования. На вкладке General можно изменить информацию о производителе и серийный номер.

На вкладке Basic Display Parameters нужно выбрать аналоговый видео вход с уровнем сигнала 0.7/0.3 (зависит от входного диапазона применяемых АЦП) и раздельными синхроимпульсами, тип дисплея выбрать цветной RGB и включить использование Preferred timing mode, размеры изображения поставить равными 0 (используется для проекторов).

На вкладке Color/Established Timings нужно снять все отметки напротив стандартных разрешений.

На вкладке Standard Timings тоже снять все отметки для всех ID с 1 по 8 (две группы по 4, выбираются внизу).

На вкладке Detailed Timings в поля для дескриптора блока 1 заносятся параметры развёртки из Excel файла, в блоке Stereo Display оставляется None, схема синхронизации цифровая раздельная с положительными синхроимпульсами.

В дескрипторе второго блока можно выбрать тип данных Monitor Name и заполнить поле с именем монитора.

Для дескрипторов остальных блоков выбирается Unused.

Результат сохраняется в файле (формат dat) для возможной последующей модификации. Я также делал экспорт в формат hex для последующего переноса данных в EEPROM. Хочу отметить, что Phoenix экспорт в hex делает не корректно – программа создаёт не правильные контрольные суммы после нескольких строк. Эту проблему я решал ручным вводом информации в программе Iceprog перед записью в микросхему EEPROM. Потом я нашёл другую программу редактирования EDID – EEditZ, которая могла делать корректный экспорт в bin формат. Она также находится в архиве. Её интерфейс очень похож на интерфейс Phoenix, поэтому здесь его не описываю и она принимает dat-файлы от Phoenix.

Практическая реализация

        Для простоты реализации прототипа шлема я использовал подключение по аналоговому интерфейсу. Поэтому на входе нужно поставить три АЦП. Я использовал AD9203 так как они у меня были. Работают они на сильно повышенной частоте, но для проверки это сойдёт. Вообще-то АЦП от AD нормально работают на повышенных частотах, в этом я убеждался не раз. Для начальной инициализации экранов и включения/выключения шлема используется микроконтроллер STM8L151K6 в удобном LQFP-32 корпусе. Пытался использовать его и для эмуляции работы EEPROM памяти с интерфейсом I2C для хранения содержимого EDID, но компьютер считывал данные не корректно, хотя при чтении программатором информация считывалась правильно. Не стал на этом этапе искать причину и задействовал для EDID отдельную микросхему 24С02. Прошивку в контроллер можно записать или через интерфейс SWIM или с помощью встроенного загрузчика через UART при помощи программы ST Flash Loader Demonstrator (FLD). Для обновления прошивки через UART служит кнопка SB3. Её удержание при включении обеспечивает принудительный переход во встроенный загрузчик контроллера. До соединения контроллера с FLD данный переход происходит циклически, что позволяет легко подключиться к контроллеру, а также такой способ не требует активации загрузчика, который отключится после первой записи прошивки. В данной конструкции контроллер выполняет всего две функции – обработка нажатия одной кнопки для включения/выключения и инициализация экранов через SPI интерфейс. Поэтому он может быть легко заменён на любой другой контроллер с небольшой правкой исходников прошивки. Логические уровни сигналов на шине применённых мной экранов имеют величину 1.8В, поэтому для сдвига уровней я применил буферы SN74LVC8T245. Для формирования всех управляющих сигналов для экранов нужно применять ПЛИС. Я выбрал EPM3064ATC44-10 от Altera, так как она у меня была и её ресурсов более чем достаточно для требуемых задач. Она программируется при помощи Byte-Blaster или USB-Blaster в среде Quartus II или при помощи Quartus II Stand-Alone Programmer. Готовые прошивки контроллера и ПЛИС и их исходники имеются в архиве. Тактовый генератор выполнен на микросхеме 74AUP1Z04, которая специально предназначена для создания кварцевых генераторов. Кварц имеет частоту 69.66МГц – такой смог купить и под него рассчитаны параметры развёртки. Чтобы заставить кварц стабильно генерировать на нужной гармонике пришлось параллельно ему поставить резистор. Я решил пожертвовать 24 битной RGB шиной в пользу 16 битной для упрощения и удешевления конструкции, так как в случае удачи её всё равно нужно было бы переделывать. Принципиальная схема приведена на рисунках.

А это содержимое ПЛИС:

Блок Delay_X  формирует разные задержки для начала вывода изображений левого и правого каналов, а так же формирует тактовый сигнал для экранов, привязанный к заднему фронту сигнала Е.  Счётчик DIV_3 и следующий за ним триггер используются только при запуске экранов для формирования правильных сигналов. Счётчик DIV_2 коммутирует каналы. Счётчик DELAY_Y с последующим триггером участвуют в формировании ССИ в начале кадра и во время КСИ.

        Готовая плата с некоторыми доработками первоначальной схемы выглядит так:

        Чтобы проверить правильность сформированной информации EDID без изготовления всего устройства, то есть, как на неё отреагирует видеокарта, достаточно запаять только микросхему EEPROM с двумя подтягивающими резисторами по шине I2C и входной VGA разъём с нагрузочными резисторами по входам RGB. В EEPROM содержимое записывается с помощью любого программатора, поддерживающего данную микросхему. Я использовал IceProg и JDM программатор, выполненный на базе USB-UART преобразователя FTDI FT232R. Если для создания EDID использовался Phoenix, то в IceProg открывается созданный hex файл, при этом IceProg ругнётся на ошибки в контрольных суммах, но начальную часть данных заполнит правильно. Теперь в блокноте открывается dat файл и, глядя на него, в ручном режиме вводим остальные байты содержимого EDID. После ввода всех данных сохраняем файл и записываем его в EEPROM. Если пользоваться EEditZ, то открывается bin файл. Редактировать его не нужно. Плата с запрограммированной ЕЕПРОМ подключается к видеокарте со свободным аналоговым выходом и в Windows в свойствах экранов проводится попытка обнаружения нового монитора. Если всё нормально, то появится монитор с разрешением 1024х1024 в списке доступных разрешений с частотой кадров 60Гц и именем, какое мы ему дали.

Если нет – проверяйте пайку и правильность информации EDID. Так же проверьте наличие напряжения +5В на 9 ножке VGA. Если монитор опознался, то с помощью осциллографа можно проверить наличие синхроимпульсов и видеосигналов. Если сигналы соответствуют заложенным параметрам, можно допаивать остальные компоненты.

        На схеме имеются 4 кнопки. У меня сейчас реально используется одна – SB4 – для включения/выключения. Так как для записи прошивки я пользуюсь отладчиком STLink – кнопка SB3 тоже свободна. SB1 и SB2 были заложены на всякий случай и их можно не запаивать. Так как источник напряжения +5В на выходе VGA разъёма имеет слабую нагрузочную способность, то для питания всей схемы необходим внешний источник питания. Я использовал для этой цели свободный USB порт.

        Итак, плата спаяна, контроллер и ПЛИС запрограммированы – начинаем включать. Для начала без экранов. Подключив VGA и USB кабели, в панели управления мониторами определяем и включаем второй монитор в разрешении 1024х1024 при 60Гц в режиме расширения рабочего стола. Не забываем про разворот изображения на 180 градусов для второго монитора. Теперь после нажатия кнопки SB4 можно проверить наличие всех сигналов на выходе ПЛИС. Синхронизируясь кадровым синхроимпульсом проверяется правильное формирование строчных синхроимпульсов,  сигналов «Е» и «CLK», приходящих на экраны. Также проверяется наличие тактового сигнала АЦП. Если все сигналы есть, снимаем питание с платы (отключаем от USB) и подключаем экраны. Опять подаём питание и включаем. На обоих экранах должно появиться чистое поле с цветом рабочего стола. Если перетащить мышкой любое окно на второй монитор, то на обоих экранах должно появиться это окно. Например перетащим окно Catalist Control Center (у меня Radeon). На приведенной фотографии экраны ещё не вынуты из передних панелей телефонов – так с ними безопаснее работать при первых подключениях и винда была ХР, а не 7.

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

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

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

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

Всё, можно запускать реальные игры в 3D режиме.

        Для вывода стереоскопических изображений в формате Interlace я использовал программу TriDef-3D. Здесь есть нюанс. Разные видеокарты могут сформировать синхроимпульсы для начала кадра в двух возможных вариантах:

Так как в ПЛИС нет анализа этой ситуации (он не нужен), то первая строка реальной видеоинформации может попасть как на левый, так и на правый канал. Поэтому в TriDef-3D просто нужно выбрать подходящий вариант для используемой видеокарты и в дальнейшем использовать его. Стереоскопический эффект в игре включается/выключается комбинацией клавиш “Alt”+”Shift”+”-“, а его глубина “Alt”+”Shift”+”]“ и “Alt”+”Shift”+”[“. Есть ещё несколько настроек, о которых можно прочитать в описании программы.

        Для запуска игр требуется полноэкранный режим. Для его получения на втором мониторе существует два варианта. Первый вариант: второй монитор с расширенным на него рабочим столом – наш шлем - нужно сделать основным. При этом после возврата первого монитора в качестве основного для повседневной работы иконки на рабочем столе могут изменить своё положение. Кроме того, при работе шлема нет возможности контроля выводимой информации, которая может быть не чёткой из за частичного выпадения информации. Второй вариант: второй монитор нужно сделать клоном первого. При этом первый монитор, который обычно имеет бОльшее разрешение, начнёт работать с разрешением шлема, при котором картинка сузится до 1024 точек. Запуск игр производится на первом мониторе но при этом выводимая информация будет продублирована на втором, что упрощает контроль при тестовых включениях. Так же, на шлем информация будет выводиться без переворота. Каким способом пользоваться каждый решает сам.

        После запуска игры в настройках её видео параметров нужно выбрать разрешение 1024х1024. Если формирования стереоскопического режима не будет, то может понадобиться уменьшить разрешение в настройках игры до стандартного 1024х768, хотя при этом само изображение останется 1024х1024. Так у меня было в STALKER. Скорее всего TriDef не работает с нестандартными разрешениями. Кроме того, некоторые игры не могут даже запуститься на нестандартном разрешении в принципе. Так у меня было в Skirym при использовании шлема, как основного монитора. Проблему решил способом клонирования мониторов и выбора разрешения 1024х768 в параметрах игры, хотя при этом вывод был в разрешении 1024х1024. Наверное способ клонирования мониторов более предпочтительный, чем смена активно монитора. При применении метода SBS формат экрана тоже будет не стандартный – с соотношением сторон 2:1. При этом могут возникнуть похожие проблемы. Нужно проверять.

Во время игры возникает интересный эффект – мозг как бы меняет фокусировку при взгляде на удалённые объекты и на близкие, как в реальной жизни, хотя на самом деле картинка находится в одной плоскости.

Выводы.

        Изготовленный прототип поставленную задачу оценки качества изображения выполнил полностью. На мой взгляд данные экраны обеспечивают качество изображения, которое находится немного ниже приемлемого для меня – разрешение всё таки маловато и в данной реализации 16-битный цвет дополнительно ухудшает восприятие. Да, пиксели достаточно крупные и их видно, но при условии разглядывания пикселей, а не целой картины виртуального мира. Если смотреть не на деревья, а на лес, то восприятие подстраивается, картинка немного сглаживается за счёт усреднения информации и воспринимается немного лучше, заметность пикселей уменьшается. Однако, по сравнению с моим первым кинескопным вариантом, информация от двух экранов дополняет друг друга немного хуже. Это связано с отсутствием пропусков между строками и отсутствием дополнительного сглаживания, которое было из за инерционности люминофора кинескопов. Стереоскопический эффект очень хорошо проявляется на близких объектах, где даже текущего качества отрисовки картинки достаточно.

        В ниже расположенной таблице просто приведу в голых цифрах расчётные характеристики 3D изображения, полученного от двух применённых мной экранов с разрешением 480х800. Предположим, что вывод происходит  в режиме SBS, то есть без пропуска точек по горизонтали, соотношение сторон экрана 2:1 (1:1 для изображения каждого канала). При увеличении разрешения выводимого изображения область стереоскопического эффекта будет уменьшаться по горизонтали и будет располагаться в центре наблюдаемого экрана.

Выводимое разрешение

Размер изображения, мм

Эквививалентная диагональ экрана смартфона, “

Область стереоэфекта,%

960х480

41х41

3.6

100

1024х512

43х43

3.8

93

1200х600

51х51

4.5

80

1280х640

55х55

4.8

66

1400х700

60х60

5.28

51

1440х720

61х61

5.3

50

Если последний вариант сравнить с одним HD экраном с разрешением 1280х720, то два отдельных экрана с значительно меньшим разрешением дают увеличение разрешения по горизонтали на 12%, пусть и с потерей стерео эффекта на значительной площади изображения. Хотя в играх внимание сосредоточено именно на центральной части экрана. Остаётся найти баланс между разрешением и размерами стереоскопической области.

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

        На данный момент вижу следующие дальнейшие действия с использованием имеющихся экранов:

- замена 3 АЦП на HDMI декодер, например TFP401, что позволит исключить лишнее преобразование сигналов с потерей качества и позволит иметь свободу в выборе параметров видеорежимов, так как тактовая частота будет получена из декодера. Такой HDMI декодер на Али стоит значительно дешевле одного примененного мной АЦП. Уже заказал парочку таких, едут. Кроме того, такое решение позволит иметь тактовую частоту, которая будет абсолютно синхронна со всеми видеосигналами. Это так же увеличит качество изображения.

- увеличение разрядности цвета до полных 24 бит и разрешения для режима Interlace до 1152х1152 или даже до 1280х1280, что должно обеспечить минимально приемлемое качество картинки. При использовании разрешения 1280х1280 на каждый экран попадёт 640х640 – довольно близко к 720 точкам в экранах формата HD. Увеличение разрешения уменьшит неиспользуемую часть экранов, что позволит отказаться от их переворота.

- попробовать метод SBS для сравнения с Interlace. При этом разрешение экрана может быть легко доведено и до 1440х720, так как тактовая частота при SBS в сравнении с Interlace будет ниже примерно в 1.6 раза. За счёт значительно меньшей тактовой частоты есть возможность увеличить верхнее и нижнее поля гашения, расположив изображение по центру экранов.

- замена 3 согласующих буферов и простенькой ПЛИС на одну более крупную ПЛИС, что сильно упростит печатную плату и главное - сделает более качественное формирование сигналов.

        Для замены ранее купленных линз на качественные асферические для устранения искажений уже приобрёл на Али китайские очки ВР FiitVR. Линзы в них имеют диаметр 39мм, что хоть и не на много, но больше, чем было. Качество линз хорошее, искажения если и есть, то совсем маленькие по краям. По крайне мере из квадрата подушку не делают. Данные линзы оптимальны для размеров изображения в диапазоне примерно от 55х55мм до 63х63мм, то есть из вышеприведенной таблицы можно рассчитывать на применение разрешения до 720 строк.

        В сети имеется реализация HDMI декодера на FPGA Xilinx. Если его дополнить логикой шлема ВР, то можно получить фактически одночиповое решение. Но такой вариант дороже.

        Уже после изготовления данного шлема я обнаружил в продаже на интернет аукционе модели смартфонов с несколько бОльшим разрешением – 540х960. Такие экраны позволят получить бОльшую область стереоэффекта, но пока их покупать не буду, так как есть возможность выжать большее из имеющихся.

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

        Продолжение следует.

        В приложенных архивах исходники всего, что я наваял, программы Phoenix и EEditZ с моим EDID, документация по стандарту VESA и эта статья в формате doc.

        Если возникнут вопросы - добро пожаловать на форум.


Файлы:
Документация по VESA и ПО для EDID
Все исходники проекта


Все вопросы в Форум.


ID: 2377