Комп'ютерна мишка як точний датчик

Завдання: швидко зробити датчик лінійного переміщення з комп'ютерної мишки.
У звичайних мишках ховається високочутливий оптичний датчик. Там ховається своя маленька «камера» і процесор обробки, який відстежує пересування найменших точок на поверхні. У топових мишках роздільна здатність становить всього 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
Як встановлювати її і управляти портами, ви зможете знайти багато інформації в мережі, тому не буду детально зупиняти на цьому.

Далі треба створити папочку нашого проекту

Усе! Тепер підключаємо мишку, вставляємо дроти і запускаємо!

Комп'ютерна мишка як точний датчик

// 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;

Автозапуск при завантаженні:

Працювати з цією програмою дуже просто. після натискання кнопки миші або просто кнопки на платі йде обнулення. При довгому натисненні кнопки переходимо в режим регулювання DPI. Це важливий параметр який задається мишкою і показує скільки відліків ми отримаємо при русі на один дюйм. Відповідно копка на платі і на мишці додає і збавляє DPI. Довго натискаємо, наше значення записалося в файл і надійно зберігається до наступного завантаження системи. Для чистоти експерименту в програмі, індикація, отримання інформації з мишки і кнопка обробляються а паралельні процеси.

Далі найцікавіше! Тестування і результати!
Які є нюанси роботи з мишкою:
1. Осі X і Y на моїй мишці були не паралельні бічних гранях, доводилося для вираховування реального відстані користуватися «піфагорових штанами».
2.Разрешающая здатність не дорівнює похибка!
Простим мовою-роздільна здатність дійсно показує мінімальне переміщення, яке побачить мишка, (відліки в комп'ютері повинні бути дискретні мінімальної роздільної здатності). А ось що мишка нічого не пропустить, нічим не гарантується. Можна зменшити цю величину використовуючи хороші поверхні (щоб оптичний сенсор міг відстежувати переміщення), використовувати невеликі швидкості. Але пропуски будуть завжди! Для користувача це означає постійний догляд нуля і непрогнозовану похибка вимірювання.
3. USB HID за яким працює миша не гарантує доставку інформації в комп'ютер! Тобто невідомо пропустив комп'ютер якусь інформацію з мишки чи ні. Імовірність пропажі інформації мала, але все ж є.
4. Налаштування чутливості (роздільної здатності) іноді зберігаються не в мишці, а в програмі для мишки.
5. Тут я дуже злий! Справа в тому, що мишку я брав найкрутішу з асортименту Logitech, це сама просунута була на той день модель logitech performance mx. Але якого було моє здивування, коли миша давала різні похибки при русі вперед і назад. ЦЕ ЯК? Поясню для користувача. Якщо постійно рухати мишку назад і вперед, то курсор відчутно так все знижується і знижується. Це на будь-яких платформах. Доводиться періодично піднімати мишку і ставити на нове місце. Після того, як я помітив це, моє життя перетворилося на кошмар! #Logitech logitech поясніть істотну різницю в погрішності виміру вперед і назад!