Arduino как USB HID
Можно ли построить скрытое устройство (например, клавиатуру) с помощью Arduino uno?
В настоящее время у меня есть кнопочные входы на Arduino, дающие выходы по последовательной линии. Итак, как я могу преобразовать свою текущую прошивку во что-то, что может вести себя как скрытая клавиатура?
- Должен ли я написать новый драйвер оконного устройства?
- Должен ли я создать программный уровень, который мог бы принимать мои последовательные данные и заставить Windows считывать их в качестве входных данных HID?
- Есть ли лучший способ достичь этого, если это вообще возможно?
@Anomaly, 👍30
Обсуждение2 ответа
Лучший ответ:
Можно ли построить скрытое устройство (например, клавиатуру) с помощью 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
Я создал проект, который полностью заменяет загрузчик Arduino. Вы можете загружать скетчи и использовать их в качестве HID. См. Project HID на Github: https://github.com/NicoHood/HID
Добро пожаловать в Arduino SE! Не могли бы вы немного рассказать о том, как пользоваться вашей библиотекой? Спасибо!, @Anonymous Penguin
Извини, чувак, это выглядит как классная библиотека, но твоей документации безумно не хватает. Насколько я могу судить, реальных инструкций по установке нет, и все темы в вашей вики просто говорят "TODO" (в частности, тема геймпада совершенно пуста). :-/, @BrainSlugs83
На самом деле здесь необходимо представить базовое описание: ответы должны быть значимыми даже без внешней ссылки, которая может умереть. А этот - нет., @Chris Stratton
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
- Как очистить входной последовательный буфер в Arduino?
Возможно, я ошибаюсь, но на самом деле речь идет не об 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