HeadMouse

build by GO!

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

1.С чего все началось

После обдумывания доступных вариантов исполнения я остановился на следующем принципе работы устройства.

Устройство состоит из передатчика и приемника.

Передатчик - это матрица 4х4 из инфракрасных светодиодов, закрепленная на голове (на козырьке кепки или гарнитуре наушников) оператора (ВирПила smile.gif (372 bytes) )

Приемник состоит из двух фотоприемников, закрепленных на верхней крышке монитора на расстоянии 5...12 см друг от друга. С них напряжения пропорциональное освещенности идут на два АЦП (токовое зеркало + компаратор), а далее на CPU. CPU (AT89C51) используется только для получения кода АЦП и передачи его в компъютер.

При повороте головы влево-вправо освещенность фотоприемников меняется в разные стороны (у одного - увеличивается, у другого - уменьшается). При повороте головы вверх-вниз освещенность фотоприемников меняется в одну и ту же сторону (при повороте головы вверх - у обоих увеличивается, при повороте головы вниз - у обоих уменьшается). Следовательно существует однозначное соответствие (в некотором диапазоне) между поворотом головы и освещенностью фотоприемников.

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

Вычислением координат мыши занимается основная прога в компе и пока только на Windows XP (возможно еще на Win2000 и на Win ME т.е. там, где правильно обрабатываются функции SendInput() и GetCurPos() ).

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

С учетом того, что примененные АЦП выдают код, обратно пропорциональный входному напряжению, получаются следующие выражения для определения координат передатчика X и Y по выходному коду АЦП:

X:=(Ua-Ub+D*D)/(2*D);

Y:=sqrt(Ua-(X*X));

или

Y:=sqrt(Ub-(D-X)*(D-X));

где:

- -выходной код АЦП левого фотоприемника,

- Ub -выходной код АЦП правого фотоприемника,

- D - расстояние между фотоприемниками.

За начало координат принято положение левого фотодатчика (зеленого).

Расчеты были проверены на математической модели (см. рис.), которая показала обнадеживающие результаты.

Загрузить программу модели IR.exe (317952 bytes)

 

2. Схема

Как было отмечено выше, приемная часть устройства состоит из двух одинаковых фотоприемников, двух АЦП и микроконтроллера. Ниже показана принципиальная электрическая схема девайса:

hm.gif (813042 bytes)

Фотоприемники выполнены на ОУ КР544УД2А, которые обладают большим входным сопротивлением и малой разностью входных токов. Это важно для данной схемы включения, т.к. здесь фотодиод работает в режиме короткого замыкания. Диоды ГД507 и КД503 на выходе фотоприемника служат для грубого выравнивания выходных сигналов фотоприемников (при настройке один или оба диода замыкают для уменьшения разности выходных напряжений).

Выходные напряжения фотоприемников поступают на входы двух АЦП, выполненных по очень простой и оригинальной схеме:

ADC.gif (2443 bytes)

АЦП построены на основе токового зеркала (транзисторы VT1 и VT2) и работают так:

Сначала сигнал RESET микроконтроллером устанавливается в лог. "1" и через диод VD1 заряжается времязадающий (а значит, стабильный!) конденсатор C до некоторого опорного напряжения (в нашем случае логической единицы минус прямое падение напряжение диода VD1), при этом напряжение на выходе OUTPUT компаратора COMP будет равно лог. "0". Затем сигнал RESET устанавливается в лог. "0", диод VD1 закрывается и начинается разряд конденсатора C током коллектора транзистора VT2. Как известно, входной и выходной токи токового зеркала равны, если равны коеффициенты усиления обоих транзисторов, следовательно ток разряда конденсатора C будет равен:

I:=(U-Ube)/R, - где

- I - ток разряда конденсатора C,

- U - входное напряжение АЦП,

- Ube - напряжение база-эмиттер транзисторов VT1 и VT2 (примерно 0,7 В.),

- R - сопротивление на входе АЦП.

В процессе разряда конденсатора C линейно падает напряжение на нем и на входе компаратора COMP. При достижении порогового уровня компаратора, сигнал OUTPUT изменит свое значение на лог. "1". Все время разряда конденсатора микроконтроллер, подключенный к линиям OUTPUT и RESET, циклически проверяет состояние сигнала OUTPUT до изиенения его в лог. "1". Число циклов проверки и будет выходным кодом АЦП. Затем опять сигнал RESET микроконтроллером устанавливается в лог. "1" и после заряда конденсатора C измерение может быть повторено.

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

A:=R*C/(T*(U-Ube)), - где

- A - выходной код АЦП,

- U - входное напряжение АЦП,

- Ube - напряжение база-эмиттер транзисторов VT1 и VT2 (примерно 0,7 В.),

- R - сопротивление времязадающего резистора на входе АЦП.

- C - емкость времязадающего конденсатора,

- T - время одного цикла опроса сигнала OUTPUT.

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

Далее, принятый с обоих АЦП код передается микроконтроллером AT89C51 в компьютер через СОМ порт по протоколу, близкому к стандартному мышиному протоколу. Дальнейшая обработка (преобразование кодов АЦП в координаты мышиного курсора) осуществляется программно в компьютере.

3. Конструкция

Устройство сейчас находится в стадии доводки, поэтому не имеет корпуса. Устройство смонтировано на четырех кусках макетницы, не считая блока питания. Блок питания обычный универсальный китайский, доработан установкой стабилизатора на микрухе 7812 для излучателя, стабилизаторы на +9в (7809) и на +5в (7805) установлены на основной (материнской smile.gif (372 bytes) ) плате, на которой распаяны два АЦП, микроконтроллер (на панельке), цепи сброса и интерфейса для RS232 (COM порта):

hmfrontbig.jpg (99682 bytes) hmrearbig.jpg (98922 bytes)

Два фотоприемника имеют абсолютно одинаковую конструкцию и разводку. Они крепятся на верхней крышке монитора (на крышке монитора лежит линейка, к которой они привязаны пластмассовыми хомутиками ). Сами фотодиоды обернуты изолентой для того, чтобы уменьшить влияние боковой засветки от посторонних источников излучения - люстра, окно и т.д. :

hmphotorxfront.jpg (22597 bytes)

hmphotorxrear.jpg (22747 bytes)

Передатчик состоит из матрицы 4х4 из инфракрасных светодиодов. Я применил светодиоды АЛ162 из-за того, что у них широкий угол излучения, т.к. нет фокусирующей линзы - плоская излучающая поверхность. Вполне возможно применение любых других инфракрасных светодиодов с рабочим током не менее 100 мА, но у них нужно надфилем или шкуркой сточить линзу для расширения угла раскрыва диаграммы направленности. Кроме того, для расширения общей диаграммы направленности светодиоды немного отогнуты в направлении от центра к краям излучателя. Светодиоды включены двумя последовательными цепочками по 8 штук. При падении напряжения на каждом из них около 1,5 в. общее напряжение цепочки составляет 12в. Это позволяет питать излучатель непосредственно от источника стабилизированного напряжения 12в. При этом ток через каждый светодиод изменяется при включении от 80мА, потом растет до 110мА, затем снижается до 100мА. Это происходит из-за разогрева светодиодов. Для подстраховки я применил быстродействующий керамический предохранитель на 250мА, но за два месяца экспериментов он ни разу не сработал (а вот пару светодиодов пришлось сменить - работают на максимально допустимом токе). Плата со светодиодами крепится на козырьке кепки любым доступным способом:

hmphototxfront.jpg (30547 bytes) hmphototxrear.jpg (23410 bytes)

4. Испытания

Испытания устройства показали неточность моих рассчетов из-за того, что диаграммы направленности излучателя и фотоприемников очень далеки от изотропных (круговых). Угол излучения передатчика я расширил увеличением количества светодиодов (сначала был один, затем 4, затем 8, сейчас 16  smile.gif (372 bytes)). А диаграмму направленности фотоприемников так не изменишь, поэтому пришлось пойти на всякие программные ухищрения, в результате чего сильно увеличилось число всяких регуляторов и коэффициентов в программе. Сейчас программа выглядит так:

hm_windows.gif (31303 bytes)

После долгой настройки, устройство действительно может управлять мышью. Вот для примера несколько треков:

IL2_HM.zip (56174 байт) - трек для игры ИЛ2 - Штурмовик (не "Забытые Сражения")
IL2FB_HM1.ntrk (597769 байт) - трек для игры ИЛ2 - Штурмовик Забытые Сражения v 1.0
IL2FB_HM2.ntrk (919584 байт) - трек для игры ИЛ2 - Штурмовик Забытые Сражения v 1.0 (еще один)

Как видно из треков, влево-вправо управление достаточно уверенное, а в управлении по вертикали есть проблемы. Включение-выключение управления мышью в программе происходит при нажатии кнопки "Scroll Lock", а центровка курсора - при нажатии кнопки "NumPad 5". Без центровки не удалось обойтись, т.к. в этой игре, да и в других программах, захватывающих мышь, функция GetCurPos() выдает виндовские координаты мыши, а не координаты мыши в игре frown.gif (374 bytes) . Кроме того, управление недостаточно плавное, движение идет рывками. Еще одна большая проблема (в треках не видно) - влияние посторонних источников света (люстра, окно и т.д.) на работу устройства.

5. Выводы

- Устройство отличается простотой и технологичностью исполнения.

- На данный момент описываемое устройство уступает по своим эксплуатационным параметрам другим аналогичным устройствам.

- Необходимо улучшить управление по вертикали (например, добавлением еще двух фотоприемников, при этом еще и значительно упростится математика).

- Нужно устранить влияние засветки от посторонних источников на работу устройства. У меня есть испытанное решение, полностью устраняющее эту проблему, но оно недостаточно простое (3 микросхемы, 3 транзистора, 8 конденсаторов, из них - 5 стабильныз и десяток резисторов), сейчас уже придумал, как сделать проще, но еще не испытал frown.gif (374 bytes) .

- Нужно решить вопрос с обратной связью в устройстве, т.к. функция GetCurPos() не во всех случаях подходит для отслеживания текущих координат мыши.

(written by "GO!" 02.11.2003)
(last update 08.11.2004)
Main HeadMouse4
Хостинг от uCoz