1. 项目概述
这款桌面轮足机器人是我最近完成的一个趣味性十足的DIY项目。它结合了轮式移动的高效性和腿式运动的适应性,可以在办公桌面上灵活移动,甚至能跨越一些小障碍。作为一个机器人爱好者,我发现这个项目特别适合想要进阶学习的创客们——它涵盖了机械设计、电路设计、嵌入式开发和运动控制算法等多个领域,但难度又控制在可以接受的范围内。
核心硬件采用ESP32作为主控,搭配无刷轮毂电机和总线舵机,通过FOC算法实现精准控制。软件方面基于Arduino开发环境,使用SimpleFOC库来处理电机控制,WebSocket协议实现低延迟的远程控制。整个项目从3D打印结构件到PCB设计、从固件开发到Web控制界面,都是完全开源的,非常适合学习和二次开发。
2. 硬件设计与选型
2.1 主控系统架构
ESP32是这个项目的"大脑",我选择它主要基于几个考虑:首先,它内置WiFi功能,省去了额外通信模块;其次,双核处理器可以很好地处理实时控制任务和网络通信;最后,丰富的GPIO和PWM输出完全能满足这个项目的需求。
电机驱动选用L6234PD013TR,这是一款专门针对无刷电机的驱动芯片,最大输出电流可达5A,足够驱动我们的小型轮毂电机。编码器采用AS5600磁编码器,通过I2C接口与主控通信,提供高精度的角度反馈。
注意:AS5600需要精确安装在电机轴附近,距离磁铁1-2mm为最佳。安装时建议先用热熔胶临时固定,测试信号正常后再用胶水永久固定。
2.2 机械结构设计
机械部分是这个项目最有趣的地方。我采用了3D打印的框架结构,主要考虑以下几点:
- 轻量化设计:使用20%填充率的PLA材料,在保证强度的前提下减轻重量
- 模块化组装:将机器人分为躯干、轮腿模块和电池仓三个主要部分
- 可维护性:设计快拆结构,方便更换舵机或维修电路
腿部采用双舵机联动设计,一个控制上下运动,一个控制前后摆动。这种设计虽然比单舵机复杂,但能实现更自然的步态。舵机我选用的是总线舵机,相比PWM舵机,总线控制可以节省GPIO资源,也简化了布线。
2.3 电源系统
电源系统设计有几个关键点:
- 选用3.7V 1000mAh锂电池,体积小巧但续航足够
- 添加了LC滤波电路,减少电机对控制电路的干扰
- 设计了低电压报警功能,当电池电压低于3.3V时LED会闪烁提示
电源管理部分特别容易出问题,我在初版设计中就遇到了电机启动时导致ESP32重启的情况。后来通过以下改进解决了:
- 增加大容量滤波电容(1000μF)靠近电机驱动
- 使用独立的LDO为控制电路供电
- 在PCB布局上让电源走线尽可能短而宽
3. 软件架构与实现
3.1 控制算法实现
运动控制是这个项目的核心难点。我采用SimpleFOC库来实现对无刷电机的精准控制,主要优势在于:
- 内置FOC算法,可以直接驱动无刷电机
- 支持位置、速度和力矩三种控制模式
- 提供完善的PID调节接口
电机控制的主要流程如下:
cpp复制// 初始化电机对象
BLDCMotor motor = BLDCMotor(7);
// 初始化驱动器
BLDCDriver3PWM driver = BLDCDriver3PWM(5, 6, 7, 8);
// 初始化编码器
MagneticSensorI2C sensor = MagneticSensorI2C(AS5600_I2C);
void setup() {
// 初始化硬件
driver.init();
sensor.init();
motor.linkDriver(&driver);
motor.linkSensor(&sensor);
// 配置电机参数
motor.voltage_limit = 5;
motor.velocity_limit = 20;
// 初始化FOC
motor.init();
motor.initFOC();
}
void loop() {
// 执行FOC算法
motor.loopFOC();
// 速度控制
motor.move(target_velocity);
}
3.2 通信协议设计
WiFi通信采用WebSocket协议,相比传统HTTP有以下优势:
- 全双工通信,实时性更好
- 连接建立后开销小
- 支持服务器主动推送
通信数据使用JSON格式,一个典型控制指令如下:
json复制{
"type": "control",
"data": {
"speed": 0.5,
"direction": 0.3,
"leg_action": "raise"
}
}
Web控制界面使用简单的HTML+JavaScript实现,核心控制逻辑如下:
javascript复制// 连接WebSocket
const socket = new WebSocket('ws://192.168.1.11/ws');
// 摇杆控制
joystick.on('move', (event, data) => {
const command = {
type: 'control',
data: {
speed: data.y,
direction: data.x
}
};
socket.send(JSON.stringify(command));
});
3.3 姿态平衡算法
IMU(MPU6050)用于检测机器人姿态,平衡控制算法流程:
- 通过DMP库获取欧拉角(roll, pitch, yaw)
- 计算当前姿态与目标姿态的偏差
- 使用PID控制器计算电机补偿量
- 将补偿量叠加到电机控制指令
平衡控制的关键参数:
- 比例系数Kp:决定响应速度
- 积分系数Ki:消除稳态误差
- 微分系数Kd:抑制振荡
经过多次调试,我最终采用的参数为:
cpp复制balance_pid.Kp = 0.8;
balance_pid.Ki = 0.05;
balance_pid.Kd = 0.2;
4. 制作流程详解
4.1 机械组装步骤
-
3D打印零件准备
- 使用0.2mm层高打印,确保运动部件光滑
- 关键受力部位可考虑增加壁厚或填充率
- 打印完成后用砂纸打磨配合面
-
金属件加工
- 电机支架需要CNC加工确保精度
- 轴销使用2mm不锈钢棒切割而成
- 所有金属件进行去毛刺处理
-
整体组装
- 先组装轮腿模块,测试自由度
- 然后安装电机和传动部件
- 最后固定电路板和电池
组装技巧:在螺丝孔位涂抹少量螺纹胶,可以防止长时间振动导致松动。舵机安装时先不要完全锁紧螺丝,等调试好位置再固定。
4.2 电路焊接与调试
PCB焊接顺序建议:
- 先焊接最小系统:ESP32、晶振、复位电路
- 然后焊接电源部分:LDO、滤波电容
- 最后焊接外设接口:电机驱动、编码器、IMU
调试时常见问题及解决方法:
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机不转 | 驱动芯片使能信号未拉高 | 检查EN引脚连接 |
| 编码器读数异常 | I2C上拉电阻未接 | 添加4.7kΩ上拉电阻 |
| WiFi连接不稳定 | 天线附近有金属遮挡 | 调整PCB布局或使用外置天线 |
4.3 软件烧录与配置
开发环境搭建步骤:
- 安装Arduino IDE(建议1.8.x版本)
- 添加ESP32开发板支持
- 安装所需库:SimpleFOC、WebSockets、ArduinoJson
首次烧录注意事项:
- 选择正确的开发板型号(ESP32 Dev Module)
- 设置正确的Flash Mode(QIO)
- 调整分区方案(默认即可)
WiFi配置有两种模式:
- AP模式:机器人创建热点,默认SSID为"RobotAP"
- STA模式:机器人连接现有WiFi,需在代码中配置SSID和密码
5. 常见问题与优化建议
5.1 调试过程中遇到的典型问题
-
电机抖动问题
- 现象:电机运行时出现不规则抖动
- 原因:PID参数不合适或编码器信号干扰
- 解决:调整PID参数,检查编码器接线屏蔽
-
平衡不稳定
- 现象:机器人站立时前后摇晃
- 原因:IMU数据延时或重心偏高
- 解决:优化滤波算法,降低机身重心
-
WiFi控制延迟
- 现象:控制指令有明显延迟
- 原因:网络拥堵或数据处理耗时
- 解决:优化通信协议,减少数据传输量
5.2 性能优化方向
-
运动控制优化
- 实现自适应PID调节
- 添加运动��迹规划
- 支持更多步态模式
-
功能扩展建议
- 添加超声波避障
- 实现视觉跟随
- 增加语音交互
-
结构改进方案
- 采用碳纤维材料减重
- 优化腿部传动结构
- 增加模块化扩展接口
5.3 成本控制技巧
- 替代方案对比:
| 原部件 | 替代方案 | 成本差异 | 性能影响 |
|---|---|---|---|
| L6234驱动 | DRV8323 | +¥15 | 支持更高电流 |
| AS5600 | 电位器 | -¥20 | 精度降低 |
| 总线舵机 | 普通舵机 | -¥30/个 | 需要更多GPIO |
- PCB省钱技巧:
- 使用立创EDA免费打样
- 拼板设计减少打样次数
- 选择普通工艺而非沉金
这个项目最让我满意的是它完美平衡了学习价值和趣味性。在调试过程中,我深刻体会到机械结构和控制算法之间的紧密联系——有时候软件调参怎么都不理想,结果发现是机械装配存在微小偏差;也有时候机械上觉得设计得很完美,但控制算法没跟上导致表现不佳。这种多学科交叉的实践体验,是单纯看书或教程无法获得的。
