元器件 · 底盘

四自由度机械臂套件

四自由度机械臂套件是一副框架,能把四个模型舵机变成一台桌面机械臂——旋转底座、大臂、小臂和夹爪都可以摆位。

它是什么

四自由度机械臂套件是桌面操作臂的机械骨架:激光切割亚克力或铝支架一套、旋转底座、四个舵机安装位。单它什么都不干——是把舵机变成够得着、摆得准、夹得住的机器的框架。拧上舵机,PCA9685 驱动,就能指挥到空间一点。

四自由度舵机机械臂侧视标注图:底部旋转底座舵机,大臂舵机抬上臂,小臂舵机弯前臂,末端夹爪舵机,底座周围画出可达弧线。
四关节四舵机:旋转底座,大臂和小臂把工具定位在一个竖直平面内,末端是夹爪。 下载 SVG

四个关节

每个自由度是一个舵机干一活:

  • 底座——整臂左右转(偏航),瞄准工作面。
  • 大臂——抬上臂;定距离高度两关节之一。
  • 小臂——弯前臂;和大臂一起把工具放到竖直面任意处。
  • 夹爪——开合夹住东西。

大臂和小臂这一对关节,正是二连杆逆解要解的:给定工作平面内的一个目标点,算出能够到它的两个关节角。底座再把这个平面转到目标所在的方向,夹爪负责抓取。

什么时候用它

想学操作而不是移动时拿四自由度套件——抓取码放、叠积木、画画,或相机装可定位云台。它是操作臂领域的两轮底盘:一整类项目共用的基础结构。它本身就是轻载设计;当教学平台用,别当成干活的机器。

更重更准上金属齿舵机、刚性框架,或加腕的五六自由度臂。移动机器人要的是底盘。

接线与坑

  • **每关节一舵机,每路一通道。**编号通道(0=底座,1=大臂……),映射写代码里,“动小臂”指令别打错舵机。
  • **舵机独立供电。**四舵机齐动电流尖峰;喂 PCA9685 V+ 端子,绝不走 Arduino。
  • **装配前先回零。**装舵盘前把每个舵机设到一个已知角度(如 90°),让机械臂的零位和代码里的零位对上。
  • **尊重臂展。**工具只能到连杆长度定的环形带里;外面点关节角再对也到不了——见机械臂模拟器。
  • **注意杠杆。**负载随臂展掉得快;轻拿轻放,不然舵机堵转尼龙齿崩。

写代码前要量的数

逆解是连杆长度的算术。量错臂自信地到错地方,代码背不了锅。

测量 量哪 典型
L1——上臂 大臂关节轴到小臂关节轴 90–105 mm
L2——前臂 小臂关节轴到夹爪夹持点 80–95 mm
底座高 桌面到大臂关节轴 50–70 mm
底座偏置 底座转轴到大臂轴,水平 0–15 mm

**量关节轴之间,不量支架边。**轴是舵机输出齿中心,常在可见支架里 5–10 mm。95 mm 连杆上 10 mm 误差超 10%——表现就是机械臂系统性地够不到目标,无论怎么调参都修不好。

两长度直接给出工作空间:

maximum reach = L1 + L2
minimum reach = |L1 - L2|

L1 = 100、L2 = 90,臂从大臂轴够 10 mm 到 190 mm——环带不是圆盘。中间有一块物理上到不了的区域,第一次碰到靠近底座的目标返回不可达时,确实会让人意外。两连杆等长洞消失,臂能折自己身上。

舵机扭矩:臂伸直为什么塌

大臂舵机要扛住外侧的一切,扭矩需求随质量离关节的距离增加。

全伸臂 L1 = L2 = 95 mm,30 g 负载,连杆各约 20 g:

Shoulder torque ~= (forearm+elbow mass x 0.095) + (payload x 0.190)
                ~= (0.05 kg x 9.5 cm) + (0.03 kg x 19 cm)
                ~= 0.48 + 0.57 = 1.05 kg.cm

SG90 4.8 V 堵转约 1.8 kg·cm。保持 1.05 kg·cm 是堵转 58% 持续,这已经远超玩具级舵机能保持精度的范围——它会掉到指令角以下、嗡嗡作响,并开始发热。

配置 大臂需求 SG90(1.8 kg·cm) MG90S(2.2 kg·cm)
收拢,无负载 约 0.2 kg·cm 舒服 舒服
伸直,无负载 约 0.5 kg·cm 行 行
伸直,30 g 负载 约 1.05 kg·cm 肉眼可见下垂 边缘
伸直,50 g 负载 约 1.4 kg·cm 堵转 下垂

三条实践后果。臂精度全伸最差,奇异形也住那,路径规划边界内。大臂用金属齿 MG90S,就算别处都用 SG90 也值得换——先坏的就是这个关节,尼龙齿在持续负载下会崩。能配平就配平:一根橡皮筋从上臂拉回底座,能免费帮大臂舵机卸掉相当一部分静载。

装配到数学能对得上

顺序要紧,一步尤其不可逆。

**1. 装舵盘前每舵机居中。**舵机上电,指令 90°,再压舵盘。舵盘花键——约 20 或 24 齿——只能离散位置装,最细调节约 15–18°。先装臂后标定,可能某关节可用范围偏 40°,机械完全救不回。

**2. 想要的零位装舵盘。**大臂一般上臂竖直,小臂前臂水平。约定定好写下,照着装。

**3. 拧紧前每关节全行程查。**指令 0° 和 180° 确认不撞框架。一个在 160° 就撞到自己支架的关节,有效限位就是 160°,你的代码必须知道这一点。

**4. 每关节偏移符号记下。**连杆的布置方式会让某些关节的旋转方向与你的数学约定相反。把它记下来:

struct Joint {
  uint8_t channel;
  int      offsetDeg;   // servo angle when the joint is at its mathematical zero
  int8_t   sign;        // +1 or -1
  int      minDeg, maxDeg;  // mechanical limits, measured
};

const Joint BASE     = {0,  90, +1,  -85,  85};
const Joint SHOULDER = {1,  90, -1,  -10, 120};
const Joint ELBOW    = {2,  90, +1, -120,  10};
const Joint GRIPPER  = {3,  20, +1,    0,  55};

int servoAngle(const Joint &j, float jointDeg) {
  float clamped = constrain(jointDeg, j.minDeg, j.maxDeg);
  return constrain((int)(j.offsetDeg + j.sign * clamped), 0, 180);
}

这个结构体就是运动学与硬件之间整座桥,显式写出来,才有一台能讲清楚的机械臂,而不是一台要靠试凑的机械臂。

四舵机供电

四微型舵机齐动远超单片机,臂失效模式更糟:撞自家框架或抓实东西整链舵机同时堵转。

情况 电流
空闲保持 合计约 40 mA
转动,无负载 约 600 mA – 1 A
四路全堵 约 2.6 A

按堵转配电源。独立 5–6 V 进 PCA9685 V+ 端子,并 470–1000 µF 电容,地和控制器连。把这些接在 Arduino 的 5 V 引脚上会让板子欠压——而且它只在机械臂到达某个特定位置时才发作,看上去很像软件缺陷。

温柔点动

舵机新角度指令全速到。在移动机器人上这只是动作突兀;在机械臂上却是实实在在的问题:剧烈的运动、电流尖峰,以及尼龙齿轮承受的一次冲击,而机械臂自身的杠杆还会把这冲击放大。

// Interpolate every joint together so the tool moves in a straight-ish line
// and no single servo takes the whole load at once.
void moveTo(float base, float shoulder, float elbow, int steps, int stepMs) {
  static float cur[3] = {0, 0, 0};
  float target[3] = {base, shoulder, elbow};

  for (int s = 1; s <= steps; s++) {
    float t = (float)s / steps;
    for (int j = 0; j < 3; j++) {
      float a = cur[j] + (target[j] - cur[j]) * t;
      pwm.setPWM(JOINTS[j].channel, 0, countsFor(JOINTS[j], a));
    }
    delay(stepMs);
  }
  memcpy(cur, target, sizeof(cur));
}

所有关节一起插值和做平滑同样重要。逐个关节依次运动,工具会在工作空间里走出一条奇怪的路径,既更慢,也更容易在半路撞上东西。

故障排查

现象 可能原因 解决
臂到完全错的地方 舵盘装在任意角度上 装舵盘前先把每个舵机归位到 90°
某关节范围偏约 20° 舵盘差一齿 拔了重装——软件修不了
臂一动板子复位 舵机电流走控制器 独立 V+ 供电,共地,大电容
全伸臂塌 大臂舵机过舒适扭矩 大臂 MG90S;配平;减负载
保持位姿嗡嗡 舵机极限顶负载 减负载,或不需要保持时就断开舵盘
底座附近到不了 目标进最小臂展环带 正常几何——|L1 − L2| 到不了
IK 回 NaN 目标超 L1 + L2 三角前先查可达
正反方向到得不一样 减速箱背隙,连杆放大 每次都从同一方向接近目标
新指令剧烈动 舵机全速 分步插值
夹爪压坏或掉东西 无力反馈 限合拢角;钳口加泡沫

什么时候升级这套件

四自由度亚克力套件是一个教学平台,它对此很坦白。它的局限,按你将会遇到的顺序排列如下。

**负载。**几十克。再重肩舵机拿不住。

**重复定位精度。**舵机减速箱的背隙加上亚克力连杆的形变,回到同一个指令位姿时会差几毫米。大臂上 4° 的空程放在 190 mm 臂展上,末端误差超过 13 mm。

**腕朝向。**四自由度工具到哪行,从哪角度到不行。五六自由度加腕,“从侧面拿起”才可能。

升级 买到
全 MG90S 舵机 金属齿——耐冲击,背隙小
铝连杆 形变更小,重复定位精度更好
MG996R 舵机加大框架 真负载,几百克
六自由度臂 独立工具朝向
步进或无刷臂 零点几毫米重复精度

这些升级都不改变数学本身。你为这个套件写的二连杆运动学求解算法,和更好的机械臂用的是同一个,这也正是先在便宜框架上搭一遍值得做的原因。

探索关联图谱

用到它的搭建

包含 四自由度机械臂套件 的项目、学习路线和模拟器。

问题

四自由度机械臂套件 常见问题

什么是四自由度机械臂?

四自由度(4-DOF)机械臂有四个独立控制的关节——通常是旋转底座、大臂、小臂和夹爪。这四种运动让末端工具能够到达桌面上一定范围内的各个位置,并把东西抓起来。它是最小的一种机械臂:用起来像一台真正的操作臂,同时又便宜、容易控制。

机械臂需要几个舵机?

每个关节一个。四自由度机械臂用四个舵机,分别负责底座旋转、大臂、小臂和夹爪。更大的机械臂还会增加腕部俯仰和腕部旋转,做到五或六个自由度。由于每个舵机都需要自己的一路 PWM 通道,机械臂正是加装 PCA9685 驱动板、而不是把舵机直接接到单片机上的经典理由。

MeArm 是什么?

MeArm 是一款很受欢迎的开源四自由度机械臂套件,用激光切割亚克力制成,由四个微型舵机驱动。它是廉价桌面机械臂的原型——如今市售的许多套件都是 MeArm 的仿制品或近似变体。它们的接线和编程方式都一样,所以运动学和驱动方面的技能可以在它们之间通用。

业余机械臂能举起多重的东西?

不多——夹爪处只有几十克。极限由舵机扭矩乘以力臂决定。SG90 约 1.8 kg·cm 的堵转扭矩听起来不小,可一旦分摊到 15 cm 长的臂上,可用负载就降到几十克。换用金属齿舵机、缩短臂长会有帮助;真要举起重物,你需要一台更大的、带减速机构的机械臂。

机械臂一定要用 PCA9685 吗?

严格来说不是必须的,但它是合适的工具。只要给舵机单独供电,四个舵机也能靠 Arduino 的 PWM 引脚运行;但 PCA9685 能腾出单片机的定时器,只用两个 I²C 引脚就能驱动所有关节,还让舵机电流走它自己的电源——这正是多关节机械臂所需要的。

延伸阅读

参考资料