Hi-tech блог

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

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

Подготовка и немного теории

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

Погуглив информацию по этой теме и разобрав старую PS/2 мышку Logitech, я увидел знакомую по статьям из интернета картину.

Не очень сложная схема «мышей первого поколения», оптический сенсор по центру и чип интерфейса PS/2 чуть выше. Попавшийся мне оптический сенсор является аналогом «популярных» моделей ADNS2610/ADNS2620/PAN3101. Я думаю, они и их аналоги были массово произведены на одном и том же китайском заводе, получив на выходе разную маркировку. Документация на него нашлась очень легко, даже вместе с различными примерами кода.

Документация гласит, что этот сенсор до 1500 раз в секунду получает изображение поверхности размером 18x18 точек (разрешение 400cpi), запоминает его и с помощью алгоритмов сравнения изображений вычисляет смещение по координатам Х и Y, относительно предыдущей позиции.

Реализация

Для «общения с сенсором» я использовал популярную вычислительную платформу Arduino, а припаяться решил прямо к ножкам чипа.

Подключаем 5V и GND к соответствующим выходам Arduino, а ножки сенсора SDIO и SCLK к цифровым пинам 8 и 9.

Для получения смещения по координатам нужно прочитать значение регистра чипа по адресу 0x02 (X) и 0x03 (Y), а для дампа картинки нужно, сначала записать значение 0x2A по адресу 0x08, а потом 18x18 раз его прочитать оттуда же. Это и будет последнее «запомненное» значение матрицы яркости изображения с оптического сенсора.

Как я реализовал это на Arduino можно посмотреть тут: http://pastebin.com/YpRGbzAS (всего ~100 строк кода).

А для получения и отображения картинки была написана программа на Processing.

Результат

После небольшого «допиливания» программы для своего проекта, я смог получать картинку прямо с оптического сенсора и производить над ней все необходимые вычисления.

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

Если начать приподнимать мышку над поверхностью даже на пару миллиметров, четкость сразу пропадает.

Если вы вдруг захотите повторить это дома, для нахождения мышки с аналогичным сенсором рекомендую искать старые девайсы с интерфейсом PS/2.

Заключение

Хотя получаемое изображение и не очень большое, этого вполне хватило для решения моей задачи (сканнер штрих кода). Получилось очень даже экономично и быстро (мышка за ~100р + Arduino + пару дней на написание кода).

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

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

Барахлит сенсор мыши

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

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

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

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

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

Прокручивается колёсико мышки

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

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

Если у Вас именно такая проблема, то она решается за счёт уплотнения края оси колеса скотчем или изолентой в небольших количествах. Если же с движением колёсика всё нормально, то поломка произошла внутри энкодера (датчика прокрутки). От длительного использования он мог разболтаться и его следует немного уплотнить:

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

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

Что самое интересное, данная манипуляция помогла! Мне осталось только обрезать лишнюю длину полоски и собрать мышь:)

Не работают кнопки мыши

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

Микропереключатель имеет три "ножки", первая из которых - обычный фиксатор, а две остальные - контакты, которые и требуется паять. Фиксатор припаивать не нужно. Он служит только в качестве "защиты от дурака" , чтобы Вы по ошибке не вставили микропереключатель не той стороной.

Иногда кнопка ещё работает, но срабатывает не при каждом нажатии. Такой симптом может сигнализировать о том, что от частого использования стерся край толкателя кнопки, который нажимает микропереключатель.

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

Последняя проблема с которой Вы можете столкнуться - кнопка мыши делает двойной клик при нажатии на неё. Решить это дело можно перепайкой микропереключателя или... программно! В любом случае перед тем как браться за паяльник проверьте правильность настроек мышки в Панели управления Windows:

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

Выводы

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

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

Надеюсь, наша статья позволит Вам определить, что именно сломалось в Вашей мышке, а значит, и починить поломку. Успешного Вам ремонта!

P.S. Разрешается свободно копировать и цитировать данную статью при условии указания открытой активной ссылки на источник и сохранения авторства Руслана Тертышного.

Нормальные герои всегда идут в обход (из к/ф "Айболит 66").

Коврики

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

реклама

Для тестов использовались обычные коврики Nova MicrOptic+ и Defender Ergo opti-laser. Внешний вид у них примерно одинаковый:

По заверениям обоих производителей эти коврики оптимизированы для работы с лазерными мышками. Проверим.

Для начала снимки поверхности с увеличением:

Кое-какие отличия есть, но не особенно заметные. У коврика Nova зерна меньше и не так явно выражены. Значит он хуже?

Теперь посмотрим на коврики глазами оптического датчика:

Согласитесь, что отличие есть и весьма кардинальные. На коврике Nova отчетливо видна высококонтрастная структура, а вот Defender дал какое-то "мыло". Скорее всего, это связано с размерами "гранул". У лазерных датчиков, в отличие от оптических, видимый размер окна уменьшен. Похоже, на коврике Defender размер гранул больше окна и датчик захватывает только их часть, постоянно переключаясь между монотонно светлыми и темными участками. Для сравнения, приведу фотографии поверхности пластика .

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

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

Высота отрыва

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

Высота отрыва светодиодных мышек 1.5-2 мм, для лазерных версий цифра больше и составляет уже 2.5-4 мм. Это все цифры, а в реальности такой мышкой неудобно пользоваться даже для офисных приложений, очень уж высоко приходится поднимать ее над ковриком. По моим личным впечатлениям, высота срыва в 1.5-2 мм довольно комфортна. А что же делать с лазерными мышками и их высотой срыва 4 мм?

Давайте возьмем одну за хвост и посмотрим на внутренности. Сейчас распространены мышки на датчике Avago(ссылка на http://www.avagotech.com) ADNS-6010

Чтоб особо не умничать, взял картинку из документации.

Пояснения:

реклама

  • Sensor - микросхема ADNS-6010, которая и является датчиком, считывающем движение
  • Sensor PCB - печатная плата мышки
  • VCSEL - лазерный излучатель. Просто небольшой полупроводниковый лазер с посредственным углом расхода луча.
  • VCSEL PCB - небольшая печатная платка, на которой смонтирован лазер.
  • VCSEL Clip - пластиковая защелка, фиксирует лазер в оптической системе. На картинке светло желтого цвета.
  • Lens - оптическая система из прозрачного пластика, блекло-желтого цвета.
  • Surface - поверхность, по которой движется мышь.
  • На этом рисунке указана цифра 2.4 мм - это оптимальное расстояние от дна оптической системы до поверхности. Один момент - дно мышки имеет какую-то толщину, поэтому расстояние от поверхности до дна мышки будет меньше на толщину этого дна.

    А от чего же зависит высота отрыва и почему на оптических мышках эта высота меньше? Посмотрим другую картинку:

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

    реклама

    Желтым цветом выделены линзы оптической системы, серым - световой поток лазера. Зеленый - зона видимости оптического датчика. Зона "видимости" датчика определяется только его фокусом и способностью работать с расфокусированным изображением. Чем выше скорость перемещения картинки, тем должна-бы быть хуже устойчивость для несфокучированных объектов. Если посмотреть данные тестирования, то так и выходит. Высота срыва в 4 мм не функциональна, я попробовал уменьшить эту величину несколько изменив принцип работы - потеря изображения датчиком может быть получена не за счет ухудшения фокусировки, а из-за ухода светового пятна из зоны видимости датчика. Примерно так работают светодиодные мышки. Для этого я увеличил угол луча подсветки с 21 градусов до, примерно, 50 градусов от вертикали.

    При подъеме мышки пятно подсветки (серый луч) выходит из видимого окна датчика (зеленая зона).

    Методика доработки не особо трудна - надо распилить оптический блок по вертикальной черте и не задеть линзы. В крайнем случае, можно чуть-чуть повредить линзу подсветки, она не столь важна. Скрепить две составные части можно термоплавким клеем, на рисунке отмечено коричневым.

    реклама

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

    К сожалению, блок подсветки надо не только наклонить, но и сдвинуть вниз, из-за чего линза подсветки окажется ниже уровня оптики. Это плохо, в дне мышки придется выплавлять небольшую вмятину под выступ. Впрочем, это не сложно и не мешает, ведь линза выходит за габариты совсем чуть-чуть. Лазерный модуль закреплялся на оптике с помощью защелки VCSEL Clip. Сейчас ее придется убрать и закрепить каплей клея или герметика. Хотя, он и так там неплохо держится. У такого построения есть одна особенность - луч подсветки падает на поверхность с другим углом, чем угол зрения датчика. В результате, между плоскостью поверхности и плоскостью отражения образуется угол около 15 градусов.

    Черный - луч на не доработанной оптической системе, зеленый - после доработки. Поверхность для доработанного случая условно поднята, чтобы она не сливалась с нормальным режимом. Датчик смотрит как бы сбоку на поверхность и четче видит все неровности на ней. Дополнительный наклон подсветки дает дополнительную модуляцию яркости при прохождении объемных областей под объективом. Хорошо сие или плохо - зависит от коврика, фактуры его поверхности. К слову, если снять картинки поверхности коврика Nova на этой, доработанной, мышке, то на фото не будет таких четких граней. И, скорее всего, дело не в фокусировке. Просто изменился угол зрения и четкие структуры коврика исчезли. На этой мышке коврик Nova и Defender выглядят почти одинаково. Впрочем, мышка хорошо ходит по обеим поверхностям. Увы, есть и явный недостаток - из-за того, что поверхность отражения наклонена относительно поверхности коврика, уменьшается общий уровнь освещенности и возникает необходимость увеличения тока лазера подсветки. Обычно он составляет цифру в районе восьми миллиампер. После доработки пришлось повысить ток до 12 миллиампер. Это уже многовато, но в пределах доступного.

    Если Вы дорабатывается обычную, серийную мышь, то хорошо бы несколько помочь схеме автоматического управления током лазера. В документации на датчик ADNS-6010 упоминается резистор Rbin с 13 вывода микросхемы. Обычно, его номинал 12.7 ком. Для того, чтобы подправить ток, надо уменьшить его номинал. Для моего случая хорошо-бы увеличить ток в 1.5 раза, что означает припаивание параллельно этому резистору еще одного с номиналом в 2 раза больше, т.е. 24-27-30KOm. И еще пара поверхностей - тканевая и лист алюминия. Довольно часто слышно рекомендации применять эти поверхности, они дают весьма неплохие результаты.

    реклама

    Вначале на мышке с не модифицированной оптикой (W-Mouse 730). Ткань:

    Лист алюминия:

    И мышка после модификации оптического блока (W-Mouse 750).

    реклама

    Ткань:

    Лист алюминия:

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

    реклама

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

    Есть и более простой способ уменьшить высоту срыва - поставить кнопку на дно мышки и при ее подъеме отключать, блокировать датчик. Средств воздействия много, вначале я пробовал отключать лазер, но контроллер в А4 умный и, если просто размыкать ток лазера, контроллер очень быстро это замечает и отключает мышь. Увы, отключает совсем, приходится перетыкать разъем USB, придется поступать не столь прямолинейно. Есть предложение при отключении лазера подсоединять вместо него пару кремниевых диодов, но это потребует установку дополнительных компонентов. Я поступил иначе - воздействовал на резистор Rbin (смотрите документацию на датчик ADNS-6010), при увеличении его номинала система авторегулирования пытается выставить такой ток. Если Rbin отсоединять или делать очень большим, то лазер фактически отключится, но это не вызовет каких-то проблем внутри системы регулирования.

    Саму "кнопку" я взял из дисковода 3.5" с датчика наличия дискеты. Усилие небольшое, но и его пришлось немного ослабить. Идея работала хорошо, высоту можно подобрать какую заблагорассудится, вот только пластмассовый штифт кнопки быстро стачивается.

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

    Этот датчик поделен на две части: принимающая (VD2) и передающая (VD1). Передающей является светодиод, который работает в ИК диапазоне, а принимающая часть, это пара фотодиодов в одном корпусе. Два - нужны для того, чтобы была возможность определять в какую сторону вращается колёсеко мышки (вверх или вниз).

    R1 - даёт ток на светодиод. R2 нужен, чтобы преобразовывать ток фотоприёмника в напряжение (не использованная ножка VD2 является выходом второго фотоприёмника). Напряжение на этом сопротивлении изменяется от 1.5 Вольт (свет отсутствует) до 3.4 Вольт (свет присутствует). Нижний предел в 1.5 Вольта очень велик, для того чтобы переключать цифровую TTL схему, потому что порог переключения равен 0.8 Вольт. По этой причине применяется операционный усилок DA1 в режиме компаратора. Напряжение порога для него даёт резистивный делитель R3 и R4, которое составляет 2.5 Вольт. Можете считать, что с выхода DA1 поступает уже цифровой сигнал.

    Чтобы уменьшить случайные наводки и ложные срабатывания, можете ввести гистерезис в уровни переключения DA1. Чтобы это сделать, нужно будет включить условно показанные резисторы R6 и R7 (R6 на разрыв между DA1 и R2). Чем ближе будет номинал R6 к R7 тем шире петля гестерезиса и тем дальше друг от друга будут уровни переключения из «0» в «1» и из «1» в «0». Таким образом при приведённых номиналах уровень переключения из «0» в «1» 2.8 Вольт, из «1» в «0» 2.1 Вольт.

    Для примера показана простая схема индикации из светодиода и инвектора DD1 . Когда между VD1 и VD2 будет распологаться предмет, который мешает свету проходить, то будет загораться светодиод VD3.

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

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

    Схема прибора достаточно проста и не требует особых пояснений. При освещении фотодатчика ФД1 транзисторы VT1, VT2 открываются, реле К1 срабатывает, включая или отключая нагрузку своими переключающими контактами (1,2 включают, 2,3 выключают). Резистором R1 устанавливается порог срабатывания схемы, светодиод HL1 служит для визуального контроля состояния реле.

    Поскольку в качестве силового транзистора использован маломощный транзистор КТ3107, электромагнитное реле должно быть маломощным. К примеру, РЭС-55. Напряжение питания можно изменять в пределах от 9 до 18 В в зависимости от напряжения срабатывания выбранного реле.

    Вместо указанных на схеме можно использовать транзисторы КТ315 и КТ361 (VT1 и VT2 соответственно) с любой буквой (лучше «Б»). Диод – любой выпрямительный кремниевый. Он защищает транзистор VT2 от напряжения самоиндукции обмотки реле при переключении. На месте HL1 может работать любой индикаторный светодиод (к примеру, от китайской игрушки).

    Фототранзистор, как было сказано выше, взят из неисправной «мышки» (на фото в черном пластиковом защитном чехле). Таких микросборок, имеющих в своем составе каждая по два фототранзистора, в мыши тоже два, нам понадобится один. А точнее, половина.

    Схема такой микросборки предельно проста и выглядит следующим образом.

    Использовать можно любой из фототранзисторов – они совершенно идентичны. Для увеличения чувствительности схемы вы можете их даже запарралелить, соединив выводы 1 и 3.

    Понравилась статья? Поделитесь с друзьями!
    Была ли эта статья полезной?
    Да
    Нет
    Спасибо, за Ваш отзыв!
    Что-то пошло не так и Ваш голос не был учтен.
    Спасибо. Ваше сообщение отправлено
    Нашли в тексте ошибку?
    Выделите её, нажмите Ctrl + Enter и мы всё исправим!