Arduino摇杆控制鼠标:精准光标导航
元器件与材料
| 元器件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| 双轴摇杆模块 | 1 |
所需软件与在线服务
- Arduino IDE
- IDLE (Python GUI)
项目简介
作为鼠标或触控板的替代方案,本项目利用摇杆实现鼠标光标的精准控制。摇杆可在X、Y两个轴向移动光标,并通过内置按键实现点击功能。
工作原理
摇杆本质上包含两个分别沿X、Y轴排列的电位器。Arduino读取模拟值,范围为0-1023。当摇杆处于中位时,读数约为512(0-1023中间值)。

Arduino程序将摇杆偏离中心的位置映射为-灵敏度到+灵敏度的范围(默认灵敏度为10)。极限位置对应输出10或-10。X、Y轴数值之间用冒号“:”分隔,例如:5:-3。摇杆按键状态(SW)以1/0形式跟在X、Y值后通过串口发送。

电脑端需使用Python的mouse库(原使用pyautogui,后更新为mouse)接收串口数据并控制鼠标。
Python编程环境搭建
- 安装Python 3(从官网下载)
- 复制Python安装路径
- 打开命令提示符,依次执行:
cd <你的Python安装路径> py -m pip install --upgrade pip py -m pip install mouse py -m pip install pyserial
mouse库用于模拟鼠标操作,pyserial用于串口通信。
Python程序逻辑
- 读取Arduino串口数据,解析X、Y增量及按键状态
- 通过
mouse.get_position()获取当前光标坐标(像素) - 光标新位置 = 当前位置 + 摇杆增量,使用
mouse.move(X+x, Y-y)移动 - 检测到按键按下(SW=1)时执行
mouse.click(button="left")左键点击
最终运行步骤
- 将Arduino代码上传至UNO,按原理图接线摇杆
- 确认Python库已安装,复制Python代码到记事本,修改正确的COM端口(从设备管理器查看),保存为
.py文件 - 用IDLE打开该文件并运行(F5)
- 若报错,重启IDLE检查COM端口设置
- 运行成功后移动摇杆即可控制光标,按下摇杆实现点击
源代码
Arduino代码
//////////////////////////////////
// 摇杆控制鼠标
// by Shubham Santosh
/////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(9, INPUT); // SW引脚
digitalWrite(9, HIGH); // 上拉
}
int prev_state = 0; // 按键前一状态
void loop() {
int z = 0, xpos = 0, ypos = 0;
int x = analogRead(A0);
int y = analogRead(A1);
int sensitivity = 10; // 可调整灵敏度
// X轴映射
if (x >= 550) xpos = map(x, 550, 1023, 0, sensitivity); // 向上
if (x <= 450) xpos = map(x, 450, 0, 0, -sensitivity); // 向下
// Y轴映射
if (y >= 550) ypos = map(y, 550, 1023, 0, sensitivity); // 向右
if (y <= 450) ypos = map(y, 450, 0, 0, -sensitivity); // 向左
// 按键检测(上升沿触发)
int curr_state = digitalRead(9);
if (curr_state == 1 && prev_state == 0) z = 1;
else z = 0;
// 仅当有移动或点击时发送
if (xpos != 0 || ypos != 0 || z == 1) {
Serial.print(xpos);
Serial.print(":");
Serial.print(ypos);
Serial.print(":");
Serial.println(z);
}
prev_state = curr_state;
delay(10);
}
Python代码
# 摇杆控制鼠标
# By Shubham Santosh
# 最后更新 2020/12/11
import mouse, sys
import time
import serial
mouse.FAILSAFE = False
ArduinoSerial = serial.Serial('com3', 9600) # 修改为实际COM口
time.sleep(1) # 等待串口稳定
while True:
data = str(ArduinoSerial.readline().decode('ascii'))
(x, y, z) = data.split(":") # 解析X, Y, 按键
(X, Y) = mouse.get_position() # 当前光标位置
(x, y) = (int(x), int(y)) # 转整数
mouse.move(X + x, Y - y) # 移动光标(Y轴取反)
if '1' in z: # 检测按键
mouse.click(button="left") # 左键点击
原理图

制造工艺
- 计算机鼠标的进化史:设计、制造与未来趋势
- 温控风扇DIY:媒体柜散热的继电器驱动方案
- 树莓派控制水培养殖系统:构建指南与代码
- 树莓派 + PIR 传感器 + MQTT 打造 AWS IoT 运动触发按钮
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 用 Python 构建 Wi-Fi 控制的树莓派机器人:分步指南
- Alexa 控制 ARDrone 2.0 演示:树莓派 + Hologram Nova 语音激活无人机
- 废旧遥控车改装:Arduino + USB Host Shield 实现 Xbox 手柄无线控制
- Arduino + 模拟摇杆互动游戏:五向 LED 反馈
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- FeNi42 合金:精密封接用低热膨胀镍铁合金