Педалируем Vim

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

    Задача


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

    Решение


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

    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 долларов. Было решено заказать сразу три штуки.

    DF Robot / Jtron Beetle

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

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

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

    Железо


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


    Софт


    1. Педаль для Vim совместима с любой операционной системой, в которой работает USB-клавиатура и собственно Vim.
    2. Для прошивки контроллера понадобится Arduino IDE. Эта оболочка запускается на трёх основных системах — Windows, Mac и Linux.
    3. Исходный код прошивки. Просто откройте код в Arduino IDE, скомпилируйте и прошейте контроллер.
    4. Для расширения возможностей педали и для реализации функций мыши — воспользуйтесь библиотекой Mouse and keyboard.

    Принцип работы прошивки до неприличя простой. Проверяется наличие сигналов на 9 выводе контроллера (переменная buttonState). Если сигнал меняется с 0 на 1 — педаль нажата, посылаем Esc, i. Если сигнал меняется с 1 на 0 — педаль отпущена, посылаем Esc. Наверное, не нужно объяснять, что перед i я тоже посылаю Esc для выхода из уже включенного режима Insert.

    Сборка


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


    Демонстрация




    Дополнительные особенности


    Стоит перечислить неочевидные особенности моего решения:
    1. Можно менять логику работы педали на лету, не отключая и даже не доставая педали с её места.
    2. Добавлять ввод целых строк и кусков текста.
    3. Использовать почти все программные возможности Arduino (но не забываем об ограниченности внешних контактов на плате).
    4. Можно написать софт на стороне компьютера, который будет пересылать контроллеру контекст приложения, а педаль будет изменять режим работы.
    5. Можно добавить простейшую пищалку, размером с таблетку, чтобы добавить звуковую индикацию (например, для слабовидящих).
    6. Можно настроить педаль так, чтобы она исполняла функции мыши. Причём, не ограничиваясь только мышиными кнопками.
    7. И наконец киллер-фича — легендарный мигающий светодиод Arduino! (в данном проекте не используется)


    Что дальше?


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


    Ссылки




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

    Комментарии 88

      +29
      Зачем?!
        0
        Задался тем же вопросом.
          +9
          Потому что может!
            +3
            Педаль — это как клавиша «шифт» вместо злого «капс-лока», только руки не занимает. С режимами нужно бороться — ну хотя бы так.
              +1
              Да почему вы всегда спрашиваете «зачем»?! Да ни зачем, просто прикольно же!
              +8
              О! А такая педалька может быть полезна во время игр, при общении по микрофону. Особенно когда играешь на геймпаде.
                +68
                Ждём коробку передач для git и руль для emacs.
                  +13
                  Это могло бы быть удобно, просто дорого. У меня вот подключена коробка передач к компьютеру, переключать ветки можно было бы легко с её помощью :)

                  Скажем, коммит hotfixа в уже работающий релиз — 5 передача, в текущий testing — 4, в master — 3, в мою собственную текущую фичу — 2. А зачем нужна первая я ещё не придумал.
                    +10
                    Первая, чтобы ехать
                      0
                      Да ладно первая, придумать бы, зачем нужно сцепление :)
                        +1
                        Нажимаем сцепление — git stash.
                        Отпускаем сцепление — git stash pop.
                          0
                          Не-не-не, это слишком просто! Надо, чтобы как в автомобиле, придумать схему с участием педали газа. А если неправильно педалируешь — чтобы что-нибудь сжечь.
                    +23
                    Хм… Vim на столько суров, что требует педалей для управления?
                    Вот почему у меня с ним никак не получалось нормально работать…
                      +3
                      А между прочим, сама идея педали не так уж и плоха, ведь есть же манипулятор мыш, почему не задействовать педаль? Кстати для доты супер идея.
                        +5
                        Для доты то зачем?
                        Вот в Кваку можно — ходьбу повесить на педаль, и/или приседания.
                        Или даже повесить на педаль прыжок — а на голову Окулус Рифт =)
                          0
                          Лично я плохо умею пользоваться клавиатурой в доте, например (и судя по всему, встряли когда-нибудь действительно научусь), т.е. у меня WASD для движения карты, мышка для контроля.
                          У среднего перса 2-3 активные способности. Было бы удобно прожимать способности ногами (отличный пример сларк), так как водительская привычка у меня уже есть.
                            +1
                            2-3 активные способности, 2-3 активируемых итема, миньоны.
                            Учитесь пользоваться клавиатурой, педалей на все не хватит.

                            Хотя для фортификейшена или курьера, можно.
                              0
                              Педаль подошла бы для способности, которая зависит от направления обзора юнита. Это прыжок у Сларка и еще нескольких героев.
                                0
                                Или же ненаправленных способностей — стун у Слардара или Шейкера будет просто отлично «ощущаться».
                                  +1
                                  Для липа потмы отлично бы подошла. Или дагер-аута.
                        +5
                        Не хватает дворников на экран ноутбука
                          +4
                          Следующим шагом должно быть подключение midi-клавиатуры.
                            +1
                            … и статья о том как сделать из vim редактор партитуры?
                              +12
                              image
                                +6
                                Чтобы так делать обязательно наличие бороды и длинных волос.
                                  +10
                                  Или просто открыть сайт hackertyper.com/ (жми F11 для пущего эффекта).
                            +14
                            Лучше бы показали на видео, как Вы в принципе на Вим работаете. Никогда не видел, хочу посмотреть.
                              0
                              Сделано на заказ, не себе. Ограничиваюсь быстрой правкой в Vim.
                                0
                                Сможете еще сделать одну на заказ?
                                  +1
                                  Легко. Но долго ждать посылок. Контроллеры ждал больше месяца.
                                    +2
                                    Не проблема. Написал в личку
                              0
                              один из самых полезных маппингов

                              " <CR> in NORMAL mode switch VIM to INSERT mode nnoremap <CR> a
                                0
                                " <CR> in NORMAL mode switch VIM to INSERT mode
                                nnoremap <CR> a
                                
                                
                                +2
                                О, интересно, а такой набор педалей можно подружить с каким-нибудь GuitarRig или чему-нибудь такому?
                                  +16
                                  offtop
                                  Приходит программист к пианисту — посмотреть на новый рояль. Долго ходит вокруг, хмыкает, потом заявляет:

                                  — Клава неудобная — всего 84 клавиши, половина функциональных, ни одна не подписана, хотя… шифт нажимать ногой — оригинально
                                    +1
                                    Если все верно понял, достаточной было обычной педали (~150р на али)?
                                      +1
                                      300+ стоят там педали usb
                                        +3
                                        Если я все верно понял, HID-девайс организует прошивка в ардуино, т.е. нам не нужна usb педаль, берем обычную — простой выключатель за 150р
                                          +1
                                          Можно за 150, на первом фото внизу слева такая. Специально взял ради интереса. Там обычный механический микрик и штекер миниджек. Экономия сомнительная.
                                          Лишний механический звук, который со временем достанет, и необходимость распаивать новый USB-шнур. Но как вариант — да.
                                      +3
                                      Всегда удивляли подобные модификации, ибо садишься за комп товарища отлаживаться и… <Музыка из ералаша>!
                                      Это же касается изогнутых клавиатур (или вовсе с другой раскладкой).
                                        +3
                                        Хорошо, что мы все разные и живём не в инкубаторе (хотя для некоторых последнее слово имеет другой смысл :).
                                          0
                                          Не надо путать свободу индивидуальности и пренебрежение стандартами, мой друг)
                                            +1
                                            Какие могут быть стандарты на «мне так удобнее»? К коллеге за комп — со своей клавиатурой можно, к примеру.
                                        0
                                        Расскажите про эту педальку, насколько она удобна, какое усилие требуется для переключения?
                                          0
                                          Усилие не измерял, но на глаз 3-5 Ньютонов. Пользовать удобно, главное нащупать её ногой под столом. Дело привычки.
                                          0
                                          Вопрос: Зачем железо если это решаемо с помощью макросов? Например, майкрософтовские ПО поддерживают подобные настройки: «Запись нескольких событий за один раз», со сторонними устройствами на вскидку работает mkey.
                                            +1
                                            Наверное, потому, что на макбуке не используется windows, да и решение с железом поуниверсальнее будет?
                                              +1
                                              Решаемо что?
                                              Взять педаль как есть и повесить макрос на неё?
                                              Не надо забывать, что что педаль — это просто клавиатура из одной клавиши. Держать её нажатой, выполняя какое-то действие, не получится. Она просто будет генерировать 100500 символов.
                                              Переключать режимы одиночными нажатиями? Уж лучше руками тогда «i — Esc — i» и макросы не нужны.
                                              Задействовать функциональную клавишу с макросом обычной клавиатуре? См. выше.
                                              Городить клавиатурные макросы на стороне ОС (особенно под Linux) — сомнительное удобство.

                                              Вот готовое решение, подключил и работай.
                                                0
                                                Почему не получится? Не знаю, как для педали, а для обычной клавиатуры события реального нажатия и отпускания клавиш отслеживаются без проблем. Значит, программно можно повесить на эти события что угодно.
                                                  0
                                                  Как выше сказал Riateche события отслеживаются, именно на подобный пример я и дал ссылку, другой вопрос что может действительно в маках и линуксах всё настолько кардинально отличается от винды, что таковые события не отслеживаются или отсутвует подобное ПО как класс, если да, тогда кристально понятно…
                                                  Ни чуть не умаляю интересность решения, но при этом считаю что ардуино и прочее в вопросе который решается существующим ПО оверинжинирингом.
                                                +3
                                                Педальный Vim
                                                  +1
                                                  Как насчет вот таких педалей? www.quietpc.com/usb-footswitch
                                                    0
                                                    Неплохо, спасибо. Сразу отмечу, что на педалях PCsensor ось наклона находится ближе к программисту, ты нажимаешь её как бы «от себя», а в этих — ось находится с другой стороны. Тут уже индивидуальная эргономика начинается.
                                                      0
                                                      Если будет крайняя заинтересованность в «потестить», то могу дать погонять, у меня есть такая трехкнопочная
                                                        +1
                                                        А если перевернуть на 180 градусов? :D
                                                        0
                                                        А как на счет вот таких? :)
                                                        www.kinesis-ergo.com/products/#foot-section

                                                        // вероятно многие из них (если не все) не-USB, но всё же…
                                                        +3
                                                        Вот это педаль!

                                                        А для беспедальных vim юзеров есть совет, чтобы также ускорить редактирование:
                                                        перемапить ESC на Caps Lock (котороткое нажатие) и Ctrl туда же: на зажатый Caps Lock.
                                                        На маке это делается с помощью KeyRemap4MacBook + стандартные маковские настройки.

                                                          0
                                                          Хороший, дельный совет. Спасибо.
                                                            +1
                                                            что это дает, не совсем понятно.
                                                              0
                                                              Это волшебное перевоплощение бесполезной клавиши Caps Lock, которая Очень удобно расположена под мизинцем, а также имеет большие размеры, в клавиши ESC и Ctrl одновременно!

                                                              ESC и Ctrl в виме используются ну ооочень часто, а их расположение обычно вызывает только боль в левом мизинце.
                                                                0
                                                                а, понял, спасибо.
                                                                у меня на капсе изменение раскладки — тоже удобно
                                                                  +2
                                                                  От себя рекомендую старый досовский вариант: левый шифт — английский, правый — русский.
                                                                    0
                                                                    А shift как нажимать, если на них переключение раскладки? Или какая-то деталь опущена?
                                                                      0
                                                                      Шифт с альтом. ;)
                                                                        0
                                                                        Одной кнопкой Caps Lock удобнее.
                                                                          0
                                                                          А вот нифига. Когда у тебя одна кнопка, то тебе нужно сначала (1) узнать, какая сейчас раскладка, (2) решить, нужно ли нажимать кнопку/кнопки, (3) нажать эти кнопки, ну, и, конечно, в особо запущенных случаях, когда используется венда и её глючный родной переключатель, (4) убедиться, что раскладка была переключена и является нужной.

                                                                          Последний этап отсекается либо отказом от венды, либо от её родного переключателя раскладок (я использую свободный keyla).

                                                                          Первый и второй этап отсекается разнесением переключения раскладок на разные комбинации клавиш — на каждую раскладку своя комбинация.

                                                                          Остаётся третий — собственно, удар по клавишам, переключающим раскладку на нужную. У меня на экране, например, вообще индикатора раскладки нет, и теперь я в принципе не понимаю, зачем он нужен, ибо я в любой момент могу, не отвлекаясь на индикатор раскладки ни от поля, куда производится ввод, ни, допустим, от листа бумаги, с которого производится ввод, просто ударить нужное комбо или просто перед вводом текста, или когда я не уверен, что сейчас активна нужная раскладка.

                                                                          Очень, очень, очень удобно.
                                                                          (к слову, это родной механизм переключения раскладок в IBM OS/2)
                                                                        +1
                                                                        Еще раз: левый шифт — английский, правый — русский. Т.е это не переключение между раскладками через комбинацию клавиш — это переключение на конкретную раскладку через шифты.

                                                                        Пример: я хочу что-то напечатать на русском, мне не нужно смотреть на значок текущего языка(убрал его из панели), просто жму на правый шифт и точно знаю, что весь последующий текст будет на русском.
                                                                          +1
                                                                          это же state machine, есть «свой» и «чужой» shift, на чужом переключаем раскладку, на своём работает сдвиг регистра :)
                                                                            0
                                                                            ну или проще, но безынтереснее — раздобыть где-то флаг, который показывает, что между нажатием и отпусканием Shift не было других нажатий (то есть отделить одиночное нажатие от нажатия в составе комбинации)…
                                                                  +1
                                                                  Можно и не вешать ESC, Ctrl достаточно. В Vim можно ESC генерировать как Ctrl+[. Поставил с пару месяцев назад, удобно.
                                                                  +1
                                                                  m.chipdip.ru/product/fs-1-15a/
                                                                  В наличии в Москве, и не капитально дороже китайской. Внутри микрик по сути, только мощнее.
                                                                    0
                                                                    гик-порно
                                                                    • НЛО прилетело и опубликовало эту надпись здесь
                                                                        –1
                                                                        1) Точнее, две кнопки, одна из которых генерирует последовательность из двух кодов.
                                                                        2) Плата в педаль не влезет по габаритам.
                                                                        0
                                                                        Игра не стоит свеч.
                                                                        Можно было и дешевле сделать на базе простой педальки (около 100 рублей) и самой дешевой клавиатуры (или поломанной, но с рабочим контроллером). Вышло бы максимум рублей в 250.
                                                                        Ставим два концевичка внутри педали: один в нижнем положении педали (для замыкания i), другой — в верхнем (для замыкания ESC).

                                                                        И никакие МК не пришлось бы покупать (таки тоже деньги — рублей 50 как минимум обойдется сделать платку, напаять МК с гнездом, кварцем и резисторами) и программировать.
                                                                          0
                                                                          В вашей теории всё гладенько, пока не перейдёте к практике.

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

                                                                          Китайцы неспроста используют фотоэлемент для этой цели — нет дребезга и ломаться нечему, механического касания нет.

                                                                          Тот товарищ, про которого я писал, так и сделал. Только вместе клавиатурного контроллера взял два педальных (два, потому что могут работать только с одной «кнопкой»). Но не стал делать переключатели, оставил фотоэлементы. И правильно сделал.

                                                                          Вы же редлагаете купить новую клавиатуру — то есть, опять таки потратить деньги, но чуть меньше (или воспользоваться старой, но рабочей). Получается, надо купить и сломать хорошую вещь, что-то там наколхозить и всё равно это решение будет хреновым. По-русски это называется — из говна и палок.
                                                                          +1
                                                                          Теперь я знаю, как использовать перегоревший процессор эффектов для гитары
                                                                            +1
                                                                            Наконец-то гитаристы в треде!
                                                                              0
                                                                              Жду продолжения о том, как можно вдохнуть вторую жизнь в старый контроллер для Guitar Hero)
                                                                            0
                                                                            Можно сделать педаль сцепления и коробку передач. Будем переключать раскладку при смене передачи. Backspace будет заменять задняя скорость. Тормоз — перевод каретки на следующую строку, акселератор — SHIFT.
                                                                              0
                                                                              Что-то подобное хочу сделать в трёхпедальной версии контроллера.
                                                                            • НЛО прилетело и опубликовало эту надпись здесь
                                                                                +1
                                                                                Неправда ваша.

                                                                                Как это не применимо? Работает? Работает. Режим переключает? Переключает. Эта педаль окупается точно также, как любое другое периферийное устройство. Пишешь код — получаешь деньги. Точно также во времена DOS гики говорили, что не нужна ни мышь, ни Windows.

                                                                                Эта педаль была сделана не себе, а на заказ. Кое-кто заплатил за это денег. Кроме того, многие захотели себе такую же и попросили меня сделать ещё педалей, за деньги.
                                                                                Значит это кому-то нужно. Значит это не только применимо, но и востребовано, и реальный экономический спрос есть.
                                                                                  +2
                                                                                  Точно также во времена DOS гики говорили, что не нужна ни мышь, ни Windows.

                                                                                  Вы так говорите, как будто они неправы.
                                                                                    0
                                                                                    Ладно ещё Windows, но нарисуй-ка электрическую схему в соответствующей программе, не используя мышь.
                                                                                      +1
                                                                                      Помнится, изучал я в институте Автокад на клавиатуре… :)
                                                                                        0
                                                                                        Трекпоинт на лептопе и трекбол на десктопе великолепно покрывают все потребности. :)
                                                                                  0
                                                                                  Все вопросы «Зачем?» задают те, то vim не использовал или не постиг. Автор, отличная идея! Будет время и себе такую сделаю.

                                                                                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                  Самое читаемое