Arduino как USB HID

25

Можно ли создать устройство HID (например, клавиатуру), используя Arduino Uno?

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

  • Должен ли я написать новый драйвер устройства окна?
  • Должен ли я создать программный слой, который мог бы принимать мои последовательные данные и иметь окна, считывающие их как ввод HID?
  • Есть ли лучший способ добиться этого, если это вообще возможно?
аномалия
источник
1
Я могу ошибаться, но это не совсем об Arduino. О разработке драйвера устройства на стороне Windows.
asheeshr
1
Первый ответ в Google: mitchtech.net/arduino-usb-hid-keyboard ... но вы не указали, какой Arduino. На Leonardo он встроен, и соответствующий драйвер уже существует (см. Arduino.cc/en/Reference/MouseKeyboard ).
FredP
Я использую Uno, но я посмотрю на то, что вы написали, потому что в прошлый раз мы рассматривали обновление DFU, но мы немного боимся кирпичей, так как компоненты не так доступны и дешевы в моей области, как в большинстве мест.
Аномалия
3
@AsheeshR Эта проблема находится на стадии
Рикардо,
1
Что ж, это определенно возможно, так как Arduino Uno оснащен Atmega16u2 в качестве микросхемы драйвера USB, пользователь может использовать перепрограммирование DFU или ICSP для установки на устройстве микропрограммы, близкой к леонардо, которая заставит Arduino вести себя как HID-клавиатура. Нет необходимости в разработке Windows, нет драйвера для сборки, так как устройства USB / HID распознаются по умолчанию. то есть этот вопрос должен быть вновь открыт.
Zmo

Ответы:

14

Можно ли создать устройство HID (например, клавиатуру), используя Arduino Uno?

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

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

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

void triggerKey(uint8_t mod, uint8_t chr) {
    uint8_t buf[8] = {mod, chr, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    // press key
    Serial.write(buf, 8);
    // emulate key press delay
    delay(10);
    buf[1] = 0x00;
    // release key
    Serial.write(buf, 8);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

ZMO
источник
1
Спасибо за всю полезную информацию, мы достигли этого.
Аномалия
Что ж, правильный путь к кирпичу AVR - перенапряжение / перенапряжение. Тогда это будет поджарено ...
user2973
Но тогда это называется не кирпичом, а жаркой или, как вы говорите, поджариванием. Вставьте 15 ампер через MCU, и я уверен, вы увидите, как он прыгнет через комнату ;-)
zmo
Как выпустить конкретный ключ? Я хочу эмулировать клавишу HOLD, затем отпустить. Кроме того, в ссылке символ переходит в массив [2], а здесь - в [1]. Зачем?
5
ну, как показано в моем примере, вы делаете это в два этапа: сначала вы нажимаете клавишу, затем происходит задержка, а затем вы отпускаете ее. Что ж, тогда вам нужно прочитать лекции о том, как работает аппаратная реализация клавиатуры, это не совсем естественно, и каждое значение массива имеет смысл. Извините, что у меня нет ссылки на общий
доступ к банкоматам
6

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


источник
4
Добро пожаловать в Arduino SE! Можете ли вы добавить немного о том, как использовать вашу библиотеку? Благодарность!
Анонимный Пингвин
2
Прочитать readme и попробовать примеры? Все там, не надо тут все перебивать. Все на Github обновлено :)
Извини, чувак, это похоже на классную библиотеку, но твоей документации безумно не хватает. Насколько я могу судить, реальных инструкций по установке нет, и целые темы в вашей вики просто говорят «TODO» (в частности, тема геймпада совершенно пуста, как эта). : - /
BrainSlugs83
1
На самом деле здесь необходимо представить базовое описание: ответы должны быть осмысленными даже без внешней ссылки, которая может умереть. А этот нет.
Крис Страттон