前言
原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。
文章如有更新请访问 DFRobot 社区及 cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。
本文是摸索创想三维 K1 系列软硬件系统的一些内容分享。最近创想三维的工作人员联系了我,希望接下来能加快网卡直连方案的进度。
我的外挂上位机方案之一是直接让外挂上位机通过 RS232 通讯接口连接 Nozzle_MCU (以下简称 Nmcu) 和 Levelling MCU (以下简称 Lmcu)。一般使用 USB 转 RS232 模块,当然最简便的方案是使用板载支持 RS232 通讯的 Arm 开发板,还真让我找到了(当然还有调整设备树启用此功能的问题,此处按下不表),然而这块开发板的稳定通讯波特率不超过 200k,而 K1 默认使用 230400,所以我们需要重新烧录 Nmcu 和 Lmcu 的固件,通讯波特率调整为标准的 115200,同时由于这两者通讯数据量不大,115200 理论上满足我们的需求。
我们约定,直接控制打印机硬件的部分称为主板,运行 Linux 系统的部分称为上位机。
软硬件测试环境:
- K1Max Mainboard with CrealityOS
- RK3399 Develoboard with Ubuntu 22.04
本文涉及的内容:
- 如何为打印机主板编译固件
- 如何解决编译过程中遇到的问题
- 如何补齐裁剪掉的 Klipper 功能
1、Klipper for K1 相关资料
创想三维系列的修改版 Klipper(以下简称 CK)做了大量改动,但是由于并不是 fork 原版 Klipper,而是直接新建仓库,导致我们无法直观看到改动记录。好在第三方 commit 可以看到:
2、编译自定义 MCU 固件
我们先看一下三块微控制器参数:
- mcu0:主控制器,控制 XYZ 步进电机、风扇等,GD32F303RET6
- Nozzle_mcu:热端工具板,GD32F303CBT6
- Leveling_mcu:热床下的调平工具板,GD32E230F8P6
在此之前我们看下 CK 相关固件编译说明:
- 预编译固件:fw/K1
- 编译选项及烧录选项:src/gd32/Makefile
- 其中提到的通过调用
flash_usb
烧录不成功,应该是没有注释掉此内容
- 其中有
# at32f40x build rules
字样,推测 GD32 的编译选项部分参考了 at32f40x,参考:maphex/klipper
- 主板编译预配置编译选项:src/configs/
- K1_mcu0_110_G32_defconfig
- K1_mcu0_110_S40_defconfig | STM32F40x
- K1_mcu0_120_G32_defconfig
- <u>K1_noz0_110_S06_defconfig</u>
- <u>K1_noz0_110_G30_defconfig</u>
- <u>K1_noz0_120_G30_defconfig</u>
- K1_bed0_100_G21_defconfig
- K1_bed0_110_G21_defconfig
- Kconfig
2.1 示例:编译 mcu0 主板固件
由于 CrealityOS 和 K1 系列主板为 MIPS 架构的 CPU,不支持 Arm Cortex 处理器的编译工具链,我们只能选择在 外挂上位机(x86_64或arm)上安装 gcc-arm-none-eabi 工具包。所以 CrealityOS 中没有 src 目录,不能安装编译工具链也无法编译 Klipper 固件。
通过之前的 mcu_util 得知 mcu0 软硬件版本号为:mcu0_120_G32-mcu0_004_000
由于社区版默认没有 GD32 的预设(虽然理论上 STM32 也能用)。这里我们选择 CK 代码进行编译。使用预配置文件:K1_mcu0_120_G32_defconfig。
## 克隆 CK 项目仓库
cd && git clone https://github.com/CrealityOfficial~/K1_Series_Klipper && cd ~/K1_Series_Klipper
## 复制预配置编译选项文件
cp src/configs/K1_mcu0_120_G32_defconfig .config
## 降级 gcc-arm-none-eabi 软件源到版本 10 以下以正确编译 prtouch_v2.o (压力调平),本文使用 Ubuntu 22.04
sudo tee /etc/apt/sources.list.d/gcc-arm-none-eabi-focal.list << _EOF_
deb https://mirrors.ustc.edu.cn/ubuntu-ports/ focal main universe #multiverse restricted
_EOF_
sudo tee /etc/apt/preferences.d/gcc-arm-none-eabi-focal << _EOF_
Package: gcc-arm-none-eabi binutils-arm-none-eabi libc6 libgcc-s1 libgmp10 libisl22 libmpc3 libmpfr6 libstdc++6 zlib1g
Pin: release n=focal
Pin-Priority: 1001
_EOF_
## 降级 gcc-arm-none-eabi 和 binutils-arm-none-eabi,并确认 arm-none-eabi-gcc 版本
sudo apt update
# apt-cache policy gcc-arm-none-eabi
# apt-cache show gcc-arm-none-eabi
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi # 降级工具链 9+2.34
arm-none-eabi-gcc --version
# 添加额外的软件包支持固件 crc 检校
sudo apt install srecord
# 调整波特率为 115200,编译 mcu0 固件
make menuconfig
make
# 使用 mcu_util 更新固件
# 修改 printer.cfg 内的 [mcu] buad 为 115200 并保存
# 测试新版固件正确启动并生效
/usr/share/klippy-env/bin/python /usr/share/klipper/klippy/klippy.py /usr/data/printer_data/config/printer.cfg
2.2 报错信息及解决:
报错 1:lto1: fatal error: bytecode stream in file 'out/src/prtouch_v2.o' generated with GCC compiler older than 10.0
原因:需要使用旧版 GCC 编译 prtouch_v2
。
解决方法(和修复 Klipper AVR 编译工具链方法相同):
- 从 https://pkgs.org/ 搜索 gcc-arm-none-eabi
- 找到 https://ubuntu.pkgs.org/20.04/ubuntu-universe-amd64/gcc-arm-none-eabi_9-2019-q4-0ubuntu1_amd64.deb.html
- 找到 Requires 全部添加到下述 APT Preferences 中
报错 2:make: srec_cat: No such file or directory
原因及解决方法:相比原版 Klipper 增加了 CRC 检校功能,需要安装额外的软件包:srecord
3、使用社区版 K1-Klipper 连接 K1
我们测试,没有版本检校,klipper官方会提醒升级固件。社区版自带示例并不会编译进 prtouch_v2.o
,因为此功能仅 Lmcu 需要,所以不会报错。
#####################################################################
# 外挂上位机
#####################################################################
# 使用社区版 K1-Klipper
# 不要用 install-ubuntu22.04 脚本,service 路径不对
# 也可以使用 kiauh 自定义 repo 方式安装,方法如下:
# cp ~/kiauh/klipper_repos.txt.example ~/kiauh/klipper_repos.txt
# echo "K1-Klipper/klipper,master" >> ~/kiauh/klipper_repos.txt
# 删除或重命名原版 Klipper
mv ~/klipper ~/klipper.old
# rm -rf ~/klipper
git clone https://github.com/K1-Klipper/klipper ~/klipper
# 重新编译 c_helper.so,默认的为 MIPS 架构会报错
rm ~/klipper/klippy/chelper/c_helper.so
cd ~/klipper/klippy/chelper/ && make
# 拷贝 K1 原厂 printer.cfg 并修改为本地串口设备号
注意:修改通讯波特率,也要修改串口转发设置中的波特率,如 socat 或者 ser2net。
4、Bonus:Creality Klipper 添加裁剪掉的功能组件
此处适用使用 CK 而非社区版 K1-Klipper 的场景,因为后者没有进行裁剪。
前面说过,CK 基于 exclude_object: Don't use gcmd.respond_error() (#6407) 这次提交进行修改开发(网址中可以看到长哈希为 ea2f6bc0f544132738c7f052ffcc586fa884a19a,短哈希为 ea2f6bc,后面会用到),为了保证兼容性,可以直接从此次 commit 或者临近的 commit 扒文件拷贝到 CK 中,以舵机支持为例:
# 克隆官方 Klipper 并切换到指定 commit
git clone https://github.com/Klipper3d/klipper /usr/data/klipper-basement && cd /usr/data/klipper-basement
git checkout ea2f6bc
# 确认当前所在版本
git log
# 如果是在外挂上位机,也可以使用之前备份的 klipper.old,必要时切换回最新 commit
# 拷贝 klippy/extras/servo.py 到 CK 对应目录即可
cp /usr/data/klipper-basement/klippy/extras/servo.py /usr/share/klipper/klippy/extras/servo.py
注意:如果想要添加新版功能,可以先尝试直接拷贝对应组件,如果报错可能需要结合 commit history 以及源码进行修改才能使用。