用Arduino Uno和8个舵机打造会走路的并联腿机器狗第一次看到机器狗灵活地迈步时那种成就感至今难忘。作为创客爱好者我决定用最基础的Arduino Uno和8个舵机从零开始搭建一个能自主行走的并联腿机器狗。这个项目不仅考验机械结构设计更需要精准的舵机控制和步态算法实现。下面分享我的完整实现过程包括硬件选型、组装技巧、代码调试中的坑以及最终让这个小家伙动起来的完整方案。1. 硬件准备与机械组装1.1 核心部件清单制作一个基础版并联腿机器狗需要以下硬件组件类别型号/规格数量备注主控板Arduino Uno R31兼容板也可舵机SG90/MG90S8建议金属齿轮扩展板PCA9685 PWM扩展板1驱动多路舵机电源7.4V锂电池1带XT60接口结构件3D打印骨架1套含关节连接件线材杜邦线(20cm)16舵机延长线提示舵机扭矩至少需要2.5kg·cm以上否则腿部支撑力不足。我最终选择了MG996R金属齿轮舵机虽然价格稍高但可靠性更好。1.2 机械结构搭建要点并联腿设计相比串联结构有几个显著优势更高的负载能力更稳定的运动轨迹更精确的末端定位组装时特别注意这些细节关节间隙处理用0.1mm垫片减少连杆间的晃动舵机保护每个舵机输出轴加装橡胶减震环布线优化用扎带固定线束避免运动缠绕重心调整电池尽量靠近身体中心位置我的第一版机器狗因为重心太靠前站立时总是向前倾倒。后来在尾部增加了50g配重才解决这个问题。2. 电路连接与供电方案2.1 舵机控制电路8个舵机通过PCA9685扩展板与Arduino连接接线方式如下// PCA9685 I2C地址通常为0x40 #include Wire.h #include Adafruit_PWMServoDriver.h Adafruit_PWMServoDriver pwm Adafruit_PWMServoDriver(); void setup() { pwm.begin(); pwm.setPWMFreq(50); // 舵机PWM频率设为50Hz }每个舵机的信号线连接到扩展板的PWM输出端口建议按腿部顺序编号左前腿0-1号通道右前腿2-3号通道左后腿4-5号通道右后腿6-7号通道2.2 电源系统设计舵机在运动时会产生瞬时大电流供电不足会导致Arduino复位。我的解决方案独立供电使用两节18650电池组成7.4V电源专供舵机电容缓冲在PCA9685电源端并联4700μF电容电压监测添加分压电路检测电池电量注意切勿通过Arduino的USB口直接供电给多个舵机极易损坏主板3. 步态算法实现3.1 基础步态设计四足机器狗的典型步态有两种踱步步态对角线两腿同时移动稳定性高但速度慢小跑步态相邻腿相位差90度速度快但需要更好平衡我选择了折中的方案——相位差180度的交替步态步态周期分解 T0: 左前右后腿抬起 → 向前摆动 T1: 左前右后腿放下 → 右前左后腿抬起 T2: 右前左后腿向前摆动 T3: 所有腿同时支撑身体前移3.2 运动轨迹生成每条腿末端需要走出椭圆形轨迹支撑期摆动期通过逆运动学转换为舵机角度。核心代码如下void gaitCycle(float t, float stride, float x, float y) { // 标准化时间参数 (0-1) float phase fmod(t, GAIT_CYCLE) / GAIT_CYCLE; if (phase 0.5) { // 支撑期 x stride * (phase * 2 - 0.5); y 0; // 保持接触地面 } else { // 摆动期 float swingPhase (phase - 0.5) * 2; x stride * 0.5 * cos(PI * swingPhase); y 0.1 * sin(PI * swingPhase); // 抬腿高度 } }4. 完整代码实现与调试4.1 主控制程序架构整个项目代码分为三个模块舵机驱动层封装PCA9685控制运动学层处理腿部的正逆运动学步态层生成周期性的步态模式关键数据结构定义struct Leg { float length1; // 大腿长度 float length2; // 小腿长度 float homeX; // 初始X位置 float homeY; // 初始Y位置 int servo1; // 髋关节舵机索引 int servo2; // 膝关节舵机索引 }; Leg legs[4] { {8.0, 10.0, 5.0, -12.0, 0, 1}, // 左前腿 {8.0, 10.0, 5.0, -12.0, 2, 3}, // 右前腿 {8.0, 10.0, -5.0, -12.0, 4, 5}, // 左后腿 {8.0, 10.0, -5.0, -12.0, 6, 7} // 右后腿 };4.2 调试中的关键问题问题1舵机抖动严重原因电源电压不稳定解决改用开关电源模块替代线性稳压问题2行走时腿部不同步原因舵机响应速度差异原因在setup()中添加舵机校准序列void calibrateServos() { for(int i0; i8; i) { pwm.setPWM(i, 0, angleToPulse(90)); // 所有舵机归中 delay(300); } }问题3转弯时容易失稳解决方案引入ZMP零力矩点控制算法实现方式通过调整四条腿的支撑相位差产生旋转力矩5. 项目优化与扩展5.1 性能提升技巧动态步态调整根据倾角传感器数据实时修正步态能耗优化空闲时降低舵机保持扭矩轨迹平滑在运动规划中加入五次多项式插值5.2 进阶功能实现通过蓝牙模块可以添加手机遥控功能#include SoftwareSerial.h SoftwareSerial BT(10, 11); // RX, TX void handleBluetooth() { if(BT.available()) { char cmd BT.read(); switch(cmd) { case F: walkForward(); break; case B: walkBackward(); break; case L: turnLeft(); break; case R: turnRight(); break; } } }最终完成的机器狗已经可以稳定行走、转弯甚至能小跑。这个项目最让我惊喜的是用如此简单的硬件也能实现相当复杂的运动控制。下次我计划给它加上超声波避障和IMU姿态稳定让这个小家伙更加智能。