Например TDA7294

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

Шлем виртуальной реальности. Часть 2. Финал.

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

        Итак, продолжаем погружаться в виртуальную реальность. В первой части была рассмотрена теория и изготовлен прототип шлема ВР, сейчас перейдём к изготовлению окончательного варианта. Кто не читал первую часть – прочитайте, повторять здесь изложенный материал не буду для сокращения объёма.

        В конце первой части я описал планы по проверке стерео режима SBS и сравнения его с чересстрочным вариантом. Скажу сразу – проверил и сравнил. Качество картинки естественно выше, но вылез очень неприятный эффект – изображение в играх сильно сжимается по горизонтали, нарушая естественные пропорции объектов. Это связано с форматом обычного изображения под широкоформатный экран, которое вжимается в половину имеющегося экрана. Мне очень не понравилось. В режиме SBS применённое мной разрешение было 1200х600 (по 600х600 на канал) при частоте всего 50Гц. Данное ограничение было связано с невозможностью одного из экранов нормально работать на тактовой частоте более 41МГц. По этой причине и после ряда экспериментов я принял решение перейти к обычному, моноскопическому варианту, но с бОльшим разрешением. При этом эффект присутствия практически не уменьшается, а качество изображения существенно увеличивается. Так же увеличению качества изображения способствует переход с аналогового сигнала на цифровой – DVI/HDMI при использовании соответствующего декодера.

        В процессе выбора оптимального разрешения возникла следующая проблема – при попытках задать нужные мне параметры для не стандартных разрешений в параметрах режимов VESA или не стандартных параметров для стандартных режимов результатов не было – монитор либо вообще не определялся, либо режим отрабатывался видеокартой не корректно. Анализ информации привёл к наличию в EDID дополнительного блока, в котором может содержаться конфигурация видеорежимов – блок стандарта СЕА. Разрешения HD как раз описываются в нём. После помещения нужных мне параметров режимов в блок СЕА всё стало на свои места. Монитор с такими разрешениями распознаётся и сами режимы работают корректно.

        Ради хороших линз я приобрёл «шлем» Fiit VR. По одному из очень подробных видео обзоров его линзы должны были быть действительно качественные. При первом взгляде так и было. Линзы асферические, искажений геометрии на обычных игровых пейзажах не наблюдалось. Но в дальнейшем, после более детального рассмотрения, были обнаружены небольшие искажения в виде кольца. Они становились видны при попытке прочитать текстовую информацию. Она чёткая, поэтому искажения  становятся заметны. На одном из форумов по VR-тематике один человек сообщил, что имел опыт по устранению искажений линз при помощи дополнительной ручной полировки и описал свою «наколенную» технологию. Я пока к такому не готов, но дешёвые линзы для тренировки у меня есть – два комплекта остались от прототипа. В любом случае, под имеющиеся линзы я подобрал наиболее оптимальный видео режим – 800х640 при частоте кадров 60Гц. В этом режиме нет заметных искажений геометрии за счёт масштабирования, размер изображения получается практически максимальным для применённых линз, но при этом сохраняется возможность видеть углы картинки, в которых обычно выводится вспомогательная информация, например мини-карта локации. При дальнейшем увеличении разрешения по вертикали некоторые игры могут не принять такой режим. Например, Скайрим не воспринял разрешение 800х648 (648 строк – это «младшее» HD разрешение по вертикали), хотя линзы позволяли в пределе выводить и 720 строк. Поэтому я ограничил свои аппетиты и остановился на максимальном разрешении 800х640. Если сравнивать с прототипом, то по сравнению с 512х512 картинка визуально существенно качественнее, разрешение по вертикали больше на 25%, по горизонтали на 56%. Такое качество меня уже вполне устраивает. Кстати, увеличение разрешения с 640 до 720 строк, то есть на 12%, не даёт такого визуально заметного увеличения качества изображения, как с 512 до 640.

        В процессе подбора оптимального разрешения для фиксации экранов в корпусе шлема я изготавливал рамки из тонкого гофрокартона.

Для правильного и удобного размещения экранов в корпусе шлема при выбранном разрешении их пришлось немного подымать, чтобы они не упирались в штатные выступы на корпусе, предназначенные для поддержания смартфона, которые я не хотел отламывать. Для такого положения экранов нужно сместить выводимые изображения в нижнюю часть экрана. При этом верхнее поле гашения для режима 640 строк составляет 158 строк, а нижнее всего 2. Для того, чтобы иметь возможность работать с выбранным не стандартным разрешением, нужно иметь и стандартное разрешение 800х600. Однако, параметры данного режима в стандарте VESA не подходят для их использования в шлеме, поэтому и для него подобраны нужные мне параметры. Чтобы в режиме 600 строк центр изображения находился на том же месте, верхнее поле гашения равно 178 строк, а нижнее 22. Чтобы уменьшить тактовую частоту экранов, бОльшая часть верхнего поля гашения выводится с удвоением строк – вместо 64 реальных получаются 128 физических. Таким образом, для режима 640 строк в параметрах EDID для верхнего поля гашения прописывается не 158, а 94 строки, а для режима 600 строк вместо 178 – 114. Такая экономия позволяет понизить тактовую частоту экранов на 3МГц и использовать комфортную кадровую частоту 60Гц без возникновения артефактов на изображении.

        Так же для небольшого увеличения ширины перекрытия центральной части изображения обоими экранами я обрезал вывод изображения на 20 точек слева и справа, что немного сместило центры изображений к центрам экранов по горизонтали. Вроде и не много, но визуально ощутимо. Для уменьшения количества используемых портов ввода-вывода ПЛИС, полярность кадровых и строчных синхроимпульсов выбирается одинаковой для всех используемых видеорежимов. Я выбрал для них положительную полярность.

        Переходим к электронной начинке. Первое и главное отличие от прототипа – переход на цифровой видео интерфейс. Интерфейсы DVI и HDMI в части видео тракта идентичны, но отличаются типом разъёма. Я выбрал разъём HDMI, как более компактный и удобный в распайке.

        Входной сигнал поступает на декодер, выполненный на микросхеме TFP401. На выходе данного декодера получаем сигнал тактовой частоты, раздельные кадровые и строчные синхроимпульсы и видеоданные на 24-битной параллельной шине. На каждый цвет приходится по 8 бит. Информация о требуемой разрядности цвета указывается в EDID.

        Информация EDID хранится во внешней микросхеме I2C EEPROM, как и в прототипе. Изначально я пытался эмулировать работу такой EEPROM при помощи контроллера, но именно в качестве EDID это не сработало, хотя программатором информация считывалась корректно. Вот и вернулся к проверенному варианту.

        Полярность сигнала тактовой частоты выбирается при помощи одного из резисторов R8_1 или R8_2 по наилучшему качеству изображения на выбранной рабочей тактовой частоте. Сигнал гашения, присутствующий на выходе декодера, не используется. Далее все нужные сигналы поступают на ПЛИС, которая выполняет формирование выходных синхроимпульсов, требуемых сигналов гашения и распределяет сигналы цветности на два экрана, одновременно преобразуя логические уровни с 3.3В до 1.8В. Так как второй банк портов ввода-вывода данной ПЛИС не имеет достаточного числа выводов для передачи всех служебных сигналов и всех 24 бит цвета, то я объединил два младших бита каждого цвета по схеме ИЛИ, что позволило использовать физический 21-битный цвет. Разницы на глаз не видно. Для согласования логических уровней некоторых низкочастотных сигналов служит буфер на 74LVC8T245.

        В качестве резисторных сборок R16…R27 я использовал сборки с тех же телефонов, с которых снял экраны, но они оказались очень не удобными при монтаже и не надёжными при перепаивании. Поэтому их лучше менять на более крупные, как R10..R15.

        Это содержимое ПЛИС.

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

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

Применение такого модуля обусловлено ещё и возможностью получить USB-HID устройство для целей отслеживания положения головы. Таким устройством для системы может быть мышка или джойстик или комбинированное устройство, включающее ещё и клавиатуру. Я остановился на комбинации мышка+клавиатура. Мышка отрабатывает наклон головы вперёд-назад и повороты влево-вправо, а наклоны влево-вправо отрабатываются клавиатурой – эмулируется нажатие кнопок K и L. Для анализа положения головы используется модуль с MEMS сенсором MPU-9250. Этот сенсор содержит акселерометр, гироскоп и компас в одном корпусе. Для обработки принятых от него данных используется фильтр Мэджвика, выдающий на выход кватернион, из которого затем получаются углы поворота и наклона.

        В качестве основы прошивки были взяты исходники Oculus Rift DK1, из которых было выброшено всё Rift-специфичное и заменено на формирование HID устройства, а так же была адаптация под другой тип сенсора. Это позволяет использовать шлем с любыми играми и без специфичных драйверов. Прошивка позволяет выбрать один из двух вариантов HID устройства - мышка+клавиатура или джойстик. Также есть возможность изменять чувствительность к изменению положения головы. Управление шлемом осуществляется одной кнопкой – удержание более 1 секунды включает его или выключает. В процедуре инициализации экранов производится индивидуальная настройка яркости и коррекции цвета для каждого экрана

        Питание шлема производится от двух источников – DVI/HDMI для декодера и USB для всего остального. Одного USB не достаточно, хоть в параметрах HID устройства задан ток потребления 500мА.

        Для крепления экранов изготовил основу из пластика подходящей толщины. Сами экраны удерживаются в основании при помощи скотча. Кабель HDMI прокладывается под платой и выходит вместе с USB кабелем вверх. Затем кабеля крепятся к верхнему ремню шлема и далее идут к разъёмам ПК. У меня кабель HDMI имеет длину 3м.

        Плата со стороны микросхем

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

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

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

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

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

При использовании видеокарт ATI (у меня такая) второй монитор с меньшим разрешением не изменяет параметры основного монитора. Как-то раз подключал карту Nvidia - после включения шлема разрешение основного монитора стало как у него. Но эксперимент был очень коротким, возможно есть способ не изменять разрешение основного монитора на картах Nvidia. Для запуска игры на шлеме его нужно сделать основным монитором.

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

        Для проверки теоретически доступного качества стереорежима с коммутацией каналов через кадр я выводил обычное моно изображение на экраны с чередованием через кадр. Так как в момент «простоя» изображение на экране сохраняется, а не гасится, то мерцания нет вообще, частота 30Гц на канал в принципе достаточна для не очень динамичных сцен. Но для использования такого режима нужен сигнал синхронизации, которого у меня нет. Так что владельцы карт Nvidia с 3D очками могут взять сигнал синхронизации очков и применить его в шлеме, получив стереоскопический эффект. Но при видео разрешении 800 точек по горизонтали и разрешении экранов 480 точек стереоскопическая область будет шириной от 160 до примерно 200 точек в зависимости от ширины обрезанных краёв. То есть, при имеющихся у меня экранах в этом просто нет смысла. Но меня лично устраивает и моно изображение.

       Вот и всё.

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


Файлы:
Проект железа под Altium
Проект прошивки под CoIDE
Расчёт таймингов и DAT файл для EEditZ
Проект под Quartus для ПЛИС
Схемы электроники в PDF
Данная статья в DOC формате


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


ID: 2526

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

20 2 1