在家用 Arduino 和 MPU-6050 构建手势控制机器人
组件与材料
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| Arduino Nano R3 | 1 |
| HC-05 蓝牙模块 | 2 |
| MPU-6050 三轴加速度计/陀螺仪 | 1 |
| 12V 直流减速电机 | 2 |
| 橡胶轮子 | 1 套 |
| L293D 双 H 桥驱动板 | 1 |
| 9V 电池 | 2 |
所需工具
- 电烙铁、无铅焊锡、泡沫胶带、螺丝刀套装
应用与服务
- Arduino IDE
项目原理
利用 MPU-6050 的 DMP (数字运动处理器) 解算姿态角 (Yaw/Pitch/Roll),根据 Pitch 和 Roll 角度阈值判断手势方向 (前进/后退/左转/右转/停止),通过两个 HC-05 蓝牙模块透传指令控制小车电机。
关键点:蓝牙模块配对。出厂默认从机模式,需配置一主一从并绑定地址,实现上电自动连接。
蓝牙模块配置步骤
- 配置从机 (接收端,装小车):
- 接线:模块 TX→Uno D10, RX→D11 (软串口),按住模块按键上电进入 AT 模式 (LED 慢闪 2s/次)。
- 烧录
configure代码 (软串口透传),串口监视器 9600 波特率、NL+CR。 - 发送指令序列:
AT+ORGL(恢复出厂) →AT+RMAAD(清除配对) →AT+UART=38400,0,0→AT+ROLE=0(从机) →AT+ADDR?记下地址 (如98d3:31:fc1234)。
- 配置主机 (发射端,装手持遥控):
- 同样进入 AT 模式,发送:
AT+ORGL→AT+RMAAD→AT+UART=38400,0,0→AT+ROLE=1(主机) →AT+CMODE=0(单设备连接) →AT+BIND="从机地址"绑定。
- 同样进入 AT 模式,发送:
硬件连接
- 小车端 (UNO):L293D 驱动两路电机 (IN1-IN4 接 D8-D11),HC-05 接硬件串口 (RX0/TX0) 波特率 38400。
- 遥控端 (Nano):MPU-6050 接 I2C (A4/A5),HC-05 接软串口 (D10/D11) 波特率 38400,按键接 D8 切换启用/禁用。
代码
小车端代码
// Gesture_controled_Robot__car_unit_
int lm1=8, lm2=9, rm1=10, rm2=11;
char d=0;
void setup() {
pinMode(lm1,OUTPUT); pinMode(lm2,OUTPUT);
pinMode(rm1,OUTPUT); pinMode(rm2,OUTPUT);
Serial.begin(38400);
sTOP();
}
void loop() {
if(Serial.available()>0) {
d=Serial.read();
if(d=='F') ForWard();
else if(d=='B') BackWard();
else if(d=='L') Left();
else if(d=='R') Right();
else if(d=='S') sTOP();
}
}
void ForWard() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void BackWard() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void Left() { digitalWrite(lm1,LOW); digitalWrite(lm2,HIGH); digitalWrite(rm1,HIGH); digitalWrite(rm2,LOW); }
void Right() { digitalWrite(lm1,HIGH); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,HIGH); }
void sTOP() { digitalWrite(lm1,LOW); digitalWrite(lm2,LOW); digitalWrite(rm1,LOW); digitalWrite(rm2,LOW); }
遥控端代码 (核心逻辑)
// 使用 I2Cdevlib + MPU6050_6Axis_MotionApps20.h
// 初始化 DMP,设置陀螺零偏,开启中断
// 主循环读取 FIFO,解算 ypr[3] (yaw, pitch, roll)
if ((ypr[1]*180/M_PI) <= -25) BTSerial.write('F'); // 前倾 >25° 前进
else if ((ypr[1]*180/M_PI) >= 25) BTSerial.write('B'); // 后倾 >25° 后退
else if ((ypr[2]*180/M_PI) <= -25) BTSerial.write('L'); // 左倾 >25° 左转
else if ((ypr[2]*180/M_PI) >= 20) BTSerial.write('R'); // 右倾 >20° 右转
else BTSerial.write('S'); // 平稳停止
// 按键按下切换 x 运行/暂停
原理图
PCB 订购链接:PCBWay 项目分享
制造工艺
- 树莓派与Arduino协作构建机器人:分步指南
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino UNO 自制循迹小车:从零构建自主巡线机器人
- 自制可拳击的可编程键盘按钮:基于 Arduino 与压电元件的分步指南
- 自主家庭助理机器人 O'nine - ROS + Alexa 语音控制 + 机械臂 + 麦克纳姆轮全向移动
- Arduino 合成乐音:从零实现 88 键钢琴全音域
- 基于 Arduino 和超声波传感器的自动门控制系统
- 通过专用 Android App 蓝牙控制 Arduino 机械臂
- 蓝牙遥控 Arduino 小车完整 DIY 指南
- 适用于 Arduino 项目的智能室内导航机器人套件
- DIY 迷你示波器:基于 Arduino Nano 与 OLED 显示屏的逐步教程