尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从零搭建4-DOF机械臂:舵机选型、结构设计与控制实现

从零搭建4-DOF机械臂:舵机选型、结构设计与控制实现 1. 项目概述与整体设计思路1.1 为什么是4-DOF而不是6-DOF说实话我玩机械臂也有几年了从最早的两自由度玩具舵机臂到现在自己动手设计4-DOF机械臂中间踩过不少坑。你看到的这个项目标题“Build a 4-DOF Robotic Arm (Part 1)”其实是个很有代表性的入门进阶项目——它不属于那种“看一眼就放弃”的复杂工业级系统但也绝不是“接三根线就能转”的玩具。先说DOF这个事。DOF全称是Degrees of Freedom自由度。你可以把它理解为机械臂身上“能独立活动的关节数量”。4-DOF的意思是这台机械臂有4个能独立控制的旋转轴。为什么不是6-DOF因为自由度越高运动学反解就越复杂对结构刚性、舵机精度、控制算法的要求会成倍上升。4-DOF是DIY领域公认的“甜点值”——它足够完成很多实际任务抓取、搬运、码放、写字同时让人能靠直觉去理解每个关节的运动。从实际布局来看常见的4-DOF方案是这样分配的底座旋转轴腰关节1个、大臂俯仰轴肩关节1个、小臂俯仰轴肘关节1个、末端旋转轴腕关节1个。这基本模仿了人手臂的旋转、抬高、弯曲和翻转四个最核心的动作。它不是完美的比如腕部缺少一个俯仰自由度导致末端姿态调整能力有限但作为学习项目这个自由度的取舍刚刚好。1.2 Part 1的合理范围划定做Project总要有个阶段划分。Part 1这个标题意味着整个项目至少分两期第一期通常是把机械臂从零搭建到能通电转动、实现初步的关节控制第二期再去做逆运动学、路径规划、视觉抓取这些进阶功能。我在规划Part 1的时候给自己划定了三条边界完成机械结构设计与搭建包括底座、腰部、肩部、肘部、腕部的完整装配。实现4个舵机的独立通电与控制确保每个关节能通过PWM信号精确转动到指定角度。做一个最简控制程序用串口命令让每个关节动起来验证整机流畅度为Part 2的联动控制打基础。这三条边界的核心逻辑是“先让硬件活起来”。我看到太多人一上来就研究运动学正逆解结果硬件还没装稳舵机先烧了代码写了半天也不知道该怎么验证。机械臂项目的正确打开方式永远是先把肌肉舵机和结构建好再谈大脑算法和规划。1.3 我给这份方案选定的目标人群这篇内容适合谁看认真说适合三类人。第一类是刚学完Arduino或STM32基础、想做个“能真正干活”的项目的电子爱好者第二类是机器人教育方向的老师或培训讲师想找一个结构清晰、成本可控的教具方案第三类是自己动手做小型自动化设备的工程师想快速验证夹取和搬运的动作逻辑。如果你是纯小白连舵机是什么都不太清楚也可以看但建议先在纸上把“PWM控制舵机角度”这个基本原理搞清楚再用这份方案来做整机。否则你可能会在结构装配阶段被一堆螺丝和支架搞得头大。2. 核心硬件选型与参数计算2.1 舵机选型为什么我推荐MG996R作为主力4-DOF机械臂的关节执行器件市面上最常见的方案就是舵机。舵机的本质是一个直流电机加减速齿轮组加角度反馈电位器通过PWM信号控制输出轴转动到指定角度。控制简单、扭矩大、价格便宜是DIY机械臂理想的入门执行器。舵机选型时最重要的参数有三个扭矩、转速、供电要求。做4-DOF机械臂最怕遇到的问题是——大臂抬不起来。我最初用的SG909克微型舵机标称扭矩1.8kg·cm。这个扭矩看着还行但加到机械臂上就是灾难。因为SG90是小舵机它的齿轮是高强度塑料的没几次就会扫齿而且它的扭矩在越靠近底座的位置越显得不足。底座舵机不仅要带动大臂和小臂还要带动整个手臂结构的自重和负载扭矩不够就直接转不动。Part 1我选择的主力舵机是MG996R这是一款金属齿轮大扭矩舵机标称堵转扭矩在6V供电下约9.4kg·cm我实测大约在8kg·cm左右。这个量级对于臂展25cm以内的4-DOF机械臂来说是比较安全的。舵机选型的逻辑我建议用“扭矩预估公式”来算每个关节的力矩大约等于“该关节以后所有结构件的重量 设计负载”乘以“重心到该关节的距离”。我算过一个示例大臂结构约重300g加上小臂200g、末端结构100g、负载100g合计700g重心距离肩关节约12cm那肩关节需要的扭矩大约是700g * 12cm 8400g·cm的1/2因为重心更靠近关节也就是大约4.2kg·cm。MG996R的8kg·cm余量就很充足了。2.2 结构件方案亚克力切割、3D打印还是铝型材机械臂的骨骼结构可以用很多材料来做。我在这个项目里主要用的是5mm亚克力板激光切割件加3D打印件的混合方案。亚克力板的优势是刚性不错、成本低、切出来的精度高、装配孔位整齐。缺点是不能承受剧烈的冲击螺丝拧太紧容易开裂。所以凡是需要经常拆装或者受力集中的位置比如舵机支架和关节连接片我会叠加一个3D打印的零件用PLA或PETG材料打印出加强筋和内部支撑结构。很多刚入门的玩家会问“能不能全用3D打印”可以但要注意打印件的层间强度问题。3D打印件的纵向拉伸强度明显低于横向而机械臂受力方向是复杂多变的很容易从层间撕裂。我建议的使用方式是大面积板材用亚克力切割受力集中又形状复杂的小零件用3D打印两者通过M3螺丝和六角铜柱连接。我整理的选型对比表放在这里方便你做决定结构材料优点缺点适合用途亚克力板激光切割精度高、成本低、表面光滑脆性大、不耐强冲击大臂、小臂、底座板3D打印PLA/PETG形状自由、减震性好层间强度弱、精度依赖打印参数舵机支架、法兰、连接件6061铝型材刚度高、承重强加工难度大、成本高底座支架、高负载改造碳纤维板极轻、极高强度昂贵、加工粉尘有害追求轻量化的进阶方案2.3 控制板与舵机驱动Arduino做主控外置电源最关键控制板我选的是Arduino Nano。选择理由很简单便宜、有足够多的PWM引脚至少6路、IDE配置简单、示例代码多。STM32也行但这个项目的算力需求在Part 1阶段不需要那么强等Part 2做运动学解算时再换也不迟。需要补充的一个重要点独立供电。舵机的瞬时电流峰值非常高MG996R启动瞬间可以到2A以上4个舵机同时动作时如果直接从Arduino的5V引脚取电电压会被瞬间拉垮导致Arduino直接重启。正确的做法是给舵机单独配一个5V 5A的开关电源或者使用2S锂电池加UBEC降压模块控制板单独用USB供电两套电源共地GND一定要接在一起但电流不共用。这个常识虽然看起来基础但我在社区确实见到了太多人烧控制板、舵机抽搐、程序频繁重启最后排查了半天发现就是供电的问题。3. 机械结构搭建实操3.1 理清4个关节的安装顺序到这一步硬件的账算清楚了开始动手装配。Part 1的机械搭建我建议按从下到上的顺序来做底座 → 腰部旋转 → 大臂肩关节 → 小臂肘关节 → 腕部与末端。为什么从下往上因为每个上层结构都要依托下层结构来固定和定位。你如果先装好了腕部再回头去装底座手腕部分的线和结构件会挡手拧螺丝非常难受。3.2 底座与腰部旋转关节的装配底座是整个机械臂的根基它的稳定性决定了整机的抖动程度。我的底座方案是这样的一块200mm见方、5mm厚的亚克力底板四角用M3螺丝固定防滑橡胶脚垫底板中央打一个直径22mm的通孔用于穿过腰部舵机的线缆。腰部旋转我用的是一个双轴承转台结构。具体做法是在底板上固定两个608轴承或一个法兰轴承位置对准中心孔。腰部旋转舵机MG996R固定在下方舵机座上舵机输出轴朝上。用一个金属U型支架套在舵机输出轴的花键上并用附带的螺丝锁紧同时用M4螺丝把U型支架和上方的转盘锁死。转盘我用了3D打印的圆盘加两个销钉孔扣在轴承内圈上与U型支架刚性连接。这样舵机转动时转盘通过轴承在底板上滑动载荷大部分压在轴承上而不是直接压在舵机输出轴上。这是个非常关键的结构细节——如果让舵机输出轴直接承受整臂的重量舵机内的减速齿轮很容易磨损或断裂。轴承在这里的角色就是“力的转移器”把垂直方向的载荷通过轴承内圈引导到底板舵机只负责提供扭力。装完后用手转一转转盘应该感觉顺畅、无卡涩。如果明显有阻力多半是轴承安装歪了或者螺丝锁太紧压到滚珠了需要松开重装。3.3 大臂与肩关节角度限位与止挡肩关节是4-DOF里受力最严峻的关节。因为大臂自身重量加小臂和负载几乎全部要通过肩关节的舵机来扛。我用的方案是双舵机并联驱动——两个MG996R分别从左右两侧同时驱动同一根大臂转轴。双舵机并联能解决单舵机扭矩不足的问题但要注意两个舵机必须同步工作。我的办法是把两个舵机的PWM信号线接在同一个Arduino引脚上可以并接让它们收到完全相同的控制信号同时安装前要先把两个舵机的输出轴都旋转到同一个初始角度比如90度再安装U型支架确保两个舵机在机械上对齐。如果没对齐两个舵机会互相“打架”轻则发热抖动重则烧毁驱动芯片。肩关节的另一个关键点是物理角度限位。因为大臂前倾和后仰都有限度一旦超过临界点大臂会撞到转盘或者反过来掰断舵机齿轮。我在这台机械臂上用了最简单、最可靠的办法在转盘和大臂支架上各钻一个孔插入一根M4螺钉作为机械止挡把大臂的运动范围限制在-60度到90度之间垂直方向为0度。注意这个止挡不是靠舵机程序限制的而是物理硬限位能在程序失控时保护硬件。3.4 小臂、腕部和末端机构的安装小臂和肘关节相对简单用小一号的舵机倒是可以但为了兼容性和统一性我还是用了MG996R。小臂的安装没有什么特殊技巧唯一的提醒是连接小臂与肘关节舵机的金属法兰盘一定要用螺丝胶或弹簧垫圈。舵机运转时存在振动金属件之间摩擦容易让螺丝逐渐松脱我见过不止一次小臂在空中突然掉下去的事故就是因为固定螺丝松了。腕部旋转关节我选的是一个偏中性的方案使用一个MG90S金属齿轮舵机作为腕部旋转因为腕部负载小不需要那么大的扭矩再用一个3D打印的夹爪作为末端执行器。如果你不想做夹爪也可以直接用一个法兰盘连接方便以后换装吸盘、激光笔、摄像头等配件。末端夹爪这里我不建议一上来就做复杂的两指平行四边形欠驱动机构。Part 1的核心是先让机械臂动起来抓取功能用简单的舵机驱动夹爪就够了——一个舵机推一个滑块带动两个夹指闭合。后续Part 2再逐步升级末端机构。3.5 布线规划决定整机可靠性的隐藏细节很多人装完机械臂通上电发现舵机抖得厉害或者某个舵机不受控第一个想到的是代码问题。其实八成是布线问题。我的布线原则是“三分离”信号线与电源线分离、强电与弱电分离、活动关节处预留余量。每根舵机线从关节处穿出来时要从结构件的圆孔中走过避免被夹在两个活动件之间。否则每次转动时线都会被反复挤压时间长了内部铜丝断裂产生间歇性接触不良。活动关节处的信号线要留出足够的“弯曲余量”。简单说就是让线在关节全行程内都有一个自然的U形弯而不是绷成直线。可以参考传统折扇的开合机制——线在关节弯折处始终有松弛的空间。舵机线建议用扎带或热缩管固定在结构件上每隔5cm固定一点防止线乱甩缠到活动关节里。这一部分我在最后单独多啰嗦一句强烈建议在接线端子的正极和负极之间并联一个大电容1000uF以上可以有效吸收舵机启动时的电压尖峰。这是我在实际使用中发现性价比最高的稳定措施。4. 控制逻辑与关键代码实现4.1 三行伪代码理解舵机控制角度与脉冲宽度的映射舵机控制其实不复杂。以MG996R为例它用20ms周期的PWM信号驱动其中高电平的脉冲宽度决定输出轴角度。脉宽0.5ms对应0度1.5ms对应90度2.5ms对应180度。也就是说舵机控制的核心就是“把目标角度换算成对应脉宽然后产生方波信号”。用Arduino的Servo库你不需要手动生成PWM波形。库函数会自动把角度映射为脉宽。所以控制代码变得异常简单#include Servo.h Servo baseServo; // 底座旋转舵机 Servo shoulderServo; // 肩关节舵机 void setup() { baseServo.attach(9); // 底座舵机接在D9引脚 shoulderServo.attach(10); // 肩关节舵机接在D10引脚 } void loop() { baseServo.write(90); // 底座转到90度 shoulderServo.write(45); // 肩关节转到45度 delay(1000); // 保持1秒 }这段代码的原理就不需要我多说了。需要注意的一点Servo库会占用定时器资源Arduino Nano的Servo库最多可以驱动12路舵机利用Timer1和Timer24路完全没问题。但如果你同时还想用analogWrite做电机调速资源就会冲突——这是Servo库最典型的限制别忘了。4.2 串口指令控制协议让机械臂“听懂”命令Part 1的目标是让4个关节能独立控制所以我设计了一个最简单的串口协议。每帧数据格式是三个部分方向标识 舵机编号 目标角度。比如在串口监视器里输入“S1:90”表示把1号舵机底座转到90度“S2:45”表示把2号舵机肩关节转到45度。对应的解析代码如下String inputString ; void serialEvent() { while (Serial.available()) { char inChar (char)Serial.read(); if (inChar \n) { parseCommand(inputString); inputString ; } else { inputString inChar; } } } void parseCommand(String cmd) { // 期望格式S舵机编号:角度 if (cmd.startsWith(S)) { int colonIndex cmd.indexOf(:); if (colonIndex 1) { int servoId cmd.substring(1, colonIndex).toInt(); int angle cmd.substring(colonIndex 1).toInt(); angle constrain(angle, 0, 180); // 角度限位保护 switch (servoId) { case 1: baseServo.write(angle); break; case 2: shoulderServo.write(angle); break; case 3: elbowServo.write(angle); break; case 4: wristServo.write(angle); break; default: Serial.println(Unknown servo ID); } Serial.print(OK, Servo ); Serial.print(servoId); Serial.print( - ); Serial.println(angle); } } }这里我给角度做了constrain(0, 180)的限制但不要以为这就够了。上一节说的物理限位依然是底线保护——程序上的限位在舵机参数异常时可能失效物理止挡永远最后兜底。4.3 上电初始化与舵机归零机械臂第一次通电前有一个特别容易被忽略的步骤舵机初始位置校准。由于安装时结构件的位置并不是绝对精确的舵机输出轴在90度时机械臂的实际姿态可能不是垂直的。如果不做校准后续每次上电机械臂都会先跳到一个未知姿态容易撞到旁边的东西。我的校准流程是先把所有舵机线断开确保上电时不会有任何舵机动作。在代码里临时加一行把每个舵机都write(90)单独给电源上电。观察每个关节的实际角度记录偏差值。在代码中定义一个offset数组每次write之前把目标角度加上偏差值int offset[4] {0, 3, -2, 5}; // 每个舵机的实际偏移 void moveServo(int id, int angle) { switch (id) { case 1: baseServo.write(angle offset[0]); break; case 2: shoulderServo.write(angle offset[1]); break; case 3: elbowServo.write(angle offset[2]); break; case 4: wristServo.write(angle offset[3]); break; } }这个offset校准小技巧能让你后面的所有控制代码都按照“理想角度”来写而不需要每次都在角度换算里纠结结构装配误差。类比你写字时先矫正笔尖后面的线条自然就正了。4.4 朝向验证与整机测试流程装完、写完代码接下来是让人紧张的验证环节。我的做法是分三步走每步确认无误再进入下一步。第一步空转测试。断开机械臂的结构载荷只留舵机逐一对每个舵机发送0度、90度、180度确认舵机自身转动正常没有卡涩和异响。第二步整机静态测试。装上完整的结构件但末端不夹持任何东西从底座开始逐个关节转动观察机械臂在运动过程中是否有明显抖动、异响、突然停顿。重点观察肩关节在承受大臂自重时是否有力不从心的表现。第三步串口联动测试。手动输入一系列动作序列比如“S1:30 → S3:60 → S2:45 → S4:90”看机械臂是否按照顺序流畅执行。如果出现某个舵机响应迟缓或者轻微抖动优先检查是不是电源电压被拉低了。这三步测试跑完Part 1的硬件和控制链路就基本验证完成了。5. 常见问题与排查技巧实录5.1 问题速查从症状直接定位原因我在做这个项目时以及帮社群里的人远程排查过很多次整理了一份高频问题对照表按“症状 → 大概率原因”来列。遇到问题先查这张表比自己瞎猜快很多。症状大概率原因处理方法舵机通电后持续抖动不定位供电电压低或电流不足换5A以上电源加1000uF电容某舵机完全不动其他正常信号线松脱或引脚接错检查该舵机信号线对应引脚舵机转动到位后有嗡嗡声负载过重导致堵转减负或并联双舵机分担扭矩程序上传后没反应舵机初始位置超出物理限位检查offset值和机械止挡位置舵机发热严重长期堵转或供电超压检查电压是否为6V以内排除机械卡死转动时伴随咔咔声齿轮磨损或扫齿拆开检查齿轮损坏则更换舵机Arduino重启导致舵机抽搐共地没接或电源被拉垮确认两路电源GND可靠共地5.2 一个极易被忽视的坑舵机零漂与初始抖动我特别想提一下“舵机零漂”这个现象。就是指你给舵机发送90度的指令舵机也确实转到了90度位置但它在接近目标时出现小幅来回抖动像“犹豫不决”一样几秒后才稳定下来。这通常是两个原因造成的一是舵机内部电位器磨损导致角度反馈信号存在噪声这属于硬件老化暂时无解只能换舵机二是PWM信号本身质量差比如直接从Arduino的3.3V引脚取信号但接收端需要5V或者信号线过长引入了干扰。我实际排查中发现第二种情况算是主要因素。解决方案也很直白信号线尽量控制在20cm以内并且不要在舵机电源线旁边平行长距离走线。如果必须走长线就用双绞线配一个74HC245电平转换芯片做信号增强。这个“信号线越短越好、远离电源线”的原则适用于所有PWM控制的舵机系统。5.3 安装阶段的三个独家避坑指南最后一个部分我把老手们踩过的坑归纳成三条每一条背后都有真实翻车案例第一螺丝不是拧得越紧越好。亚克力板上的螺丝孔如果拧到“呲呲”响的程度说明已经滑丝或者压裂了。正确做法是用螺丝刀拧到感觉有阻力后再拧四分之一圈收手。如果需要更高的连接强度用铜柱加双面螺母而不是靠猛拧螺丝。第二装配时优先使用弹簧垫圈而不是平垫圈。舵机是高振动部件平垫圈在振动下会逐渐退丝弹簧垫圈能在一定程度上抵抗振动导致的松动。在关键受力部位还要配合螺纹胶比如乐泰243但注意别让胶水渗进舵机壳内部。第三留出升级空间。Part 1的结构设计我建议在底座上加装一组备用孔位用于以后装视觉支架或者关节限位传感器在控制板盒子上多留两个航插接口。你现在觉得多余的孔到Part 2做传感器扩展或者视觉定位时你会发现它们简直是救命稻草。我当初没留后期只能用热熔胶硬粘丑还不稳。说回装配过程本身我印象最深的是调试肩关节双舵机同步的那一晚。两个舵机始终差了一步改代码、换引脚、调零点都没用最后发现是一个舵机支架打印的轴孔偏了0.2mm。换上重新打印的支架后一切顺滑。这种机械公差问题没法从根本上避免但你可以通过学习3D打印的收缩率补偿来降低发生率——这就是为什么我一直强调玩机械臂不能只懂代码机械和结构的基本功同等重要。目前调试完最舒适的整机状态大概是这样的底座转动顺畅无点头大臂抬起时声音沉稳不发抖小臂和腕部动作干脆整机固定在桌面上运行三分多钟没有明显温升。Part 1到这里算是完成了它的使命。至于Part 2的逆运动学、联动轨迹规划、末端夹持控制等我把手头这批测试数据整理完再继续分享。
返回列表