智能手机蓝牙鼠标:自制虚拟摇杆控制电脑光标
项目背景
本项目实现一个基于手机 App 的虚拟触控板/鼠标:手机端通过 MIT App Inventor 开发的 App,经由蓝牙(HC-05)将双摇杆坐标、点击、滚轮状态发送给 Arduino Uno,Arduino 解析后经串口输出格式化数据,PC 端 Python 脚本(mouse + pyserial)读取并模拟系统鼠标动作。适合演示、投影控制、躺床上操作电脑等场景。
硬件清单
- Arduino Uno × 1
- HC-05 蓝牙模块 × 1
- 跳线若干
- USB 数据线(供电与串口通信)
软件环境
- Arduino IDE(上传固件)
- Python 3.x +
mouse+pyserial库 - MIT App Inventor(App 源码
.aia可导入修改) - 已编译 APK:
Bluetooth Mouse Control
通信协议设计
App → Arduino(蓝牙,每 20ms 一帧)
帧格式:[0xFF] [JoyX] [JoyY] [BtnFlags]
- 0xFF (255) : 帧头,用于同步
- JoyX (0-255): 左摇杆 X 轴(中心 ~128)
- JoyY (0-255): 左摇杆 Y 轴
- BtnFlags : 位域
bit0=1 左键按下, bit1=1 右键按下, bit2=1 滚轮向下, bit3=1 滚轮向上
Arduino → PC(USB 串口,115200/9600 波特率)
输出格式:X:Y:Click\n
- X (0-1279) : 目标屏幕 X 坐标(假设 1280×800 分辨率)
- Y (0-799) : 目标屏幕 Y 坐标
- Click : 0=无动作, 1=左键, 2=右键, 3=滚轮下, 4=滚轮上
示例:640:400:0 (移动到中心) 640:400:1 (左键点击)
Arduino 固件逻辑
// 关键参数
int sensitivity = 20; // 像素/帧 最大位移
int width = 0, height = 0; // 当前光标坐标
int l_prev = 0, r_prev = 0; // 按键边沿检测
void loop() {
if (Serial.available()) {
in_byte = Serial.read();
if (in_byte == 255) array_index = 0; // 帧头同步
datareceived[array_index++] = in_byte;
if (array_index == 4) { // 收满 4 字节
// 映射摇杆到位移
if (data[1] >= 110) xpos = map(data[1], 110, 172, 0, sensitivity);
else if (data[1] <= 70) xpos = map(data[1], 60, 1, 0, -sensitivity);
// Y 轴同理...
// 按键边沿检测
if (data[3]==1 && l_prev==0) clicks=1;
else if (data[3]==2 && r_prev==0) clicks=2;
else if (data[3]==3 || data[3]==4) clicks=data[3];
l_prev = r_prev = data[3];
// 限幅并发送
width = constrain(width + xpos, 0, 1279);
height = constrain(height + ypos, 0, 799);
if (xpos||ypos||clicks) {
Serial.print(width); Serial.print(":");
Serial.print(height); Serial.print(":");
Serial.println(clicks);
}
}
}
}
Python 主机端脚本
import mouse, serial, time
ArduinoSerial = serial.Serial('COM3', 9600) # 修改为实际端口
time.sleep(1)
mouse.FAILSAFE = False
while True:
line = ArduinoSerial.readline().decode('ascii').strip()
if not line: continue
x, y, z = line.split(':')
x, y = int(x), int(y)
mouse.move(x, y)
if '1' in z: mouse.click('left')
elif '2' in z: mouse.click('right')
elif '3' in z: mouse.wheel(-1)
elif '4' in z: mouse.wheel(1)
部署步骤
- 按原理图接线:HC-05 VCC→5V, GND→GND, TX→D0(RX), RX→D1(TX) 经分压(或用 SoftwareSerial 避开硬件串口)。
- 上传 Arduino 代码,打开串口监视器确认波特率 9600。
- 安装 Python 3,命令行执行:
pip install --upgrade pip pip install mouse pyserial - 修改 Python 脚本中
COM3为实际端口,保存为mouse_control.py。 - 手机安装 APK,打开蓝牙配对 HC-05(默认密码 1234/0000)。
- 运行 Python 脚本(IDLE 或命令行
python mouse_control.py)。 - App 连接蓝牙,即可用虚拟摇杆控制鼠标。
常见问题排查
- 光标不动:检查串口端口、波特率、Python 是否报错;串口监视器是否有
X:Y:Z输出。 - 蓝牙频繁断开:HC-05 供电不足,建议外接 3.3V 稳压或加大电容;避免金属遮挡。
- 坐标跳变:App 发送频率 20ms 可能过快,可在 Arduino 增加平滑滤波或降低
sensitivity。 - 分辨率不匹配:代码写死 1280×800,需根据实际屏幕修改
width/height上限。
扩展思路
- 改用 ESP32/ESP8266 实现 Wi-Fi/BLE 直连,免去 Python 中转。
- App 增加手势识别(滑动、捏合缩放)映射为快捷键。
- 加入键盘映射,实现全功能远程键鼠。
- PC 端改用
pyautogui或pynput跨平台支持 macOS/Linux。
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 手势控制 RGB 台灯 —— 交互式免手操作照明
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- 通过树莓派用 Alexa 控制 LED - 简单分步指南
- 废旧遥控车改装:Arduino + USB Host Shield 实现 Xbox 手柄无线控制
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- 语音控制家电:Google Assistant + 蓝牙 + Arduino UNO
- PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
- 蓝牙遥控避障机器人:打造智能远程操控小车