Берегитесь, покемоны, сейчас всех закликаю!

Вся наша команда с нетерпением ожидала доставки долгожданного HoloLens, его пришлось заказывать через знакомых за океаном и держать кулаки, чтоб таможня не заинтересовалось пока не сертифицированным для Европы WiFi. Наконец, в начале сентября, к нам попал заветный овальный футляр. Открываем, заряжаем, надеваем на голову — вот они, ворота в виртуальный мир. Правда у ворот просят пропуск — нужно авторизоваться паролем от Microsoft. Да-да, тем самым, криптостойко длинным, со специальными символами и в разных регистрах. Пока наш первопроходец виртуальных миров, щипая воздух жестом air-tap, набивал на плавающей в пространстве клавиатуре что-то типа Opa, opa #00FF00 ograd@!, у остальных было время призадуматься о том, как же мы этим 3D собираемся управлять.

Проблема


На десктопах, и с некоторыми оговорками на планшетах и мобильниках, у нас есть два типа устройств ввода. Мышь — можно указать любой из миллиона пикселей. Быстро, но неточно. Клавиатура — нажать одну или несколько кнопок из гораздо меньшего ассортимента (< 100), зато работает очень надёжно и даже вслепую. Спецкнопки вроде Escape нажимаются практически без ошибок, не перепутаешь.

У HoloLens аналогом мыши является висящая перед носом точка курсора. Щипок air-tap не столь удобен как клик мышиной кнопки, но помогает прилагаемый однокнопочный контроллер Clicker. Легко выбрать желаемую проецируемую кнопку и дать команду “поехали”, но вот уже с отменой действия есть серьёзные проблемы — катастрофически не хватает Escape. Например, в Galaxy Explorer легко показать на планету и вызвать детальную информацию, но вот попытки вернуться к карте галактики или просто изменить масштаб сильно напоминают пляски с бубном, особенно если смотреть на человека в очках со стороны.

Команды Microsoft рекомендует отдавать голосом, через Cortana, однако вы пробовали делать это хотя-бы впятером в одной комнате? Привет кубиклы и Open Space. При использовании у работающего конвейера, как в нашем случае, мешает внешний шум. Кроме того, глядя на экран, пользователь с мышкой сразу видит доступные кнопки и гиперссылки, а на физической клавиатуре возможные варианты выбора даже можно потрогать. Но вот передо мной микрофон, как, глядя на него, понять какие команды поддерживаются? Не ясно даже на каком языке с ним говорить, не говоря уж о том, что команда у нас интернациональная и родной язык и произношение у каждого свои.

Проблемы речевого интерфейса


Идея


Так родилась идея прикрутить к HoloLens нунчак от Wii. Две качественные, аппаратные кнопки с антидребезгом, джойстик, плюс, в перспективе, возможность задействовать акселерометр. Устройство компактное, мобильное, прочное и дешёвое. Тем более, что Wii remote опознаётся по Bluetooth как HID устройство ввода, что же может быть проще?

Тут ждало первое разочарование — для подключения контроллер от Nintendo просит PIN, который является записанным наоборот адресом устройства. Например, мой контроллер имеет адрес 00:1E:A9:5D:A6:BC и нужно как-то ввести строку из 5 символов с кодами BC,A6,5D,A9,1E, и в конце завершающий 00. Может кому-то и повезло с адресом контроллера, но у меня все имеющиеся адреса попадали в диапазон непечатных символов.

Нунчак выдаёт данные по шине I2C и с микроконтроллера легко опросить состояние кнопок и акселерометра. Решил передавать данные на HoloLens через Bluefruit EZ-Key — это готовый контроллер HID клавиатуры, способный отсылать произвольную комбинацию до 6-ти одновременно нажатых клавиш.

Получилась такая архитектура:



Ардуино, как же без неё


Логики от микроконтроллера требуется минимум — читай себе данные с I2C, да посылай соответсвующий USB HID код из таблицы. Для чтения нашлась готовая библиотека для Arduino, его и взял, конкретно выбор пал на миниатюрную Arduino Pro Mini на 8MHz с питанием 3,3 В. У нас не массовое производство и для прототипа пойдёт и цена в 10 долларов, даже если с той же работой справится и микроконтроллер за пару копеек.

Собираем на макетке прототип, запускаем на HoloLens Internet Explorer как простейшую замену Notepad и… ура! Заработала! При нажатии кнопок в адресной строке браузера появляются буквы!



Первый COM комом


При отладке кода для Ардуино наступил на грабли — неожиданно Bluefruit перестала отсылать коды, хотя Bluetooth был в порядке и устройство по-прежнему определялось HoloLens как клавиатура. Arduino Mini программируется FTDI-кабелем или другой Ардуино, и при очередной переделке прототипа на Bluefruit не подавалось питание. Arduino же, получила ток с компьютера через кабель программатора, и запустившаяся программа начала честно передавать коды кнопок. 3,3 вольта приложенные к входу обесточенной платы выжгли входной RX-пин последовательного интерфейса на стороне Bluetooth-модуля. И ведь читал же когда-то на Easyelectronics статью почему так делать нельзя!

К счастью, после замены Bluefruit на новую, дальше пошло как по маслу. Схема соединения очень простая — никаких активных элементов, нужно только соединить пины друг с другом.



Для питания оставил кабель нунчака и припаял штекер USB-A. Стабилизатор Arduino преобразует 5 вольт с USB в 3,3, которые питают логику нунчака и Bluefruit EZ-Key. На конец кабеля вынес кнопку Pair от Bluetooth. Что необычно, по инструкции эту кнопку надо соединять с шиной питания, а не с землёй, как все остальные кнопки на Bluefruit.

Программирование и сборка


Исполняемая на Arduino программа очень проста — 20 раз в секунду опрашивать нажатые кнопки, складывать их USB HID коды в буфер (возможны несколько нажатий одновременно) и отсылать по последовательному интерфейсу на Bluetooth-модуль. Единственная особенность — важно правильно указать тип Arduino в IDE. Моя модель работает на 8 MHz, а не на стандартных для Ардуино 16-ти, так что сперва последовательный интерфейс работал на половинной скорости и отдавал данные на 4800 бод вместо ожидаемых 9200.

Правильные настройки

Все исходники и прочие файлы выложены под MIT-лицензией на GitHub.

Arduino Mini и Bluefroot имеют похожие размеры, и для компактности я спаял их вместе вот в такой бутерброд:


Для изоляции между платами сделана П-образная вставка из пластика, она же защищает экран Bluetooth-модуля от сдавливания. Обрезав кабель, подпаялся к логике нунчака.


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


Вся конструкция в сборе. На конце кабеля штекер питания и кнопка соединения Bluetooth.


Unity


С точки зрения HoloLens мой контроллер — простая клавиатура, поддержка которой встроена с начала времён. Не нужно ни внешних зависимостей, ни сторонних библиотек.

Направления джойстика превращаются в ASDW, кнопка «Z» в Enter, а «C» — в Escape.

if (UnityEngine.Input.GetKey(KeyCode.A))
{
    // Joystick left
    ...
}

if (UnityEngine.Input.GetKey(KeyCode.D))
{
    // Joystick right
    ...
}

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

В результае получилось вот что:



Видео снято прямо с очков через встроенную функцию Mixed Reality Capture. Исходники демки тоже на Github.

Что дальше?


Power Bank легко положить в карман и питание от USB не сильно снижает мобильность, однако хочется полностью автономного устройства. Думаю прикрутить литий-ионную банку 18650 и контроллер зарядки от Micro-USB. На Ардуино можно подавать любое напряжение от 3,3 до 8 вольт, так что дополнительная стабилизация не понадобится. Увы, в родной корпус аккумулятор уже не поместится, придётся печатать собственный на 3D-принтере.

Зарядное устройство

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

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

На форуме поддержки народ требует новых жестов и зрелищ, посмотрим что ещё наизобретает Microsoft.
Поделиться с друзьями
-->

Комментарии (13)


  1. Nagg
    29.09.2016 11:07

    Интересная реализация :) лично мне хотелось бы перчатки (желательно с обратной связью) для идеального инпута. Еще давольно смелое решение — прикрутить лип моушен на скотч повверх HoloLens и трекать любые жесты через него.


  1. iAmGeorge
    29.09.2016 12:35

    Почему такой большой лаг?


    1. IronHead
      29.09.2016 12:44

      ардуина же


    1. commanderxo
      29.09.2016 12:54

      Реальный лаг там доли секунды и совсем не ощущается. Вот используемый для трансляции видео с HoloLens интрефейс Mixed Reality Capture торомозит, это верно. Если пытаться смотреть в десктопном браузере что же видит человек в очках, то видеопоток вобще может отставать на 3-5 секунд.


      1. ApeCoder
        29.09.2016 15:28
        +1

        Где-то на DotNetRocks, кажется, описывали трюк, что для более мелких лагов надо подключаться к хололенсу напрямую, а не через рутер — делать из ноута точку доступа wifi


  1. NikitosZs
    29.09.2016 13:02

    Жесть. Чуть со стула не упал. У вас такой же монитор (sa550, верно?) и клава (натурал 4000).
    Нунчак вообще клёвый контроллер, в своё время его как только не использовали в самоделках, китайские поделки стоили копейки.


  1. AllexIn
    29.09.2016 13:57

    Может глупый вопрос… но зачем ардуина?
    Atmega вообще без какой либо обвязки может перекидывать i2c->uart. там практически напрямую ноги подсоединяются. А стабилизатор питания можно взять с wii, насколько я понимаю.

    А второй глупый вопрос — зачем 18650? Возьмите LiPo аккумулятор. Они бывают совсем маленькие по размерам.


    1. IronHead
      29.09.2016 14:14

      Да собственно можно и тот контроллер, что на плату впаян использовать


    1. commanderxo
      29.09.2016 14:24

      Вопросы очень уместны. В нашем случае это прототип чтоб понять какого рода программы можно написать для HoloLens. Если использование Arduino экономит два часа времени, то те лишние 9,9 $ разницы уже себя оправдали. При массовом производстве применять Arduino чтоб переслать 9 байт это как из пушки по воробьям, согласен.

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


      1. AllexIn
        29.09.2016 14:51

        А тут вопрос не в экономии денег. Я с вами полностью согласен и сам на DIY проектах никогда не экономлю, именно по обозначенным вами причинам.
        Просто atmega будет в два-три раза меньше чем ардуина.
        По поводу контроллера — я не смогу посоветовать, т.к. сам тоже лишь программист и только вникаю в электронщину. :))) Сам предпочитаю использовать умную зарядку, а на устройства контроллер не ставить.
        Аккум то легко посчитать, ведь его емкость — это и есть количество ампер отдаваемых за час до полной разрядки. При потреблении в 50мА и 8 часах рабочих нужен аккум емкостью 400mAh. Такой аккум легко влезет в корпус и еще место останется. Я бы с запасом раза в два взял.


  1. ngl4ngl
    29.09.2016 14:15

    Мне кажется, это стандартная проблема с VR и производители очков никаких удобных решений не предлагают.
    Но кое-что уже появляется, например, на kickstarter был проект инерциального контроллера Gestor, и, судя по описанию, эта приблуда должна быть весьма удобна для навигации в VR.


  1. Jamato
    29.09.2016 15:58

    Я извиняюсь, но про прочность устройства я сильно сомневаюсь. У меня было где-то 4 нунчака от Wii. Из них три уже мертвы. Один протянул всего 8 часов! Его тупо хватило на одну игру. Один был для японского рынка, два для Европы, один для Америки. Джойстик отказывает первым делом.


  1. tikhiy
    29.09.2016 15:58
    +1

    Тут уже сказали про батарейку. Имейте в виду, есть разные форм-факторы в т.ч. для Li-Ion:



    По зарядке, есть готовые модули, например: http://www.5v.ru/em4056a.htm