Arduino 四足蜘蛛机器人制作教程:从零开始的完整指南
零部件与材料清单
| 组件 | 数量 | 备注 |
|---|---|---|
| Arduino Nano R3 | 1 | 主控板 |
| 蓝牙低功耗 (BLE) 模块 | 1 | 用于手机 APP 控制 |
| Onion Corporation OLED 扩展屏 | 1 | 显示表情动画 |
| RGB 共阴极 LED | 1 | 状态指示灯 |
| JLCPCB 定制 PCB | 1 | 集成电路板,含伺服接口 |
| 9g 微型舵机 (SG90 或同规格) | 12 | 每条腿 3 个,共 4 条腿 |
| 7.4V 锂电池 (或 2 节 18650 串联) | 1 | 为舵机供电 |
| 3D 打印机打印件 | 1 套 | 含机身、大腿、小腿、连接件等 |
| 排针排母、螺丝、杜邦线等 | 若干 | 焊接与组装用 |
项目简介
本教程将手把手教你制作一款四足蜘蛛机器人(Quadruped Spider Robot)。项目采用 Arduino Nano 为核心,驱动 12 个舵机实现四足行走、转向、姿态调整等动作,并通过蓝牙模块与手机 APP 通信,支持前进、后退、左转、右转及 RGB 灯光颜色实时控制。OLED 屏幕可显示类似 Cozmo 机器人的丰富表情,增加趣味性。
整个项目历时 7 天完成:硬件制作与组装 2 天,代码编写与 APP 开发 5 天。得益于 JLCPCB 定制 PCB,电路布局紧凑美观,焊接难度大幅降低。教程提供完整的原理图、Gerber 文件、Arduino 代码、安卓 APP 下载链接及 3D 打印 STL 文件,适合进阶 Maker 挑战。
核心知识点
- 四足机器人运动学基础:步态规划、重心平衡、逆运动学解算
- 舵机控制原理:PWM 脉宽调制、舵机角度校准、多舵机同步驱动
- PCB 设计与制造流程:从原理图到 Gerber 文件,低成本打样
- 蓝牙串口通信:Arduino 与手机 APP 交互协议设计
- OLED 图形显示:Adafruit_GFX 库绘制动画表情
- 机械结构设计:3D 打印件公差配合、舵机安装角度预设
制作步骤详解
步骤 1:理解四足蜘蛛机器人
四足机器人模仿蜘蛛/昆虫步态,四条腿各有 3 个自由度(髋、膝、踝),共 12 个舵机。与轮式机器人相比,足式机器人越障能力强,但控制复杂度高、成本大。四足结构具备被动稳定性:站立时四足构成支撑多边形,重心落在多边形内即可保持平衡,无需持续主动控制。
本项目采用「对角步态」:对角线两条腿同步移动(如左前+右后),其余两腿支撑机身,实现平稳前进/后退。转向时通过调整支撑腿位置实现原地旋转。
步骤 2:舵机选型与控制原理
舵机内部包含电机、减速齿轮组、位置反馈电位器、控制电路。标准 PWM 周期 20ms (50Hz),高电平宽度 0.5~2.5ms 对应 0~180°。本项目使用 9g 模拟舵机,扭矩约 1.5 kg·cm,足以驱动轻量 3D 打印结构。
关键参数:
- 控制频率:50Hz (20ms 周期)
- 脉宽范围:500~2500 µs
- 中位脉宽:1500 µs (90°)
- 供电电压:4.8~6V (建议外接 5V 稳压,勿从 Arduino 取电)
代码中使用 FlexiTimer2 库建立 20ms 定时中断,在中断服务程序中按线性插值逐步移动舵机至目标角度,实现平滑动作。
步骤 3:PCB 设计与制造 (JLCPCB)
定制 PCB 集成了:
- Arduino Nano 插座 (含 ICSP 接口)
- 12 路舵机信号引脚排针 (按腿分组:D2/D4/D7, D8/D9/D10, D11/D12/D13, A0/A1/A2)
- 蓝牙模块接口 (TX/RX/VCC/GND)
- OLED I2C 接口 (SDA/SCL/VCC/GND)
- RGB LED 驱动 MOSFET 电路 (PWM 控制)
- 电源输入接口 (舵机独立供电、逻辑供电分离)
PCB 外形设计为蜘蛛造型,丝印标注每个舵机编号与极性,极大简化焊接。下单流程:导出 Gerber → JLCPCB 网站上传 → 选择板厚 1.6mm、红色阻焊、数量 5 片 → 支付约 $2 → 5 天收货。
步骤 4:硬件组装指南
- 焊接 PCB:按 BOM 焊接排针、MOSFET、电阻、电容、蓝牙模块座、OLED 排针、电源接口。建议先焊低矮元件,再焊高大元件。
- 组装单腿:每条腿由 Coxa(髋)、Femur(大腿)、Tibia(小腿) 三段 3D 打印件 + 3 个舵机组成。先将舵机转至中位 (90°),再固定舵盘与打印件,注意舵机输出轴朝向与代码定义一致。
- 安装机身:将 4 条腿的根部舵机 (Coxa) 安装到上机身板预留孔位,用 M2 螺丝锁紧。
- 安装电池与 PCB:电池固定在下机身板,PCB 通过排针插在上机身板背面,走线整理扎带固定。
- 连接舵机信号线:按 PCB 丝印标号 (Leg0~Leg3, 每腿 Servo0~2) 插入对应排针,核对极性 (棕=GND, 红=VCC, 橙=信号)。
步骤 5:舵机中位校准 (关键步骤)
上传 Scaling_Servo.ino 校准代码,上电后所有舵机应转至 90° 中位。此时手动调整每个舵机安装角度,使机械结构呈标准站立姿态:
- Coxa 舵机输出轴垂直于机身前后轴线
- Femur 与 Tibia 成一直线,垂直于地面
- 四足尖接地形成矩形,边长约 71mm (length_side)
记录每个舵机的偏移值,填入主程序 polar_to_servo() 函数的角度修正逻辑中。
步骤 6:上传主程序与测试
主程序 Spider_Robot_Main.ino 核心模块:
- 逆运动学解算:
cartesian_to_polar()将足端笛卡尔坐标 (x,y,z) 转为三舵机角度 (α,β,γ) - 步态生成器:
step_forward()、step_back()、turn_left()、turn_right()通过预设关键点坐标序列生成步态 - 舵机同步服务:20ms 定时中断
servo_service()按线性插值驱动 12 舵机 - 蓝牙指令解析:串口接收 'f'前进 'p'后退 'l'左转 'r'右转 'b/g/r' RGB 值
- OLED 表情动画:
happy()、sad()、angry()等函数绘制像素风表情
上传代码后,打开手机 APP (下载链接见文末),点击「连接蓝牙」选择模块 (通常名为 HC-06),即可控制机器人行走、转向、变灯色。OLED 会随动作播放对应表情。
步骤 7:常见问题与优化建议
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 机器人站立不稳、抖动 | 舵机供电不足 / 中位校准偏差大 | 用 2A 以上 5V 稳压模块单独给舵机供电;重新精细校准中位 |
| 行走时腿部碰撞、卡顿 | 步态参数 (x_default, y_step, z_up) 不匹配机械尺寸 | 实测腿长、机身宽,修改代码常量区几何参数 |
| 蓝牙频繁断连 | 模块供电不稳 / 天线被金属遮挡 | 给蓝牙模块单独加 100µF 电容;调整 PCB 布局远离金属件 |
| OLED 不显示 / 花屏 | I2C 地址错误 (0x3C vs 0x3D) / 排线接触不良 | 扫描 I2C 地址确认;换用 4 线制排线、缩短线长 |
进阶扩展方向
- 加装 MPU6050 姿态传感器,实现自平衡、防跌倒保护
- 引入超声波/激光测距模块,实现避障自主导航
- 移植到 ESP32,支持 Wi-Fi 远程控制、Web 端监控
- 设计更仿生的步态:小跑、疾走、侧向移动、爬坡
- 集成语音识别模块,实现声控交互
资源下载链接
- 原理图 PDF:Schematic_SpiderBot.pdf
- Gerber 文件:Gerber_SpiderBot.zip (可直接在 JLCPCB 下单)
- Arduino 校准代码:Scaling_Servo.ino
- Arduino 主程序:Spider_Robot_Main.ino
- 安卓 APP (APK):SpiderBot_Control.apk
- 3D 打印 STL 文件包:SpiderBot_STL.zip (含上下机身、Coxa/Femur/Tibia、连接件)
完整主程序代码 (关键片段)
// 核心逆运动学:笛卡尔坐标转舵机角度
void cartesian_to_polar(volatile float &alpha, volatile float &beta, volatile float &gamma,
volatile float x, volatile float y, volatile float z) {
float v, w;
w = (x >= 0 ? 1 : -1) * sqrt(pow(x, 2) + pow(y, 2));
v = w - length_c;
alpha = atan2(z, v) + acos((pow(length_a, 2) - pow(length_b, 2) + pow(v, 2) + pow(z, 2))
/ (2 * length_a * sqrt(pow(v, 2) + pow(z, 2))));
beta = acos((pow(length_a, 2) + pow(length_b, 2) - pow(v, 2) - pow(z, 2))
/ (2 * length_a * length_b));
gamma = (w >= 0) ? atan2(y, x) : atan2(-y, -x);
alpha = alpha / pi * 180; beta = beta / pi * 180; gamma = gamma / pi * 180;
}
// 舵机角度映射 (含各腿安装方向修正)
void polar_to_servo(int leg, float alpha, float beta, float gamma) {
if (leg == 0) { alpha = 90 - alpha; gamma += 90; }
else if (leg == 1) { alpha += 90; beta = 180 - beta; gamma = 90 - gamma; }
else if (leg == 2) { alpha += 90; beta = 180 - beta; gamma = 90 - gamma; }
else if (leg == 3) { alpha = 90 - alpha; gamma += 90; }
servo[leg][0].write(alpha); servo[leg][1].write(beta); servo[leg][2].write(gamma);
}
// 前进步态示例 (对角步态)
void step_forward(unsigned int step) {
move_speed = leg_move_speed;
while (step-- > 0) {
if (site_now[2][1] == y_start) { // 第2、1腿摆动
set_site(2, x_default + x_offset, y_start, z_up); wait_all_reach();
set_site(2, x_default + x_offset, y_start + 2*y_step, z_up); wait_all_reach();
set_site(2, x_default + x_offset, y_start + 2*y_step, z_default); wait_all_reach();
move_speed = body_move_speed;
set_site(0, x_default + x_offset, y_start, z_default);
set_site(1, x_default + x_offset, y_start + 2*y_step, z_default);
set_site(2, x_default - x_offset, y_start + y_step, z_default);
set_site(3, x_default - x_offset, y_start + y_step, z_default); wait_all_reach();
move_speed = leg_move_speed;
set_site(1, x_default + x_offset, y_start + 2*y_step, z_up); wait_all_reach();
set_site(1, x_default + x_offset, y_start, z_up); wait_all_reach();
set_site(1, x_default + x_offset, y_start, z_default); wait_all_reach();
} else { // 第0、3腿摆动 (对称逻辑) ... }
}
}
祝你制作愉快!如有疑问欢迎在评论区交流。完整代码、STL 文件与 APP 下载见文末资源链接。
制造工艺
- 蓝牙控制树莓派机器人:语音反馈功能构建指南
- JQR 四足自主机器人:DIY 腿足机器人用于自主导航与救援
- 舵机驱动避障机器人:基于 Arduino 与 HC-SR04 构建
- Arduino UNO 自制循迹小车:从零构建自主巡线机器人
- Arduino Nano 语音控制机器人:蓝牙 + 手机 APP 实现
- 从零构建智能 Arduino 四足机器人:完整指南
- PiBot:Arduino驱动的88键钢琴机器人,精准演奏MIDI乐曲
- LittleArm 2C:3D 打印 Arduino 机械臂 - STEM 教学专用,坚固易装
- 自主家庭助理机器人 O'nine - ROS + Alexa 语音控制 + 机械臂 + 麦克纳姆轮全向移动
- 通过专用 Android App 蓝牙控制 Arduino 机械臂
- 适用于 Arduino 项目的智能室内导航机器人套件
- 机器人个人助理如何走入寻常百姓家