亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

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路舵机驱动板1I2C 地址 0x40,12位分辨率,400Hz 刷新
NEMA17 步进电机 + A49881底座大扭矩旋转,微步细分 1/16
3D 打印结构件1套Thingiverse #1748596/#1750025/#1838120/#1982745
5V/2200mAh RC 锂电池1舵机专用,共地 Arduino
手套端Arduino Nano R31体积小、引脚足、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);
}

组装指南

  1. 3D 打印:按 Thingiverse 文件打印(PLA/PETG,填充 30%+,支撑结构),总耗时 ~40h
  2. 机械臂组装:按 Wonder Tiger 教程组装底座、大臂、小臂、腕部、夹爪,预留舵机线槽
  3. 电子集成:PCA9685 堆叠在 UNO 上(I2C 直通),A4988 接 D4/D5,舵机电源独立 5V 线束
  4. 手套制作:柔性传感器缝制/粘贴在手套指背,MPU6050 固定腕部/前臂,Nano+HC-05 裹腕带盒
  5. 蓝牙配对:先用 AT 命令绑定地址,再上电自动连接,LED 指示连接状态

测试与调试清单

阶段测试项通过标准
单元测试柔性传感器 ADC 波形弯曲/伸直差值 > 200 LSB,无抖动
单元测试MPU6050 欧拉角输出静止漂移 < 0.5°/s,动态跟随流畅
单元测试PCA9685 扫描 0-180°6 路舵机全程平滑,无抖动/卡顿
集成测试蓝牙透传延迟端到端 < 50ms,丢包率 < 0.1%
系统测试抓取 200g 物体夹持稳定 30s,无掉落
系统测试连续运行 10 分钟电池电压 > 4.8V,舵机温度 < 55°C

成果展示

DIY 手势控制机械臂:基于 Arduino + 柔性传感器 + IMU + 蓝牙的六自由度仿生臂

Mark 1 已能精准模仿手势完成:夹爪开合、腕部旋转、大小臂协同抓取轻量物体。代码、STL、原理图全开源:

Mark 2 规划

制造工艺

  1. 蓝牙控制树莓派机器人:语音反馈功能构建指南
  2. 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
  3. Android 手势遥控车:Raspberry Pi + Arduino 101 + 电机扩展板,I2T 协同控制
  4. 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
  5. Arduino UNO 自制循迹小车:从零构建自主巡线机器人
  6. Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
  7. Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
  8. 以太网远程控制机械臂 — 基于 Arduino 101 与 WIZ750SR
  9. MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
  10. PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
  11. LittleArm 2C:3D 打印 Arduino 机械臂 - STEM 教学专用,坚固易装
  12. 适用于 Arduino 项目的智能室内导航机器人套件