Пользователь
0,0
рейтинг
22 сентября 2011 в 20:53

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

КПДВ, 111.3 KB

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

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


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

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

Image #1238805, 96.3 KB

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

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

Реализация


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

Image #1238838, 97.1 KB

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

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

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

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

Исходник тут: http://pastebin.com/XqGyP5EA.

Результат


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

Image #1238886, 80.6 KB

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

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



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

Заключение


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

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

Теория

http://www.ixbt.com/peripheral/mice-sensor.shtml

Аналогичные работы

http://spritesmods.com/?art=mouseeye&page=1
http://www.bidouille.org/hack/mousecam

Документация

http://www.avagotech.com/docs/AV02-1184EN

Исходники

http://pastebin.com/YpRGbzAS
http://pastebin.com/XqGyP5EA

UPD от 23.09: добавил немного информации про линзу и номера пинов для ардуины.
@webaff
карма
101,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

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

  • +13
    молодца, толковый девайс
    приятно видеть что-то отличное от трехколесныйх девайсов
    • +12
      А если эту штуку объеденить с тем «трехколесным девайсом», то можно процесс еще больше автоматизировать)
    • +17
      А приятно ли вам будет увидеть четырехколесный девайс управляемый с мобильника (Arduino + Bluetooth + J2ME)?

      www.youtube.com/watch?v=ZFM5Skc-JuE
      www.youtube.com/watch?v=EdVwAnX8OGw

      Хотел сначала написать пост об этом, но он получился уж слишком большим для песочницы.
      • +1
        конечно пиши
        главное подробнее
        • 0
          ок, но всему свое время :)
          • +10
            Нет, нет, нет мы хотим сегодня
            Нет, нет, нет мы хотим сейчас
            Мы уже кармы накидали :(
            • +6
              Для меня написать качественный и читаемый пост намного сложнее чем все это закодить. Но я постараюсь порадовать Вас как можно скорее.
            • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        • НЛО прилетело и опубликовало эту надпись здесь
      • +2
        Тоже хочу сделать нечто подобное, но танк. А в качестве орудия сделать пушку Гаусса, вот вопрос есть: не скажется ли магнитное поле от катушки на 1кВ на работу контроллера?
        • +7
          Контроллер вполне может сгореть от первого же выстрела. Чтобы этого не случилось, нужно будет принять меры:
          0) Гальваническая развязка силовой и управляющих цепей. Обязательно.
          1) Грамотная разводка цепей питания и земли контроллера, чтобы не было петель, которые, как антенны, будут ловить ЭМИ.
          2) Защитные диоды на выводах контроллера, не обязательно на всех, можно только на тех, что уходят за пределы платы. Обратите внимание на заявленное быстродействие применяемых диодов, импульс от пушки Гаусса может быть с очень крутым фронтом.
          3) Watchdog, можно даже внешний. Если контроллер и не сгорит от импульса, то повиснуть он может запросто.
          4) Экранировка управляющей платы. Это по желанию, если больше ничего не помогает. Обычно достаточно заземленного полигона под корпусом контроллера.
      • +6
        Пишите!!! Чорт подери, после вашей статьи, похоже, придется покупать Arduino. Как-то до этого момента я не понимал всей его силы!)
        • +6
          чорт. вы уверены что готовы тратиться на это? или ждать посылки с ебея и т.п? совсем недавно, не имея знаний по физике и радиоэлектронике, я разобрался с этой темой немного, и собрал себе рабочую дуину на атмега8. для старта хватает. программирую кстати через юсб, но для заливки бутлоадера все-таки пришлось отыскать lpt. может мне стоит об этом написать?
          • +1
            Стоит.
          • +2
            так на сайте arduino.cc написано :)
            • +3
              хотя с другой стороны — куча народу прочитает впервые
          • 0
            Ну, стоит он не шибко дорого вроде. Как программировать микроконтроллеры я в принципе представляю и так, но сборка и отладка любой рабочей схемы с моими навыками требует время. А здесь — полноценная плата, из которой не торчит во все стороны навесные элементы, где есть примеры программ и понятный датащит.
            • 0
              нуу. знаете. у меня провода торчат только у программаторов. при работе сам МК вообще не требует проводов(ну за исключением кварца и пары конденсаторов к нему). вечером дома буду — скину фото своего девайса.
      • +1
        Ардуино приходит со дня на день, очень ждём подробный пост об этом!
      • +1
        Смысл делать такое негибкое управление? Переделайте под управление с помощью гироскопа телефона!
      • +1
        да, будет интересно
      • +1
        писал диплом на очень похожую тему…
        Правда, ни про какие Arduino в то время не знал.
        Радиоуправляемая машинка ехала к заданной точке на изображении, снимаемом с камеры. Анализировалось текущее положение машинки, точка, к которой необходимо добраться, и далее через кучу блоков в матлабе выдавались управляющие сигналы на ком-порт и пульт управления машинкой.
        Самый нескучный диплом в группе был, ну и радуюсь, что тема не пропала зря и ее, насколько я знаю, до сих пор используют в лабах и даже как-то развивают.
  • +1
    Интересно, что можно получить с сенсором от Razer Mamba?
    • +28
      Зеркалку?
      • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      интересно, а можно получить с шариковой мышкой такое же?)
      • +2
        Что такое же? Получите координаты перемещения, а не картинку.
        • +1
          Сканер поверхности )
          • +1
            Даже карту высот не получится построить без дополнительных датчиков, не говоря уже об оптическом сканировании. Только относительное перемещение, да и то с поправками на проскальзывание шарика.
            • +6
              Ну ни грамма юмора, ребята… (…
              • +10
                Юмор должен быть хорошим, а не на грани бреда
            • 0
              Wacom Inklink в помощь, или его аналоги…
              1024 уровня нажатия и инфракрасные датчики для определения расположения в пространстве.
          • 0
            Проще ультразвуком или ик-лазером его получить.
    • 0
      Кстати, что там за сенсор? Все никак не могу найти для замены, но Razer Naga. Сорри, что в старый пост пишу, но читаю сейчас.
  • 0
    спасибо, очень интересно!
    если что-то получится с более новыми чипами будет совсем хорошо!
  • +4
    «популярный микроконтроллер Arduino»
    Микроконтроллер ATMEGA168 фирмы ATMEL установлен в Вашей ардуине.
    Интересная идея с сенсором мышки, это пойдет для единичных устройств, а если нужно сделать побольше Ваших сканеров штрих-кодов, что мышки будете скупать мешками?

    Ну, в общем, я плюсанул все равно:)
    • +2
      Спасибо за поправку. Не обязательно покупать мышки мешками, есть готовые платы на этом сенсоре, например, вот тут: www.sparkfun.com/products/10026. Думаю сам чип или аналоги должны быть массовой в продаже на alibaba или том же ebay.
    • +1
      не обязательно на ATMega168, поздние Duemilanove и часть клонов построены на ATMega328. Хотя я разницы между ними, кроме 32k против 16k и 1k EPROM в 328 не увидел
  • +2
    Как у этого сенсора со светочувствительностью? Если просто в пространство направить (без подсветки) будет что-нибудь видно? Если да, то можно придумать сразу кучу интересных применений: слежение за источником света, датчик движения и т.д. Полноценную камеру для таких вещей использовать «слишком жирно», а матрица 18x18 должна быть как раз. Возможно только, придется подобрать другую оптику.
    • +3
      Лучше всего этот сенсор сенсор видит красный цвет, именно поэтому там подсветка такого цвета.

      image

      Посмотрите документацию, там много картинок и информации про фокусное расстояние и тд.

      Могу сделать пару скриншотов комнаты через этот сенсор. Но скажу сразу, что даже если его чуток приподнять, то получается в основном размытая каша. Для индикатора света может быть подойдет, для слежения врядли.
      • 0
        Может попробовать линзу, чтобы изменить фокусное расстояние?
        • 0
          Нужно посмотреть через этот сенсор на лампочку (точечный источник света). Если яркое пятно будет размером 1-2 пиксела, значит с фокусом все в порядке. Оптику подбирать придется еще и для получения нужного угла обзора.
    • 0
      Зависит от задач. Примеры датчиков движения на ИК диодах есть еще в литературе советских времен. В одной польской книжке видел робота «мотылька» летящего на свет (приемником был транзистор со спиленным корпусом). Используемые полупроводниковые лазеры в мышах имеют все же большой угол расходимости и маленькую мощность (их плюс кпд). Для чего то более серьезного надо применять либо более подходящий лазер, либо использовать примитивную систему фокусировки (как в популярных нынче китайских «самолето-уловителях»).
      • 0
        Первое, что пришло в голову — автоматическая ориентация солнечных батарей.
        • +2
          Навалом более удобных и более пригодных ПИ (приемников излучения) нежели сенсор от мышки. Фокус последнего уж явно не в бесконечности, а заморачиваться с линзами вокруг такой плюгавки имхо неудобно)
        • 0
          Так можно же маленькую батарею использовать.
          • 0
            Одноканальный датчик (один фотоэлемент) только покажет, что освещенность снизилась, если солнце ушло. Задача в том, чтобы видеть куда оно ушло.
        • +10
          А у меня в избранном есть генеальное решение для этой задачи в 100 раз проще.



          Подробнее тут:
          www.instructables.com/id/Arduino-Solar-Tracker/?ALLSTEPS
          • +1
            Так и не понял куда фантик пропадает.
          • 0
            Проверенное временем решение.
            На таких штуках летали одни из первых самонаводящихся ракет.
    • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Мне тут бредовая мысль пришла, что можно так наковырять сенсоров, собрать в размер А4 матрицу и возможно получится сканер без жужащей и яркой лампы.
    • +16
      Сканер без жужжащей лампы — это фотоаппарат :) Идя вышеуказанным путем, вы в итоге фотоаппарат и получите.
    • 0
      и получится шахматная доска из видимых и невидимых областей формата А4
  • +4
    Зачем? Пятимегапиксельная камера (фотоаппарат) на жестком штативе решит Вашу проблему. Например, можно собрать что-нибудь такое
    image
    Картинка отсюда.
    • +14
      Не та картинка, должна быть с троллейбусом.
    • 0
      А не лучше ли темную гофру и подсветку снизу?
  • 0
    А ведь можно собирать картинки более высокого качества из соседних кадров, благо fps достаточный :)
    • +3
      В первой ссылке из аналогичных работ это реализовано.

      image
      • +31
        Похоже на reCaptcha. может так и сканируют ;)
      • +1
        Вот это действительно сурово. Ребятам из Лэнгли должно понравится, да и для промшпионажа тоже неплохой инструмент. Чувствую, скоро придется на входе на режимную территорию отбирать не только мобилы с камерами…
  • 0
    Можно наверное датчик дождя/загрязнения собрать для автомобильного стекла. На каком расстоянии от поверхности получается более менее различимая картинка?
    • +3
      Водите мышью влево-вправо и медленно поднимаете её со стола. Ещё вопросы? )
      • 0
        Поводил мышью, потом медленно поднял. Что-то не то.
        • +1
          Дык на каком расстоянии потеряла связь — там и кончилась различимая для сенсора/Драйвера картинка.
        • +2
          Делать одновременно
    • 0
      И когда вместо чистого неба будет попадаться туча, то стекло будет безостановочно мыться.
      У автомобильных датчиков дождя другой принцип работы.
      • 0
        Не. Туча как раз слишком далеко чтобы попасть в фокус сенсора мыши. Просто пришел в голову алгоритм по которому запускается чистка стекла, если сенсор получил в «область зрения» каплю воды. Она будет близко к сенсору и поэтому ее будет видно. Я просто видел наработки на той же ардуине в которых делали подобный датчик на основе ик излучателя.
        • +2
          Так там насколько я знаю построено все на отражении ик луча, что если он попадает в каплю то отражается совершенно по другому и дальше уже активируются механизмы очистки.
          • 0
            Ну я не изучал как родная электроника в автомобилях работает. Просто в том датчике на ардуине использовалось определение расстояния до объекта на основе ИК-диода. Диод просто моргает и на приемнике определяется через какое время пришел отраженный сигнал.

            Если датчик мыши может получить хотя бы еле различимую картину для пятна больше чем 1 квадратный сантиметр, то почему бы не рассматривать и такой вариант реализации.
    • 0
      Только на самой поверхности. Мышка под сенсором имеет такую стеклянную подставку с небольшой, но тонко настроенной линзой. Без неё пятно размытое получается. Сделаю скриншот позже.
  • +2
    Ахренительный пост! Я сам когда-то хотел такое сделать, но руки не дошли. Дома валяется куча сенсоров (могу отдать). Мой респект
    • +4
      А вам спасибо за посты про «плеер из Vogue». Я вообще заинтересовался микроконтроллерами и ардуиной в частности в этом году после серии постов про тот уникальный выпуск журнала. Открыл для себя несколько новых хобби)
      • +2
        Приятно, когда узнаваем :). Ну я мало что сделал для этих плееров, кроме написания постов на хабр. Надеюсь ещё что-нить интересное сваяю.
  • 0
    Всё ждал когда объединят мышь и сканер, направление же очевидное. Многие мыши могут помериться dpi со сканером.
    • +1
      Для топовых мышек уже 6400 вполне нормальное явление.
      • 0
        Да, топовая мышь есть с 6500, а топовые сканеры уже 9600x9600 dpi 0_о
        • +11
          9600x9600 dpi — это топовые маркетологи ;D
          • –3
            dpi — количество точек на линейный дюйм. Т.е. выражение y * x dpi — абсурдно.
            • +3
              О чём с долей иронии и написал автор выше, а вы — скапитанили.
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                разная плотность точек по горизонтали и вертикали? зачем? оО
                • 0
                  Особенность матрицы скорей всего.
                • 0
                  Разные механизмы перемещения по осям X и Y. Для каждого из них удалось достичь разной точности позиционирования.
                • 0
                  Разные механизмы отвечают за разрешение по горизонтали и вертикали. Например, у лазерных принтеров по горизонтали — развертка зеркалом, по вертикали — протяжкой бумаги/поворотом барабана. И если зеркало еще можно прецизионно откалибровать и не дышать, то с бумагой уже такой фокус не прокатывает.
        • 0
          Да ладно вам, у меня 9600 умеет старинный планшетный сканер от hp времён 6-8 года.
          • +3
            Не боясь за эту шутку, получить 15 суток.
            Интерполя-ци-я.
            • 0
              Да я бы не сказал, он просто ОЧЕНЬ долго сканирует. Лампа едет пол часика.
              • +1
                Так можно неплохую аппаратную интерполяцию замутить.
  • 0
    Круто.
    Но сложно поверить что у вас ушло 2 дня.
    Я как купил Ардуино, так даже самый стандартный пример с официального сайта о том как подключить два серво-мотора с 5-ю строкам кода — и то заставить его работать не получилось. Помучался, погулил пару дней, в итоге забросил Ардуино в дальний ящик.
    • 0
      Сервомоторы не заработают без дополнительного питания или специального шилда.
      • 0
        Ну насчет этого в туториале не было ни слова. И, пардон, я вначале пытался один подключить. Но и это не удалось.
        www.arduino.cc/playground/Learning/SingleServoExample
        • 0
          У меня тоже были проблемы с сервой подключенной напрямую к ардуино, да и это не безопасно для неё самой. При питании ардуины и сервы от USB микроконтроллер постоянно перезагружался и серва дергалась. Потом подключил все это дело через AC/DC (9V) адаптер и все стало вроде ок. Но лучше и безопаснее всего использовать спец.шилд.
    • +3
      Вы не любите трудности.
  • +2
    А можно видео того сканера штрихкода, который вы получили, как им пользоваться и какие результаты дает?
    • +3
      Я на защиту диплома писал распознавалку образов, в качестве штрих кода использовал квадратную матрицу в которой было закодировано число. Без сенсора, это выглядит примерно вот так: www.youtube.com/watch?v=myKIx3A3e00. С ним примерно тоже самое, только входящее изображение не с веб камеры, а с мыши. Распознает число. Используется OpenCV, но это совсем другая песня)
      • 0
        Ютуб тоже как-то делал систему стабилизации изображения на видео, очень похоже работает)
  • +1
    Всегда воспринимал мышь как данное и даже не задумывался как же ОНО таки работает) Что мешает тогда производителям устроить «гонку мегапикселей» и пихать в грызунов более мощное железо? Например воткнуть матрицу с большим количеством активных пикселей, побыстрей железо? Или это не имеет смысла после определенного предела разрешающей способности сенсора?
    • 0
      Дык игровые мыши и так вовлечены. Посмотрите на продукцию Razer и показатели среднерыночной продукции.
  • +2
    Очень хорошая статья. Недавно рассказывал студентам о том как работает в частности оптическая мышь и думаю, что в весеннем семестре будет больше материала для лекции. :))
  • 0
    У меня немного не в тему вопрос, скорее ко всем электронщикам.
    Мне надо собрать дистанционно управляемый нажиматель кнопки :) Усилие небольшое, критерий — портативность. Чем на рынке полу-готовых изделий сейчас это можно реализовать проще всего?
    • +7
      Dharma Initiative не ваш стартап случайно?
    • 0
      Почему именно нажиматель? почему не рапаять кнопку? Или это будут разные кнопки при работе на выезде?
      Расскажите поподробней, мне вот даже интересно стало что-за задача такая…
      • 0
        нажимать спуск у фотоаппарата(без поддержки электронного спуска) не теряя гарантию )
        конструкция фотоаппарата позволяет закрепить даже достаточно тяжелое устройство жестко, так что вопрос только в его реализации.
        • 0
          Тогда, возможно, что-то подобное.
        • +3
          Возьмите серву для р/у моделей и сделайте как-то так:
          • 0
            Механическая часть мне ясна. Мне интересно чем легче всего реализовать связку ДУ и приемник, включающий мотор. Тех же сервомоторов на dealextreme пачки просто.
            • 0
              Самое простое — использовать готовое модельное радиоуправление. Приемники есть очень миниатюрные, причем с выходом сразу на сервы.
              Из минусов:
              — избыточное количество каналов
              — слишком большой передатчик
              • +1
                ну т.е. условно говоря я беру раз
                www.dealextreme.com/p/towerpro-sg90-9g-mini-servo-with-accessories-12859
                два
                www.dealextreme.com/p/e-sky-futaba-35mhz-6-channel-radio-mini-rc-receiver-10779
                (правда там пишут, что там нет кристалла — что они имеют ввиду?)

                +питание 4.5 вольт — чем его лучше делать?
                +пульт — какой?

                Не очень хочется углубляться — пусть будет избыточность, жалко я заранее никак не узнаю о совместимости компонент
              • 0
                хотя на IR наверняка компактнее и проще бы вышло
              • +1
                возможно, наверное, цепь сервомотора замкнуть вот такой штукой
                www.dealextreme.com/p/seagull-infrared-flash-remote-trigger-for-digital-camera-syk-3-8201
                к ней, вроде, любой почти пульт подходит, если я правильно понял. но я не уверен, что короткого замыкания хватит, чтобы нажалась кнопка
                • 0
                  Вся сложность с управлением сервами в том, что им нужен ШИМ-сигнал, скважность импульсов задает положение вала. Просто подать питание недостаточно. Пока вижу три варианта:
                  1) использовать стандартную аппаратуру радиоуправления (она как раз рассчитана на сервы). Про совместимость компонентов лучше спрашивать на соответствующих форумах.
                  2) использовать микроконтроллер. Тогда в качестве канала связи удобнее и проще использовать IR.
                  3) разобрать серву и выкинуть из нее всю электронику, оставив двигатель и редуктор. Подали питание — крутится до упора, обратно возвращать можно пружинкой. В качестве канала связи в этом случае подойдет любой комплект ДУ для фотоаппарата, но не получится реализовать полунажатие кнопки.
  • 0
    Осталось засунуть сенсор в головку матричного принтера, и получить винтажный жужжащий матричный сканнер. :)
  • 0
    Отличная статья.
    Хотя повторить не получилось (видимо драйвера на руки не настроены..). Коллега намедни мышь genius navigator 525 презентовал, на ней вместо скролла стоит такой же сенсор. Мышой пользоваться не стал (неудобная какая-то), да и такой оптический скролл не очень точен показался. Хотел из него дополнительное управление сделать…
  • 0
    В заголовке очепятка в слове «комПьютерной».
    А где еще можно глянуть исходники, а то сайт роскомнадзор заблокировал, видимо боится восстания мышей.

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