低成本双机械臂DIY:从Arduino控制到AI任务学习全解析

发布时间:2026/5/31 12:29:10

低成本双机械臂DIY:从Arduino控制到AI任务学习全解析 1. 项目概述为什么选择打造一台低成本双机械臂在机器人领域尤其是机械臂方向高精度、高负载的工业级产品往往价格不菲动辄数万甚至数十万这让很多爱好者、学生和初创团队望而却步。但机器人技术的核心魅力——与环境进行物理交互的能力——并不应该被高昂的成本所垄断。这正是Bidex双机械臂项目诞生的初衷用尽可能低的成本打造一台结构完整、功能可扩展并且足够安全可以与人类近距离协作的开源机器人平台。Bidex的核心设计理念非常明确低成本、开源、安全、可AI赋能。它没有采用昂贵的谐波减速器或精密导轨而是巧妙地利用常见的MG996R金属齿轮舵机作为动力源通过创新的结构设计在仅使用4个舵机驱动单臂的情况下实现了肩、肘、腕、手爪的基本自由度。整机主体采用3mm亚克力板激光切割而成总重仅2.6公斤这使得它在意外碰撞时对人造成的伤害风险远低于沉重的金属机械臂。更重要的是它获得了开源硬件协会OSHWA的官方认证认证号SA000003这意味着所有的机械设计文件、电路图和示例代码都是完全开放的任何人都可以下载、修改、制造属于自己的Bidex。这个项目非常适合以下几类朋友机器人爱好者想要一个可以实际动手组装和编程的实体平台高校学生或教育工作者需要用于教学演示或课程设计的教具创客或开发者希望有一个低成本载体来验证自己的算法比如计算机视觉抓取、路径规划或简单的AI学习任务。接下来我将从设计思路、硬件选型、组装调试到编程控制为你完整拆解这个项目的每一个环节并分享我在复现和拓展过程中积累的实操经验与避坑指南。2. 核心硬件解析与选型考量一台机械臂的性能天花板很大程度上在硬件选型阶段就已经决定了。Bidex的设计在成本与性能之间做了精妙的平衡理解其背后的考量能帮助你在复现或改进时做出更明智的决策。2.1 主控与驱动方案为什么是Arduino I2C舵机驱动板项目选用Arduino作为主控这是一个极其务实的选择。对于机械臂控制这类需要实时响应PWM信号的任务Arduino Uno/Nano等基于AVR单片机的板子完全能够胜任其社区资源丰富、编程门槛低是快速原型开发的利器。原作者并未指定具体型号这意味着你可以根据手头资源灵活选择。我个人推荐使用Arduino Mega 2560原因很简单它拥有更多的数字I/O引脚和串口。双机械臂至少需要8个舵机信号线每臂4个未来若想增加传感器或通讯模块Mega的引脚余量能让你更从容。舵机驱动方案是另一个亮点。直接使用Arduino的IO口驱动多个舵机并非不可行但存在两个问题一是会占用大量IO资源二是当多个舵机同时运动时Arduino的5V电源可能无法提供足够的峰值电流导致板子重启或舵机抖动。Bidex方案中使用的I2C舵机驱动模块完美解决了这两个问题。这类模块如PCA9685通过I2C总线与Arduino通信仅占用2个引脚SDA, SCL就能控制多达16路舵机并且自带独立的电源接口可以为舵机提供强大而稳定的电流。这是构建多自由度机器人时一个非常专业且必要的选择。注意务必为舵机驱动板提供独立电源切勿从Arduino的5V引脚取电给多个舵机供电。一个MG996R堵转电流可达2A以上多个同时工作会瞬间拉低电压损坏你的Arduino板。建议使用一个输出能力在5V/5A以上的开关电源单独为驱动板供电。2.2 动力核心伺服电机的选择与扭矩考量Bidex单臂使用了4个舵机MG996R金属齿轮舵机 (x2)用于肩部和肘部关节。这两个关节需要承受整个前臂和负载的重量对扭矩要求最高。MG996R标称扭矩在4.8V时约为9.4kg·cm在6.0V时可达11kg·cm且是金属齿轮耐用性较好是性价比之选。微型金属齿轮舵机 (x2)用于腕部旋转和手爪开合。这两个关节负载相对较小但对尺寸和重量敏感。使用微型舵机可以减轻末端重量从而降低肩、肘关节的负载。这里有一个关键的经验点标称扭矩与实际可用扭矩。舵机标称的“堵转扭矩”是在特定电压下测得的实际应用中由于机械结构存在摩擦、力臂长度等因素传递到末端的有效扭矩会打折扣。Bidex的设计通过两个途径优化了这一点一是采用亚克力激光切割的轻量化结构尽可能减轻自身重量二是在手爪等部位使用塑料垫片plastic spacers连接而非金属螺丝螺母进一步减重。这提醒我们在DIY机器人时“轻量化设计”和“动力选型”是必须同步考虑的一体两面。如果你希望获得更强的性能可以考虑以下升级方案舵机升级将MG996R替换为数字舵机如Dynamixel AX或XM系列。数字舵机支持菊花链总线通讯如TTL总线无需单独的驱动板且具有位置、温度、负载反馈等功能但成本会大幅增加。电压提升在舵机允许的电压范围内通常MG996R可接受5V-7.2V适当提高供电电压可以线性增加输出扭矩和速度。例如使用6V电源供电。但务必确保所有舵机都能承受此电压并且电源功率足够。2.3 结构材料亚克力板的利与弊使用3mm厚亚克力板激光切割是达成“低成本”和“快速原型”目标的关键。它的优点显而易见加工速度快、成本低、重量轻、绝缘性好。文件设计好后在线下或线上的激光加工服务商那里可以很快拿到成品。但缺点也需要正视强度与刚度有限亚克力板较脆在长期、高负载或受到冲击时可能在螺丝孔位或薄弱处产生裂纹甚至断裂。连接可靠性亚克力板之间的连接通常依靠螺丝和螺母或者胶粘。反复拆装容易导致滑丝。实操心得加强关键节点在承受较大剪切力或弯矩的关节连接处可以在亚克力板之间加入小型金属加强片或者使用更厚的亚克力板如5mm进行局部加强。螺丝使用技巧在亚克力上攻丝不可靠务必使用自锁螺母或防松螺母配合螺丝使用。在拧紧时力度要适中感觉到阻力后再稍加一点力即可过度拧紧会压裂亚克力。备件准备激光切割时不妨多切一套关键结构件作为备件以防在调试过程中损坏。3. 机械结构组装与校准全流程拿到所有激光切割件和硬件后组装是第一个大挑战。顺序和精度直接影响最终性能。3.1 组装顺序与核心技巧建议按照“从末端到基座从单臂到整体”的顺序进行组装手爪Gripper这是最精密的部件。按照设计文件将拇指、手掌和手指部件用5mm塑料垫片和细轴连接起来。确保各指节活动顺畅无卡滞。然后将微型舵机安装到位通过连杆或直接驱动的方式连接舵机盘与手指。此处的关键点是确保舵机在中立位置时手爪处于半开或预紧状态这需要在后续编程中校准舵机角度。手腕Wrist将驱动手腕旋转的微型舵机通过其支架bracket固定到前臂forearm部件上。这里原作者提示使用强力的亚克力胶水如氯仿或专用亚克力胶来粘合电机支架与亚克力板这比单纯用螺丝固定更牢固、更紧凑。粘合前务必用酒精清洁粘合面并确保位置准确。前臂与肘关节将已完成的手腕部件与肘部舵机MG996R的输出轴连接。肘部舵机负责俯仰运动。同样需要确保机械零位与舵机电零位对齐的标记。上臂与肩关节将前臂组件与上臂连接再将上臂组件安装到驱动肩部俯仰的舵机上。肩部舵机是受力最大的关节所有螺丝和连接件务必锁紧。躯干Torso与基座将两个完整的机械臂对称地安装到躯干两侧。躯干内部用于放置Arduino主控板、舵机驱动板、电源模块以及可能的传感器如摄像头。合理的线束管理非常重要使用扎带将电线捆好避免运动时缠绕。一个至关重要的步骤机械零位校准。在给任何舵机上电之前手动将每个关节旋转到你认为的“零度”位置例如手臂完全伸直下垂手爪水平。然后小心地将舵机输出盘舵机臂拆下再安装到对应的关节连接件上确保此时舵机输出盘也处于其电机的机械零位通常舵机在0°脉冲宽度时对应的位置。这样能保证软件发送0°指令时机械臂处于预定的姿态避免一上电就暴力旋转到极限位置导致结构损坏。3.2 双臂对称性与协调性调整对于双机械臂两臂的对称性和运动协调性是高级要求。在组装后你需要进行测量和微调基准面校准确保两个机械臂的安装基座在同一水平面上且相对于躯干中轴线对称。可以使用直角尺或水平仪进行粗略校准。运动范围标定通过编程缓慢移动每个关节记录其在实际物理结构限制下的安全角度范围例如肩关节从-30°到90°。将这些软限位写入代码防止运动超程。同步性测试编写简单的镜像运动程序让左臂跟随右臂做相同的动作观察末端轨迹是否一致。由于加工和组装的误差完全一致很难但可以通过在代码中为每个关节添加微小的偏移量进行补偿。4. 控制系统搭建与基础编程硬件组装完毕接下来是赋予机器人“生命”的软件部分。我们从最基础的舵机控制开始逐步构建一个可交互的控制系统。4.1 开发环境与核心库配置首先确保你已安装Arduino IDE。接下来需要安装控制I2C舵机驱动板所必需的库。最常用的是Adafruit PWM Servo Driver Library。在Arduino IDE中点击“工具” - “管理库...”。在库管理器中搜索“Adafruit PWM Servo Driver”。找到并安装它。这个库封装了通过I2C与PCA9685等芯片通信的复杂细节让我们可以用简单的函数如setPWM()来控制舵机。然后将Arduino、舵机驱动板、舵机按电路图连接。核心连接如下Arduino的5V- 驱动板的VCC(给驱动板逻辑部分供电)Arduino的GND- 驱动板的GND(共地至关重要)Arduino的A4 (SDA)- 驱动板的SDAArduino的A5 (SCL)- 驱动板的SCL外部5-6V电源正极- 驱动板的V(或标有舵机电源的接口)外部电源负极- 驱动板的GND(务必也与Arduino的GND连通)舵机信号线通常是橙色或白色连接到驱动板的PWM输出通道如SERVO0, SERVO1...。舵机的红色正极和棕色负极线分别接到驱动板的V和GND排针上。4.2 从串口控制到运动函数封装项目提供的示例代码bidexSample.ino是一个很好的起点。它通过串口监视器发送单个字符W/S/A/D/O/C来控制单个机械臂的四个舵机微动。这对于初步测试每个关节是否正常工作非常有效。然而要实现有意义的复杂动作我们需要更高级的控制方式。下一步就是将这种低级的、按度移动的指令封装成更易用的运动函数。例如我们可以编写如下函数#include Wire.h #include Adafruit_PWMServoDriver.h Adafruit_PWMServoDriver pwm Adafruit_PWMServoDriver(); // 定义舵机通道假设左臂的4个舵机接在0-3通道 #define L_SHOULDER 0 #define L_ELBOW 1 #define L_WRIST 2 #define L_GRIPPER 3 // 定义每个舵机的脉宽范围微秒需根据你的舵机实测调整 #define SERVOMIN 150 #define SERVOMAX 600 void setup() { Serial.begin(9600); pwm.begin(); pwm.setPWMFreq(50); // 模拟舵机通常使用50Hz频率 delay(1000); goToHomePosition(); // 上电后回到安全“家”位置 } void loop() { // 主循环可以执行动作序列或响应更复杂的指令 } // 将角度度转换为脉宽脉冲 int angleToPulse(int ang) { int pulse map(ang, 0, 180, SERVOMIN, SERVOMAX); return pulse; } // 控制单个舵机运动到指定角度 void setServoAngle(int servoNum, int angle) { int pulse angleToPulse(angle); pwm.setPWM(servoNum, 0, pulse); } // 定义“家”位置 void goToHomePosition() { setServoAngle(L_SHOULDER, 90); // 肩部垂直 setServoAngle(L_ELBOW, 90); // 肘部90度弯曲 setServoAngle(L_WRIST, 90); // 手腕水平 setServoAngle(L_GRIPPER, 30); // 手爪微开 delay(1000); } // 示例完成一个简单的“取放”动作序列 void pickAndPlace(int targetShoulderAngle, int targetElbowAngle) { // 1. 移动到目标点上方 setServoAngle(L_SHOULDER, targetShoulderAngle); setServoAngle(L_ELBOW, targetElbowAngle); delay(1000); // 2. 下降并抓取 setServoAngle(L_WRIST, 70); // 调整手腕角度以垂直下降 delay(500); setServoAngle(L_GRIPPER, 0); // 闭合手爪假设0度为闭合 delay(500); // 3. 抬起 setServoAngle(L_WRIST, 90); delay(1000); // 4. 移动到放置点并松开 // ... 此处省略移动到放置点的代码 setServoAngle(L_GRIPPER, 60); // 打开手爪 delay(500); goToHomePosition(); }通过这样的封装我们就不再需要记住“W是肩部上移2度”这种底层指令而是可以直接调用pickAndPlace(120, 60)这样的高级命令。这是构建更复杂应用的基础。4.3 引入逆运动学让控制更直观基础的运动序列编程是“示教”式的你需要知道每个关节的角度。但在实际应用中我们更习惯用笛卡尔空间坐标即末端的X, Y, Z位置来控制机械臂。这就需要逆运动学。逆运动学是根据末端执行器的目标位置和姿态反解出各个关节所需角度的数学过程。对于Bidex这样的4自由度平面关节型机械臂肩、肘为旋转关节运动主要在一个平面内其逆运动学有解析解相对容易实现。我们可以编写一个逆运动学函数输入末端的X, Y坐标相对于肩部旋转中心输出肩部和肘部的角度。这涉及到一些三角几何计算。虽然计算过程稍复杂但一旦实现你就可以用moveToPoint(200, 150)这样的命令让机械臂末端直线移动到指定坐标控制体验会有质的飞跃。网络上有很多关于二连杆机械臂逆运动学的教程和代码示例可以将其适配到Bidex的尺寸上。5. 迈向智能AI学习基本任务的探索项目描述中提到Bidex“能够使用AI学习基本任务”。这是一个非常吸引人的方向。在低成本硬件上实现AI通常指的是模仿学习或简单的强化学习而不是需要巨大算力的深度学习模型。这里提供几个可行的实践路径5.1 路径一基于示教的动作记录与回放这是最简单直接的“学习”。你可以手动引导机械臂在断电状态下完成一个动作比如画一个圆。在这个过程中通过安装在关节上的电位器或编码器需要额外硬件实时记录每个关节的角度变化序列。记录完成后让机械臂自动重复这个角度序列就能复现你教给它的动作。这本质上是“录制-播放”功能。5.2 路径二结合视觉的闭环控制为Bidex增加一个摄像头如USB摄像头或树莓派摄像头它的能力将大大扩展。你可以使用OpenCV在电脑或树莓派上处理图像实现以下功能颜色跟踪抓取识别特定颜色的物体计算其在图像中的位置通过坐标转换得到相对于机械臂的世界坐标再调用逆运动学函数控制机械臂抓取。姿态估计通过摄像头观察机械臂自身的标记点可以实时估算其末端实际位置与目标位置比较形成闭环控制补偿由于舵机精度、结构形变带来的误差。在这种架构下Arduino主要负责接收来自上位机运行OpenCV的电脑/树莓派的关节角度指令并执行复杂的图像处理和决策在上位机完成。两者通过串口USB通信。5.3 路径三简单的强化学习尝试这是一个更前沿的尝试。你可以设定一个目标比如“让机械臂用手爪触碰一个固定位置的开关”。将机械臂各关节的当前角度、末端估计位置作为状态将给每个舵机的微小角度增量作为动作触碰成功给予正奖励其他情况给予负奖励或零奖励。然后使用一个轻量级的强化学习算法如Q-learning或其变种在Arduino上实现可能过于吃力更适合在上位机运行来训练一个策略网络。由于Bidex是物理实体训练过程会非常缓慢且可能损坏硬件。一个更安全的方法是先在高保真的仿真环境如PyBullet, MuJoCo或ROS Gazebo中建立Bidex的模型并进行训练待策略收敛后再将策略部署到真实的Bidex上运行。这涉及到“仿真到现实”的迁移是当前机器人研究的热点。6. 常见问题排查与性能优化指南在搭建和调试Bidex的过程中你几乎一定会遇到下面这些问题。这里是我总结的排查清单和优化建议。6.1 舵机相关问题问题现象可能原因排查与解决方法舵机不转动有异响1. 电源功率不足或电压过低。2. 机械负载过大舵机堵转。3. 信号线接触不良或接错。1. 用万用表测量驱动板V端的电压确保在5.5V-6V之间且电源能提供足够电流建议5A以上。2. 手动转动关节检查是否有卡滞。卸下负载测试舵机是否正常。3. 检查信号线是否确实连接到了驱动板正确的通道并接触良好。舵机抖动或定位不准1. 电源干扰。2. 机械结构松动或存在虚位。3. 舵机本身精度差或已损坏。1. 为驱动板电源并联一个大电容如1000uF 16V以滤除波动。2. 紧固所有机械连接检查亚克力孔位是否因磨损变大。3. 更换一个已知良好的舵机进行测试。MG996R这类模拟舵机本身存在一定死区属正常现象。舵机发热严重1. 持续处于堵转或高负载状态。2. PWM信号占空比异常导致舵机持续用力。1. 检查程序中的角度指令是否超出机械限位导致舵机一直“顶”着。2. 在非运动时段发送“松弛”指令对于PCA9685可以发送setPWM(channel, 0, 4096)来关闭输出或者使用舵机的“扭矩使能”功能如果支持。6.2 结构与控制系统问题问题机械臂运动缓慢不流畅。分析舵机速度是固定的无法像步进或伺服电机那样进行精确的速度规划。但我们可以通过软件实现“步进式”运动来模拟平滑。解决不要直接让舵机从角度A跳到角度B。编写一个平滑移动(smoothMove)函数将大的角度变化分解为多个微小步长并在每一步之间加入短暂延时。例如void smoothMove(int servoNum, int targetAngle, int stepDelay) { int currentAngle getCurrentAngle(servoNum); // 需要自己记录或读取当前角度 int step (targetAngle currentAngle) ? 1 : -1; for (int ang currentAngle; ang ! targetAngle; ang step) { setServoAngle(servoNum, ang); delay(stepDelay); // 延时越小运动越快但可能加重舵机负担 } }问题双臂运动不同步或动作结束后有轻微漂移。分析不同舵机即使型号相同其内部电位器和齿轮间隙也存在微小差异导致对同一指令的响应不完全一致。漂移可能是由于舵机保持力不足或结构存在回差。解决软件校准为每个舵机建立一个角度偏移查找表。在关键位置如0°90°180°手动测量实际角度与指令角度对比将差值补偿到指令中。增加闭环反馈这是终极解决方案。可以为每个关节加装廉价的AS5600等磁性角度传感器实时读取实际角度与目标角度做比较通过PID算法进行闭环控制可以极大提升精度和一致性。这会将项目复杂度提升一个等级但收获也巨大。问题想增加更多传感器但Arduino引脚不够用了。分析这是Arduino Uno等板子的常见瓶颈。解决换用Arduino Mega 2560它拥有54个数字IO和16个模拟输入。使用IO扩展芯片如通过I2C接口的PCF8574或MCP23017可以用2个引脚扩展出8个或16个IO。升级到更强大的控制器如树莓派Pico双核ARM大量GPIO或ESP32无线功能强大但需要重新适配开发环境。6.3 电源与布线优化一个干净稳定的电源系统是机器人可靠运行的基础。建议电源分离为Arduino等逻辑电路使用一个5V/2A的开关电源为舵机驱动板使用另一个独立的5-6V/5A以上的大功率开关电源。两个电源的“地”GND必须连接在一起。线径足够连接舵机电源的导线要足够粗建议18AWG或更粗以减少压降和发热。添加电容在舵机驱动板的电源输入端口处并联一个大容量电解电容如1000uF 16V和一个小容量陶瓷电容如0.1uF。前者缓冲大电流需求后者滤除高频噪声。线束管理使用蛇皮管、缠绕管或扎带将电线整齐地捆扎在机械臂结构内部或背面避免运动时与自身发生干涉。7. 项目扩展与进阶玩法当你成功让Bidex稳定运行后可以尝试以下扩展让它变得更强大、更智能更换主控与引入ROS将Arduino替换为树莓派或Jetson Nano。在这些更强大的平台上你可以安装ROS。在ROS中你可以为Bidex创建URDF模型利用MoveIt!等强大的工具包进行运动规划、避障和仿真并轻松集成激光雷达、深度相机等高级传感器。Arduino可以退居二线作为ROS节点下的一个执行器驱动板。升级执行器将舵机升级为带有位置反馈的直流电机编码器减速箱的组合并采用电机驱动器如DRV8833、TB6612和PID控制。这将获得更大的扭矩、更精确的位置控制和更快的速度但成本和复杂度也显著增加。打造“感知-决策-执行”闭环在机械臂末端安装一个六轴力/力矩传感器可以实现真正的力控让Bidex能够完成“拧螺丝”、“插拔”等需要力反馈的精细操作。结合摄像头可以实现更复杂的“眼在手外”或“眼在手上”的视觉伺服控制。开发图形化上位机软件使用Python的PyQt或Tkinter库开发一个简单的桌面控制软件。通过滑块控制每个关节按钮触发预设动作甚至可以实现鼠标点击图像某处机械臂自动移动到对应位置的“指点即到”功能。这能极大提升交互体验。Bidex项目就像一个乐高基础套装它提供了可靠的开源硬件平台和明确的实现路径让你能够以较低的成本跨入机器人实践的大门。它的真正价值不在于其出厂性能而在于它为你预留的、巨大的改造和升级空间。从按照教程成功组装并动起来的那一刻起你的创造力和工程能力就成了这个项目进化的唯一限制。我自己的那台Bidex最初也只能笨拙地开合手爪现在已经在树莓派和OpenCV的加持下学会了从杂乱的积木中识别并抓取指定颜色的那一块。这个过程里踩过的每一个坑解决的每一个问题都让最终的成功更加甘甜。

相关新闻