正确的 Marlin 固件文件和位置在哪里可以在打印机的 LCD 菜单中添加我想要购买的代码,然后在按下按钮时执行我编写的功能?
例如,我想添加一个菜单项,上面写着“Preheat Custom”,它与“preheat PLA”和“preheat ABS”在同一菜单中,然后运行代码以加热到我指定的值。
我在 Creality Ender 3 上运行 Marlin 固件版本 1.1.9。
正确的 Marlin 固件文件和位置在哪里可以在打印机的 LCD 菜单中添加我想要购买的代码,然后在按下按钮时执行我编写的功能?
例如,我想添加一个菜单项,上面写着“Preheat Custom”,它与“preheat PLA”和“preheat ABS”在同一菜单中,然后运行代码以加热到我指定的值。
我在 Creality Ender 3 上运行 Marlin 固件版本 1.1.9。
您的问题的答案是文件ultralcd.cpp。现在,您还可以通过Configuration_adv.h文件启用额外选项,只需启用:
#define CUSTOM_USER_MENUS
并根据需要编辑其下方的选项(否则它将使用Configuration.h文件中的预设值)。
使用ultralcd.cpp添加自定义项目
如果您想通过ultralcd.cpp 将项目添加到Marlin 固件的菜单中,这就是我以前的做法。最好先查看菜单项的当前实现。正如您已经提到的Preheat PLA
,这将是第一个搜索。当您访问带有 Marlin 固件源的 github 网站时,在文件中搜索很容易,可以使用在文件中搜索的功能。或者,下载固件的副本并使用免费的“grep”实用程序来搜索文件。
搜索Preheat PLA
将显示一堆语言翻译文件。这些指向使用了一个常量MSG_PREHEAT_1
,该常量发现它存在于ultralcd.cpp 中。这暗示了将菜单项添加到 LCDlcd_preheat_m1_menu
所调用的函数MENU_ITEM
。您可以从那里开始添加您自己的选项。
示范
作为快速演示,我CUSTOM PREHEAT
通过复制ultralcd.cpp 中的lcd_preheat_m2_menu
函数添加了一个项目并将其重命名(一个完整的功能项目需要在其中进行更改,因为它现在使用来自ABS 预热选项的常量)。lcd_preheat_m3_menu
lcd_preheat_m3_menu
然后通过更改这部分代码将项目添加到菜单中:
// // 材料 1 和 2 的预热 // #if TEMP_SENSOR_1 != 0 || TEMP_SENSOR_2 != 0 || TEMP_SENSOR_3 != 0 || TEMP_SENSOR_4 != 0 || HAS_HEATED_BED MENU_ITEM(子菜单,MSG_PREHEAT_1,lcd_preheat_m1_menu); MENU_ITEM(子菜单,MSG_PREHEAT_2,lcd_preheat_m2_menu); // 添加这一行: MENU_ITEM(子菜单,“自定义预热”,lcd_preheat_m3_menu); #别的 MENU_ITEM(功能,MSG_PREHEAT_1,lcd_preheat_m1_e0_only); MENU_ITEM(功能,MSG_PREHEAT_2,lcd_preheat_m2_e0_only); #万一
编译并上传到打印板后,进入Prepare
菜单,向下滚动可以看到:
正如 Mark 所说,Marlin 在其高级配置中支持许多菜单项。这些项目旨在运行自定义 G 代码,在这种情况下(使用自定义目标挤出机和床温添加预热操作)足以满足您的需求。那么,让我们看看高级配置文件:Configuration_adv.h。我们要查找的部分几乎在文件的末尾,您可以 ctrl+f 为“CUSTOM_USER_MENUS”找到它。
#define CUSTOM_USER_MENUS
#if ENABLED(CUSTOM_USER_MENUS)
#define USER_SCRIPT_DONE "M117 User Script Done"
#define USER_SCRIPT_AUDIBLE_FEEDBACK
//#define USER_SCRIPT_RETURN // Return to status screen after a script
#define USER_DESC_1 "Do the trick"
#define USER_GCODE_1 "G91\nG0 z5\nG0 y10"
#define USER_DESC_2 "Park"
#define USER_GCODE_2 "G27 P2"
//#define USER_DESC_2 "Preheat for PLA"
//#define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND)
//#define USER_DESC_3 "Preheat for ABS"
//#define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND)
//#define USER_DESC_4 "Heat Bed/Home/Level"
//#define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29"
//#define USER_DESC_5 "Home & Info"
//#define USER_GCODE_5 "G28\nM503"
#endif
从官方 repo 下载的源代码实际上附带了一些示例(评论的那些),我又添加了两个只是为了好玩。要使您的自定义预热菜单项工作,您将使用以下 Gcodes:
关于如何在实践中进行自定义菜单的补充:
启用(取消注释)此行configuration_adv.h
:
#define CUSTOM_USER_MENUS
下面有 5 个示例条目,稍后您可以更改它们或删除/注释掉。您可以添加新的,例如:
#define USER_DESC_6 "Home Z (0.2)"
#define USER_GCODE_6 "G28 Z\nG0 Z0.2"
#define USER_DESC_7 "Fan on"
#define USER_GCODE_7 "M106 S255"
#define USER_DESC_8 "Fan off"
#define USER_GCODE_8 "M107"
Marlin 目前 (v2.0.7.2) 最多支持 25 个菜单项(请参阅 menu_custom.cpp)。这些数字可能存在差距,因此您可以注释掉一些不需要的选项,而无需固定其他选项的编号,这可能非常方便。
自定义命令可以在运行时执行(当已经打印时)。我可以在手动调整 Z endstop 后使用上面的“home Z”来快速校正第一层的高度,而无需重新启动打印。因此,您实际上也会对正在进行的打印造成伤害。
可能有更好的解决方案。
Marlin 支持自定义用户菜单,在 中configuration_adv.h
,您可能应该尽量将更改限制在configuration*.h
文件中。
菜单代码有点难看,你很容易破坏东西。