воскресенье, 20 февраля 2011 г.

Arduino: как подключить энкодер к PC

Здесь находится описание и видео процесса подключения к компьютеру датчика угла поворота через Arduino и USB-порт. Получившийся прототип по принципу своего действия похож на устройство Powermate от компании Griffin


Сегодня рассказываю о том, как сделать из простого механического энкодера устройство ввода для компьютера.

Идея простая: Существует целый класс устройств ввода, которые построены на принципе “ручки громкости”. К компьютеру подключается большая шайба которую пользователь может вращать против, или по часовой стрелке без остановки, тем самым регулируя разные параметры с высокой степенью точности. Таких устройств не очень много и большинство из них находят применение в каких-то сложных программах для видеомонтажа, 3D-моделирования или CAD:
Все эти устройства построены на угол-код преобразователях (энкодерах), которые можно найти в ближайшем радиомагазине. Вот и я во время очередного похода купил себе Bourns PEC11-4215F-S0024 за 124 рубля. Энкодеры различаются в основном по типу устройства (механические, оптические, магнитные и пр.), по выдаваемому сигналу (как я понял, для простейших моделей это код Грея) и по своему разрешению. О последнем подробнее.

Разрешение это количество шагов (сигнальных изменений) которое обеспечивает энкодер за один свой полный оборот. Разрешение сильно зависит от типа энкодера и большая часть устройств находится в диапазоне от 8 до 1000 шагов. Однако, если верить фильтрам магазина DigiKey и чуть-чуть Википедии, то существуют какие-то промышленные монстры с разрешением 6000 шагов и более. Доставшийся вариант имел разрешение в 24 шага. Забегая вперёд скажу, что этого мало.




Подключение не вызвало никаких проблем: Вытащить из ящика старую Ардуину и напрямую подсоединить к ней выводы. Средний вывод энкодера — общая земля. Правый и левый отвечают за сдвинутые по фазе сигналы. Подключить их к 1му и 2му аналоговым входам Ардуино. Кнопку энкодера (да, на ручку этой модели можно нажимать) подключить ко 2му цифровому порту Ардуино через 10 кОм резистор, как рекомендует туториал на их сайте.





Для того чтобы подружить получившуюся железку с компьютером было нужно чтобы прошивка Ардуино, получив сигнал от энкодера, писала данные об изменениях в виртуальный COM-порт через USB.

Естественно, я не первый, кто подключил энкодер к Ардуино, поэтому писать прошивку-сэмпл мне не пришлось и я взял готовую (кстати, в заметке по ссылке много полезного). Поигравшись с delay, скоростью COM, отключив счётчики и включив обработку кнопки я добился приемлемого для прототипа качества опроса. Без реализации акселерации, обработки ложных срабатываний, непредсказуемого флуда в порт и других тысяч важных мелочей.

Осталось написать какой-то приёмник на стороне компьютера который бы открывал нужный COM, парсил приходящие в него данные и на их основе эмулировал нажатия кнопок клавиатуры. Тут всё совсем просто. Получившийся скрипт на Питоне использует модули pySerial для работы с COM и pyWin для эмуляции клавиатуры. Сам скрипт состоит из 3х конструкций if … else и прост ровно настолько на сколько крив.

Итоговый результат вы можете оценить по видеоролику. Я надеюсь, что кому-то этот рассказ поможет решить давно заброшенную задачу, или, наоборот, вдохновит взяться за паяльник, или, на крайний случай, поведает о существовании такого класса устройств, как энкодеры.

7 комментариев: