Arduino как USB HID

Можно ли построить скрытое устройство (например, клавиатуру) с помощью Arduino uno?

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

  • Должен ли я написать новый драйвер оконного устройства?
  • Должен ли я создать программный уровень, который мог бы принимать мои последовательные данные и заставить Windows считывать их в качестве входных данных HID?
  • Есть ли лучший способ достичь этого, если это вообще возможно?

, 👍30

Обсуждение

Возможно, я ошибаюсь, но на самом деле речь идет не об Arduino. Речь идет о разработке драйверов устройств на стороне окна., @asheeshr

Первый ответ в google : http://mitchtech.net/arduino-usb-hid-keyboard/ ... но вы не указали, какой именно Arduino. На Леонардо он встроен, и соответствующий драйвер уже существует (см. http://arduino.cc/en/Reference/MouseKeyboard)., @FredP

Я использую Uno, но я посмотрю на то, что вы опубликовали, потому что в прошлый раз мы рассматривали обновление DFU, но мы немного боимся кирпичей, так как компоненты не так легкодоступны и дешевы в моем районе, как в большинстве мест., @Anomaly

@AsheeshR Ну, теперь вы добавили больше информации, чтобы подкрепить свое заявление, но это всего лишь ссылка. Так почему же вы не опубликовали более эллаборативную версию этого комментария в качестве ответа (чтобы не считаться ответом на ссылку) и не дождались апвотов? Это было бы гораздо более конструктивно, чем голосование за его закрытие., @Ricardo

@AsheeshR Этот вопрос сейчас на мете: http://meta.arduinoprosto.ru/q/102/46, @Ricardo

Ну, это определенно возможно, так как Arduino Uno имеет Atmega16u2 в качестве чипа драйвера USB, пользователь может использовать либо DFU, либо ICSP мигание, чтобы нажать на устройство прошивку, близкую к Леонардо, которая заставит Arduino вести себя как скрытая клавиатура. Там нет разработки Windows, нет драйвера, который должен быть построен, поскольку устройства USB/HID распознаются по умолчанию. т. Е. Этот вопрос должен быть вновь открыт., @zmo


2 ответа


Лучший ответ:

16

Можно ли построить скрытое устройство (например, клавиатуру) с помощью Arduino uno?

да, это так! И здесь есть отличный учебник о том, как это сделать

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

Как показано в руководстве, вам нужно преобразовать код прошивки таким образом, чтобы вместо печати событий вы фактически запускали события. Что вам нужно сделать, так это добавить в свой код:

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // нажмите клавишу
    Serial.write(buf, 8);
    // эмуляция задержки нажатия клавиши
    delay(10);
    buf[1] = 0x00;
    // отпустите клавишу
    Serial.write(buf, 8);
}

То, что вы здесь делаете, - это отправка событий вашего основного микроконтроллера Arduino по последовательной линии на меньший микроконтроллер, который обрабатывает USB-связь. Этот микроконтроллер будет принимать эти ключевые "буферы" и передавать их по мере нажатия клавиш клавиатуры USB HID через USB.

Имейте в виду, что ключевой символ (chr в коде здесь) на самом деле является кодом ключа, отправленным по USB, который интерпретируется вашим драйвером USB HID, который затем переводит его в реальный символ, используя текущую раскладку, которую вы настроили для своей клавиатуры.

Символ mod-это одна из клавиш-модификаторов на клавиатуре (shift, control, alt...), причем 0x00 не является модификатором.

  • Должен ли я написать новый драйвер оконного устройства?

Нет, вам это не нужно! С обновлением DFU ваш arduino будет рассматриваться Windows как USB - клавиатура .

  • Должен ли я создать программный уровень, который мог бы принимать мои последовательные данные и заставить Windows считывать их в качестве входных данных HID?

Вам не нужно этого делать, и на самом деле это очень плохая идея по многим причинам:

  • ваше решение не будет переносимым, и поэтому вам нужно будет что-то взломать для каждой платформы,которую вы можете использовать.
  • ваше решение будет подразумевать много нового кода ; чем больше кода вы напишете, тем больше ошибок будет в вашей системе.
  • ваше решение было бы действительно хакерским, так как оно вело бы себя как драйвер устройства (т. Е. Земля ядра), принимающий входные данные от пользовательской программы (т. Е. Земля пользователя), и, скорее всего, не будет работать, будет адом для отладки и подвержен проблемам безопасности... Если это вообще возможно сделать!

Я использую Uno, но я посмотрю на то, что вы опубликовали, потому что в прошлый раз мы рассматривали обновление DFU, но мы немного боимся кирпичей

Наконец, в комментарии у вас есть опасения по поводу кирпичной кладки вашего arduino. Пожалуйста , поверьте мне и автору статьи, что вы не можете кирпичить свой arduino , делая прошивку прошивки:

ПРИМЕЧАНИЕ: При использовании этого метода нет никаких шансов "замуровать" устройство. Прошивка загрузчика Arduino всегда может быть обновлена с помощью протокола DFU!

В случае, если что-то действительно пойдет не так, и вы получите повреждение загрузчика в маленьком AVR (atmega8u2), вы все равно можете перепрошить его с помощью другого arduino или программатор atmel использует 6 контактов рядом с USB-штекером.

В конце концов, знайте, что единственный способ замуровать AVR, а значит, и Arduino, - это поиграть с предохранителями и сбросить предохранители программирования. И даже тогда вы можете использовать HVSP спасет ваше устройство, хотя часто проще просто взять новый чип.

,

Спасибо за всю полезную информацию, в итоге мы этого добились., @Anomaly

Ну, правильный способ кирпичить AVR-это перегрузка по току / перенапряжению. Тогда он будет поджарен..., @user2973

Но тогда это называется не кирпичом, а жаркой или, как вы говорите, поджаркой. Поместите 15ампер через MCU, и держу пари, вы увидите, как он прыгает по комнате ;-), @zmo

Как освободить конкретный ключ? Я хочу подражать УДЕРЖАНИЮ клавиши, а затем отпусканию. А также в ссылке символ переходит в массив [2], а здесь-в [1]. Почему?, @5argon

ну, как показано в моем примере, вы делаете это в два шага: сначала вы нажимаете клавишу, затем есть задержка, затем вы отпускаете ее. Ну, тогда вам нужно будет прочитать себе лекцию о том, как работает аппаратная реализация клавиатуры, это как-то неестественно, и каждое значение массива имеет свой смысл. Извините меня за то, что у меня нет ссылки на share atm, но всякий раз, когда вы найдете что-то в Интернете, пожалуйста, оставьте новый комментарий ☺, @zmo

Просто для ясности. Эта способность зависит от Atmega16u2, так что, например, это невозможно с Arduino nano?, @Clijsters


10

Я создал проект, который полностью заменяет загрузчик Arduino. Вы можете загружать скетчи и использовать их в качестве HID. См. Project HID на Github: https://github.com/NicoHood/HID

,

Добро пожаловать в Arduino SE! Не могли бы вы немного рассказать о том, как пользоваться вашей библиотекой? Спасибо!, @Anonymous Penguin

Извини, чувак, это выглядит как классная библиотека, но твоей документации безумно не хватает. Насколько я могу судить, реальных инструкций по установке нет, и все темы в вашей вики просто говорят "TODO" (в частности, тема геймпада совершенно пуста). :-/, @BrainSlugs83

На самом деле здесь необходимо представить базовое описание: ответы должны быть значимыми даже без внешней ссылки, которая может умереть. А этот - нет., @Chris Stratton