- PVSM.RU - https://www.pvsm.ru -

Кнопка раздолбая и педалирование Vim

О кнопке раздолбая я впервые услышал году в 2005-м. Суть устройства была в том, что нажатие спрятанной под ковром кнопки приводило к сворачиванию всех окон на мониторе, дабы внезапно нагрянувший шеф не увидел, чем вы реально занимаетесь на работе. Тогда это позиционировалось как модный гаджет для прогрессивной молодёжи.

Так бы оно и лежало в глубинах памяти, если бы не статья «Педалируем Vim» [1]. А тут как раз на столе валялись несколько аппаратных ключей на AT90USB162, что мы выпускаем для защиты своего софта.

Кнопка раздолбая и педалирование Vim

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

Кнопка раздолбая и педалирование Vim

Итак, наши ключи дополнительных падов под кнопки не имели. Исключение – кнопки Reset и HWB, что необходимы для запуска штатного butloader для прошивки через USB. Да-да, программатор не нужен, нужна только программа Flip от Atmel. [2] Все чипы с завода прошиты штатным butloader.

Reset никак не использовать, а вот HWB в обычном режиме – просто порт PD7 и его можно использовать по желанию. Справедливости ради замечу, что ограничений на число педалей нет. В случае переделки платы или покупки готовой платы в китае [3], число педалей можно увеличить до двух десятков (у «китайца» выведен 21 пад).

В тексте выше, кстати, ответ на 3 вопроса будущих комментариев:

1. Почему на AVR?
2. Почему не ардуина?
3. Почему только одна кнопка?

Итак, за основу был взят атмельский пример HID клавиатуры на МК серии AT90USB***. Он подробно описан в апноте «AVR271: USB Keyboard Demonstration [4]» (тут перевод [5]) и останавливаться на нём я не буду. Пример этот может быть скомпилирован как под GCC, так и под IAR, я использовал IAR, версии 6.3.3.1990.

Для обработки нажатия педали прерывания не используются – практика показала, что скорости простого поллинга более чем достаточно даже с учётом антидребезговых задержек. Вся полезная работа – поллинг и отправка запроса – происходят в файле keyboard_task.с. Функция kbd_test_hit(); проверяет нажатие единственной кнопки (педали) HWB (PD7) на предмет нажатия или отпускания, keyboard_task(void) отправляет сформированный запрос в ПК. А что именно отправлять, keyboard_task узнаёт из eeprom.

Мы заботимся о наших клиентах, поэтому сделали так, чтоб изменение/добавление комбинаций было максимально удобным и не вынуждало юзера устанавливать IAR и пересобирать код. Юзеру всего-то надо вручную поправить hex-файл eeprom!

В приложенном к статье архиве три файла eeprom с комбинациями Win+D, Alt+Tab и i/Esc для Vim (за последний не уверен, не проверял в железе). Но если этого мало, то открываем файл в блокноте. Видим следующее:

Кнопка раздолбая и педалирование Vim

Выделенные 13 байт, это и есть наша посылка. Структура их такова:

Кнопка раздолбая и педалирование Vim

Первый байт определяет, будем мы реагировать только на нажатие (0x00) или ещё и на отпускание (0x01) педали. Далее идут 3 пары байт посылки на нажатие и 3 пары байт посылки на отпускание. Пара байт, это байт модификаторов и байт, собственно, кода кнопки. В байте модификаторов каждый бит соответствует нажатию одной кнопки модификатора (Ctrl, Alt, Win etc.). Если мы хотим передать сразу несколько модификаторов (например, Ctrl+Shift) – устанавливаем несколько бит в байте, соответствующих этим модификаторам. Все коды клавиш и модификаторов наличествуют в файле usb_commun_hid.h. или их можно найти в инетах [6].

Программа МК проигрывает запись из eeprom аки магнитофон в порт USB, поэтому что туда вставлено, то и будет отправлено ОС без коррекции. Не нужные байты заменяем нулями – код 0x00 означает «no_key» и ОС его не воспринимает. Позже я подумал, что первый байт, определяющий реакцию на нажатие, в общем-то, и не нужен, достаточно забить не нужные пары байт нулями, но менять что-то было уже лень. Сделаю при условии всемирного успеха конструкции.

Итак, вы внесли необходимые коррективы в файл. Теперь надо посчитать контрольную сумму строки. Для этого копируем строку от двоеточия до последнего байта (не включая их), как показано на картинке снизу, и считаем КС, например, тут [7] или руками. Полученный результат заносим в последний байт строки файла eeprom. Сохраняемся. Шьём.

Кнопка раздолбая и педалирование Vim

Инструкций по прошивке флипом в сети море [8], всё стандартно. Тонкость только одна – чтоб прошить eeprom надо сначала прошить flash, иначе никак. В приложенном архиве есть две прошивки flash – для плат с кварцами 8 и 16 МГц. Я рекомендую использовать 16 МГц, особенно, если собираетесь делать много кнопок. Обратите внимание, что китайцы на своих платах перепрошивают чипы своим бутлодырем Teensy Loader (на таких платах есть только кнопка Reset, HWB они не используют) и Flip с ним не работает, у них свой софт для прошивки, но процедура, в общем, схожа.

В архиве под статьёй находятся: исходник проекта, готовые *.hex & *.eep файлы прошивки, рисунок платы в формате SprintLayout5 и гербер файлы в формате кампании oshpark [9], а так же схему в высоком разрешении и разные фоточки.
Ну и конечно же, демонстрейшон.

Где использовать это изделие? На самом деле, много где. Например, в авиасимуляторах, сопоставив тумблеры на панели виртуального самолёта на опр. клавиши клавиатуры, можно соорудить свою собственную приборную панель с железными тумблерами. В играх. В клавиатурах для людей с ограниченными возможностями и т.д.

ПС. Видимо, я ещё не достоин вкладывать вложения, по этому так: yadi.sk [10]

Автор:

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy/68994

Ссылки в тексте:

[1] «Педалируем Vim»: http://habrahabr.ru/post/232177/

[2] Flip от Atmel.: http://www.atmel.com/tools/flip.aspx

[3] готовой платы в китае: http://www.aliexpress.com/item/Free-Shipping-1pc-Teensy-USB-development-board-AVR-MKII-ISP-download-cable-AT90USB162/1988373824.html

[4] AVR271: USB Keyboard Demonstration: http://www.atmel.com/Images/doc7602.pdf

[5] тут перевод: http://microsin.net/programming/avr-working-with-usb/avr271-usb-keyboard-demonstration.html

[6] можно найти в инетах: http://www.mindrunway.ru/IgorPlHex/USBKeyScan.pdf

[7] например, тут: http://www.planetimming.com/checksum8.html

[8] Инструкций по прошивке флипом в сети море: https://code.google.com/p/micropendous/wiki/LoadingFirmwareWithFLIP

[9] oshpark: https://oshpark.com/

[10] yadi.sk: https://yadi.sk/d/1-WeniIBb3zfC

[11] Источник: http://habrahabr.ru/post/235711/