ARTICLE · 1000628
道生万物!从机器人控制器软件基本框架开始拓展
一块不开源机器人控制器,售价三千;
一套机器人控制器软硬件开源方案,源码获取成本为0元。
研究后者,您可以自己打造更多的前者。 ————老戴
写在前面
打开 Github 仓库,我们看它代码结构:
AnyRobotController / mdk_project /
AnyRobotController
├── core/ #工程入口,main函数,主循环、EtherCAT周期调度
├── mdk-arm/ #mdk工程组织
├── soem/ #ecat协议栈 SOEM-1.3.0原版代码
├── drivers/ #单片机外设驱动(ETH MAC/PHY、定时器、串口等)
├── user #应用层函数,CiA402伺服状态机、多轴PDO映射、轨迹生成
仔细说说:
1、SOEM文件夹:原版 EtherCAT 协议栈
这一份代码就是 Windows 上面跑的那个 SOEM 库本身。SOEM 本身不区分 Windows 还是单片机,它只是一堆处理 EtherCAT 数据包的 C 语言函数。
它负责的事情:
• 扫描总线上全部伺服驱动器(多台从站)
• 和每一台伺服单独握手、CiA402状态切换
• 打包下发多轴目标位置、目标速度、力矩指令
• 并行读取全部电机反馈:当前位置、速度、报警状态
• 统一处理分布式时钟DC,保证多轴之间同步
SOEM本身不知道网卡是什么东西!收发数据包这件事,它自己不干,交给下层硬件适配层。
2、drivers文件夹:单片机以太网底层驱动
单片机想要发以太网数据包,离不开两样东西:
• 芯片内部的以太网 MAC 控制器
• 外接 PHY 芯片(网线接口芯片)
drivers 文件夹存放初始化 MAC、PHY 芯片的底层代码,保证网线硬件可以正常收发数据包。
额外增加:高精度定时器驱动,为EtherCAT周期任务提供稳定时基,保障多轴同步。
3、Core 核心层
main入口,EtherCAT周期任务调度。
不再是单轴循环,会在固定周期内,一次性完成:全部从站PDO输入读取 → 多轴轨迹运算 → 全部从站PDO输出写入。
处理DC分布式时钟同步,校准各个伺服之间的时间偏移,抑制多轴不同步抖动。
4、User应用层
CiA-402伺服状态机,支持批量初始化多台伺服。
多轴PDO配置模块:可以独立配置每一个伺服的PDO映射(位置/速度/力矩模式,各轴可以不同模式混合运行)。
轨迹插值:多轴位置指令生成,可实现多轴联动插补。
怎么跑起来
🔧硬件准备
1. 主控单片机+电路板:选用老戴设计的这款控制器,基于H7芯片,原理图随工程一起开源。
2. 多台支持 EtherCAT、遵循 CiA-402 协议的伺服驱动器(2轴及以上)。
3. 网线:EtherCAT总线串联,单片机网口接第一台伺服IN口,前一台OUT接下一台IN,最后一台OUT悬空。
4. 下载器:ST-Link 或者 J-Link,用于程序烧录与调试。
📥 获取源码
git clone https://github.com/bant-tech/AnyRobotController.git
cd AnyRobotController
git submodule update --init --recursive
项目包含原版 SOEM 作为子模块,一定要执行 submodule 命令拉取 SOEM 源码,不然 SOEM 文件夹是空的,直接编译会报大量头文件缺失。
🛠编译环境配置
直接打开mdk的工程文件,编译就行。
注意:多轴版本会增加PDO数组、多轴状态数组,需要检查MDK栈、堆空间,适当调大,防止数组溢出。
🚀烧录,运行调试
1. 使用下载器把固件烧写到控制器,上电。
2. 建议接上串口调试输出,工程 app 层打印了关键日志,可以通过串口看运行状态:
◦ 看以太网 PHY 是否成功 link(网线插好,PHY初始化成功)
◦ EtherCAT总线扫描日志:列出所有扫描到的伺服从站,输出从站数量、设备ID。如果打印no slaves found,代表总线没通。
没扫到伺服排查方向:网线、PHY驱动、RMII/MII配置、硬件引脚、总线串联顺序。
3. 如果扫描到全部从站,代码会进入 app 里面 CiA-402 状态机逻辑,批量完成所有伺服上电、切换到可运行状态。
4. 配置各轴运行模式(支持每轴独立选择位置/速度模式),周期循环下发多轴目标位置指令。此时多台伺服电机同步运动;同时代码并行读取全部伺服反馈的实际位置、状态、报警信息。
老戴会继续拓展其他模块,最终打造成一个强大完备的控制器,请留意后续模块的文章,欢迎点赞关注,我会持续更新的~