做机械臂这件事我劝你先别急着买零件。很多人一上来就打开购物网站搜“机械臂套件”或者直接照着别人的图纸下单了一堆舵机和亚克力板。我第一台4-DOF机械臂就是这么开始的结果做到底座部分就发现肩部舵机扭矩算错了整条胳膊抬不起来只能返工。这篇是4自由度机械臂搭建记录的第1部分我会把从自由度规划、舵机选型计算到把底座旋转关节做出来并且通电测试的完整过程拆开讲。适合正在准备做机械臂的学生、创客爱好者也适合想从零入手机器人结构设计的人参考。Part 1 的边界我划得很清楚不做整臂的最终组装不写复杂逆运动学代码只做三件事——定方案、算负载、把底座关节做扎实并跑通测试。因为机械臂这种东西底座不稳后面全白搭。1. 为什么第一台机械臂选4自由度而不是“越多越好”1.1 三个旋转轴加一个夹爪到底能干什么4自由度机械臂最常见的构型是底座旋转、肩部俯仰、肘部俯仰、腕部俯仰或夹爪旋转。也就是说真正决定末端位置的是前三个关节第四个关节负责末端姿态或夹取动作。很多人觉得自由度越多越高级6轴、7轴听起来才像工业机器人。但自己做项目自由度每加一个机械结构、控制逻辑、供电负载和调试成本不是线性增长是成倍增长的。4自由度的意义在于它能覆盖“从A点抓东西放到B点”这个最常用的场景而且运动学计算还能用手算搞定不需要矩阵迭代。我当时的任务很简单桌面范围内把一个小方块从左边抓起来放到右边的指定位置再抬起来。这个动作只需要底座转、肩抬、肘伸、夹爪开合。4自由度刚好覆盖不多不少。1.2 4自由度做不到什么心里要有数4自由度解决不了姿态保持的问题。比如你想让末端夹爪在移动过程中始终水平朝下或者让杯子里的水不洒出来4自由度做不到需要第5个或者第6个自由度来做姿态补偿。这一点必须在动手前就想明白否则做到一半你会发现机械臂“够得着但姿势不对”然后开始怀疑是不是自己装配有问题实际上这是自由度规划的问题不是装配问题。我自己画的规划表是这样的目标动作需要的关节自由度数量桌面取放方块底座旋转肩肘夹爪4水平移动末端姿态不变底座旋转肩肘腕俯仰5绕过障碍且保持姿态底座旋转肩肘腕旋转6所以如果你只是做入门项目4自由度是最合理的起点。它会逼你把每个关节的机械设计、扭矩计算、控制调试都摸一遍又不会因为自由度太多导致第一版就失控。2. 结构件与舵机选型先算负载再买零件2.1 亚克力、3D打印还是铝件不要只看颜值结构材料的选择直接决定整机刚性和加工难度。我见过太多人用3mm亚克力做整机结果装完发现肩部关节在舵机启动时明显形变末端抖动超过1厘米。这不是舵机的问题是材料刚性不够。我对比过的三种方案材料优点缺点适合场景3mm亚克力便宜、透明好看、激光切割快脆、螺丝孔容易裂、刚性一般教学演示、不追求精度的原型3D打印PETG/ABS可做复杂形状、免开孔层间强度弱、机加工精度受打印参数影响需要定制结构的原型铝合金CNC/板材刚性高、精度高、耐用贵、需要加工设备或外发要做长期稳定运行的整机我最后选的是3mm铝板加少量3D打印连接件。铝板刚性足够3D打印件用来做舵机支架和轴承座这类形状复杂的零件。如果你学生党预算有限至少底盘和立柱用金属上肢可以用打印件把刚性重点放在最底下这一层。2.2 舵机扭矩计算最容易被忽略的数学题选舵机不能靠感觉。我见过有人用9g舵机做肩关节结果连自身重量都撑不住。扭矩计算其实只需要一个公式扭矩kg·cm 力kg × 力臂cm × 安全系数以我的设计为例上臂长度15cm前臂长度13cm夹爪加负载约50g。肩部舵机支撑的总重量包括上臂结构件、前臂结构件、肘部舵机、腕部舵机、夹爪和负载加起来大约250g。这个重量分布在整个手臂上重心粗略估算在离肩关节约15cm的位置。肩部需要的扭矩 0.25kg × 15cm ≈ 3.75kg·cm。听起来很小对吧但你还要考虑两个因素第一机械臂在水平伸展时重心离肩关节最远力臂要按最恶劣工况算第二舵机在运动过程中的冲击载荷远大于静态载荷。所以安全系数建议取2到3倍。我最终选了15kg·cm级别的金属齿轮舵机实际使用下来余量充足不会出现憋死的情况。底座的扭矩计算逻辑不一样。底座主要承受的是整个上肢的弯矩和旋转时的惯性力不是单纯的抬升力。上肢总重量大约400g重心到底座转轴大约20cm底座承受的倾覆力矩在8kg·cm左右同时还要克服转动摩擦。所以底座我也选了20kg·cm级别的舵机第一版用MG996R最后升级成了DS3218。如果预算有限底座至少也要15kg·cm这个位置省不得。2.3 我的选型清单这里直接给出我Part 1阶段实测可用的清单舵机参数是按多年经验标定的可以直接抄部件型号/规格数量说明底座舵机DS3218 数字舵机 20kg·cm1金属齿轮带轴承支撑肩部舵机MG996R 模拟舵机 15kg·cm1扭矩余量足够肘部舵机MG996R 模拟舵机 15kg·cm1后续可换MG995腕部舵机MG90S 金属齿轮 2kg·cm1只带动夹爪控制板Arduino Uno R31上手成本最低PWM驱动PCA9685 16路模块1舵机数量多时必备电源6V/5A 开关电源1单独给舵机供电结构件3mm铝板 PETG打印件若干底座用铝板轴承684法兰轴承 两个2底座旋转核心舵机线建议全部换成硅胶软线尤其是底座关节的线因为要跟着旋转走线普通PVC线用久了会硬化断裂。3. 底座旋转关节的制作整机稳定的起点3.1 为什么Part 1先从底座开始做从底座开始不是因为它简单恰恰因为它最难。底座是整个机械臂的“腰”它决定了整机的稳定性和旋转精度。如果你先把夹爪和手腕做好了再回头做底座心态会崩——因为你会发现所有前期工作都要重新适配。底座的装配方案我用了一个很经典的设计舵机主体固定在底板上输出轴朝上通过舵臂连接一个法兰轴承支撑的转盘。转盘再连接上面的立柱。重点是让舵机输出轴不要直接承受整个手臂的重量重量由轴承承受舵机只负责输出扭转力。结构拆开看是这样的底板200mm×200mm×3mm铝板四角打孔用于固定舵机固定座3D打印的舵机座用M3螺丝锁在底板上法兰轴承安装在舵机座上方的支撑板上内圈过盈配合舵机输出轴转盘一块直径80mm的铝圆盘或3D打印圆盘中心孔与舵机输出轴配合3.2 装配步骤与细节具体装配我用编号步骤说清楚先把舵机装进3D打印底座输出轴朝上舵机底部用4颗M3×8沉头螺丝固定。注意MG996R的耳朵比较薄螺丝拧到刚好锁紧就行不要大力出奇迹否则耳朵会裂。装法兰轴承。我在支撑板上打了三个孔一个中心孔装轴承两个对称孔穿舵机线。线要从两侧穿出来不要从轴承孔里穿否则舵机旋转时线会被绞住。把舵机输出轴的舵臂装上这个舵臂就是整个转盘的连接点。为了减小角度误差最好先让舵机回中位再装舵臂让舵臂与机械臂前进方向对齐。转盘与舵臂之间用螺栓固定转盘上再立柱。立柱我用的是2mm厚的折弯铝件用一堆角码固定在转盘上。这里注意立柱不要只靠中间一颗螺栓固定至少要对称四颗否则前后受力时会晃。满行程测试手动转动转盘检查是否有卡滞点。如果有卡滞多半是轴承没压到位或者舵机输出轴与转盘不同心。3.3 走线预留和重心控制底座走线是所有新人都会踩的坑。我第一次做的时候舵机线从底部直接拉到立柱上方旋转范围一大线就被绞断了。后来我改成在底板侧面开了一个出线口把三根舵机线电源、地、信号用螺旋保护管套住从底座的侧面引出加长线连接到控制板这样转盘旋转时线的形变是舒缓的不会产生死折。重心这块我多说几句。机械臂在完全伸展的状态下重心会偏到离底座中心大约25-30cm的地方整个上肢的倾覆力矩非常大。底板的固定方式有两个选择一是用C型夹或螺丝固定在桌面上二是在底板下面加配重块。我的做法是底板四角打了沉孔直接用M4螺丝锁死在桌面的木板上。如果你需要在不同桌面之间挪动建议底板下面加一块5mm厚、200mm×200mm的钢板配重能有效降低倾覆风险。4. 控制板与电源Part 1里最容易翻车的两个地方4.1 控制板选型Arduino Uno为什么够用控制板的选择其实很随意Arduino Uno、Mega、ESP32、树莓派Pico都可以。我选Arduino Uno的原因是生态最成熟舵机库、PCA9685库、各种教程都是现成的调试时遇到问题搜索一下就有答案。但要注意一个细节直接用Arduino驱动多个舵机板子上的5V引脚是扛不住的。一个MG996R堵转时电流可以到2.5A四个舵机同时工作瞬时电流随便超过6A。Arduino的AMS1117稳压芯片只能输出几百毫安所以必须用外部电源给舵机供电Arduino只负责输出PWM信号。这里我把连线逻辑理一下Arduino Uno通过USB或DC口供电只给主控芯片供电PCA9685模块的VCC接外部6V电源的正极舵机电源PCA9685的V引脚接舵机电源正极GND接电源负极Arduino的GND和PCA9685的GND必须接在一起这叫“共地”不共地的话PWM信号的电平基准不一致舵机会乱抖4.2 舵机供电与逻辑供电分离的真正原因很多人不理解为什么要分离供电。我用一句话解释舵机是“大功率抖动源”它在启动和堵转瞬间会产生很大的电流波动这些波动会拉低电压而Arduino这种逻辑电路对电压波动非常敏感一旦电压降到4.5V以下单片机就会复位程序重跑。我第二版测试时遇到过这种情况机械臂转动到某个角度时Arduino突然重启。排查了半天最后用万用表测舵机供电端发现电压在舵机启动瞬间跌到了4.2V。把舵机电源和控制板电源彻底分开之后这个问题再没出现过。供电方案我建议这样做方案优点缺点推荐度6V/5A开关电源功率足、便宜、可靠需要插220V电源移动性差首选7.4V 2S锂电池 5V/6V UBEC降压模块可移动、重量轻电池管理麻烦降压模块要选5A以上进阶方案四节18650串联 降压容量大电压太高需要高质量降压风险大不推荐选6V电源还有一个原因MG996R和DS3218的数据手册里标称工作电压是4.8V到6.8V6V是性能最好的工作点。如果你用5V电源舵机速度会明显变慢扭矩也会打折。4.3 上电前的检查清单我每次上电前都会过一遍这个检查清单避免烧板子烧舵机是否共地Arduino的GND与PCA9685的GND必须连接舵机线序是否正确棕色/黑色是地线红色是电源黄色/橙色是信号接反必烧舵机信号线是否插在PCA9685的0到15通道中而不是误插到电源跳线帽上先用电源给PCA9685上电观察舵机是否自发抖动如果抖说明信号端没有共地或者PWM频率不对在Arduino上电前先检查PCA9685的VCC引脚上电压是否为6V左右防止电源反接这套检查大概只需要两分钟但能避免90%的翻车。5. 让底座先动起来测试程序与三个常见故障5.1 最简单可靠的舵机扫描测试程序Part 1的验收标准很简单底座旋转关节能按照指令左右转动角度脉冲准确无抖动无卡滞。下面这个程序是我实际在用的基于Adafruit PCA9685库。#include Wire.h #include Adafruit_PWMServoDriver.h Adafruit_PWMServoDriver pwm Adafruit_PWMServoDriver(); // 脉宽值范围根据实际舵机调整一般150-600对应0-180度 #define SERVO_MIN 150 #define SERVO_MAX 600 #define SERVO_CENTER 375 void setup() { Serial.begin(115200); pwm.begin(); pwm.setPWMFreq(50); // 舵机标准频率50Hz周期20ms pwm.setPWM(0, 0, SERVO_CENTER); delay(500); } void loop() { if (Serial.available()) { int target Serial.parseInt(); if (target SERVO_MIN target SERVO_MAX) { pwm.setPWM(0, 0, target); Serial.print(move to pulse: ); Serial.println(target); } else { Serial.println(out of range); } } }这个程序干的事情很简单通过串口输入一个脉宽值底座舵机就会转到对应位置。先用这个方法找到底座的真实机械限位不要一上来就跑自动扫描程序。因为你不知道舵机的物理极限在哪里硬跑极有可能扫到极限位置后堵转电流飙升舵机发烫。找到限位后把SERVO_MIN和SERVO_MAX改成你测出来的安全值我最终设定的是200和550也就是大约60度到150度的范围。这样既保留了大范围运动能力又不会卡到结构极限。5.2 抖动、偏转和舵机发烫的排查路径第一个常见故障是底座舵机原地抖动不转到指定位置。出现这个现象我先检查供电用万用表直接量PCA9685输出端子的电压如果舵机启动瞬间电压跌破4.8V基本可以确定是电源功率不够换大功率电源即可。如果电压稳定再查信号线是否接触不良尤其是舵机线的公母头这种线的端子很容易松动我遇到过好几次线头缩回去的问题。第二个是舵机“回中不准”。每次让舵机回到中位停下来的角度都不一样。这种问题要么是舵机电位器磨损要么是电压不稳定。新手最容易忽视的是舵盘没有锁紧MG996R的舵盘与输出轴是靠一个十字形样式的齿啮合固定的如果舵盘螺丝没拧紧受力时会出现虚位回中自然不准。手放到舵盘上晃一下就知道有没有虚位。第三个是舵机发烫甚至冒烟。这个必须立刻断电排查。原因一般是机械卡滞舵机被憋住之后堵转电流非常大。我用热成像看过MG996R堵转一分钟表面温度就能到70度以上。所以上电测试时如果听到舵机发出“吱吱”的憋力声立刻关电源检查转盘是否有东西卡住、舵盘角度是否在结构限位内。千万别想着“应该能撑住”堵转十分钟舵机就报废了。5.3 三个改良点和Part 2的接口预留底座测试通过后我给后续的Part 2预留了几个接口你也可以照着做一我把立柱上端统一成标准的60mm间距M3螺丝孔这样后续安装肩部支架时不需要重新打孔。二我把舵机连接线从直接焊接改为JST插头方便后续拆装舵机坏了直接拔插更换不用动烙铁。三我在代码里把底座角度写成了一个单独的函数rotateBase(angle)后续做逆运动学控制时只需要调用这个函数不需要重构代码。还有一个我自己后来才做的改良给底座转盘加了一个限位开关作为归零传感器。虽然Part 1用不到但后续如果要做自动归零这个开关可以当硬件参考点。如果你现在能做到建议预留安装孔位不然等整机装好了再想加就非常难受。到这里Part 1的底座部分就完成了。我个人做下来最深的体会是机械臂这种项目结构设计和选型计算花的时间必须比组装和写代码多。只要底座够稳、扭矩富余、供电扎实后面就算犯点小错也不会出大问题。下一次Part 2我会把手腕和夹爪做出来然后进入整机联调。到时候见。