#固件 #打印 #CNC #可靠 #3D #杠杆 #框架

无std 应用 prinThor

高度可靠但并非必需功能的3D打印机固件

2个版本

0.0.3 2024年1月27日
0.0.2 2024年1月12日
0.0.1 2023年11月15日
0.0.0 2023年11月14日

#90硬件支持

每月30次下载

MIT 和可能 LGPL-3.0

1.5MB
10K SLoC

Minimum Rust: 1.75 crates.io License: MIT Discord Shield

Printhor: 高度可靠但非必需功能的3D打印机固件

如果您正在使用此产品或喜欢此项目,请此存储库以表示您的支持!🤩

概述

Printhor是一个通用的硬件无关固件框架,专注于FDM打印机、CNC和雕刻机,使用Rust实现。

社区中有许多生产性固件,如gbrl、marlin、reprap等。每个都有自己的方法和指南。这个目标是为非生产性目的提供一个研究环境,但也是一个可靠的平台,具有以下目标

  • 鲁棒性。
  • 数值稳定性。
  • 高效资源利用和接近抢占式多任务。
    • 利用异步多任务。
    • 将忙等待保持在最低。
    • 尽可能利用DMA传输。
    • 当存在时,确保利用FPU。
  • 简单。
  • 清晰性和可读性。

这意味着主要短期目标是不要开发生产性固件,而是提供一个环境,让人们可以测试和实验任何具体方法,以向社区提供高质量的、最先进的或创新的功能。

功能

  • "清洁"硬件抽象。
  • 向量几何/线性代数计算
    • 高精度和确定性的运动学和计算。
  • 简单、安全和高效的资源和外设共享。
  • 清洁和简单的异步任务协调/事件驱动原语。
  • 广泛的GCode标准覆盖。
  • 原生的模拟和基准测试。
    • 平滑加速和减速度运动规划。
    • 精确的热控制。
    • 更多功能即将推出。

总体状态

功能状态
模拟功能
I/O功能
状态和逻辑孵化
运动规划器孵化
运动学草图
热控制草图
显示草图
激光/CNC待办事项

需要帮助

如果您对这个项目感兴趣并希望合作,欢迎加入。已创建一个Discord服务器用于非正式讨论。否则,建议使用Github Issues和Pull Requests。
Discord Banner 4

检出

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(帽子):alt text

在这些开发板中,只需连接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)

该板(https://biqu.equipment/collections/control-board/products/bigtreetech-skr-mini-e3-v2-0-32-bit-control-board-for-ender-3)功能相当完善

二进制镜像生产(标准带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

示例输出

alt text

待办事项

定制化

对于单板,可以通过cargo功能选择或直接编辑main/cargo.toml来激活/禁用高级功能(如热端、热床、风扇、sd卡等)。目前,为了更改引脚,需要编写/修改一些代码,目前没有预期会出现任何类型的配置文件。

由于这种限制(Rust由于其严格的类型系统而难以解决),干净的代码组织至关重要,并且通过编辑代码进行轻微的定制相对简单直接。

架构

printhor由以下架构模块组成

有意避免在不是绝对需要时使用特性,而是基于

  • 类型别名
  • 模块导出

图示正在制作中

类似的、相关的软件和致谢

  • 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