Ардуино и клавиатура
- Войдите на сайт для отправки комментариев
Чт, 11/02/2021 - 17:30
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], пробел это некий промежуток между одним нажатием и спамом. Не совсем корректно описал проблему и мысль, но как сделать подобное на ардуино? А не просто круглый спам. В винде за это отвечает параметр "Задержка перед началом повтора".
Видимо, счётчик проходов завести - на первом проходе loop после нажатия кнопки в delay побольше повисеть, во втором и далее - поменьше.
было бы все так легко, если делать задержку, то эта задержка везде будет, в играх будешь ходить "рывками", а не сразу
было бы все так легко, если делать задержку, то эта задержка везде будет, в играх будешь ходить "рывками", а не сразу
будешь рывками грабить корованы. о_О
это реальная проблема.
Я недавно выкладывал обработку кнопок - похоже работает. Выдаёт короткое нажатие, длинное, а если зажать то через 1200 мс начинает пулемётом выдавать короткое нажатие. Переделать на [w www...] - можно. Главное принцип понять. http://arduino.ru/forum/programmirovanie/due-5-knopok-kontrol-nazhatiya-knopok-i-obrabotka-sobytii
Я недавно выкладывал(с)... бг-г-г!
а, смысл? - через полгода к вам придут забаненые в гугле мамкины ардуинщики и зададут тот же вопрос.
А я снова скажу выкладывал :-)
Не совсем корректно описал проблему и мысль, но как сделать подобное на ардуино?
Насчет корректности ничего сказать не могу, но что непонятно - это точно.
Мне кажется, Вы слово "спам" используете не по назначению.
Постарайтесь описать проблему по следующей схеме:
1. Что должна делать программа.
2. Что она на самом деле делает.
3. Чем 2 отличается от 1.
А я снова скажу выкладывал :-)
я проверял - они глухие и слепые.
Ты здесь дольше меня. Тебе виднее. Приму к сведению. Спасибо.
Скажем максимально просто.
Представим.. что я хочу сделать клавиатуру как на пк, передать весь функционал клавиатуры, во.
Но есть несколько проблем на моем пути. Представим игру, мы зажимаем клавишу "W" и сразу же идем вперед, но если открыть чат и зажать клавишу "W", то сначала у нас будет одна буква W, а через пару миллисекунд будет WWWW.. За это всё отвечает параметр "Задержка перед началом ввода", параметр в самой винде. Если реализовывать такую систему через delay или что-то подобное, то в игре будешь ходить рывками, нажимаешь W, дернулся, а потом уже побежал. А надо все сделать так, чтоб сразу бежал, без рывка.
Не могу описать свою мысль, слишком малый словарный запас и красноречие.
Скажем максимально просто.
Представим.. что я хочу сделать клавиатуру как на пк, передать весь функционал клавиатуры, во.
Но есть несколько проблем на моем пути. Представим игру, мы зажимаем клавишу "W" и сразу же идем вперед, но если открыть чат и зажать клавишу "W", то сначала у нас будет одна буква W, а через пару миллисекунд будет WWWW.. За это всё отвечает параметр "Задержка перед началом ввода", параметр в самой винде.
Не так.
Во-первых, есть два отдельных понятия: первоначальная задержка и частота автопорвтора. И там далеко не пара миллисекунд, а порядка половины секунды и 10-20 Гц. Но главное - две разных константы.
Во-вторых, эти параметры задаются не виндой, а самой клавиатурой. Аппаратно. Вполне вероятно, что эти параметры можно настраивать снаружи - той же виндой, но все равно автоповтор генерируется в клавиатуре, а не в винде.
Ну и в-третьих, пожалуй, самое главное: клавиатура генерирует не только код нажатия на клавишу, но и код ее отпускания. И если рассматривать игры, то они обычно реагируют только на первоначальное нажатие и на отпускание, а весь автоповтор - игнорируют. Автоповтор - для текстовых редакторов, которые, наоборот, игнорируют код отпускания клавиши.
Если реализовывать такую систему через delay или что-то подобное, то в игре будешь ходить рывками, нажимаешь W, дернулся, а потом уже побежал. А надо все сделать так, чтоб сразу бежал, без рывка.
Ну так тут по стандарту: blink without delay.
Не могу описать свою мысль, слишком малый словарный запас и красноречие.
Это плохо. Чтобы плодотворно программировать, прежде всего нужно научиться четко выражать свои мысли. Без этого ничего не получится.
Keyboard сам подтянешь
Тут 2 варианта, либо я криво работаю с keyboard'ом, либо ничего и не изменилось. Все равно рывок остался..
nivlovix, скетч идеологически не верный для вашей задачи. Никаких releaseAll через delay в нём не должно быть. Если кнопка нажата -отправляем однократно Keyboard.press('w'); Если отжата -отправляем однократно Keyboard.release('w'); Тогда поведение будет точно как в винде. Дребезг кнопки желательно исключить аппаратно (RS-триггер), а не программно.
Тут 2 варианта, либо я криво работаю с keyboard'ом, либо ничего и не изменилось. Все равно рывок остался..
В моем скетче срабатывание идет в момент нажатия и через 300 миллисекунд запускается серия с периодом 50 миллисекунд. Как в винде. Никакие дополнительные задержки добавлять не нужно. Если только отрегулировать интервал задержки и скорость выдачи импульсов