Как избавиться от задержки? Arduino и PS2 Keyboard
- Войдите на сайт для отправки комментариев
Пт, 29/06/2012 - 12:33
Решил подключить к Ардуино PS2 клавиатуру - получилось. Пробовал использовать библиотеки PS2Keyboard и еще много других. Во всех библиотеках есть задержка между нажатиями клавиш, т.е. нажимаю клавишу и удерживаю - вначале срабатывает 1 раз, а позже нажатия начинают повторятся с небольшой задержкой. Да, это все хорошо для набирания текста, но мне нужно без задержек, т.е нажал и куча срабатываний без задержек, как с кнопкой, подключенной к ардуино. Думаю дело в библиотеке, а иначе как в компьютерных играх совершать какие-либо движения?
---
Заранее Спасибо.
Не знаю, как у вас, но лично у меня всегда так. В любой программе для ввода текста (да даже в поле, в котором сейчас набираю комментарий) если зажать клавишу, вначале прописывается один символ, потом спустя 2 секунды вводятся остальные. Обе задержки изменяются в настройках, но совсем избежать первой не удается. Думаю, это все должно обрабатываться программно уже.
Эта задержка исключительно реализуется операционной системой. К примеру, есть в разных языках программирования комманды на подобие ReadKey, читающие нажатую кнопку. Помнится еще на QBasic в консоле игру шарики писал, используя подобную комманду. Так что, внимательно изучи библиотеку, может найдешь, как избавится от задержки. А лучше - пойми принцип, на котором работает обмен данными с ПС2 и напиши сам с нуля. Не думаю, что это сильно сложно.
Принцип - изучил, нашел скетч, работающий вообще без библиотеки - то же самое. Может есть спец.режим в контроллере клавиатуры? Вот тот самый скетч:
Из скетча видно - единственное, что может оказать задержку, это функция waitClockLow - и то, она работает в зависимости от состояния clock-пина клавиатуры.
Спасибо всем, проблему решил. Нужно было просто перевести клавиатуру в режим считывания @make and release@. ЗДесь мы регистрируем только нажатие и отпускание клавиши :-), почти это мне и надо было. Чтобы перевести ее в этот режим нужно:
Здравствуйте. А у меня вопрос:
При нажатии клавиши Q я получаю
Сохраняйте w перед 15. Это будет скэн код. А в лупе, при скэне == f0, следующий пропускаете.
Только есть ещё keypad и такие как Print Screen, Pause... На их коды посмотрите.
Достаточно на клавиатуре клавиш с многобайтовым скан-кодом нажатия и кодом отпускания. Некислое ветвление получается, если полностью все кнопки пытаться обработать.
Многобайтовые скан-коды (а, тем более, скан-коды переменной длины) нужно обрабатывать конечным автоматом. А реакцию предусмотреть не после каждого принятого байта, а только после завершения последовательности.
Вот такой вариант (не для всех клавиш)
Оно, как бы, и не сложно, но и не с наскоку. А ещё есть светодиодики, которыми тоже хочется управлять... https://www.youtube.com/watch?v=BgdzBgIMACc
Почему Serial.println(r, HEX) (и case) срабатывает два раза?
Но срабатывают дважды только те клавиши, которые указаны в case
"Ругается" на функцию diod_on
При таком коде при нажатии на клавишу Q в мониторе порта получаю
Если ещё точнее, то ругань на strip.show();
Задержка не решила проблему
Чо пишет то (дословно)?
Дак ничего не пишет.
Нажимаю любые" клавиши, кроме Q и W в монитор порта получаю коды.
Стоить только нажать Q (или W) в монитор порта получу 15 Q (1D W) и на этом всё, больше на нажатие клавиш не реагирует.
Если убрать strip.show(), всё ОК
Вынести из цикла strip.show пробовала?
Да.
Так код
бьз цикла
Если убираю код
Получаю в монитор
В чем смысл всех этих r, w и тп (кто так вообще переменные называет?!)?
Сделала проверку получаемых кодов
При первом нажатии на Q получаю
В чем смысл всех этих r, w и тп (кто так вообще переменные называет?!)?
НУ пока будут называться так
Попробуй, но я не до конца понимаю причём тут show...
Ну и вот q. Вначале оно равно 1, первое условие не выполняется, выполняется второе и q = 2. И в конце этого же if опять оно приравнивается 1. Как оно 11 достигнет - для меня загадка.
Работает. Но получаю код нажатия и отпускания
Ну и вот q. Вначале оно равно 1, первое условие не выполняется, выполняется второе и q = 2. И в конце этого же if опять оно приравнивается 1. Как оно 11 достигнет - для меня загадка.
Я, честно говоря, скопировала этот код, потому что не разобралась как он работает.
Ну я тоже не догоняю. На этом «мои полномочия все» )))
Как ещё вариант:
Правда я не знаю что за 0xF0 и зачем его фильтровать...
15 это код клавиши Q при нажатии
А F0 15 это два кода при отпускании клавиши
Мошт так?
Получаю два кода
Странно, не должно же...
Мошт ещё кто по умнее заглянет и подскажет...
Хочешь сказать так только Q и W «двоятся»?
Да
Покажи весь последний код.
Нипанятна. Надо подумать.
клавиатуру поменяй.
Как вариант...
клавиатуру поменяй.
На книгу о вкусной и здоровой пище.
С клавиатурой всё в порядке)