Педалируем Vim

В этом посте пойдёт речь о широко известной в узких кругах педали для переключения Vim из Normal mode в Insert mode и обратно. Вдохновившись примерами подобных поделок на просторах сети, я решил сделать свой вариант, с преферансом и поэтессами.

Задача
Сделать педаль, представляющую собой USB HID-устройство, при нажатии и удержании которой печатается i, а при отпускании Esc.

Решение
Заказать китайскую педаль PCsensor USB footswitch и запрограммировать её соответствующим образом.



В теории всё кажется очень простым. Я заказал одну обычную USB-педаль, одну тройную педаль и одну механическую педаль с кнопкой без контроллера. Как только я получил посылку с педалями — сразу же столкнулся с суровой реальностью. Я не учёл того, что педаль PCsensor может работать только как одна клавиша. Это годится только для очень примитивных решений. Для нашей задачи необходимо наличие как минимум двух клавиш, причём, срабатывающих от разных событий. Это уже не говоря о том, что софт для программирования педалей доступен только под Windows. Под Mac и Linux педаль практически бесполезна, если вы не способны написать драйвер для конфигурирования этого устройства самостоятельно.

Александр Левчук, разработкой которого я вдохновился, использовал грубый хак — он взял два оптических датчика от двух педалей и засунул их в один корпус. Один датчик срабатывает при нажатии и запрограммирован на i, а другой запрограммирован на генерацию Esc при отпускании. А поскольку каждый датчик — это самостоятельный USB HID-контроллер — его устройство занимает сразу два USB-порта компьютера! Плюсов от такого решения немного — для получения одной Vim-педали потребуется две обычных педали PCsensor, зато не нужно городить свой собственный контроллер.

Теперь, когда проблема изучена, можно приступить к решению. Итак: одна педаль, один датчик, один USB-провод и один контроллер, умеющий прикидываться USB HID-устройством. Искать даже ничего не пришлось. Я давно увлекаюсь Arduino и микроконтроллерами. В линейке плат Arduino есть версии Leonardo на базе ATmega32u4 и Due на базе ARM-чипа Atmel SAM3X8E Cortex-M3, которые умеют работать как периферийное USB-устройство. Однако, обе платы слишком большие и их функции явно избыточны для нашей простой задачи. Начал искать микро-версии этих же плат.

Уже не помню какими путями наткнулся на решение DF Robot Beetle и его китайский клон на dx.com. Цена вопроса — около 10 долларов. Было решено заказать сразу три штуки.

Как видно на фото, контроллер имеет очень маленький размер, уменьшенное (по сравнению с Arduino) число контактов и никаких лишних выступающих элементов. При этом он обладает совместимостью с Arduino на программном уровне. Таким образом, я не только избавился от избыточности классической Arduino-платформы в пользу необходимой и достаточной компактности, но добавил новые фичи, свойственные этой платформе.

Всё! Осталось подсоединить к контроллеру оптические датчики педали, написать прошивку и аккуратно собрать устройство в корпус. Я просто подпаял уже существующий оптический сенсор педали к одному из входов Arduino (в данном случае D9). Нашёл на плате педали + и , соединил их с Arduino и вывел сигнал от фотодиода на цифровой вход. На всякий случай отрезал заводскую микросхему-каплю на плате педали, чтобы не давала ложных сигналов.

К сожалению, я не буду расписывать здесь на множество экранов, какой проводочек куда подпаять, потому что это рискует закончиться тем, что мне придётся рассказывать, как включить паяльник и где купить олово. Для людей, умеющих пользоваться паяльником, всё довольно просто и очевидно.

Железо

  • USB Foot Switch (PCsensor).
  • DF Robot Beetle, известный также как Jtron Beetle.
  • Паяльник, опыт его использования и сопутствующие материалы.
  • Набор проводочков.
  • MicroUSB-шнур.
  • Софт

  • Педаль для Vim совместима с любой операционной системой, в которой работает USB-клавиатура и собственно Vim.
  • Для прошивки контроллера понадобится Arduino IDE. Эта оболочка запускается на трёх основных системах — Windows, Mac и Linux.
  • Исходный код прошивки. Просто откройте код в Arduino IDE, скомпилируйте и прошейте контроллер.
  • Для расширения возможностей педали и для реализации функций мыши — воспользуйтесь библиотекой Mouse and keyboard.
  • Принцип работы прошивки до неприличя простой. Проверяется наличие сигналов на 9 выводе контроллера (переменная buttonState). Если сигнал меняется с 0 на 1 — педаль нажата, посылаем Esc, i. Если сигнал меняется с 1 на 0 — педаль отпущена, посылаем Esc. Наверное, не нужно объяснять, что перед i я тоже посылаю Esc для выхода из уже включенного режима Insert.

    Сборка

  • Первый прототип. На фото слева — Arduino-контроллер, справа — плата контроллера и датчиков PCsensor. Три провода — это плюс, сигнал и общий. Нижний красный — плюс, верхний красный — минус, синий — сигнал.
  • Здесь мы пропускаем процесс прошивки контроллера при помощи Arduino IDE — это общее место. Исходник программы доступен. Для прошивки выбираем в настройках плату Leonardo и соответствующий USB-порт.
  • Попытка предварительной сборки педали с новым контроллером.
  • На удивление, всё заработало сразу и не потребовало наладки. Чуть не забыл сказать. Для сборки конструкции нам понадобится штекер разъёма microUSB, к которому я припаял штатный длинный шнур от педали. Для людей, умеющих держать в руках паяльник, модификация шнура не должна стать проблемой.
  • Внешний вид готового решения.
  • Демонстрация

    Дополнительные особенности
    Стоит перечислить неочевидные особенности моего решения:

  • Можно менять логику работы педали на лету, не отключая и даже не доставая педали с её места.
  • Добавлять ввод целых строк и кусков текста.
  • Использовать почти все программные возможности Arduino (но не забываем об ограниченности внешних контактов на плате).
  • Можно написать софт на стороне компьютера, который будет пересылать контроллеру контекст приложения, а педаль будет изменять режим работы.
  • Можно добавить простейшую пищалку, размером с таблетку, чтобы добавить звуковую индикацию (например, для слабовидящих).
  • Можно настроить педаль так, чтобы она исполняла функции мыши. Причём, не ограничиваясь только мышиными кнопками.
  • И наконец киллер-фича — легендарный мигающий светодиод Arduino! (в данном проекте не используется)
  • Что дальше?

  • Дальше хотелось бы собрать трёхпедальную версию устройства. Может быть тоже для Vim, может быть для других приложений (Sublime Text, Atom). Для такого решения также понадобится всего один Arduino.
  • Bluetooth-версию педали можно реализовать на контроллере Bluefruit EZ-key. Честно говоря, я на нём и хотел сделать педаль изначально. Представляете, как офигенно было бы иметь беспроводную педаль! Но увы, из-за проблем с доставкой в Россию, эту деталь практически невозможно заказать ни на Adafruit, ни на Amazon (я узнавал). Если кому-то удастся это сделать — обязательно напишите мне.
  • Ссылки

    В комментариях принимаются идеи по дальнейшему развитию проекта. Спасибо за внимание!

    Оставить комментарий