DIY 手势控制机械臂:基于 Arduino + 柔性传感器 + IMU + 蓝牙的六自由度仿生臂
项目愿景
受《环太平洋》《阿凡达》等科幻电影启发,打造一款可穿戴手势捕捉手套 + 六轴机械臂系统,实现“人动臂随”的直观遥操作。Mark 1 版本采用 3D 打印结构、MG996R 舵机、PCA9685 舵机驱动板、HC-05 蓝牙透传、MPU6050 姿态解算与柔性电阻弯曲检测,负载 600g,通信距离 10m+,完全开源可复现。
系统架构
[手套端] [机械臂端]
┌──────────────────┐ BT SPP ┌──────────────────┐
│ Arduino Nano │ ◄─────────► │ Arduino UNO │
│ ├─ Flex×5 (A0-A4)│ 4800/9600 │ ├─ PCA9685 (I2C) │
│ ├─ MPU6050×2(I2C)│ │ │ └─ MG996R ×6 │
│ └─ HC-05 (Master)│ │ ├─ NEMA17+A4988 │
└──────────────────┘ │ │ └─ 底座旋转 │
│ └─ HC-05 (Slave) │
└──────────────────┘
核心硬件清单
| 子系统 | 关键器件 | 数量 | 选型要点 |
|---|---|---|---|
| 机械臂本体 | MG996R 金属齿舵机 | 6 | 扭矩 15kg·cm @6V,需外接 5V/3A+ 电源 |
| PCA9685 16路舵机驱动板 | 1 | I2C 地址 0x40,12位分辨率,400Hz 刷新 | |
| NEMA17 步进电机 + A4988 | 1 | 底座大扭矩旋转,微步细分 1/16 | |
| 3D 打印结构件 | 1套 | Thingiverse #1748596/#1750025/#1838120/#1982745 | |
| 5V/2200mAh RC 锂电池 | 1 | 舵机专用,共地 Arduino | |
| 手套端 | Arduino Nano R3 | 1 | 体积小、引脚足、3.3V/5V 兼容 |
| 柔性电阻传感器 | 5 | 对应大拇指/食指/中指/无名指/小指 | |
| MPU6050 (6轴 IMU) | 2 | 手腕+前臂,I2C 地址 0x68/0x69 (AD0 接高/低) | |
| HC-05 蓝牙模块 | 2 | 一主一从,AT 命令配对绑定 | |
| 指示 LED + 电阻 | 1 | 发送确认指示 |
关键技术实现
1. 柔性传感器信号调理与映射
柔性电阻直立 ~10kΩ,弯曲 90° → ~30kΩ。构成分压器(上拉 10kΩ 至 3.3V),ADC 读取电压,映射为舵机角度:
// 校准:上电 1 秒采集基线,计算高/低阈值
if (!calibrated) {
delay(1000);
thumbHigh = thumbVal * 1.15;
thumbLow = thumbVal * 0.90;
fingerHigh = fingerVal * 1.03;
fingerLow = fingerVal * 0.80;
pinkieHigh = pinkieVal * 1.06;
pinkieLow = pinkieVal * 0.80;
calibrated = true;
}
// 运行时:超阈值发送指令字符
if (fingerVal >= fingerHigh) { Serial.print('F'); delay(100); } // 大写=反向
if (fingerVal <= fingerLow) { Serial.print('f'); delay(100); } // 小写=正向
2. MPU6050 姿态解算(DMP 或互补滤波)
双 IMU 分别测量手腕 Roll/Pitch/Yaw 与前臂补偿,差值映射为云台/腕关节角度:
// 简化互补滤波获取欧拉角
void GetMpuValue(uint8_t addr, float &roll, float &pitch, float &yaw) {
Wire.beginTransmission(addr); Wire.write(0x3B); Wire.endTransmission(false);
Wire.requestFrom(addr, 14);
int16_t ax=Wire.read()<<8|Wire.read(), ay=Wire.read()<<8|Wire.read(), az=Wire.read()<<8|Wire.read();
Wire.read(); Wire.read(); // 温度
int16_t gx=Wire.read()<<8|Wire.read(), gy=Wire.read()<<8|Wire.read(), gz=Wire.read()<<8|Wire.read();
float accRoll = atan2(ay, az) * RAD_TO_DEG;
float accPitch = atan2(-ax, sqrt(ay*ay+az*az)) * RAD_TO_DEG;
// 陀螺积分 + 互补滤波 (α=0.98)
// ... 此处省略完整滤波代码,建议用库:I2Cdevlib + DMP
}
3. 蓝牙主从配对与透传
| 角色 | AT 命令关键配置 |
|---|---|
| 手套端 (Master) | AT+ROLE=1 AT+CMODE=0 AT+BIND=从机地址 AT+UART=4800,0,0 |
| 机械臂端 (Slave) | AT+ROLE=0 AT+CMODE=0 AT+UART=4800,0,0 |
波特率统一 4800(软串口稳定),配对后自动连接,透传字符流。
4. 机械臂端舵机驱动与硬限位保护
#include <Wire.h>
#include "HCPCA9685.h"
#define I2C_ADDR 0x40
HCPCA9685 pca(I2C_ADDR);
// 各关节参数结构体
struct Joint { uint8_t ch; int pos, minPos, maxPos, step; };
Joint joints[6] = {
{0, 60, 10, 180, 20}, // 基座(由步进电机控制,此处占位)
{1, 90, 20, 160, 20}, // 肩
{2, 90, 10, 170, 20}, // 肘
{3, 90, 10, 180, 20}, // 腕旋
{4, 90, 10, 180, 20}, // 腕俯仰
{5, 60, 10, 120, 10} // 夹爪
};
void moveJoint(uint8_t idx, int target) {
Joint &j = joints[idx];
target = constrain(target, j.minPos, j.maxPos);
if (target != j.pos) {
j.pos = target;
pca.Servo(j.ch, j.pos);
}
}
// 蓝牙指令解析
void loop() {
if (Serial.available()) {
char cmd = Serial.read();
switch (cmd) {
case 'S': stepperLeft(); break; // 底座左转
case 's': stepperRight(); break; // 底座右转
case 'F': moveJoint(4, joints[4].pos + joints[4].step); break; // 腕俯仰+
case 'f': moveJoint(4, joints[4].pos - joints[4].step); break; // 腕俯仰-
// ... 其他关节映射同理
}
}
}
5. 步进电机底座旋转 (NEMA17 + A4988)
const uint8_t STEP_PIN = 4, DIR_PIN = 5;
const uint16_t STEP_DELAY_US = 800; // 速度调节
void stepperLeft() { digitalWrite(DIR_PIN, LOW); stepPulse(); }
void stepperRight() { digitalWrite(DIR_PIN, HIGH); stepPulse(); }
void stepPulse() {
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(STEP_DELAY_US);
digitalWrite(STEP_PIN, LOW);
delayMicroseconds(STEP_DELAY_US);
}
组装指南
- 3D 打印:按 Thingiverse 文件打印(PLA/PETG,填充 30%+,支撑结构),总耗时 ~40h
- 机械臂组装:按 Wonder Tiger 教程组装底座、大臂、小臂、腕部、夹爪,预留舵机线槽
- 电子集成:PCA9685 堆叠在 UNO 上(I2C 直通),A4988 接 D4/D5,舵机电源独立 5V 线束
- 手套制作:柔性传感器缝制/粘贴在手套指背,MPU6050 固定腕部/前臂,Nano+HC-05 裹腕带盒
- 蓝牙配对:先用 AT 命令绑定地址,再上电自动连接,LED 指示连接状态
测试与调试清单
| 阶段 | 测试项 | 通过标准 |
|---|---|---|
| 单元测试 | 柔性传感器 ADC 波形 | 弯曲/伸直差值 > 200 LSB,无抖动 |
| 单元测试 | MPU6050 欧拉角输出 | 静止漂移 < 0.5°/s,动态跟随流畅 |
| 单元测试 | PCA9685 扫描 0-180° | 6 路舵机全程平滑,无抖动/卡顿 |
| 集成测试 | 蓝牙透传延迟 | 端到端 < 50ms,丢包率 < 0.1% |
| 系统测试 | 抓取 200g 物体 | 夹持稳定 30s,无掉落 |
| 系统测试 | 连续运行 10 分钟 | 电池电压 > 4.8V,舵机温度 < 55°C |
成果展示

Mark 1 已能精准模仿手势完成:夹爪开合、腕部旋转、大小臂协同抓取轻量物体。代码、STL、原理图全开源:
- GitHub:arduino-robotic-arm
- Thingiverse 模型:基座/大臂 | 小臂/腕 | 夹爪 | 手套外骨骼
Mark 2 规划
- 升级 ESP32 双核 + ESP-NOW 低延迟通信(<10ms)
- 引入力反馈:电流采样/FSR 传感器 → 手套振动马达
- 视觉融合:OpenMV/ESP32-CAM 目标检测 → 半自主抓取
- 结构优化:碳纤维管+金属关节,负载提升至 2kg
- ROS 2 micro-ROS 移植,标准化 URDF/MoveIt 仿真
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- Android 手势遥控车:Raspberry Pi + Arduino 101 + 电机扩展板,I2T 协同控制
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino UNO 自制循迹小车:从零构建自主巡线机器人
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- 以太网远程控制机械臂 — 基于 Arduino 101 与 WIZ750SR
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
- LittleArm 2C:3D 打印 Arduino 机械臂 - STEM 教学专用,坚固易装
- 适用于 Arduino 项目的智能室内导航机器人套件