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