РадиоКот >Лаборатория >Радиолюбительские технологии >

Теги статьи:

Энкодер из оптического датчика мыши Logitech

Автор: Хатуль_мадан
Опубликовано 10.06.2022
Создано при помощи КотоРед.

Немного истории.

Началось все с того, что понадобились энкодеры (валкодеры, кому как нравится) для некоторых самоделок. Механические обладают рядом недостатков, таких как: дребезг контактов, быстрый износ и др. Поэтому, для контроля вращения мотора, например, оптимально подходят оптические датчики. Их выбор невелик. Те, которые в составе имеют пару фотоэлементов (два фототранзистора), и те, которые с цифровым выходом, в основном, от мышек фирмы Logitech. Более навороченные, с фотоматрицами и лазерным считыванием, рассматривать не будем, их цена не для самоделок. Так вот, самый популярный вариант - это со сдвоенным фотодатчиком. Включение простое, настройка легкая, иногда требуется небольшое усиление сигнала, или компаратор, т.к. сигнал аналоговый. При медленном вращении вала на выходе плавно меняющееся напряжение. Со всем можно смириться, но такие датчики стояли в очень старых мышках с шариком. Сейчас таких почти не найти. В наше время пока очень популярны дешевые мышки фирмы Logitech, в которых тоже встречаются оптические датчики (но все чаще применяют механические энкодеры). Беда в том, что много лет не мог найти в сети толкового описания протокола обмена с таким датчиком, все заканчивалось на упоминании двух импульсов при опросе. А недавно вновь понадобился энкодер для модернизации одного устройства, пришлось взять рабочую (но подглючивающую) мышку и самому изучить, что же происходит при опросе оптического датчика. Очень подробно описывать не буду, все материалы во вложениях в конце статьи.

Тестовое включение.

Подопытная мышка Logitech B100. Датчик в ней H6z02, сверху EL. Питание подавал от зарядника телефона +5В. Светодиод матрицы при этом не горит. Распайка датчика: вид сзади, ноги вниз: 1-пин общий, 2-пин +5В, 3-пин выход. Так вот, для того, чтобы увидеть, что происходит в шине обмена с датчиком, понадобился двухканальный осциллограф и небольшая тестовая схемка, на МК типа PIC10F322

Всем управляет контроллер мыши. Периодически от него подается сигнал, чтобы зажечь светодиод, период 200мкС и длительность импульса 25мкС. Так как у PIC10F322 всего три ноги, работающие на выход, то входную RA3 использовал для синхронизации с контроллером мыши. На двух выходных ножках формируем сигнал традиционного инкрементального энкодера (светодиоды в помощь), а еще одна как раз для обмена с датчиком. Почему именно PIC10F322? Потому, что есть и много, наши друзья китайцы прислали по 33р за штуку. Но полноценный энкодер лучше сделать на 8-и ногом МК, типа PIC12F629, или PIC12F683, или на атини, при изменении программы. Исходники программы тоже прилагаются, там ничего сложного нет, переделка под любой МК не займет много сил. Так вот, кратко: после импульсов на светодиод примерно через 130...140мкС начинается опрос датчика, ножка МК настраивается на выход и подается высокий уровень на 2...3мкС, затем на такое же время подается низкий уровень, затем ножка переводится на вход, т.е. этот спад импульса является сигналом датчику на вывод информации, и уже датчик выставляет низкий уровень на шине, если нет вращения, или высокий уровень, если вращение вправо. МК опрашивает шину и фиксирует поворот, если он был. Второй импульс опроса происходит полностью аналогично: МК дает фронт на 2мкС, потом спад на 2мкС, освобождает шину и опрашивает датчик. Если после второго импульса датчик выставил высокий уровень, то вращение влево, если низкий, то вращения нет. Вот и весь протокол обмена. Проверял еще на одной мышке Logitech RX250, и все то же самое, только импульсы с промежутком в 10мкС. Вот картинки, как все проверялось, сам МК на тестовой плате:


И как все цепляется к мышке:


Теперь, некоторые практические размышления. В программе анализируется вращение и преобразуется в код инкрементального энкодера из 4 комбинаций, который выводится на ноги МК, и который, в свою очередь, тоже нужно анализировать еще одним основным МК. Это все отнимает время и усложняет процесс основной программы. Даже если делать полноценную схему на более крупном контроллере (в архиве схема вариант3), то от частого опроса (каждые 200мкС) никто не избавляет. Поэтому появилась идея, раз уж применять маленький МК, то пусть он и занимается сбором информации именно от датчика, а по запросу, например, каждые 10...100мС, можно скидывать накопленное по упрощенному SPI интерфейсу, тогда и ног у PIC10F322 хватает на все, и основной МК не отвлекается на опрос. Вот схема, ничем не сложнее:

Такой обмен может быть организован, или с запросом от основного МК, выставив низкий уровень на шине CLK, или, если энкодер повернули, то на ноге Data выставляем низкий уровень, что служит сигналом о вращении и необходимости обмена. В модели все работает, упрощенно немного, но если дойдет до практического применения, то доработать не сложно.

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

https://radiokot.ru/forum/viewtopic.php?p=1988291#p1988291

Как вставлять видео работы я еще не научился. Если есть вопросы, пишите в ту же ветку форума.


Файлы:
Проверка аналог. энкодера
Исследование протокола обмена
Схемы 3 варианта
Схема энкодера
Фото готового Энкодера
Модели отладки в Prot-8,6
Прошивки и исходники


Все вопросы в Форум.