Бывает иногда настроение, поигрываю в онлайн игрушки. Периодически ловлю себя на мысли, что некоторые моменты в игре плохо продуманы разработчиками и требуют однообразных действий. Собственно, решил поделиться мыслями об автоматизации подобных процессов. Итак, господа читеры, статья для Вас.

Итак варианты, которые мне известны:
1. Использовать готовые программы эмуляторы
2. Написать самому программу, которая имитирует нажатия клавиш
3. Аппаратный эмулятор клавиатуры
4. …

Сразу оговорюсь. Конечно же, все зависит от конкретной ситуации, поэтому мы фантазируем о неких крайностях.

Пункты 1 и 2. Когда речь идет об автоматизации игр/процессов, которые не имеют никакой защиты, это самый правильный подход. Для ленивых берем, какую нибудь готовую программу, например AutoIt, либо пишем свой эмулятор. Начинающим рекомендую C#, тестил давно, но запомнилось, что делается это очень просто. В чем минус данного способа? Большинство онлайн игр имеют защиту от подобных действий. Поэтому примитивные решения грозят вам баном. Проверено :) Всегда, существуют способы обойти защиту, но это совсем другая история, считай отдельная наука.

Следующий пункт 3, аппаратное решение. Использовать какой нибудь AT90USB или некий подобный микроконтроллер, который может прикинуться клавиатурой и посылать нужные сообщения. Опять же рассматривая с т.з. крайностей, нужно чтобы ваша девайсина нигде не выдала себя и посылки полностью соответствовали реальной клавиатуре. Реализовать подобное возможно, но все же нужно хорошо разбираться в этом вопросе. Кроме того, в системе будет видно сразу 2 клавиатуры, одна с которой вы играете, а вторая проводит какие то манипуляции. Не правда ли довольно подозрительно?

4 пунктом решение в лоб — взять реальную клавиатуру! Клавиатура это же обыкновенные кнопки, так что нам мешает подпаять параллельно транзистор, а управлять им микроконтроллером. И данный способ лишен каких либо недостатков выше и не требует никаких специфичных знаний, научился мигать светодиодом — значит можешь сделать и подобную вещь :)

Как то в сети оказалось не густо с описанием того, как работают клавиатуры, поэтому наглядный пример того, что может содержать обычная клава. Итак потроха состоят из двух пленок и резинки сложенных бутербродом. Каждая пленка является контактом, поэтому когда мы нажимаем на них резинкой, пленки соприкасаются и контакт замыкается. Что за токопроводящий материал нанесен на пленку, сказать сложно, но ориентировочно на 10 см подобной дорожки порядка нескольких ом сопротивления. Разведены кнопки рандомно, никакого порядка не прослеживается, видимо просто как было удобно.
kb_kiwki

Все контакты с пленки соединяются с платой через графитовые контакты.
kb_plate

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

Сама суть физического подключения — обычная матричная клавиатура, подобный материал я рассматривал в 20 уроке AVR, смысл такой только кнопок больше. Опрос производится с частотой 250Гц.
lesson20-1

Итак после небольшого эксперимента получилось что с 1 по 18 контакты это выходы, а с 19 по 26 это входы. Дальше встал вопрос, как вытащить коды клавиш. Для этого я накрапал на C# небольшую программку — создаем форму на нее цепляем label, и для формы пишем обработчик для события KeyUp.

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    KeysConverter kc = new KeysConverter();
    label1.Text = kc.ConvertToString(e.KeyValue);
}

В результате форма при нажатии кнопки выдает ее название. Довольно удобно.
form_kb

Все это вылилось в такую таблицу, т.е. я наверняка знаю что при замыкании контактов 18 и 19 у меня сработает ESC. Тут правда есть небольшая тонкость, замыкать контакты нужно через какое нибудь сопротивление, т.е. если замкнуть напрямую то срабатывание не произойдет. Достаточно 100-200 Ом резистор.
keyboard

Если нам не нужно одновременное нажатие нескольких клавиш, то схему можно перерисовать так:
inputmatrix

Т.е. если нам нужен символ «z», то мы замыкаем кнопку 2 выхода и кнопку 26 входа. Если нужен символ «w» то кнопки 4 и 25. Собственно, остается заменить кнопки транзисторами, завести управление в микроконтроллер и загнать туда двухмерный массив символов.

Количество транзисторов, будет равно количеству строк и столбцов, т.е. если 26 контактов, то 26 транзисторов. Я попытался изобразить схему для двух входов и двух выходов. Для большего количества строк и столбцов, суть останется той же. PB0-PB3 это ножки микроконтроллера, который будет управлять клавой. Сигналы IN, OUT это сигналы от клавиатуры.
inout_section

В прошивке стоит учесть, что пользователь нажимает кнопки с разной скоростью, поэтому полюбому нужно использовать рандомные задержки перед следующим нажатием кнопки. В идеале, снять зависимость, промежутков между нажатиями, например напечатать некий текст и в лог сохранять временные промежутки между событиями KeyDown и KeyUp. На основании лога, ограничить рандом разумными пределами.

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

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

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Свежие записи
Последние комментарии
  • Загрузка...
Счетчик
Яндекс.Метрика