惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Recorded Future
Recorded Future
爱范儿
爱范儿
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
腾讯CDC
罗磊的独立博客
阮一峰的网络日志
阮一峰的网络日志
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
G
GRAHAM CLULEY
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
C
Cyber Attacks, Cyber Crime and Cyber Security
T
The Blog of Author Tim Ferriss
T
The Exploit Database - CXSecurity.com
博客园 - 叶小钗
Latest news
Latest news
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
量子位
S
Security @ Cisco Blogs
Microsoft Security Blog
Microsoft Security Blog
Stack Overflow Blog
Stack Overflow Blog
美团技术团队
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
IT之家
IT之家
U
Unit 42
Project Zero
Project Zero
B
Blog
博客园 - 【当耐特】
D
DataBreaches.Net
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Hugging Face - Blog
Hugging Face - Blog
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
F
Full Disclosure
Vercel News
Vercel News
NISL@THU
NISL@THU
AWS News Blog
AWS News Blog
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
T
Threatpost
Martin Fowler
Martin Fowler
Engineering at Meta
Engineering at Meta
T
Tor Project blog
M
MIT News - Artificial intelligence
V
V2EX

博客园 - 思兼

跟思兼学Klipper(41):优化 KAMP 的自适应划线清除喷嘴残料 跟思兼学Klipper(40) 免费高速简单的3D打印机远程控制服务 跟思兼学Klipper(39.1)解决 QIDI Q2 主板散热风扇开机即转、待机不停的风扇噪音问题 跟思兼学Klipper(38) 成品3D打印机使用外挂上位机提升性能简明指南 跟思兼学Klipper(37) M8P v2.0+CB2/BTTPi2 新版系统使用简明指南 跟思兼学用Klipper(36)低成本升级自动Z偏移校准实现完美首层 MKS Pi/SKIPR 自制新版系统简明使用指南 火力全开!Intel NUC6iKYK 骷髅峡谷提速降温简明指南 跟思兼学用Klipper(35) mergerfs 助力 Klipper 上位机热插拔自动扩容与脱机打印 跟思兼学用Klipper(34) 3D打印机如何进行双 Z 等高校准之我见 跟思兼学Klipper(32):修复 CrealityOS IP 地址经常改变的问题 跟思兼学Klipper(30):使用辅助宏调整3D打印机无感归位堵转检测阈值 玩转创想三维 K1 系列主板之一:在线更新 MCU 固件 基于 ESPHome 的 3D 打印机舱内控制系统(2): FireBeetle 2 ESP32-C6 + Moonraker Sensor + Fluidd 基于 ESPHome 的 3D 打印机舱内控制系统(1): 荆棘满途之 FireBeetle 2 ESP32-C6 初始配置 跟着思兼学习Klipper(29):行空板遇上Klipper之一: 安装Klipper全家桶 跟着思兼学习Klipper(28):无接触线刷Klipper固件:千秋万载,一统江湖之Katapult 跟着思兼学习3D打印 Klipper 固件系列文章合集 27-行空板遇上Klipper之三: 做一个基于Klipper的通用延时摄影机
玩转创想三维 K1 系列主板之二:编译 MCU 固件,恢复裁剪组件
思兼 · 2024-05-14 · via 博客园 - 思兼

前言

原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎交流指正。

文章如有更新请访问 DFRobot 社区cnblogs 博客园,前者内容较全,后者排版及阅读体验更佳。

本文是摸索创想三维 K1 系列软硬件系统的一些内容分享。最近创想三维的工作人员联系了我,希望接下来能加快网卡直连方案的进度。

我的外挂上位机方案之一是直接让外挂上位机通过 RS232 通讯接口连接 Nozzle_MCU (以下简称 Nmcu) 和 Levelling MCU (以下简称 Lmcu)。一般使用 USB 转 RS232 模块,当然最简便的方案是使用板载支持 RS232 通讯的 Arm 开发板,还真让我找到了(当然还有调整设备树启用此功能的问题,此处按下不表),然而这块开发板的稳定通讯波特率不超过 200k,而 K1 默认使用 230400,所以我们需要重新烧录 Nmcu 和 Lmcu 的固件,通讯波特率调整为标准的 115200,同时由于这两者通讯数据量不大,115200 理论上满足我们的需求。

我们约定,直接控制打印机硬件的部分称为主板,运行 Linux 系统的部分称为上位机。

image-20240514111454676

软硬件测试环境:

  1. K1Max Mainboard with CrealityOS
  2. RK3399 Develoboard with Ubuntu 22.04

本文涉及的内容:

  1. 如何为打印机主板编译固件
  2. 如何解决编译过程中遇到的问题
  3. 如何补齐裁剪掉的 Klipper 功能

1、Klipper for K1 相关资料

创想三维系列的修改版 Klipper(以下简称 CK)做了大量改动,但是由于并不是 fork 原版 Klipper,而是直接新建仓库,导致我们无法直观看到改动记录。好在第三方 commit 可以看到:

2、编译自定义 MCU 固件

我们先看一下三块微控制器参数:

  1. mcu0:主控制器,控制 XYZ 步进电机、风扇等,GD32F303RET6
  2. Nozzle_mcu:热端工具板,GD32F303CBT6
  3. 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
    • K1_noz0_110_S06_defconfig
    • K1_noz0_110_G30_defconfig
    • K1_noz0_120_G30_defconfig
    • 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

image-20240514122254968

由于社区版默认没有 GD32 的预设(虽然理论上 STM32 也能用)。这里我们选择 CK 代码进行编译。使用预配置文件:K1_mcu0_120_G32_defconfig。

image-20240514122131755

## 克隆 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

image-20240514122634286

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 编译工具链方法相同):

  1. https://pkgs.org/ 搜索 gcc-arm-none-eabi
  2. 找到 https://ubuntu.pkgs.org/20.04/ubuntu-universe-amd64/gcc-arm-none-eabi_9-2019-q4-0ubuntu1_amd64.deb.html
  3. 找到 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 以及源码进行修改才能使用。