Skip to content

Arduino - 键盘消息

某些 Arduino 开发板可以作为人机接口设备 (HID, Human Interface Device),例如键盘或鼠标。这使得你的 Arduino 能够向连接的计算机发送按键指令。此功能适用于具有原生 USB 功能的开发板,例如 Leonardo、Micro、Due、Zero、MKR 系列和 UNO R4。

在本教程中,我们将让按钮按下时向计算机发送一条消息,并计数它已被按下了多少次。编程完成后,只需打开任何文本编辑器即可查看输出。

警告: 当你使用 Keyboard 库时,Arduino 将控制你的计算机键盘。为避免失去控制,请始终在电路中包含一个物理控制(如按钮)来触发键盘命令,如本示例所示。

  • 1 × 面包板
  • 1 × Arduino Leonardo、Micro 或其他兼容 HID 的开发板
  • 1 × 瞬时按钮 (Momentary Pushbutton)
  • 1 × 10kΩ 电阻(下拉电阻,pull-down)
  1. 将按钮的一条腿连接到 Arduino 的 5V 引脚。
  2. 将另一条腿连接到数字输入引脚(例如,引脚 4)。
  3. 将 10kΩ 电阻从同一条腿(引脚 4)连接到 GND。这是一个下拉电阻,确保按钮未按下时引脚读取为 LOW。

方法 2:使用 INPUT_PULLUP 的现代方法

Section titled “方法 2:使用 INPUT_PULLUP 的现代方法”
  • 1 × 面包板
  • 1 × Arduino Leonardo、Micro 或其他兼容 HID 的开发板
  • 1 × 瞬时按钮
  1. 将按钮的一条腿连接到数字输入引脚(例如,引脚 4)。
  2. 将另一条腿连接到 Arduino 的 GND 引脚。

这种方法更简单、更可靠。它利用了微控制器内部的上拉电阻 (pull-up resistor),无需外部电阻。这是推荐的方法。

Arduino 代码(适用于使用 INPUT_PULLUP 的方法 2)

Section titled “Arduino 代码(适用于使用 INPUT_PULLUP 的方法 2)”

此代码使用更简单的 INPUT_PULLUP 电路,并包含去抖动 (debouncing) 功能,以防止单次按下被多次注册。

/*
键盘消息发送器
适用于兼容 HID 的 Arduino 开发板。
使用推荐的 INPUT_PULLUP 方法与去抖动功能。
*/
#include "Keyboard.h"
// 引脚和设置常量
const int BUTTON_PIN = 4; // 连接到按钮的引脚
const long DEBOUNCE_DELAY = 50; // 去抖动时间(毫秒)
// 用于跟踪按钮状态和时间的变量
int buttonState = 0; // 输入引脚的当前读数
int lastButtonState = HIGH; // 输入引脚的先前读数
unsigned long lastDebounceTime = 0; // 上次输出引脚切换的时间
int pressCounter = 0; // 按钮按下计数器
void setup() {
// 将按钮引脚设置为带内部上拉电阻的输入模式。
// 当按钮未按下时,引脚将为 HIGH;按下时,引脚将为 LOW。
pinMode(BUTTON_PIN, INPUT_PULLUP);
// 初始化键盘控制
Keyboard.begin();
}
void loop() {
// 将开关状态读取到局部变量中:
int reading = digitalRead(BUTTON_PIN);
// 检查按钮状态是否已改变(从 HIGH 到 LOW 或从 LOW 到 HIGH)
if (reading != lastButtonState) {
// 重置去抖动计时器
lastDebounceTime = millis();
}
// 如果按钮状态稳定超过去抖动延迟时间,
// 则确认为有效状态变化。
if ((millis() - lastDebounceTime) > DEBOUNCE_DELAY) {
// 如果状态已改变,且是有效的按下事件
if (reading != buttonState) {
buttonState = reading;
// 我们只希望在按钮按下时(变为 LOW)才进行打字
if (buttonState == LOW) {
pressCounter++;
Keyboard.print("按钮已按下 ");
Keyboard.print(pressCounter);
Keyboard.println(" 次。");
}
}
}
// 保存当前读数以供下一次循环迭代
lastButtonState = reading;
}
  • #include "Keyboard.h":此行包含了 Arduino 键盘库,其中包含了模拟键盘所需的所有函数。
  • pinMode(BUTTON_PIN, INPUT_PULLUP):这会将引脚配置为输入模式,并连接一个内部电阻到 5V。这意味着引脚默认读取 HIGH,只有当按钮按下时(连接到 GND 时)才读取 LOW。
  • millis()-基于的去抖动:代码会检查按钮的状态是否在 DEBOUNCE_DELAY 毫秒内保持稳定,然后才将其注册为有效按下。这是一种处理机械开关嘈杂电信号的稳健方法。
  • Keyboard.print():此函数向连接的计算机发送按键指令,就像你在真实键盘上打字一样。

对开发板编程后,拔下 USB 线。在你的电脑上打开一个文本编辑器,并将光标放置在输入区域。重新插上 Arduino。现在,每次你按下按钮时,你的编辑器中都应出现一行新文本,报告更新后的按下计数。