2个版本
0.0.3 | 2024年1月27日 |
---|---|
0.0.2 | 2024年1月12日 |
0.0.1 |
|
0.0.0 |
|
#90 在 硬件支持
每月30次下载
1.5MB
10K SLoC
Printhor: 高度可靠但非必需功能的3D打印机固件
如果您正在使用此产品或喜欢此项目,请★此存储库以表示您的支持!🤩
概述
Printhor是一个通用的硬件无关固件框架,专注于FDM打印机、CNC和雕刻机,使用Rust实现。
社区中有许多生产性固件,如gbrl、marlin、reprap等。每个都有自己的方法和指南。这个目标是为非生产性目的提供一个研究环境,但也是一个可靠的平台,具有以下目标
- 鲁棒性。
- 数值稳定性。
- 高效资源利用和接近抢占式多任务。
- 利用异步多任务。
- 将忙等待保持在最低。
- 尽可能利用DMA传输。
- 当存在时,确保利用FPU。
- 简单。
- 清晰性和可读性。
这意味着主要短期目标是不要开发生产性固件,而是提供一个环境,让人们可以测试和实验任何具体方法,以向社区提供高质量的、最先进的或创新的功能。
功能
- "清洁"硬件抽象。
- 向量几何/线性代数计算
- 高精度和确定性的运动学和计算。
- 简单、安全和高效的资源和外设共享。
- 清洁和简单的异步任务协调/事件驱动原语。
- 广泛的GCode标准覆盖。
- 原生的模拟和基准测试。
- 平滑加速和减速度运动规划。
- 精确的热控制。
- 更多功能即将推出。
总体状态
功能 | 状态 |
---|---|
模拟 | 功能 |
I/O | 功能 |
状态和逻辑 | 孵化 |
运动规划器 | 孵化 |
运动学 | 草图 |
热控制 | 草图 |
显示 | 草图 |
激光/CNC | 待办事项 |
需要帮助
如果您对这个项目感兴趣并希望合作,欢迎加入。已创建一个Discord服务器用于非正式讨论。否则,建议使用Github Issues和Pull Requests。
检出
git clone https://github.com/cbruiz/printhor
cd printhor
构建
构建和运行所需的最小工具集是
- Rust,用于编译
- cargo binutils,生成可以通过SD卡刷入的镜像二进制文件。
- [可选] probe-run,如果您愿意使用SWD/Jlink调试器(https://github.com/knurling-rs/probe-run)
- [可选] cargo-bloat和cargo-size工具非常适合分析代码大小。
- [可选] Rust IDE,如VStudio Code(推荐),Jetbrains IDE(IntelliJ,CLion或RustRover(推荐)),或其他IDE
先决条件:Rust和工具链
此crate需要 Rust >= 1.75。
有关官方指南,请参阅 https://rust-lang.net.cn/tools/install
但是,如果您的操作系统是基于Unix的
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup update
对于微控制器(目前仅支持少数stm32),还需要特定的目标工具链和cargo binutils
rustup target add thumbv7em-none-eabi
rustup target add thumbv7em-none-eabihf
rustup target add thumbv6m-none-eabi
rustup component add llvm-tools
cargo install cargo-binutils
[可选] 对于裸机微控制器的调试(目前仅支持少数stm32)
cargo install probe-run
本地模拟器后端
该框架提供了一组模拟的外设(其中大多数没有逻辑)。在标准输入上提供命令行GCode提示
注意:如果启用本地sdcard功能,则需要打开./data/中的SDCard镜像)
RUST_LOG=info cargo run --bin printhor
集成测试
本地后端有一个名为integration-test的特殊功能,用于执行“某种类型的”集成测试。仍在完善中。
RUST_LOG=info cargo run --features integration-test --bin printhor
通过socat使用GCode发送器进行测试
RUST_LOG=info cargo build --bin printhor
socat pty,link=printhor,rawer EXEC:target/debug/printhor,pty,rawer
MKS Robin Nano(目前仅支持v3.1)
该板(https://www.makerbase.store/pages/mks-robin-nano-v3-1-intro)仍在开发中
二进制镜像生产(标准带defmt)
可以使用以下命令行生成准备上传到SD卡的firmware.bin文件
DEFMT_LOG=info cargo objcopy --release --no-default-features --features mks_robin_nano --target thumbv7em-none-eabihf --bin printhor -- -O binary firmware.bin
当前固件大小为200kB,使用之前的设置。
最小大小二进制镜像生产
DEFMT_LOG=off RUST_BACKTRACE=0 cargo objcopy --profile release-opt --no-default-features --features mks_robin_nano --target thumbv7em-none-eabihf --bin printhor -- -O binary firmware.bin
当前固件大小为164kB,使用之前的设置。
使用JLink/SWD设备运行
DEFMT_LOG=info RUST_BACKTRACE=1 RUSTFLAGS='--cfg board="mks_robin_nano"' cargo run --release --no-default-features --features mks_robin_nano --target thumbv7em-none-eabihf --bin printhor
Nucleo-64
本类别支持两种基础板。假设/要求是使用这些通用开发板中的任意一个,配合Arduino CNC Shield v3(帽子):
在这些开发板中,只需连接USB即可直接使用probe-rs进行烧录和运行,因为它们内置了SWD/JTAG接口
nucleo-f410rb
请注意,该板在闪存和内存方面非常有限(48kB SRAM,128kB闪存)。您可能不会假设未经优化(LTO等)的固件会适应闪存。
注意:此目标默认使用flip-link,需要flip-link工具。要更改此行为,请检查.cargo/config.toml
cargo install flip-link
DEFMT_LOG=info RUST_BACKTRACE=0 RUSTFLAGS='--cfg board="nucleo64-f410rb"' cargo run --release --no-default-features --features nucleo_64_arduino_cnc_hat,nucleo64-f410rb --target thumbv7em-none-eabihf --bin printhor
nucleo-l476rg
这个板子速度略慢,但RAM和闪存更多。即使使用未经过优化的固件和许多功能,也足够使用。
DEFMT_LOG=info RUST_BACKTRACE=0 RUSTFLAGS='--cfg board="nucleo64-l476rg"' cargo run --release --no-default-features --features nucleo_64_arduino_cnc_hat,nucleo64-l476rg --target thumbv7em-none-eabihf --bin printhor
SKR Mini E3(目前仅支持v3.0)
二进制镜像生产(标准带defmt)
可以使用以下命令行生成准备上传到SD卡的firmware.bin文件
DEFMT_LOG=info cargo objcopy --release --no-default-features --features skr_mini_e3 --target thumbv6m-none-eabi --bin printhor -- -O binary firmware.bin
当前固件大小为196kB,使用之前的设置。
最小大小二进制镜像生产
DEFMT_LOG=off RUST_BACKTRACE=0 cargo objcopy --profile release-opt --no-default-features --features skr_mini_e3 --target thumbv6m-none-eabi --bin printhor -- -O binary firmware.bin
当前固件大小为164kB,使用之前的设置。
使用JLink/SWD设备运行
DEFMT_LOG=info RUST_BACKTRACE=1 RUSTFLAGS='--cfg board="skr_mini_e3"' cargo run --release --no-default-features --features skr_mini_e3 --target thumbv6m-none-eabi --bin printhor
额外工具
一个简单的独立标准二进制程序,用于实验运动计划(类似于游乐场)
cargo run --bin scurve_plot
示例输出
待办事项
- 代码产品化。主要基于https://dl.acm.org/doi/pdf/10.1145/3519941.3535075和https://jamesmunns.com/blog/fmt-unreasonably-expensive/
- 代码大小缩减。
- 移除unwrap/panic调用。
- 移除不安全代码(一点点,但确实有)
- 移除琐碎/冗余的计算,但不会牺牲可读性。
- 单元测试
- CoreXY支持
- 显示
- I/O控制
- xonxoff
- 自适应计划成本测量以决定是否链式操作及其程度。
- 在SKR E3 Mini v3中同时激活USB和SPI存在问题:(
- 支持exfat将非常不错。
定制化
对于单板,可以通过cargo功能选择或直接编辑main/cargo.toml来激活/禁用高级功能(如热端、热床、风扇、sd卡等)。目前,为了更改引脚,需要编写/修改一些代码,目前没有预期会出现任何类型的配置文件。
由于这种限制(Rust由于其严格的类型系统而难以解决),干净的代码组织至关重要,并且通过编辑代码进行轻微的定制相对简单直接。
架构
printhor由以下架构模块组成
- embassy-rs,作为硬件和异步基础 https://github.com/embassy-rs/embassy
- async-gcode,作为GCode解释的核心 https://github.com/ithinuel/async-gcode
- printhor-hwa-common(在项目中),作为硬件抽象层契约和通用工具
- 每个硬件/板的集合(在项目中)
- printhor-hwi_native:本机模拟器。
- printhor-hwi_skr_mini_e3_v3:(见Datasheets/SKR_MINI_E3-V3.0)
- printhor-hwi_mks_robin_nano_v3_1 [WIP]:(见Datasheets/MKS-ROBIN-NANO-V3.1)
- printhor-hwi_nucleo_64_arduino_cnc_hat [WIP]:一个Nucleo-64开发板(目前为L476RG或F410RB)带有Arduino CNC Shield v3.x(见Datasheets/NUCLEO-L476RG_CNC_SHIELD_V3)
有意避免在不是绝对需要时使用特性,而是基于
- 类型别名
- 模块导出
图示正在制作中
类似的、相关的软件和致谢
- https://embassy.dev/ Rust Embassy;嵌入式应用的下一代框架。本项目最重要的和核心框架,符合本项目的支柱。
- https://github.com/nviennot/turbo-resin 与printhor完全相同,但专注于树脂打印机。该项目启发了本项目。
- https://github.com/marcbone/s_curve 非常受赞赏的知识。当前选定的运动配置文件基于这项工作,但进行了大量的重新解释以使本项目工作。s-curve的作者引用的书籍被认为是实现运动计划目标的关键阅读。尽管如此,我们的实现仍然不成熟/未经证明,不能要求合并。
GCode兼容性 [草案]
Gcode实现状态,如https://reprap.org/wiki/G-code
- WIP:工作进行中
- ILT:长期
- TODO:待办
M-Code | 模式 | 描述 | 状态 |
---|---|---|---|
M | * | 列出所有支持的m代码 | DONE |
M0 | * | 停止或无条件停止 | WIP |
M1 | * | 休眠或条件停止 | WIP |
M2 | * | 程序结束 | WIP |
M3 | CNC | 主轴开启,顺时针旋转 | WIP |
LASER | 激光开启 | WIP | |
M4 | CNC | 主轴开启,逆时针旋转 | WIP |
LASER | 激光开启 | WIP | |
M5 | CNC | 主轴关闭 | WIP |
LASER | 激光关闭 | WIP | |
M6 | * | 换刀 | ILT |
M7 | CNC | 雾冷开启 | ILT |
M8 | CNC | 喷淋冷却开启 | ILT |
M9 | CNC | 冷却关闭 | ILT |
M10 | CNC | 真空开启 | ILT |
M11 | CNC | 真空关闭 | ILT |
M13 | CNC | 主轴开启(顺时针旋转)和冷却开启(喷淋) | ILT |
M16 | CNC | 预期打印机检查 | 待办事项 |
M17 | * | 启用/开启所有步进电机 | WIP |
M18 | * | 禁用所有步进电机 | WIP |
M20 | * | 列出SD卡 | WIP |
M21 | * | 初始化SD卡 | 待办事项 |
M22 | * | 释放SD卡 | 待办事项 |
M23 | * | 选择SD文件 | 待办事项 |
M24 | * | 开始/恢复SD打印 | 待办事项 |
M25 | * | 暂停SD打印 | 待办事项 |
M26 | * | 设置SD位置 | ILT |
M27 | * | 报告SD打印状态 | 待办事项 |
M30 | * | 程序停止 | 待办事项 |
M31 | * | 自上次M109或SD卡启动以来输出时间到串行端口 | 待办事项 |
M32 | * | 选择文件并开始SD打印 | 待办事项 |
M33 | * | 获取SD卡文件或文件夹的长名 | ILT |
M37 | * | 模拟模式 | WIP |
M73 | * | 设置/获取构建百分比 | 待办事项 |
M79 | * | 软重启 | WIP |
M80 | * | ATX电源开启 | WIP |
M81 | * | ATX电源关闭 | WIP |
M82 | * | 将挤出机设置为绝对模式 | WIP |
M83 | * | 将挤出机设置为相对模式 | WIP |
M92 | * | 设置轴每单位步数 | WIP |
M104 | FFF | 设置热端温度 | DONE |
M105 | FFF | 获取热端和/或热床温度 | DONE |
M106 | * | 风扇开启 | WIP |
M107 | * | 风扇关闭 | WIP |
M109 | FFF | 设置挤出机温度并等待 | WIP |
M110 | * | 设置当前行号 | WIP |
M111 | * | 设置调试级别 | WIP |
M112 | * | 完全(紧急)停止 | WIP |
M114 | * | 获取当前位置 | DONE |
M115 | * | 获取固件版本和能力 | WIP |
M116 | * | 等待 | WIP |
M117 | * | 显示消息 | WIP |
M118 | * | 在主机上回显消息 | WIP |
M119 | * | 获取限位器状态 | WIP |
M120 | * | 启用限位器检测 | WIP |
M121 | * | 禁用限位器检测 | WIP |
M140 | * | 设置热床温度(快速) | DONE |
M190 | * | 等待热床温度 | DONE |
M200 | * | 设置丝材直径 | WIP |
M201 | * | 设置最大加速度 | WIP |
M202 | * | 设置最大移动加速度 | WIP |
M203 | * | 设置最大进给率 | WIP |
M204 | * | 设置默认加速度 | WIP |
M205 | * | 高级设置 | WIP |
M206 | * | 偏移轴 | WIP |
M207 | * | 设置回缩长度 | WIP |
M208 | * | 设置回缩长度 | WIP |
M209 | FFF | 启用自动回缩 | WIP |
M210 | * | 设置回参考进给率 | WIP |
M211 | * | 禁用/启用软件限位器 | WIP |
M212 | * | 设置床水平传感器偏移量 | WIP |
M218 | * | 设置热端偏移量 | WIP |
M220 | * | 设置速度因子覆盖百分比 | WIP |
M221 | * | 设置挤出因子覆盖百分比 | WIP |
M290 | * | 婴儿步进 | WIP |
M302 | * | 允许冷挤出 | WIP |
M305 | * | 设置热敏电阻和ADC参数 | WIP |
M350 | * | 设置微步进模式 | WIP |
M360 | * | 报告固件配置 | WIP |
M400 | * | 等待当前移动完成 | 待办事项 |
M401 | * | 部署Z探头 | 待办事项 |
M402 | * | 存储Z探头 | 待办事项 |
M404 | * | 丝材宽度和喷嘴直径 | WIP |
M407 | * | 显示丝材直径 | WIP |
M410 | * | 快速停止 | 待办事项 |
M422 | * | 设置G34点 | WIP |
M450 | * | 报告打印机模式 | WIP |
M451 | * | 选择FFF打印机模式 | WIP |
M452 | * | 选择激光打印机模式 | WIP |
M453 | * | 选择CNC打印机模式 | WIP |
M500 | * | 将参数存储在非易失性存储中 | 待办事项 |
M501 | * | 从EEPROM读取参数 | 待办事项 |
M502 | * | 恢复默认设置 | WIP |
M503 | * | 报告当前设置 | WIP |
M504 | * | 验证EEPROM | 待办事项 |
M505 | * | 清除EEPROM并重置打印机 | 待办事项 |
M510 | * | 锁定机器 | ILT |
M511 | * | 使用密码解锁机器 | ILT |
M512 | * | 设置密码 | ILT |
M513 | * | 删除密码 | ILT |
M524 | * | 中止SD打印 | ILT |
M555 | * | 设置兼容性 | ILT |
M563 | * | 定义或删除工具 | ILT |
M851 | * | 设置Z探头偏移 | WIP |
M862.1 | * | 检查喷嘴直径 | ILT |
M862.2 | * | 检查型号代码 | ILT |
M862.3 | * | 型号名称 | 待办事项 |
M929 | * | 开始/停止将事件记录到SD卡 | 待办事项 |
G-Code | 模式 | 描述 | 状态 |
---|---|---|---|
G | * | 列出所有支持的G代码 | DONE |
G0 | * | 快速移动 | WIP |
G1 | * | 线性移动 | WIP |
G4 | * | 暂停 | 待办事项 |
G10 | * | 缩回/设置坐标系 | ILT |
G11 | * | 取消缩回 | 待办事项 |
G17 | * | 平面选择XY(默认) | 待办事项 |
G18 | CNC | 平面选择ZX | ILT |
G19 | CNC | 平面选择YZ | ILT |
G21 | * | 将单位设置为毫米 | WIP |
G22 | * | 固件缩回 | ILT |
G23 | * | 固件恢复 | ILT |
G28 | * | 移动到原点(归位) | 待办事项 |
G29 | * | 详细Z探头 | 待办事项 |
G29.1 | * | 设置Z探头头偏移 | WIP |
G29.2 | * | 从工具头位置设置Z探头头偏移 | ILT |
G30 | * | 单次Z探头 | 待办事项 |
G31 | * | 设置或报告当前探头状态 | 待办事项 |
G38.2 | * | 向工件探头,接触停止,失败时发出错误信号 | ILT |
G38.3 | * | 向工件探头,接触停止 | ILT |
G38.4 | * | 远离工件探头,失去接触停止,失败时发出错误信号 | ILT |
G38.5 | * | 远离工件探头,失去接触停止 | ILT |
G80 | * | 基于网格的Z探头 | ILT |
G81 | * | 网格床调平状态 | ILT |
G82 | * | 在当前位置进行单次Z探头 | 待办事项 |
G90 | * | 设置为绝对定位 | DONE |
G91 | * | 设置为相对定位 | DONE |
G92 | * | 设置位置 | WIP |
G92.1 | * | 将轴偏移(以及参数5211-5219)重置为零。(X Y Z A B C U V W) | ILT |
G92.2 | * | 将轴偏移重置为零 | ILT |
G93 | CNC | 进给率模式(逆时间模式) | ILT |
G94 | CNC | 进给率模式(每分钟单位) | ILT |
3D打印G代码示例
M73 P0 R87
M73 Q0 S87
M201 X1000 Y1000 Z200 E5000 ; sets maximum accelerations, mm/sec^2
M203 X200 Y200 Z12 E120 ; sets maximum feedrates, mm / sec
M204 P1250 R1250 T1500 ; sets acceleration (P, T) and retract acceleration (R), mm/sec^2
M205 X8.00 Y8.00 Z0.40 E4.50 ; sets the jerk limits, mm/sec
M205 S0 T0 ; sets the minimum extruding and travel feed rate, mm/sec
M107
;TYPE:Custom
M862.3 P "MK3" ; printer model check
M862.1 P0.4 ; nozzle diameter check
G90 ; use absolute coordinates
M83 ; extruder relative mode
M80 ; Power on
G28 W ; home all without mesh bed level
G80 ; mesh bed leveling
G28 X Y; Park
M104 S235 ; set extruder temp
M140 S60 ; set bed temp
M190 S60 ; wait for bed temp
M109 S235 ; wait for extruder temp
G1 Z0.2 F720
G1 Y-3 F1000 ; go outside print area
G92 E0
G1 X60 E9 F1000 ; intro line
G1 X100 E12.5 F1000 ; intro line
G92 E0
M221 S95
; Don't change E values below. Excessive value can damage the printer.
M907 E430 ; set extruder motor current
G21 ; set units to millimeters
G90 ; use absolute coordinates
M83 ; use relative distances for extrusion
; Filament-specific start gcode
M900 K0.2
M107
;LAYER_CHANGE
;Z:0.2
;HEIGHT:0.2
;BEFORE_LAYER_CHANGE
G92 E0.0
;0.2
G1 E-3.1 F3000
G1 Z.4 F720
;AFTER_LAYER_CHANGE
;0.2
G1 X76.782 Y74.538 F13200
G1 Z.2 F720
G1 E3.1 F3000
M204 P800
;TYPE:Skirt/Brim
;WIDTH:0.42
G1 F1200
G1 X77.609 Y73.879 E.03317
G1 X90.788 Y67.532 E.45862
G1 X91.819 Y67.297 E.03317
激光G代码示例
G21
G90
M206 X-45. Y-10. Z-20.; Laser offset
G28; Homing
G1 F3000. Z7.
M107;svg#svg5 > g#layer89324 > path#rect2575
G0 X12.6508 Y109.9950
M4 S255
G1 X112.6408 Y109.9950 F3000
G1 X112.6408 Y10.0050 F3000
G1 X12.6508 Y10.0050 F3000
G1 X12.6508 Y109.9950 F3000
M5
G4
依赖关系
~5–47MB
~1M SLoC