Arduino 作为键盘 HID:程序在键盘/编程模式下运行方式不同
Posted
技术标签:
【中文标题】Arduino 作为键盘 HID:程序在键盘/编程模式下运行方式不同【英文标题】:Arduino as Keyboard HID: Program runs differently in Keyboard/Programming mode 【发布时间】:2022-01-10 20:34:49 【问题描述】:我正在尝试使用我的 Arduino Uno 制作键盘 HID。我的 Arduino 1)在建立与输入的连接时点亮红色 LED(模拟按键_并在建立连接时将其关闭;2)在触发输入时点亮蓝色 LED,通过串行发送一次模拟键盘信号,并在输入未触发时关闭 LED。我的程序似乎可以工作,在启动时打开红色 LED 约 0.5 秒,点亮蓝色 LED 并在触发外部输入时按预期发送信号。
但是,在我缩短 Arduino 以清除原始十六进制并刷新所需的十六进制文件以帮助我的 PC 使用 Freematics Builder 将 Arduino 识别为 HID 键盘后,程序不再按预期工作。启动时红色 LED 不再亮;蓝色 LED 总是微弱地亮起并且不响应外部输入触发。我尝试了多个 hex 文件版本(one version、another version),但它们的行为都相同。
我是否使用了错误版本的 hex 文件?我做错什么了吗?
附:简化代码:
// #includes
Adafruit_MPR121 cap = Adafruit_MPR121(); // input
/////////////////////////////////////////////////
#define KEY_1 0x59
#define KEY_2 0x5a
#define KEY_3 0x5b
#define KEY_4 0x5c
#define KEY_5 0x5d
// ... Keycodes
void press_key(int key)
uint8_t buf[8] = 0;
buf[2] = key;
Serial.write(buf, 8);
buf[2] = 0;
Serial.write(buf, 8);
void setup()
pinMode(2, OUTPUT); // blue LED
pinMode(3, OUTPUT); // red LED
Serial.begin(9600);
while (!Serial) delay(10);
digitalWrite(3, HIGH);
if (!cap.begin(0x5A)) // Wait until established connection
while (1);
digitalWrite(3, LOW); // turn off red LED
delay(1000);
void loop()
if (input_is_valid())
if (input_triggered())
press_key(corresponding_key);
digitalWrite(2, HIGH); // light blue LED
else // input_untriggered
digitalWrite(2, LOW); // turn off blue LED
delay(100);
【问题讨论】:
我不确定 freematics 与制作 ahid 键盘有什么关系? @AlanBirtles Freematics 是用于将 hex 文件刷入 Arduino 的软件。 为什么选择 UNO?有带有原生 USB 的 atmega32u4(leonardo、micro、pro micro、..)的变体,它可以工作...... @KIIV 我学校的实验室只有 uno... 我想做一个 leonardo,它有很好的内置键盘模拟... 【参考方案1】:我使用 Atmel Flip 进行闪烁,效果很好。我使用的十六进制文件版本在this tutorial 中。在短接 Arduino 之后和闪烁之前,在您的设备管理器中检查 Arduino。如果在其他设备下显示类似 atmega16u2,请按照上述博客中的额外步骤从 Atmel 安装驱动程序。完成这些步骤后,您可能需要尝试几次才能成功加载十六进制。
【讨论】:
以上是关于Arduino 作为键盘 HID:程序在键盘/编程模式下运行方式不同的主要内容,如果未能解决你的问题,请参考以下文章