第一部分:核心概念 - 六足机器人如何行走?
在开始之前,我们必须理解六足机器人(学名:六足仿生机器人或Hexapod Robot)的基本运动原理,它的核心是 “三角步态”(Tripod Gait)。

三角步态原理:
- 结构: 将六条腿分为两组,每组3条腿,形成一个“三角形”的支撑点,左前、右中、左后为一组(A组);右前、左中、右后为另一组(B组)。
- 行走过程:
- 初始状态: A组三条腿支撑身体,B组三条腿抬起,准备移动。
- 第一步: B组抬起的三条腿向前移动,然后落下,支撑身体,身体重心前移。
- 第二步: A组三条腿抬起,向前移动,然后落下,支撑身体。
- 循环往复: 重复以上步骤,机器人就能平稳、连续地向前行走。
关键部件:舵机
- 六足机器人的“关节”通常由 舵机 控制。
- 每条腿通常有 2到3个自由度,即需要2到3个舵机来控制。
- 2自由度 (2-DOF): 一个舵机控制大腿(上下摆动),一个舵机控制小腿(弯曲/伸展),这是最常见和经济的方案。
- 3自由度 (3-DOF): 在2自由度基础上,增加一个舵机控制髋部的旋转,可以实现更复杂的动作,如侧向移动。
- 我们以 2自由度 为例,每条腿需要2个舵机,六条腿总共需要 12个舵机。
第二部分:硬件清单
你需要准备以下所有组件:
| 组件名称 | 推荐规格/型号 | 数量 | 备注 |
|---|---|---|---|
| 主控制器 | Arduino Mega 2560 | 1 | 舵机数量多,需要足够多的PWM引脚,Mega是首选。 |
| 舵机 | MG996R (金属齿轮) 或 SG90 (塑料齿轮) | 12 | MG996R扭矩大,更稳定,SG90便宜但扭矩小。 |
| 舵机控制板 | PCA9685 (16路舵机驱动板) | 1 | Arduino的PWM引脚不够用,PCA9685通过I2C总线控制16个舵机,极大解放引脚。 |
| 机器人结构 | 3D打印件 | 1套 | 在网上(如Thingiverse)搜索 "Arduino Hexapod" 或 "六足机器人",有很多免费模型可下载。 |
| 电源 | 5V/6V 5A 或 2A 电源 | 1 | 非常重要! 12个舵机同时工作电流很大,普通USB口无法供电,需要外部独立电源。 |
| 连接线 | 杜邦线 (公对母, 母对母) | 若干 | 用于连接Arduino、PCA9685和舵机。 |
| 螺丝螺母 | M3螺丝螺母 | 若干 | 用于固定舵机和结构板。 |
| 可选 | 蓝牙模块 (如HC-05) | 1 | 用于手机遥控。 |
| 可选 | 舵机延长线 | 12根 | 让内部走线更整洁。 |
第三部分:组装步骤
- 3D打印零件: 下载你喜欢的3D模型文件,使用3D打印机打印出所有需要的零件(如身体、大腿、小腿等)。
- 安装舵机:
- 将舵机安装到3D打印件的“大腿”和“小腿”连接处。
- 小腿舵机(膝关节)会安装在大腿的末端。
- 将大腿舵机(髋关节)安装到机器人身体的连接点上。
- 注意: 在安装前,务必将所有舵机调整到初始中位(90度),这样在编程时,90度就是腿的垂直状态,方便计算。
- 连接电路:
- PCA9685与Arduino连接:
- VCC -> Arduino 5V
- GND -> Arduino GND
- SDA -> Arduino SDA (Mega上为21号引脚)
- SCL -> Arduino SCL (Mega上为20号引脚)
- 外部电源连接:
- 电源正极 -> PCA9685的
V+或VMOT引脚(注意是供电引脚,不是逻辑VCC)。 - 电源负极 -> PCA9685的
GND引脚,同时也要连接到Arduino的GND(共地非常重要!)。
- 电源正极 -> PCA9685的
- 舵机与PCA9685连接:
- 将12个舵机的信号线(通常是橙色或黄色线)依次连接到PCA9685的
0到11号输出通道。 - 舵机的电源线(红色)和地线(棕色/黑色)并联到外部电源的正负极上。
- 将12个舵机的信号线(通常是橙色或黄色线)依次连接到PCA9685的
- PCA9685与Arduino连接:
第四部分:软件编程 (Arduino IDE)
这是最核心的部分,我们将分步实现。

步骤1:安装必要的库
打开Arduino IDE,通过 库管理器 安装以下库:
Adafruit PCA9685:用于控制PCA9685舵机驱动板。Adafruit PWM Servo Driver Library:PCA9685库的依赖库。
步骤2:舵机校准和测试
在组装好硬件后,第一步是确保每个舵机都能正确响应指令,这是一个简单的测试代码,它会依次将每个舵机转动到0度、90度、180度,让你检查舵机安装方向是否正确。
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// 定义PCA9685的I2C地址,通常是0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
// 定义舵机连接的通道
const int servoPins[12] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
void setup() {
Serial.begin(9600);
Serial.println("PCA9685 Test!");
pwm.begin();
pwm.setPWMFreq(50); // 舵机标准频率为50Hz
// 初始化所有舵机到90度(中位)
for (int i = 0; i < 12; i++) {
setServoAngle(servoPins[i], 90);
delay(500); // 每个舵机间隔0.5秒,方便观察
}
}
void loop() {
// 测试舵机0到180度
for (int angle = 0; angle <= 180; angle += 10) {
for (int i = 0; i < 12; i++) {
setServoAngle(servoPins[i], angle);
}
delay(100);
}
// 测试舵机180度到0度
for (int angle = 180; angle >= 0; angle -= 10) {
for (int i = 0; i < 12; i++) {
setServoAngle(servoPins[i], angle);
}
delay(100);
}
}
// 将角度(0-180)转换为PCA9685的脉冲值(0-4095)
// 0.5ms -> 0度, 1.5ms -> 90度, 2.5ms -> 180度
void setServoAngle(int channel, int angle) {
int pulse = map(angle, 0, 180, 102, 512); // 102 ~ 512 对应 0.5ms ~ 2.5ms (在50Hz下)
pwm.setPWM(channel, 0, pulse);
}
上传代码后观察:
- 如果舵机转动方向反了,你可以在
setServoAngle函数里用180 - angle来修正,或者交换舵机的信号线。 - 如果舵机抖动或无力,检查电源供电是否充足。
步骤3:实现三角步态
这是实现行走的核心,我们需要定义机器人的姿态(站立、抬起、前进)。

定义姿态数据结构: 我们可以用一个二维数组来存储机器人所有腿的姿态,每个姿态包含12个舵机的角度。
// 定义姿态数组,每行代表一个姿态,每列代表一个舵机的角度
// 顺序很重要!请按照你的硬件连接顺序来定义
// 假设顺序是:左前-大腿, 左前-小腿, 右前-大腿, 右前-小腿, ... (请根据你的实际情况调整)
// 姿态0:初始站立姿态
int pose_stand[12] = {90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90}; // 所有腿垂直
// 姿态1:B组腿抬起并前移
int pose_step1[12] = {
110, 70, // 左前腿抬起
90, 90, // 右前腿支撑
70, 110, // 左中腿抬起
90, 90, // 右中腿支撑
110, 70, // 左后腿抬起
90, 90 // 右后腿支撑
}; // 注意:这里的 angles 是示例,需要根据你的3D模型和舵机安装位置进行微调!
// 姿态2:B组腿落下,A组腿抬起并前移
int pose_step2[12] = {
90, 90, // 左前腿支撑
110, 70, // 右前腿抬起
90, 90, // 左中腿支撑
70, 110, // 右中腿抬起
90, 90, // 左后腿支撑
110, 70 // 右后腿抬起
};
重要提示: pose_step1 和 pose_step2 中的角度值不是标准答案,需要你通过不断测试和调整来找到最适合你机器人的数值,这通常是最耗时但也是最关键的一步。
编写行走函数:
// 执行一个步态周期
void walkCycle() {
// 1. 移动到姿态1 (B组腿抬起)
moveToPose(pose_step1, 200); // 200ms内完成姿态转换
// 2. 移动到姿态2 (A组腿抬起)
moveToPose(pose_step2, 200);
// 3. 移动回姿态1 (B组腿抬起,此时机器人已前移)
moveToPose(pose_step1, 200);
// 4. 移动回站立姿态
moveToPose(pose_stand, 200);
}
// 将机器人平滑地移动到目标姿态
void moveToPose(int targetPose[12], int duration) {
int steps = 20; // 分20步完成移动
int delayTime = duration / steps;
for (int s = 0; s < steps; s++) {
for (int i = 0; i < 12; i++) {
// 计算当前步的中间角度
int currentAngle = currentPose[i] + (targetPose[i] - currentPose[i]) * s / steps;
setServoAngle(servoPins[i], currentAngle);
}
delay(delayTime);
}
// 更新当前姿态
for (int i = 0; i < 12; i++) {
currentPose[i] = targetPose[i];
}
}
// 全局变量,记录当前姿态
int currentPose[12];
主程序:
void setup() {
// ... (之前的PCA9685初始化代码)
// 初始化当前姿态为站立姿态
for (int i = 0; i < 12; i++) {
currentPose[i] = pose_stand[i];
}
}
void loop() {
// 让机器人向前走一步
walkCycle();
// 停顿一下
delay(500);
}
第五部分:进阶方向
当你成功让机器人走起来后,可以尝试以下进阶功能:
-
增加遥控功能:
- 加入 HC-05/HC-06 蓝牙模块。
- 在手机上用 MIT App Inventor 或 Arduino Bluetooth Controller 等App制作一个简单的遥控界面。
- 编写蓝牙接收代码,根据接收到的指令(如 'F' 前进, 'B' 后退, 'L' 左转, 'R' 右转)来调用不同的行走函数。
-
增加传感器:
- 超声波传感器 (HC-SR04): 安装在机器人头部,用于探测前方障碍物,当检测到障碍物时,让机器人停止或转向。
- IMU (MPU-6050): 感知机器人的姿态(加速度、角速度),可以用来实现自平衡或更稳定的步态。
-
优化步态算法:
- 从固定的三角步态,升级为可以控制速度、方向、转向的动态步态。
- 学习使用 逆运动学,直接通过足端在地面上的目标坐标来计算每个舵机的角度,这样步态会更自然、更灵活。
-
3D模型改造:
在网上寻找不同的六足机器人设计,或者自己用CAD软件设计独特的结构,比如蜘蛛形、甲虫形等。
总结与资源
- 挑战: 这个项目最大的挑战在于 机械结构的搭建 和 舵机角度的精细调试,耐心是成功的关键。
- 学习资源:
- GitHub: 搜索 "Arduino Hexapod",可以找到很多开源项目,包括完整的代码和3D模型文件。"Hexapod-Project"。
- YouTube: 搜索 "Arduino Hexapod Tutorial",有大量视频教程,可以跟着一步步做。
- Thingiverse: 3D模型仓库,可以免费下载无数种六足机器人设计。
祝你项目顺利,早日做出自己的六足机器人!
标签: Arduino六足机器人步态控制算法 Arduino六足机器人三角步态实现 Arduino六足机器人步态代码编程