Это устройство было задумано как простая, технологичная и недорогая альтернатива небезизвестному TrackIR - устройству для управления мышиным курсором поворотом или перемещением головы (наиболее активно используется в авиасимуляторах для управления обзором из кабины летательного аппарата). 1.С чего все началосьПосле обдумывания доступных вариантов исполнения я остановился на следующем принципе работы устройства. Устройство состоит из передатчика и приемника. Передатчик - это матрица 4х4 из инфракрасных светодиодов, закрепленная на голове (на козырьке кепки или гарнитуре наушников) оператора (ВирПила ) Приемник состоит из двух фотоприемников, закрепленных на верхней крышке монитора на расстоянии 5...12 см друг от друга. С них напряжения пропорциональное освещенности идут на два АЦП (токовое зеркало + компаратор), а далее на CPU. CPU (AT89C51) используется только для получения кода АЦП и передачи его в компъютер. При повороте головы влево-вправо освещенность фотоприемников меняется в разные стороны (у одного - увеличивается, у другого - уменьшается). При повороте головы вверх-вниз освещенность фотоприемников меняется в одну и ту же сторону (при повороте головы вверх - у обоих увеличивается, при повороте головы вниз - у обоих уменьшается). Следовательно существует однозначное соответствие (в некотором диапазоне) между поворотом головы и освещенностью фотоприемников. По освещенности фотодиодов определяется расстояние от каждого из них до передатчика (козырька кепки), а по этим расстояниям находятся координаты самой кепки. Затем найденные координаты используются для перемещения мышиного курсора в рассчитанное положение. Вычислением координат мыши занимается основная прога в компе и пока только на Windows XP (возможно еще на Win2000 и на Win ME т.е. там, где правильно обрабатываются функции SendInput() и GetCurPos() ). Работа основана на регистрации освещенности фотодатчиков, которая обратно пропорциональна квадрату расстояния от излучателя до приемника (если считать, что их диаграммы направленности близки к изотропным).
2. СхемаКак было отмечено выше, приемная часть устройства состоит из двух одинаковых фотоприемников, двух АЦП и микроконтроллера. Ниже показана принципиальная электрическая схема девайса: Фотоприемники выполнены на ОУ КР544УД2А, которые обладают большим входным сопротивлением и малой разностью входных токов. Это важно для данной схемы включения, т.к. здесь фотодиод работает в режиме короткого замыкания. Диоды ГД507 и КД503 на выходе фотоприемника служат для грубого выравнивания выходных сигналов фотоприемников (при настройке один или оба диода замыкают для уменьшения разности выходных напряжений). Выходные напряжения фотоприемников поступают на входы двух АЦП, выполненных по очень простой и оригинальной схеме: АЦП построены на основе токового зеркала (транзисторы 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) установлены на основной (материнской ) плате, на которой распаяны два АЦП, микроконтроллер (на панельке), цепи сброса и интерфейса для RS232 (COM порта): Два фотоприемника имеют абсолютно одинаковую конструкцию и разводку. Они крепятся на верхней крышке монитора (на крышке монитора лежит линейка, к которой они привязаны пластмассовыми хомутиками ). Сами фотодиоды обернуты изолентой для того, чтобы уменьшить влияние боковой засветки от посторонних источников излучения - люстра, окно и т.д. : Передатчик состоит из матрицы 4х4 из инфракрасных светодиодов. Я применил светодиоды АЛ162 из-за того, что у них широкий угол излучения, т.к. нет фокусирующей линзы - плоская излучающая поверхность. Вполне возможно применение любых других инфракрасных светодиодов с рабочим током не менее 100 мА, но у них нужно надфилем или шкуркой сточить линзу для расширения угла раскрыва диаграммы направленности. Кроме того, для расширения общей диаграммы направленности светодиоды немного отогнуты в направлении от центра к краям излучателя. Светодиоды включены двумя последовательными цепочками по 8 штук. При падении напряжения на каждом из них около 1,5 в. общее напряжение цепочки составляет 12в. Это позволяет питать излучатель непосредственно от источника стабилизированного напряжения 12в. При этом ток через каждый светодиод изменяется при включении от 80мА, потом растет до 110мА, затем снижается до 100мА. Это происходит из-за разогрева светодиодов. Для подстраховки я применил быстродействующий керамический предохранитель на 250мА, но за два месяца экспериментов он ни разу не сработал (а вот пару светодиодов пришлось сменить - работают на максимально допустимом токе). Плата со светодиодами крепится на козырьке кепки любым доступным способом: 4. ИспытанияИспытания устройства показали неточность моих рассчетов из-за того, что диаграммы направленности излучателя и фотоприемников очень далеки от изотропных (круговых). Угол излучения передатчика я расширил увеличением количества светодиодов (сначала был один, затем 4, затем 8, сейчас 16 ). А диаграмму направленности фотоприемников так не изменишь, поэтому пришлось пойти на всякие программные ухищрения, в результате чего сильно увеличилось число всяких регуляторов и коэффициентов в программе. Сейчас программа выглядит так: После долгой настройки, устройство действительно может управлять мышью. Вот для примера несколько треков:
Как видно из треков, влево-вправо управление достаточно уверенное, а в управлении по вертикали есть проблемы. Включение-выключение управления мышью в программе происходит при нажатии кнопки "Scroll Lock", а центровка курсора - при нажатии кнопки "NumPad 5". Без центровки не удалось обойтись, т.к. в этой игре, да и в других программах, захватывающих мышь, функция GetCurPos() выдает виндовские координаты мыши, а не координаты мыши в игре . Кроме того, управление недостаточно плавное, движение идет рывками. Еще одна большая проблема (в треках не видно) - влияние посторонних источников света (люстра, окно и т.д.) на работу устройства. 5. Выводы- Устройство отличается простотой и технологичностью исполнения. - На данный момент описываемое устройство уступает по своим эксплуатационным параметрам другим аналогичным устройствам. - Необходимо улучшить управление по вертикали (например, добавлением еще двух фотоприемников, при этом еще и значительно упростится математика). - Нужно устранить влияние засветки от посторонних источников на работу устройства. У меня есть испытанное решение, полностью устраняющее эту проблему, но оно недостаточно простое (3 микросхемы, 3 транзистора, 8 конденсаторов, из них - 5 стабильныз и десяток резисторов), сейчас уже придумал, как сделать проще, но еще не испытал . - Нужно решить вопрос с обратной связью в устройстве, т.к. функция GetCurPos() не во всех случаях подходит для отслеживания текущих координат мыши. (written by "GO!" 02.11.2003)(last update 08.11.2004) |