Arduino作为USB HID


25

是否可以使用Arduino uno构建HID设备(如键盘)?

当时,我在Arduino上有按钮输入,在串行线上提供了输出。因此,如何将当前的固件转换为可以像HID键盘一样工作的固件?

  • 我应该编写一个新的窗口设备驱动程序吗?
  • 我是否应该创建一个软件层来接收我的串行数据,并让Windows将其读取为HID输入?
  • 如果有可能,是否有更好的方法可以实现?

1
我可能是错的,但这与Arduino无关。它是关于Window的侧面设备驱动程序开发的。
asheeshr 2014年

1
在google中的第一个答案:mitchtech.net/arduino-usb-hid-keyboard ...但是您没有指定哪个Arduino。在Leonardo上它是内置的,并且适当的驱动程序已经存在(请参阅arduino.cc/zh/Reference/MouseKeyboard)。
FredP 2014年

我使用的是Uno,但我会看一下您发布的内容,因为上次我们考虑过DFU更新,但是由于有些组件在我所在的地区不像大多数地区那么容易获得和便宜,因此我们有点担心的地方。
2014年

3
@AsheeshR这个问题现在在meta上:meta.arduino.stackexchange.com/q/102/46
Ricardo

1
好吧,这绝对是可能的,因为Arduino Uno具有Atmega16u2作为USB驱动器芯片,用户可以使用DFU或ICSP闪存在设备上推送接近leonardo的固件,这将使Arduino充当HID键盘。无需进行Windows开发,因为默认情况下不会识别USB / HID设备,因此无需构建驱动程序。即该问题应重新讨论。
zmo 2014年

Answers:


14

是否可以使用Arduino uno构建HID设备(如键盘)?

是的!还有的就怎么做,在一个伟大的教程在这里

当时,我在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通信的较小的微控制器。该微控制器将获取这些按键“缓冲区”,并通过USB HID键盘按键通过USB传输它们。

请注意,关键字符(chr在此处的代码中)实际上是通过USB发送的关键代码,由USB HID驱动程序解释,然后使用您为键盘设置的当前布局将其转换为真实字符。

mod角色是你的键盘(换挡,控制,ALT ...)上的修饰键之一,0x00是没有任何修改。

  • 我应该编写一个新的窗口设备驱动程序吗?

不,您不需要!随着DFU升级,Windows将您的arduino视为USB键盘。

  • 我是否应该创建一个软件层来接收我的串行数据,并让Windows将其读取为HID输入?

您无需这样做,由于许多原因,这实际上是一个非常糟糕的主意:

  • 您的解决方案将无法移植,因此您需要为可能使用的每个平台破解一些东西,
  • 您的解决方案将包含许多新代码;一个代码写的越多,您的系统中可能出现的错误就越多,
  • 您的解决方案确实很糟糕,因为它的行为就像是设备驱动程序(即内核land)从用户程序(即user land)获取输入,因此可能无法正常工作,难以调试并且容易出现安全问题。 ..如果可能的话!

我使用的是Uno,但我会看一下您发布的内容,因为上次我们考虑过DFU更新,但我们有点怕砖砌东西

最后,在评论中,您担心砖砌arduino。请相信我和本文的作者,您不能对您的arduino进行固件更新:

注意:使用这种方法不可能“砖化”设备。可以始终使用DFU协议更新Arduino引导加载程序固件!

万一发生严重错误,并且在小型AVR(atmega8u2)中出现引导加载程序损坏,您仍然可以使用另一个arduinoatmel编程器,使用USB插头旁边的6针重新刷新它。

最后,要知道,连接AVR和Arduino 的唯一方法是使用保险丝并复位编程保险丝。即使这样,您也可以使用 HVSP保存设备,尽管仅购买新芯片通常会减少麻烦。


1
感谢所有有用的信息,我们最终实现了这一目标。
2014年

好吧,连接AVR的正确方法是过电流/过电压。然后将被烤...
user2973

但是,这不是砖砌,而是油炸,或者如您所说的烘烤。将15安培通过MCU,我敢打赌,您会看到它穿过房间;-)
zmo 2014年

如何释放特定密钥?我想模拟一个关键,然后释放。并且在链接中,字符转到数组[2],而此处转到[1]。为什么?
5argon

好了,如我的示例所示,您分两个步骤进行操作,首先按键,然后有延迟,然后释放它。好了,那么您需要对硬件键盘实现的工作方式进行自我介绍,这是不自然的,并且数组的每个值都有其含义。原谅我没有链接到ATM共享,但每当你发现了一些在网上搜索,请发表新评论☺
ZMO

6

我创建了一个项目,该项目完全替代了Arduino Bootloader。您可以上传草图并将其用作HID。在Github上查看Project HID:https : //github.com/NicoHood/HID


4
欢迎使用Arduino SE!您可以添加一些有关如何使用您的库的信息吗?谢谢!
匿名企鹅2014年

2
阅读自述文件并尝试示例吗?一切都在那里,无需在这里重复一切。Github上的所有内容都是最新的:)

抱歉,老兄,它看起来像一个很酷的库,但是您的文档非常缺乏。据我所知,没有真正的安装说明,您的Wiki中的整个主题都只说了“ TODO”(特别是游戏手柄主题完全是空的,像这样)。:-/
BrainSlugs83 '16

1
实际上,这里需要提供基本描述:即使没有外部链接,答案也必须有意义,否则可能会导致死亡。而这个不是。
克里斯·斯特拉顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.