CopyPaste клавиатура своими руками или идеальная клавиатура в мире, где каждая строчка кода уже написана

  • Tutorial
Многие люди, только начинающие изучать программирование, задают вопрос — нормально ли копипастить чужой код? Учитывая, что человек существо ленивое, а время программиста стоит денег — ответ, на мой взгляд, очевиден — да. Но людям, которые доводят этот принцип до абсурда, которые копируют не думая и не разбираясь, а еще тем, кто пишет диплом, реферат именно таким и посвящается эта клавиатура и статья. И да, эта клавиатура содержит ровно две кнопки — copy и paste.

image

Под катом будет рассказ о сборке и прошивке — даже дребезг логическим анализатором посмотрим

Итак, я принял решение собрать эту клавиатуру. Начать решил с компонентов — digispark(маленькая платка с attiny85 и обвязкой для usb, которую можно вставить прямо в компьютер) пусть отлавливает нажатия и эмулирует клавиатуру. Теперь кнопки — нормальных механических кнопок для клавиатуры у меня нет, а ждать не хочется, поэтому возьмем тактовые smd кнопки. Вот такие:

Кнопки


Определились с компонентами, теперь нарисуем лицевую панель, чтобы в дальнейшим распечатать на принтере. Размеры 45mm * 21mm, размеры накладок на кнопики 10mm* 10mm
Что-нибудь напишем вверху и внизу.

Получилось как-то так:



Следующая проблема — кнопки smd, значит их надо впаять на какую нибудь плату. Так как травить плату ради такого дела не имеет смысла — процарапаем текстолит буквой T:



Расстояние между центрами кнопок — 15mm. Припаяем их на импровизированную плату.

Паяем три провода. Когда кнопка будет нажата она будет замыкать один из крайних проводов на центральный.



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

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



Вот так, с помощью нехитрых приспособлений можно сделать клавиатуру с двумя кнопками, НО ЗАЧЕМ?


Три провода подключаем в digispark.



Схема «клавиатуры»



Далее нам надо заставить digispark притвориться клавиатурой и по нажатию на кнопку отправлять СTRL+C/CTRL+V.

Итак, нам надо отловить нажатие. Начнем с того, что если центральный провод подключить к +5V, а боковые провода подключить к пинам, настроенным на вход, то при нажатой кнопке, да, на пине будет 1, но при ненажатой пин будет ловить помехи и не получится отследить, что есть нажатие, а что помеха. Решается такая проблема удивительно просто — нужно подтянуть через резистор большого номинала ( десятки кОм) пины к земле. Открыв даташит на микроконтроллер можно увидеть, что внутри него можно включить подтяжку, но только к VCC(+ питания). Собственно, это не проблема — требуется всего лишь подключить центральный пин к GND(земле) и инвертировать логику работы.

Представить можно так:



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



Но так же неинтересно! Может у нас и нет никакого дребезга. Чтобы это узнать я расчехлил логический анализатор. Сейчас и посмотрим… Собираем тестовую установку — подтяжка 10 ком, 16 миллионов измерений в секунду

Установка


Видим что нажатие длилось 0,1176 ms



Приближаем момент отпускания кнопки(выделено красным)



Сбоку есть некоторые измерения «выбросов», а всего дребезг длился около 0,1435ms. Да я знаю, это мало, но стоит учесть что у меня кнопки только из ленты, контакты еще не успели окислиться или изменить форму. А со временем ситуация будет только ухудшаться. Как же бороться с дребезгом? Есть три основных способа:

  1. Триггер Шмидта + RC-цепь — позволяет получить идеальный сигнал
  2. RC-цепь — позволяет сделать из выбросов горку(плавно возрастающий сигнал)

Но у нас же целый микроконтроллер — и поэтому нам доступен 3 способ: задержки
Один из способов «в лоб» бороться с дребезгом это проверять, все еще нажата ли кнопка через время, заведомо большее дребезга. Если реализовывать через задержки то код будет блокирующий, но как это делается правильно можно посмотреть в сотнях статей про борьбу с дребезгом и arduino.

Итак, поняли мы, что кнопка нажата — что же дальше? Сказать компьютеру, что нажато CTRL+C/V.

Делается это с помощью стандартной библиотеки для digispark'a.

Итоговый код вышел таким:

#include "DigiKeyboard.h" // library for emulate keyboard
#define COPY 2 // copy button pin
#define PASTE 0// paste button pin
#define GND 1// center must be connected to ground
void setup() {
  pinMode(COPY, INPUT); // set pin to input
  digitalWrite(COPY, HIGH);// turn on pullup
  pinMode(PASTE, INPUT);
  digitalWrite(PASTE, HIGH);
  pinMode(GND, OUTPUT); // set pin to output
  digitalWrite(GND, LOW);// and set on pin GND
}


void loop() {
  // if something COPY or PASTE clicked
  if (!digitalRead(COPY) || !digitalRead(PASTE)) {
    delay(30); // wait(debounce)
    if (!digitalRead(COPY)) { // if copy still pressed send CTRL+C
      DigiKeyboard.sendKeyStroke(KEY_C , MOD_CONTROL_LEFT);
      delay(30);
    }
    else if (!digitalRead(PASTE)) {// if paste still pressed send CTRL+V
      DigiKeyboard.sendKeyStroke(KEY_V , MOD_CONTROL_LEFT);
      delay(200);
    }
  }
}

Вот такой проект за 3 часа у меня получился. Не бойтесь копировать чужой код!

Copying and Pasting from Stack Overflow

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

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

    +2
    Избыточно, ИМХО.
    Достаточно было бы одной клавиши.
    Первое нажатие — КОПИРОВАТЬ, второе нажатие ВСТАВИТЬ.
    Если хочется задействовать третий вывод — повесить на него светодиод зелёный.
    Пусть загорается после операции КОПИРОВАТЬ, индицируя наличие данных в буфере обмена.
      +7
      А если надо в несколько мест вставить?
        +4
        Или скопировал не то.
          +2
          Ну например в линуксе, достаточно выделить текст, а потом в нужном месте нажать колесико мыши)
            +3
            все верно. только не в линуксе, а в иксах. и не в любом месте, а там, где иксы явно управляют отрисовкой текста.
              0

              Не, не только в иксах. gpm позволяет даже в менюшки mc в консоли мышью тыкать. Ну и копипаст тоже работает. Помнится, лет 12 назад вполне себе сносно обходился вообще без иксов. Причём с аськой, браузером и фильмами

              0
              Удобнейшая фича.
            0
            Длинное нажатие.
            Данные вставляются но остаются в буфере.
            Следующий вопрос?
            +6

            Не. Лучше нажал кнопку -> ctrl+c. Отпустил -> ctrl+v. Drag and drop на стероидах)

              +2

              "Вставить" можно на ножную педаль (футсвич)

            +2
            Прикольная Приблуда.
            ИМХО, ее надо вставлять внутрь мыши, например под большой палец.
              +1
              Уже есть много мышей, у которых под большим пальцем как раз две кнопки, обычно настраиваемые через ПО мыши.
                0

                Они ж "вперёд" и "назад".

                  0
                  Переназначить.
                    0

                    А "вперёд" и "назад" куда деть? Они ж часто даже важнее копипасты.

                      0
                      Есть два модификатора — Shift и Ctrl, есть мыши с 4-5 дополнительными кнопками, есть жесты мышью (в браузере либо средствами драйвера мыши).
                        +1

                        У меня на мыше так настроено — под большим пальцем 3 кнопки: ctrl, shift, alt. А копипаста на качалке колесом мыши влево/вправо.

                        0

                        В редакторе кода длина строки обычно ограничена, и горизонтальный скроллинг не требуется — так что просто вешаем в том же драйвере мыши для IDE профиль где наклон колёсика мышки влево (к примеру) забинден на CTRL+C, а вправо — на CTRL+V — и всё, пользуемся.

                          0

                          Странно, я эти кнопки вообще не использую. А можете раскрыть секрет, зачем они нужны? Я в браузере обычно только в новой вкладке всё открываю, поэтому пользуюсь почти только средней кнопкой мыши и Ctrl+W. Ну ещё tab, shift+tab. Да и кнопка назад на интерфейсе тоже недалеко. А в редакторе кода они вроде бы и не работают (только что попробовал в pycharm, там не работает, там Ctrl+alt+arrow только). Поэтому у меня на мыши как раз копипаст и переназначен.

                            0
                            Я и в браузере активно использую и в редакторе кода, который у меня почти такой же как и у вас — PhpStorm. Они там прекрасно работают при навигации по коду. Я так к этому привык, что становится очень тяжело использовать мышь без кнопок навигации.
                    0
                    Лучше вставлять в место боковых клавиш
                      0
                      Есть жесты мышью (при помощи специальных программ типа Just Gestures): зажал ПКМ, потянул вверх, отпустил ПКМ – скопировалось, то же самое только вниз – вставилось. Очень удобно и быстро, пользуюсь уже много лет.
                      +3
                      Есть три основных способа:
                      1. Триггер Шмидта — позволяет получить идеальный сигнал
                      2. RC-цепь — позволяет сделать из выбросов горку(плавно возрастающий сигнал)

                      эм, и как одним триггером Шмитта дребезг убрать?

                        0
                        Конечно вы правы — триггер Шмидта сделает фронты после RC цеопчки вертикальными. Сейчас исправлю.
                        +2
                        Можно дальше развивать идею, прикупив все таки переключатели и получив что-то такое =)
                        По запросу two key keyboard
                        image
                          +1
                          или приспособить гоночные педали для PC =)
                            +1
                            Помнится, в прошлом веке фидошный товарищ читал ньюсы за тарелкой супа, переназначив в линуксе педаль джойстика на пробел :-)
                              0
                              Нюансы: это был не суп, а борщ, и педаль не джойстика, а MIDI :)
                                0
                                (посыпая голову пеплом): мда… хорошо, хоть вообще помню :-)
                                А что, борщ — это не суп? Для меня это открытие.
                          +4
                          Можно дальше развивать идею…

                          педали ctrl+c, ctrl+v?

                            +1

                            Лет 10 назад меня на работе девочки просили придумать такую педаль, но на эскейп. В автокаде это наиболее часто используемая кнопка. Жаль, тогда не было этой статьи

                              +1
                              Так ведь даже тогда была куча контроллеров с USB, просто USB микросхемы, софтовый USB на авр. В самом крайнем случае можно на PS/2 сделать педаль, а клаву USB. А уж PS/2 реализовать так вообще как два пальца. При небольшом желании, т.к. в ps/2 (в отличие от usb) девайс генерирует события, на совсем любом контроллере собрать прокси с дополнительной кнопкой…
                              В общем нечем здесь гордиться «просили,…, жаль не было этой статьи»…
                                0
                                Можно без всяких знаний просто раздербанить самую дешёвую готовую клавиатуру. Самым сложным тогда будет найти пару контактов, отвечующую за Esc.
                              0

                              vim педаль

                                0
                                Про Vim педали тут.
                                И до сих пор не реализованные идеи тут.
                                –7
                                на хабре сейчас парад статей «сделай сам бесполезную вещь» что ли?
                                Сначала игра snake с помощью паяльника, потом сборка 486 из компонентов, теперь огромная статья про то, как проводами соединять кнопки с ардуиной (digispark можно считать упрощенной версией ардуины)… А что дальше? Статья о том, как спаять кабель для связи пк с монитором?
                                  +6
                                  В змейке всё таки неплохой технический уровень, если речь идёт об этом
                                    0
                                    на хабре сейчас парад статей....

                                    А какие статьи Вы любите?
                                    И о чем Вы пишите?
                                      0
                                      ну, например, мне тут попадалась статья про экраны из лепестков с сервоприводами. К ней еще бонусом в комментариях добавили ссылку на канал про гибкие магниты
                                        0
                                        Вы имеете ввиду умные пайетки (https://habr.com/ru/post/502318/), да, согласен, весьма интересная тема.
                                          0
                                          Но что же там хорошего? Здесь поделка, хоть и примитивная, но имеющая и право на жизнь при чуть лучшем исполнении, и потенциал для расширения. А активные паетки — тупиковая идея для предлагаемой аппаратной платформы. А лучшую предложить сложно.
                                      0
                                      Нужно всё же 3 кнопки минимум — для журнала буфера обмена )
                                        0
                                        Сначала 2 кнопки, потом третью, потом четвертую, а в конце будет вторая настраиваемая навороченная программируемая клавиатура, а обычную использует для совсем редких кнопок.
                                        +1

                                        Для macOS нужно предусмотреть переключение на Command-C и Command-V

                                          +2
                                          Проблема с данным микроконтроллером в том, что после запуска системы его надо перегрузить/переткнуть. Я делал на нем регулятор громкости по инструкции и этот нюанс оказался весьма неприятным при использовании :(

                                          image
                                            0
                                            Можно использовать atmega32u4(arduino pro micro), под stm32f1 плату сделать и так далее. Может быть это из-за загрузчика, тогда есть смысл попробовать прошить программатором.
                                              0
                                              Скорее всего проблема конкретно на вашем оборудовании. Год уже пользуюсь таким девайсом — при перезагрузке не отваливается.
                                                0
                                                Возможно в организации подачи питания на usb-порты на матери. Насколько я знаю, загрузчик пять секунд ждет подтягивания Reset, и если его не случилось, то выполняет программу. У меня платка после старта компьютера висела в режиме ожидания заливки прошивки, т.е. как будто подтянули пин. Может там подтягивающий резистор надо на этот пин.
                                                0
                                                KV-300H? )
                                                  0
                                                  Конечно. Она популярная.
                                                +2
                                                Вместо:
                                                  pinMode(COPY, INPUT); // set pin to input
                                                  digitalWrite(COPY, HIGH);// turn on pullup
                                                

                                                Начиная с Arduino 1.0.1 лучше использовать:
                                                pinMode(COPY, INPUT_PULLUP);
                                                

                                                Источник: www.arduino.cc/reference/en/language/functions/digital-io/pinmode
                                                  0

                                                  Ну-у-у, если сделать на синих свичах, будет норм. А так получается на любителя...

                                                    0

                                                    Лучше сделать, как в нормальной клавиатуре. Не понимаю, почему людям нравятся механические клавиатуры.
                                                    Они очень шумные.

                                                      0

                                                      Вы говорите так как будто это плохо. А это не так. В первых не так уж и шумные. И во вторых — мне например шум синих переключателей нравится — релаксирует и успокаивает.


                                                      Но все-же, все-же, звук buckling spring лучше.

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

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