Педаль для компьютера на Arduino Digispark

Я рисовал плату в Sprint Layout, когда понял — двух рук для меня мало. Одна держит мышку, вторая прижимает к уху телефон, а третьей как раз бы удерживать кнопку CTRL, чтобы дорожки не привязывались к сетке. Но нет — значит нет. Изогнувшись, зажал телефон плечом и тем самым освободил руку. Проблемка.

На работе установлен Altiun Designer — в нём нужные действия спрятаны по меню и по вкладкам, и «горячие» сочетания клавиш — ну чисто гаммы на пианино! Добавить на плату полигон — P, G. Добавить вертикальную направляющую — P, W, V. Снять выделение — Shift+C. А в редакторе схем свои сочетания, и как назло — самое нужное сделано неудобно. Проблемка.

Финальная миссия GTA IV никак не проходилась. Главный герой прыгает на мотоцикле с трамплина и цепляется за полозья летящего вертолёта. Чтобы залезть в него, игроку надо часто-часто жать пробел, но в моём случае герой ничего не делал, а потом падал в местный игровой Гудзон. Оказалось, что это известная проблема — игра не оптимизирована под новые компьютеры, и если видеокарта выдаёт больше 30 FPS — герой никогда не поднимется в вертолёт. Кто-то выкручивал настройки графики на максимум, кто-то переключал приложение на одно ядро процессора, кто-то ставил архивироваться огромный фильм. Одно из самых элегантных решений — сделать запись игрового экрана при помощи программы Fraps, которая умеет ограничивать число кадров. Я начал миссию заново, но пока включал запись кнопкой F9, мотоцикл проскочил мимо трамплина. Проблемка.

Педаль для компьютера решила все эти вопросы! Бюджет проекта — $4…6 и два вечера неспешной работы.

Что нужно

Настройка Digispark

Поначалу Arduino IDE не знает плату Digispark. Чтобы их подружить, читайте эти материалы — я всё делал по ним:

Большой обзор Digispark Attiny85

Начало работы с Digispark., а для кого то просто ATtiny85 с USB . Установка драйверов и работа с arduino IDE

Особенности платы:

  1. Порядок загрузки скетча отличается от обычной Arduino. Отключаете плату от ПК, нажимаете «Загрузить», ждёте приглашения от IDE и только потом подключаете плату.
  2. После включения плата всегда ждёт 5 секунд — вдруг будет обновление прошивки? Только потом запускается зашитая программа. «Пищалку» я поставил как раз для однозначности, чтобы она коротким сигналом оповещала — педаль загрузилась и готова к работе.
  3. Для проекта подойдёт и синяя плата с micro-USB разъёмом, и чёрная, которая вставляется прямо в USB-порт.

Схема педали


Спасибо микроконтроллерному миру за лаконичность этой схемы! Нас не интересует, что внутри «дигиспарка», а внешние подключения можно было бы и описать словами. Единственное — для удобства я выпаял 78L05, чтобы к её полигону припаять «земляную» ножку «пищалки».

Код

// Digispark-based keyboard
// 07.07 - 09.07.21

#include "DigiKeyboard.h"
#include "GyverButton.h"
// download: https://alexgyver.ru/gyverbutton/

#define PEDAL PB0
#define BUZZER PB1

GButton btn(PEDAL, HIGH_PULL, NORM_OPEN);

void setup()
{
  btn.setDebounce(50); // антидребезг
  btn.setTimeout(500); // таймаут удержания
  btn.setClickTimeout(400); // таймаут между кликами

  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, HIGH);
  delay(100);
  digitalWrite(BUZZER, LOW);
  // initialize OK

  DigiKeyboard.sendKeyStroke(0);
}

void loop()
{
  btn.tick();

  // GTA IV mode
  // if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_F9);

  // FUNCTION SETS
  // CHOOSE ONLY ONE
  //copypast();
  altium();

  // MAIN PURPOSE
  // CTRL HOLDING
  //  if (btn.isHold()) DigiKeyboard.sendKeyPress(0, MOD_CONTROL_LEFT);
  if (btn.isStep()) DigiKeyboard.sendKeyPress(0, MOD_CONTROL_LEFT);
  if (btn.isRelease()) DigiKeyboard.sendKeyPress(0, 0);
}

void copypast()
{
  if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_V, MOD_CONTROL_LEFT);
  if (btn.isDouble()) DigiKeyboard.sendKeyStroke(KEY_C, MOD_CONTROL_LEFT);
  if (btn.isTriple()) DigiKeyboard.sendKeyStroke(KEY_X, MOD_CONTROL_LEFT);
}

void altium()
{
  if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_C, MOD_SHIFT_LEFT);
  if (btn.isDouble()) DigiKeyboard.sendKeyStroke(KEY_W, MOD_CONTROL_LEFT);
  if (btn.isTriple())
  {
    DigiKeyboard.sendKeyStroke(KEY_P);
    DigiKeyboard.sendKeyStroke(KEY_W);
  }

  // один клик + удержание
  if (btn.isStep(1)) DigiKeyboard.sendKeyPress(0, MOD_SHIFT_LEFT);
  // два клика + удержание
  if (btn.isStep(2)) DigiKeyboard.sendKeyPress(0, MOD_ALT_LEFT);
}

Заметки по коду:

  1. В «диспетчере устройств» плата будет отображаться клавиатурой.
  2. После перезагрузки или выключения ПК педаль надо переподключить.
  3. Таймауты на удержание и интервал между кликами, возможно, вам придётся подстроить под себя.
  4. «Пищалка» висит на том же выходе, что и светодиод. Он моргнёт, когда плата загрузится после подачи питания.
  5. Главная задача педали — эмулировать нажатие CTRL, если на неё нажали и держат. За это отвечают строчки в функции void loop():
if (btn.isStep()) DigiKeyboard.sendKeyPress(0, MOD_CONTROL_LEFT);
if (btn.isRelease()) DigiKeyboard.sendKeyPress(0, 0);

Допускается и вариант попроще — он сейчас закомментирован:

if (btn.isHold()) DigiKeyboard.sendKeyPress(0, MOD_CONTROL_LEFT);
  1. В той же void loop() есть ещё пример использования — по нажатию на педаль нажимать клавишу F9 (так я и прошёл GTA IV):
if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_F9);

Список всех доступных клавиш, строки 66-129.

Дальше я сгруппировал возможные режимы работы педали в функции void copypast() и void altium(). Раскомментированной должна быть только одна из них, потому как на одинаковые действия с педалью они реагируют разными клавиатурными сочетаниями.

void copypast()
{
  if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_V, MOD_CONTROL_LEFT);
  if (btn.isDouble()) DigiKeyboard.sendKeyStroke(KEY_C, MOD_CONTROL_LEFT);
  if (btn.isTriple()) DigiKeyboard.sendKeyStroke(KEY_X, MOD_CONTROL_LEFT);
}

Одно нажатие: CTRL+V

Два нажатия: CTRL+C

Три нажатия: CTRL+X

void altium()
{
  if (btn.isSingle()) DigiKeyboard.sendKeyStroke(KEY_C, MOD_SHIFT_LEFT);
  if (btn.isDouble()) DigiKeyboard.sendKeyStroke(KEY_W, MOD_CONTROL_LEFT);
  if (btn.isTriple())
  {
    DigiKeyboard.sendKeyStroke(KEY_P);
    DigiKeyboard.sendKeyStroke(KEY_W);
  }

  // один клик + удержание
  if (btn.isStep(1)) DigiKeyboard.sendKeyPress(0, MOD_SHIFT_LEFT);
  // два клика + удержание
  if (btn.isStep(2)) DigiKeyboard.sendKeyPress(0, MOD_ALT_LEFT);
}

Одно нажатие: Shift+C

Два нажатия: CTRL+W

Три нажатия: P, W

Нажал, отпустил, нажал и удерживаю: удержание Shift

Нажал-отпустил два раза, нажал и удерживаю: удержание Alt.

  1. Разница между sendKeyPress() и sendKeyStroke() — первая функция нажимает и удерживает указанные кнопки, пока не будет отпущена педаль, а вторая нажимает и сразу же их отпускает. Это хорошо видно по экранной клавиатуре — а я поначалу не мог понять, почему строка
if (btn.isHold()) DigiKeyboard.sendKeyStroke(0, MOD_CONTROL_LEFT);

даёт нестабильное и прерывистое удержание CTRL.

  1. Более сложные конструкции можно сгородить через оператор «ИЛИ»:
if (btn.isSingle()) DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT | MOD_ALT_LEFT);

Это Alt+Shift, переключение раскладки. Варианты

if (btn.isSingle()) DigiKeyboard.sendKeyStroke(MOD_SHIFT_LEFT, MOD_ALT_LEFT);

if (btn.isSingle()) DigiKeyboard.sendKeyStroke(0, MOD_SHIFT_LEFT, MOD_ALT_LEFT);

работать не будут — функция принимает лишь два аргумента, и оба из них не могут быть клавишами-модификаторами.

Железо


Педаль с «Алиэкспресса» и синий «дигиспарк».


Внутри педали, простите за каламбур, только большой микровыключатель и пружина.


Это был несерьёзный проект на вечер, поэтому — навесной монтаж. 78L05 ушла, но освободила место для «земляного» вывода «пищалки».


Вторую плату сделал по тому же принципу. Ей не нужен micro-USB разъём — можно подпаяться прямо к контактам.


Платы налеплены на термоклей.


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


Подписаться

Оставьте свою почту, чтобы раньше «Гугла» узнавать о новых записях. Когда не пишу о приёмниках VEF — пишу о другой электронике, делюсь разработками, рекомендую книги, сбрасываю музыку под настроение.


Помочь проекту

4731 1856 0173 1794

Карта VISA принимает любую валюту

Брелок для ключей в виде радиоприёмника VEF — 50 гривен, отправка только по Украине. Сам рисовал и заказывал на производстве, поэтому на «Алиэкспрессе» таких не найти.

Запись опубликована в рубрике Arduino, Электроника. Добавьте в закладки постоянную ссылку.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s