Задача: быстро сделать датчик линейного перемещения из компьютерной мышки.
В обычных мышках прячется высокочувствительный оптический датчик. Там скрывается своя маленькая «камера» и процессор обработки, который отслеживает передвижения малейших точек на поверхности. В топовых мышках разрешающая способность составляет всего 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/init.d/autostart.sh
Работать с этой прогой очень просто. по нажатию кнопки мыши или просто кнопки на плате идет обнуление. При долгом нажатии кнопки переходим в режим регулировки DPI. Это важный параметр который задается мышкой и показывает сколько отсчетов мы получим при движении на один дюйм. Соответственно копка на плате и на мышке прибавляет и убавляет DPI. Долго нажимаем, наше значение записалось в файл и надежно хранится до следующей загрузки системы. Для чистоты эксперимента в программе, индикация, получение информации с мышки и кнопка обрабатываются а параллельных процессах.
Дальше самое интересное! Тестирование и результаты!
Какие есть нюансы работы с мышкой:
1. Оси X и Y на моей мышке были не параллельны боковым граням, приходилось для высчитывания реального расстояния пользоваться «пифагоровыми штанами».
2.Разрешающая способность не равно погрешность!
Простым языком- разрешающая способность действительно показывает минимальное перемещение, которое увидит мышка, (отсчеты в компьютере должны быть дискретны минимальной разрешающей способности). А вот что мышка ничего не пропустит, ничем не гарантируется. Можно уменьшить эту величину используя хорошие поверхности (чтобы оптический сенсор мог отслеживать перемещения), использовать небольшие скорости. Но пропуски будут всегда! Для пользователя это означает постоянный уход нуля и непрогнозируемую погрешность измерения.
3. USB HID по которому работает мышь не гарантирует доставку информации в компьютер! То есть неизвестно пропустил ли компьютер какую нибудь информацию с мышки или нет. Вероятность пропажи информации малая, но все же есть.
4. Настройки чувствительности(разрешающей способности) иногда хранятся не в мышке, а в программе для мышки.
5. Тут я сильно зол! Дело в том, что мышку я брал самую крутую из ассортимента Logitech, это самая продвинутая была на тот день модель logitech performance mx. Но какого было мое удивление, когда мышь давала разные погрешности при движении вперед и назад. ЭТО КАК? Поясню для пользователя. Если постоянно двигать мышку назад и вперед, то курсор ощутимо так все снижается и снижается. Это на любых платформах. Приходится периодически поднимать мышку и ставить на новое место. После того, как я заметил это, моя жизнь превратилась в кошмар! #Logitech logitech объясните существенную разницу в погрешностях измерения вперед и назад!
Видео демонстрации работы-
https://youtu.be/zVuP0h4cddM
В итоге: недостатки перевесили все плюсы мышки как измерительного прибора. Поэтому проект закрыл и выкладываю для дорогих моих читателей на GeekTimes.
Автор: SergeySavkin