夜雨聆风学习资料网

ARTICLE · 1000628

道生万物!从机器人控制器软件基本框架开始拓展

道生万物!从机器人控制器软件基本框架开始拓展

一块不开源机器人控制器,售价三千;

一套机器人控制器软硬件开源方案,源码获取成本为0元。      

研究后者,您可以自己打造更多的前者。              ————老戴

写在前面

[多功能机器人控制器软硬件开源架构】分软硬件两块设计。软件架构旨在像Codesys 一样只需简单配置就能控制不同结构机器人,并可以轻松移植到多种硬件。且因为开源具备更大灵活性,并无需授权。同时提供一套开源硬件方案(您可以花费极少的硬件成本自己打造硬件,有需要也可以私信老戴)。本专栏逐步拆解具体实现。
项目地址🔗:https://github.com/bant-tech/AnyRobotController

书接上回,我们已经在H7单片机上,用 SOEM 做成 EtherCAT 主站,并稳定控制单台伺服电机。本文基于此最小框架,继续扩展到多轴机器人控制器,支持多伺服同步控制。
项目工程已经升级到多轴版本,本文是对应剖析。
开源工程详解

打开 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. 配置各轴运行模式(支持每轴独立选择位置/速度模式),周期循环下发多轴目标位置指令。此时多台伺服电机同步运动;同时代码并行读取全部伺服反馈的实际位置、状态、报警信息。

老戴会继续拓展其他模块,最终打造成一个强大完备的控制器,请留意后续模块的文章,欢迎点赞关注,我会持续更新的~

相关学习资料

返回首页浏览学习资料