Skip to content

Arduino - 鼠标按钮控制

某些Arduino开发板,如Leonardo、Micro或Due,具有原生USB功能,使其能够充当人机接口设备(HID),例如键盘或鼠标。本教程展示了如何使用按钮构建一个简单的鼠标控制器。

此更新示例使用五个按钮:四个用于方向移动(上、下、左、右),一个用于左键点击。我们将采用现代编码实践,包括使用内部上拉电阻来简化接线,以及使用非阻塞延迟结构以实现更灵敏的控制。

重要警告: 当您运行此草图时,Arduino将接管您计算机的鼠标。要重新获得控制,您可能需要拔下Arduino。在上传草图之前,务必制定停止草图的计划。

  • 1 × Arduino Leonardo、Micro或Due开发板(带有ATmega32U4或SAM3X8E芯片的开发板)
  • 1 × 面包板
  • 5 × 瞬时按钮
  • 跳线

我们将使用Arduino的内部上拉电阻,这通过消除对外部电阻的需求来简化电路。将每个按钮的一条腿连接到数字引脚,另一条腿连接到GND。

以下是连接布局:

Button Arduino Pin
-----------------------------
Up Button --> Pin 2
Down Button --> Pin 3
Left Button --> Pin 4
Right Button--> Pin 5
Click Button--> Pin 6
(The other leg of ALL buttons connects to Arduino GND)

当按钮按下时,它将数字引脚连接到GND,Arduino将读取为LOW。

此草图旨在提高可读性和可扩展性。它使用数组进行引脚定义,并采用非阻塞延迟以保持代码响应。

/*
* 现代按钮鼠标控制
*
* 通过Arduino Leonardo、Micro或Due上的五个按钮控制鼠标。
* 此版本使用内部上拉电阻和非阻塞延迟。
*
* 警告:此草图将接管您的鼠标!拔下Arduino以重新获得控制。
*/
#include <Mouse.h>
// --- 引脚定义 ---
// 使用数组可以方便地在以后添加更多按钮。
const int buttonPins[] = {2, 3, 4, 5, 6}; // {上,下,左,右,点击}
const int numButtons = sizeof(buttonPins) / sizeof(buttonPins[0]);
// --- 控制参数 ---
const int movementSpeed = 5; // 每步移动的像素数
const long responseDelay = 10; // 更新之间的延迟(毫秒)
// --- 状态变量 ---
unsigned long lastUpdateTime = 0; // 用于非阻塞延迟
void setup() {
// 将所有按钮引脚初始化为带有内部上拉的输入模式
for (int i = 0; i < numButtons; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
// 初始化鼠标控制。这将启动HID通信。
Mouse.begin();
}
void loop() {
// 使用非阻塞延迟以确保循环保持响应
if (millis() - lastUpdateTime > responseDelay) {
lastUpdateTime = millis();
// 读取所有按钮的状态(LOW 表示按下)
bool upState = (digitalRead(buttonPins[0]) == LOW);
bool downState = (digitalRead(buttonPins[1]) == LOW);
bool leftState = (digitalRead(buttonPins[2]) == LOW);
bool rightState = (digitalRead(buttonPins[3]) == LOW);
bool clickState = (digitalRead(buttonPins[4]) == LOW);
// 计算移动
int xDistance = 0;
if (leftState) xDistance = -movementSpeed;
if (rightState) xDistance = movementSpeed;
int yDistance = 0;
if (upState) yDistance = -movementSpeed;
if (downState) yDistance = movementSpeed;
// 如果有移动,则发送命令
if (xDistance != 0 || yDistance != 0) {
Mouse.move(xDistance, yDistance, 0); // (x, y, 滚轮)
}
// 处理鼠标点击
// 此逻辑在按住按钮时按下,在松开时释放。
if (clickState) {
if (!Mouse.isPressed(MOUSE_LEFT)) {
Mouse.press(MOUSE_LEFT);
}
} else {
if (Mouse.isPressed(MOUSE_LEFT)) {
Mouse.release(MOUSE_LEFT);
}
}
}
}

#include <Mouse.h>: 此行包含用于HID鼠标仿真的必要库。它仅适用于特定开发板。

pinMode(pin, INPUT_PULLUP): 这是一个关键改进。它将引脚配置为输入并启用连接到VCC的内部电阻。这意味着您不需要外部电阻,从而简化了电路。当按钮未按下时,引脚将读取HIGH;当按钮按下时(因为它连接到GND),引脚将读取LOW。

非阻塞延迟: if (millis() - lastUpdateTime > responseDelay)结构避免了使用delay()。这对于响应式应用程序至关重要。loop()持续运行,我们仅以固定间隔更新鼠标位置,这可以防止移动卡顿,同时使程序保持准备好执行其他任务。

  • 代码无法编译? 确保您已在Arduino IDE的工具 > 开发板下选择了正确的开发板(Leonardo、Micro等)。Mouse库不适用于Uno或Mega等开发板。
  • 鼠标移动不稳定或根本不动? 仔细检查您的接线。确保所有按钮都有一条腿连接到正确引脚,另一条腿连接到GND。错误的连接可能导致引脚“浮空”,从而产生随机输入。

这个基本的控制器可以扩展到许多有用的项目中:一个自定义游戏键盘、一个演示文稿点击器、一个媒体控制面板(使用Keyboard.press()实现播放/暂停/音量键),或一个供行动不便的用户使用的辅助设备。