Ардуино и клавиатура

nivlovix
Offline
Зарегистрирован: 11.02.2021
void setup() {
  pinMode(2, INPUT_PULLUP);
  Keyboard.begin();
}
 
void loop() {
  while (digitalRead(2) == HIGH) {
    delay(500);
  }
  delay(1000);
  Keyboard.press('w');
  delay(100);
  Keyboard.releaseAll();
}

Возьмем самый простой код клавиатуры на ардуино, при нажатии кнопки на ардуино - эмулируется клавиша w. Все хорошо, но есть проблема, если зажать эту кнопку, то будет постоянный спам w, а на винде все наоборот. В играх если ты зажмешь эту кнопку, то ты будешь постоянно идти, а в винде если зажмешь, то будет +- так [w www], пробел это некий промежуток между одним нажатием и спамом. Не совсем корректно описал проблему и мысль, но как сделать подобное на ардуино? А не просто круглый спам. В винде за это отвечает параметр "Задержка перед началом повтора".

sadman41
Offline
Зарегистрирован: 19.10.2016

Видимо, счётчик проходов завести - на первом проходе loop после нажатия кнопки в delay побольше повисеть, во втором и далее - поменьше.

nivlovix
Offline
Зарегистрирован: 11.02.2021

было бы все так легко, если делать задержку, то эта задержка везде будет, в играх будешь ходить "рывками", а не сразу

Клапауций 9999
Offline
Зарегистрирован: 27.11.2020

nivlovix пишет:

было бы все так легко, если делать задержку, то эта задержка везде будет, в играх будешь ходить "рывками", а не сразу


будешь рывками грабить корованы. о_О
это реальная проблема.

nik182
Offline
Зарегистрирован: 04.05.2015

Я недавно выкладывал обработку кнопок - похоже работает. Выдаёт короткое нажатие, длинное, а если зажать то через 1200 мс   начинает пулемётом выдавать короткое нажатие. Переделать на [w www...] - можно. Главное принцип понять. http://arduino.ru/forum/programmirovanie/due-5-knopok-kontrol-nazhatiya-knopok-i-obrabotka-sobytii

 

Клапауций 9999
Offline
Зарегистрирован: 27.11.2020

Я недавно выкладывал(с)... бг-г-г!
а, смысл? - через полгода к вам придут забаненые в гугле мамкины ардуинщики и зададут тот же вопрос.

nik182
Offline
Зарегистрирован: 04.05.2015

А я снова скажу выкладывал :-)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nivlovix пишет:

Не совсем корректно описал проблему и мысль, но как сделать подобное на ардуино?

Насчет корректности ничего сказать не могу, но что непонятно - это точно.

Мне кажется, Вы слово "спам" используете не по назначению.

Постарайтесь описать проблему по следующей схеме:

1. Что должна делать программа.

2. Что она на самом деле делает.

3. Чем 2 отличается от 1.

Клапауций 9999
Offline
Зарегистрирован: 27.11.2020

nik182 пишет:

А я снова скажу выкладывал :-)


я проверял - они глухие и слепые.

nik182
Offline
Зарегистрирован: 04.05.2015

Клапауций 9999 пишет:
я проверял - они глухие и слепые.

Ты здесь дольше меня. Тебе виднее. Приму к сведению. Спасибо. 

nivlovix
Offline
Зарегистрирован: 11.02.2021

Скажем максимально просто.

Представим.. что я хочу сделать клавиатуру как на пк, передать весь функционал клавиатуры, во.

Но есть несколько проблем на моем пути. Представим игру, мы зажимаем клавишу "W" и сразу же идем вперед, но если открыть чат и зажать клавишу "W", то сначала у нас будет одна буква W, а через пару миллисекунд будет WWWW.. За это всё отвечает параметр "Задержка перед началом ввода", параметр в самой винде. Если реализовывать такую систему через delay или что-то подобное, то в игре будешь ходить рывками, нажимаешь W, дернулся, а потом уже побежал. А надо все сделать так, чтоб сразу бежал, без рывка. 
Не могу описать свою мысль, слишком малый словарный запас и красноречие.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nivlovix пишет:

Скажем максимально просто.

Представим.. что я хочу сделать клавиатуру как на пк, передать весь функционал клавиатуры, во.

Но есть несколько проблем на моем пути. Представим игру, мы зажимаем клавишу "W" и сразу же идем вперед, но если открыть чат и зажать клавишу "W", то сначала у нас будет одна буква W, а через пару миллисекунд будет WWWW.. За это всё отвечает параметр "Задержка перед началом ввода", параметр в самой винде.

Не так.

Во-первых, есть два отдельных понятия: первоначальная задержка и частота автопорвтора. И там далеко не пара миллисекунд, а порядка половины секунды и 10-20 Гц. Но главное - две разных константы.

Во-вторых, эти параметры задаются не виндой, а самой клавиатурой. Аппаратно. Вполне вероятно, что эти параметры можно настраивать снаружи - той же виндой, но все равно автоповтор генерируется в клавиатуре, а не в винде.

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

Цитата:

Если реализовывать такую систему через delay или что-то подобное, то в игре будешь ходить рывками, нажимаешь W, дернулся, а потом уже побежал. А надо все сделать так, чтоб сразу бежал, без рывка. 

Ну так тут по стандарту: blink without delay.

Цитата:

Не могу описать свою мысль, слишком малый словарный запас и красноречие.

Это плохо. Чтобы плодотворно программировать, прежде всего нужно научиться четко выражать свои мысли. Без этого ничего не получится.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020
#include <shButton.h> // https://github.com/VAleSh-Soft/shButton

shButton but(2);

void setup() {
  but.setLongClickMode(LCM_CLICKSERIES); // включение серии событий при удержании кнопки
  but.setTimeout(300); // установка времени удержания кнопки нажатой, мс (по умолчанию 500 мс)
  but.setLongClickTimeout(50); // установка интервала серийного срабатывания при длительном нажатии кнопки
  Serial.begin(9600);
}

void loop() {
  byte _but_ = but.getButtonState();

  if (_but_ == BTN_DOWN || _but_ == BTN_LONGCLICK) {
    Serial.println('w');
  }
}

Keyboard сам подтянешь

nivlovix
Offline
Зарегистрирован: 11.02.2021

v258 пишет:
Keyboard сам подтянешь

Тут 2 варианта, либо я криво работаю с keyboard'ом, либо ничего и не изменилось. Все равно рывок остался..

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nivlovix, скетч идеологически не верный для вашей задачи. Никаких releaseAll через delay  в нём не должно быть.  Если кнопка нажата -отправляем однократно Keyboard.press('w');   Если отжата -отправляем однократно Keyboard.release('w');  Тогда поведение будет точно как в винде. Дребезг кнопки желательно исключить аппаратно (RS-триггер), а не программно. 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

nivlovix пишет:

v258 пишет:
Keyboard сам подтянешь

Тут 2 варианта, либо я криво работаю с keyboard'ом, либо ничего и не изменилось. Все равно рывок остался..

В моем скетче срабатывание идет в момент нажатия и через 300 миллисекунд запускается серия с периодом 50 миллисекунд. Как в винде. Никакие дополнительные задержки добавлять не нужно. Если только отрегулировать интервал задержки и скорость выдачи импульсов