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

от автора

Многие люди, только начинающие изучать программирование, задают вопрос — нормально ли копипастить чужой код? Учитывая, что человек существо ленивое, а время программиста стоит денег — ответ, на мой взгляд, очевиден — да. Но людям, которые доводят этот принцип до абсурда, которые копируют не думая и не разбираясь, а еще тем, кто пишет диплом, реферат именно таким и посвящается эта клавиатура и статья. И да, эта клавиатура содержит ровно две кнопки — 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

ссылка на оригинал статьи https://habr.com/ru/post/502794/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *