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

Для решения одной из задач мне потребовалось программно получать и обрабатывать изображения небольшого участка поверхности бумаги с очень близкого расстояния. Не получив достойного качества при использовании обычной USB камеры и уже на пол пути в магазин за электронным микроскопом, я вспомнил одну из лекций, на которой нам рассказывали как устроены различные девайсы, в том числе и компьютерная мышка.
Подготовка и немного теории
В подробности принципа работы современной оптической мыши я вдаваться не буду, очень подробно об этом написано вот тут (рекомендую прочитать для общего развития).
Погуглив информацию по этой теме и разобрав старую PS/2 мышку Logitech, я увидел знакомую по статьям из интернета картину.

Не очень сложная схема «мышей первого поколения», оптический сенсор по центру и чип интерфейса PS/2 чуть выше. Попавшийся мне оптический сенсор является аналогом «популярных» моделей ADNS2610/ADNS2620/PAN3101. Я думаю, они и их аналоги были массово произведены на одном и том же китайском заводе, получив на выходе разную маркировку. Документация на него нашлась очень легко, даже вместе с различными примерами кода.
Документация гласит, что этот сенсор до 1500 раз в секунду получает изображение поверхности размером 18×18 точек (разрешение 400cpi), запоминает его и с помощью алгоритмов сравнения изображений вычисляет смещение по координатам Х и Y, относительно предыдущей позиции.
Реализация
Для «общения с сенсором» я использовал популярную вычислительную платформу Arduino, а припаяться решил прямо к ножкам чипа.

Подключаем 5V и GND к соответствующим выходам Arduino, а ножки сенсора SDIO и SCLK к цифровым пинам 8 и 9.
Для получения смещения по координатам нужно прочитать значение регистра чипа по адресу 0x02 (X) и 0x03 (Y), а для дампа картинки нужно, сначала записать значение 0x2A по адресу 0x08, а потом 18×18 раз его прочитать оттуда же. Это и будет последнее «запомненное» значение матрицы яркости изображения с оптического сенсора.
Как я реализовал это на Arduino можно посмотреть тут: http://pastebin.com/YpRGbzAS (всего ~100 строк кода).
А для получения и отображения картинки была написана программа на Processing.
Результат
После небольшого «допиливания» программы для своего проекта, я смог получать картинку прямо с оптического сенсора и производить над ней все необходимые вычисления.
Можно заметить текстуру поверхности (бумага) и даже отдельные буквы на ней. Следует отметить, что такое четкое качество картинки получается из-за того, что разработчики этой модели мыши добавили в конструкцию специальную стеклянную подставку с небольшой линзой прямо под сенсором.
Если начать приподнимать мышку над поверхностью даже на пару миллиметров, четкость сразу пропадает.
Если вы вдруг захотите повторить это дома, для нахождения мышки с аналогичным сенсором рекомендую искать старые девайсы с интерфейсом PS/2.
Заключение
Хотя получаемое изображение и не очень большое, этого вполне хватило для решения моей задачи (сканнер штрих кода). Получилось очень даже экономично и быстро (мышка за ~100р + Arduino + пару дней на написание кода).
Оставлю ссылки на материалы, которые мне очень пригодились для решения этой задачи. Это реально было не сложно и делалось с большим удовольствием. Сейчас я ищу информацию о чипах более дорогих моделей современных мышек для получения качественных изображений с большим разрешением. Возможно, мне даже удастся собрать что-то вроде микроскопа (качество изображений с текущего сенсора для этого явно не подходит). Спасибо за внимание!
Кафедра АППиЭ
3. Кожемяко. Как из оптической компьютерной мыши сделать датчик перемещения?
Автор Ko_Dee, Среда, марта 30, 2016, 07:33:24
Страницы 1
Страницы 1
- Кафедра АППиЭ
- ► КОНФЕРЕНЦИИ
- ► Дни науки АмГУ 2016 Секция Автоматика, управление и моделирование
- ► 3. Кожемяко. Как из оптической компьютерной мыши сделать датчик перемещения?
- Помощь | Условия и правила | Вверх ▲
- SMF 2.1 Beta 2 © 2015, Simple Machines
Страница создана за 0.200 секунд с 19 запросами.
Компьютерная мышка как точный датчик
Задача: быстро сделать датчик линейного перемещения из компьютерной мышки.
В обычных мышках прячется высокочувствительный оптический датчик. Там скрывается своя маленькая «камера» и процессор обработки, который отслеживает передвижения малейших точек на поверхности. В топовых мышках разрешающая способность составляет всего 3 мкм!

С какими подмышиными камнями мы столкнулись, плюс техническая часть, расскажем дальше!
Следующее ТЗ дал заказчик: сделать как можно скорее, с любой мышкой (возможно беспроводной), выводить на 7 сегментный индикатор, обнулять по кнопке, компьютер не подходит, нужна разрешающая способность 0.01 мм, максимальное расстояние 1000 мм.
Для начала как все это делалось:
Считывание координат xy с мышки: Реализовать считывание данных можно несколькими способами: а) Непосредственно с микросхемы оптического сенсора + Можно обойтись простым контроллером - Про универсальность можно забыть совсем б) Подключить мышку по USB к простым контроллерам (например к ардуино) + Простота и дешивизна - Надо паять - Под рукой была только arduino, а к ней можно подключить мышки совместимые с PS/2, а они обычно очень неточные. Можно было на stm32, но отладочные платы сильно подорожали, самому паять не было времени. (но если интересно, то несколько лет назад был такой похожий проект именно на stm32f4discovery) в) Взять какой нибудь простой одно платный компьютер. Под рукой был как раз Raspberri pi. + Подходит для любых USB мышек + Хорошая производительность - Дорого, но может избыточная мощность потребуется потом
В итоге, под нож хирурга легла Малина пи 3. Четыре 64 битных ядра A-53 по 1GHz, 512 МБ оперативки и много других космических для этой задачи циферок.

Задачка: Индикация должна быть на выданных 7-сегментных индикаторах. Получается нам необходимо по 6 цифр на одну координату, итого 12 индикаторов. Каждый индикатор имеет 7 ножек на цифры+ ножка на светодиод точки (dp), общий провод не считаем. Итого после простых расчетов получаем, что мы должны управлять 96 проводниками плюс нужна кнопка. 96 резисторов не очень хотелось тратить.
Послушайте!
Ведь, если светодиод зажигают — значит — это нужно один резистор?
Управлять сразу таким массивом ножек нету возможности. Выход есть! И даже несколько!
1) Использовать дополнительные микросхемы по типу max7219, или сдвиговые регистры, мультплексоры, и т.д.
+ Можно почти бесконечно наращивать количество индикаторов
— Max7219 оказалась с рабочим напряжением 5 В
— Не было под рукой ничего подходящего.
2) Можно сделать динамическую индикацию. В один момент времени зажигать только один светодиодный индикатор. Если индикаторы переключать очень быстро, то человеческий глаз не заметит подставы.
+ Нужно только 8 проводов и резисторов на один индикатор и 12 на переключение индикаторов. Плюс не забываем кнопку. Итого: всего 21 ножка против 96. Берем!
— Так как мы пытаемся управлять целым индикатором через один пин распберри, то максимальный ток у нас ограничен 50 мА. Всегда берем запас, и берем 35 мА на все 8 светодиодов (что не шибко). Еще к этому добавим быстрое переключение индикаторов. В итоге у нас каждый светит в 12 раз меньше положенного. Доработать можно 12 транзисторами, но оставил я это на потом, т.к. яркости в конечном счете хватило.

Теперь начинается софт:
На распберри пи надо поставить linux. Я поставил минимальный дистрибутив
RASPBIAN JESSIE LITE.
Далее через программу putty подключился к IP малинки, и дальше все через командную строку.
Чтобы было проще работать с GPIO(портами ввода и вывода) есть замечательная библиотека WiringPi.
Как устанавливать её и управлять портами, вы сможете найти много информации в сети, поэтому не буду подробно останавливать на этом.
Дальше надо создать папочку нашего проекта:
cd /home/pi sudo mkdir mouse cd /home/pi/mouse
Дальше открываем редактор и вставляем код с гита. ВАЖНО! Код писал на очень скорую руку!
sudo nano
для выхода из редактора надо нажать Alt+x и сохранить файл с названием blinker.c. Дальше надо обязательно скомпилировать с указанием wiring pi:
gcc -o mouse mouse.c -l wiringPi
Все! Теперь подключаем мышку, вставляем провода и запускаем!
Подключение проводов

// pin number declarations. We’re using the Broadcom chip pin numbers.
const int p21pin = 2;
const int p22pin = 3;
const int p23pin = 4;
const int p24pin = 17;
const int p25pin = 27;
const int p26pin = 22;
const int p11pin = 10;
const int p12pin = 9;
const int p13pin = 11;
const int p14pin = 5;
const int p15pin = 6;
const int p16pin = 13;
const int papin = 8;
const int pbpin = 23;
const int pcpin = 12;
const int pdpin = 20;
const int pepin = 21;
const int pfpin = 24;
const int pgpin = 18;
const int pdppin = 16;
const int butpin = 26;
sudo ./mouse
Автозапуск при загрузке:
sudo nano /etc/rc.local и перед exit 0 дописать две строчки cd /home/pi/mouse sudo ./mouse &
Работать с этой прогой очень просто. по нажатию кнопки мыши или просто кнопки на плате идет обнуление. При долгом нажатии кнопки переходим в режим регулировки DPI. Это важный параметр который задается мышкой и показывает сколько отсчетов мы получим при движении на один дюйм. Соответственно копка на плате и на мышке прибавляет и убавляет DPI. Долго нажимаем, наше значение записалось в файл и надежно хранится до следующей загрузки системы. Для чистоты эксперимента в программе, индикация, получение информации с мышки и кнопка обрабатываются а параллельных процессах.
Дальше самое интересное! Тестирование и результаты!
Какие есть нюансы работы с мышкой:
1. Оси X и Y на моей мышке были не параллельны боковым граням, приходилось для высчитывания реального расстояния пользоваться «пифагоровыми штанами».
2. Разрешающая способность не равно погрешность!
Простым языком — разрешающая способность действительно показывает минимальное перемещение, которое увидит мышка, (отсчеты в компьютере должны быть дискретны минимальной разрешающей способности). А вот что мышка ничего не пропустит, ничем не гарантируется. Можно уменьшить эту величину используя хорошие поверхности (чтобы оптический сенсор мог отслеживать перемещения), использовать небольшие скорости. Но пропуски будут всегда! Для пользователя это означает постоянный уход нуля и непрогнозируемую погрешность измерения.
3. USB HID по которому работает мышь не гарантирует доставку информации в компьютер! То есть неизвестно пропустил ли компьютер какую нибудь информацию с мышки или нет. Вероятность пропажи информации малая, но все же есть.
4. Настройки чувствительности(разрешающей способности) иногда хранятся не в мышке, а в программе для мышки.
5. Тут я сильно зол! Дело в том, что мышку я брал самую крутую из ассортимента Logitech, это самая продвинутая была на тот день модель logitech performance mx. Но какого было мое удивление, когда мышь давала разные погрешности при движении вперед и назад. ЭТО КАК? Поясню для пользователя. Если постоянно двигать мышку назад и вперед, то курсор ощутимо так все снижается и снижается. Это на любых платформах. Приходится периодически поднимать мышку и ставить на новое место. После того, как я заметил это, моя жизнь превратилась в кошмар! #Logitech logitech объясните существенную разницу в погрешностях измерения вперед и назад!
В итоге: недостатки перевесили все плюсы мышки как измерительного прибора. Поэтому проект закрыл и выкладываю для дорогих моих читателей на GeekTimes.
На каких поверхностях может работать оптическая мышка
![]()
Компьютерная мышь — это манипулятор без которого не обойдется ни один офисный работник или геймер. Пользователи не всегда задумываются над тем, на какой поверхности лучше всего перемещать своего «грызуна». А между тем, этот фактор является немаловажным.
Немного истории
Первоначальный облик компьютерной мыши был несколько непривычен современным пользователям, так как прямо в центре «грызуна» находился круглый шарик, который и отвечал за функционал мыши. В начале 80-х годов была создана мышка, которая начинает отслеживать движения пользователя не шариком, а светом. Это была оптическая мышь первого поколения. Второе поколение оптических «грызунов» появилось в конце 90-х годов. Они полностью избавились от шариков, стали намного точнее, практичнее и вообще близки к современным моделям.
Оптическая мышь первого поколения не могла работать на любой поверхности. Для этого был необходим специальный коврик-планшет.
![]()
Поверхность
Принцип работы оптической мыши заключается в подсветке участка поверхности под мышкой специальным светодиодом. В лазерных мышках функцию светодиода выполняет соответственно лазер, хотя в целом принцип работы у обоих типов одинаков. Свет отражается от поверхности, собирается другой линзой и фиксируется миниатюрной видеокамерой-сенсором. Полученная информация (сделанные снимки) передается на специальный микропроцессор и далее уходит на компьютер.
Для работы оптической мыши будет пригодна практически любая однородная поверхность. Такая поверхность способствует эффективной работе датчика мышки, который и приводит в движение курсор на экране. Это может быть, как поверхность обычного компьютерного стола, так и коврика для мыши, которые выпускаются в различных вариантах и из различных материалов (даже из искусственной кожи или металла).
![]()
Ровные или неровные
Конечно для работы мышки желательно использовать ровную поверхность, но что делать, когда ее нет под рукой, а проводить какие-либо манипуляции на мониторе необходимо? В принципе, как было уже сказано, подойдет любая поверхность, например, даже книга, поверхность кожаного кресла или дивана. Проведем несколько тестов, используя вместо привычного коврика, ровную поверхность деревянного компьютерного стола и ручку компьютерного кресла с искусственной кожаной обивкой.
![]()
Возьмем несложную онлайн программу, которая поможет нам проверить, возможно ли совершить на разных поверхностях стандартные клики мышками за отведенное время. Тестировать будем обычную оптическую мышку Oklick, а время теста ограничим 15 секундами. В нашу задачу входит сделать одинаковое количество кликов на той и другой поверхностях за отведенное время. Результаты проведенного теста видны на скринах. Из них можно сделать вывод, что за 15 секунд удалось сделать равное количество кликов правой и левой кнопками, а также двойные клики без срывов и других проблем с сенсором. Однако есть и минус — на кожаной обивке курсор мыши несколько «плавает» по экрану, что делает работу не совсем удобной.
![]()
![]()
Поэтому помимо кликов стоит проверить как будет реагировать сенсор на точность позиционирования. В этом нам поможет небольшая тестовая игра, где нужно успеть за отведенное время попасть по неожиданно возникающим красным кругам. Учитываем, что результат также может зависеть и от быстроты человеческой реакции (для геймеров отличная возможность проверить свои навыки). Как видим из результатов, точность при использовании покатой кожаной поверхности кресла несколько ниже, хотя не стоит забывать, что тесты не дают полноценной картины. Многое зависит от модели мыши и других условий.
![]()
![]()
![]()
Несмотря на то, что оптическая мышь увидела свет еще в 80-х годах, она была недоступна широкому кругу покупателей вплоть до 1999 года из-за высокой цены.
Разноцветные и цветные
Так как сейчас производится немалое количество ковриков разных цветов, то возникает закономерный вопрос о влиянии цветов на работоспособность мышки. Устройство будет работать на ковриках любого цвета, хотя желательно чтобы цвет был однородным. А как мышь будет вести себя на других цветных поверхностях, не предназначенных для ее работы? Небольшой эксперимент показывает, что если действовать мышью на разноцветных листах бумаги (красный, зеленый, белый, желтый), то ведет она себя менее уверенно, но в целом работоспособно.
![]()
Прозрачные, полупрозрачные, зеркальные
Работать на данных типах поверхностей получится не всегда, так как есть риск, что мышка просто не будет слушаться пользователя. Любая поверхность имеет микроскопические, практически не видимые глазу трещины и неровности. Все они освещаются оптическим светодиодом и отбрасывают тени, которые считываются датчиком. На прозрачной или полупрозрачной поверхности данных неровностей может не быть и сенсору просто не за что «зацепиться». Поэтому мышь либо будет стоять на одном месте, либо «плавать» по экрану. Проблему можно попытаться решить с помощью использования матового стекла.
На зеркальных поверхностях мышка ведет себя еще хуже. Она хотя и реагирует на движения, но теряет все свойства манипулятора. Курсор зависает, дергается, и чтобы переместить его с одного угла экрана в другой, нужно изрядно постараться. На практике это будет выглядеть следующим образом. Первый гиф показывает движения курсора по коврику, а нижний гиф по зеркальной поверхности. Если присмотреться, то видно, что на зеркале все-таки можно сделать несколько движений и кликов, но полноценно работать на такой поверхности «грызун» просто не сможет.
Тип сенсора и качество подсветки
Сенсор можно назвать настоящим «сердцем» мышки, так как именно он отвечает за перемещение устройства по поверхности. Соответственно поведение «грызуна» на каком-либо типе поверхности будет зависеть от типа сенсора — оптического светодиодного или лазерного. Лазерный считается более инновационным и способен работать практически на всех поверхностях. Однако, несмотря на плюсы, лазерный сенсор способен собирать бесполезную информацию с поверхности, что чревато потерей точности.
Также немаловажное значение имеет производитель сенсора и другие характеристики. Такие как разрешение датчика dpi (чувствительности мышки), частота опроса (измеряется в Гц) или качество подсветки светодиода.
![]()
Наиболее проверенными брендами будут сенсоры от производителей HERO, Mercury, Pixart. Сенсор как правило имеет красный светодиод из-за большей чувствительности фотоэлемента именно к красному свету и возможности более точной передачи отражаемого света. Считается, что подобными качествами также обладает и зеленый свет. Многие мышки имеют подсветку, в том числе и подсветку RGB, что никак не мешает работе устройства.
![]()
Первая мышь имела всего одну кнопку, хотя ее создатель Дуглас Энгельбарт, хотел сделать еще 5. По одной на каждый палец руки.
Оптимальное использование и рекомендации
Так какая же поверхность будет оптимальной для оптической мыши? Любая ровная и чистая поверхность. Дерево, пластик, искусственная кожа, ткань и т.д. На всех этих материалах мышка будет чувствовать себя вполне уверенно, однако все-таки предпочтительнее использовать поверхности специальных ковриков или же обычного стола. Это позволит избежать потери чувствительности, срывов сенсора и «плавания» курсора по экрану.
Заранее определите для каких целей вам необходимо устройство: для простой офисной работы или же для игр. Высокие цифры dpi гарантируют быстрое перемещение курсора мыши по экрану, но в тоже время это может создавать серьезные неудобства, особенно в процессе игры. Для комфортной работы оптимальным будет значение 800 или 1000 dpi. Нужно периодически очищать рабочую поверхность, нижнюю часть корпуса и ножки мышки, так как грязь, мелкие частицы могут ухудшить перемещение самого устройства и соответственно курсора.