本文最后更新于:2025年4月18日 凌晨
前言 Smoothieboard固件项目 的README概述里说该项目适用于LPC17xx微控制器,但将固件烧录到BTT SKR V1.4(LPC1768)主板后,连最基础的移动都无法执行,串口会返回答复:printe pause
,使用OpenPNP软件检测固件时也会打印已弃用的警告信息:WARNING:deprecated_MCU
。
如果烧录到BTT SKR V1.4 Turbo(LPC1769)主板则是可以正常使用,暂不清楚导致该情况的具体原因,而且该项目已经多年未维护,很多功能也不支持;所以尝试使用Marlin固件配置编译OpenPNP固件烧录到BTT SKR V1.4(LPC1768)/ BTT SKR V1.4(LPC1768)主板中进行使用。
这2款主板均可搭配BTT EXP-MOT扩展板 使用,扩展之后相当于有8个电机驱动位,这样可以在OpenPNP里配置为2个吸嘴单元,4个吸嘴;本次使用Marlin-2.1.3-b测试版本进行OpenPNP配置(当前稳定版Marlin-2.0.9.7不能定义8个轴,编译时会有报错,尝试了各种方法也没解决😅),以下只列出部分参数,仅供参考;更多详细参数配置请查看 Marlin官方参数配置文档 。
如果主板的Bootloader为Smoothieware固件的DFU-Bootloader,只要将主板通过USB线连接上电脑后,就会将插入板载TF卡接口的TF卡模拟成一个U盘,这样Marlin每次重新编译生成firmware.bin文件时,可以将新固件复制到U盘中,然后弹出U盘并给主板断电重启,就能直接刷写新固件了。🎉 这两款主板出厂均自带DFU-Bootloader。😀
pins_BTT_SKR_V1_4.h 定义I、J、K、U、V轴限位引脚 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 #define I_DIAG_PIN P1_26 #define J_DIAG_PIN P1_25 #define K_DIAG_PIN P1_21 #define U_DIAG_PIN P1_19 #define V_DIAG_PIN P0_28 #ifdef I_STALL_SENSITIVITY #define I_STOP_PIN I_DIAG_PIN #if I_HOME_TO_MIN #define I_MAX_PIN P1_26 #else #define I_MIN_PIN P1_26 #endif #elif ENABLED(I_DUAL_ENDSTOPS) #ifndef I_MIN_PIN #define I_MIN_PIN P1_26 #endif #ifndef I_MAX_PIN #define I_MAX_PIN P1_26 #endif #else #define I_STOP_PIN P1_26 #endif #ifdef J_STALL_SENSITIVITY #define J_STOP_PIN J_DIAG_PIN #if J_HOME_TO_MIN #define J_MAX_PIN P1_25 #else #define J_MIN_PIN P1_25 #endif #elif ENABLED(J_DUAL_ENDSTOPS) #ifndef J_MIN_PIN #define J_MIN_PIN P1_25 #endif #ifndef J_MAX_PIN #define J_MAX_PIN P1_25 #endif #else #define J_STOP_PIN P1_25 #endif #ifdef K_STALL_SENSITIVITY #define K_STOP_PIN K_DIAG_PIN #if K_HOME_TO_MIN #define K_MAX_PIN P1_25 #else #define K_MIN_PIN P1_25 #endif #elif ENABLED(K_DUAL_ENDSTOPS) #ifndef K_MIN_PIN #define K_MIN_PIN P1_25 #endif #ifndef K_MAX_PIN #define K_MAX_PIN P1_25 #endif #else #define K_STOP_PIN P1_00 #endif #ifdef U_STALL_SENSITIVITY #define U_STOP_PIN U_DIAG_PIN #if U_HOME_TO_MIN #define U_MAX_PIN P1_00 #else #define U_MIN_PIN P1_00 #endif #else #ifndef U_STOP_PIN #define U_STOP_PIN P1_19 #endif #endif #ifdef V_STALL_SENSITIVITY #define V_STOP_PIN V_DIAG_PIN #if V_HOME_TO_MIN #define V_MAX_PIN P1_00 #else #define V_MIN_PIN P1_00 #endif #else #ifndef V_STOP_PIN #define V_STOP_PIN P0_28 #endif #endif
新增I、J、K、U、V轴限位引脚定义;对于线性轴,必须有对应轴的限位引脚定义,实际归位时需要检测对应引脚逻辑信号,而对于旋转轴,实际使用时无需限位进行检测,但是不定义对应旋转轴的限位引脚时编译时会报错,所以这里给旋转轴也定义了引脚。
配置I、J、K、U、V轴步进控制引脚 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #define I_STEP_PIN P2_13 #define I_DIR_PIN P0_11 #define I_ENABLE_PIN P2_12 #ifndef I_CS_PIN #define I_CS_PIN P1_04 #endif #define J_STEP_PIN P1_15 #define J_DIR_PIN P1_14 #define J_ENABLE_PIN P1_16 #ifndef J_CS_PIN #define J_CS_PIN P1_01 #endif #define K_STEP_PIN P3_25 #define K_DIR_PIN P0_18 #define K_ENABLE_PIN P1_31 #ifndef K_CS_PIN #define K_CS_PIN P1_20 #endif #define U_STEP_PIN P0_16 #define U_DIR_PIN P3_26 #define U_ENABLE_PIN P1_22 #ifndef U_CS_PIN #define U_CS_PIN P1_18 #endif #define V_STEP_PIN P0_15 #define V_DIR_PIN P0_17 #define V_ENABLE_PIN P1_23 #ifndef V_CS_PIN #define V_CS_PIN P1_30 #endif
将E0、E1的步进控制引脚都注释掉,然后新增I、J、K、U、V轴的步进控制引脚定义;虽然不修改Marlin会自动配置,但是我测试时发现电机只能朝一个方向,无法换向,暂不清楚是不是Marlin的BUG。💦
Configuration.h 配置信息 1 #define STRING_CONFIG_H_AUTHOR "(dongxunz, openpnp config)"
固件配置作者名及当前配置的类型,可视情况进行修改。
主板型号 1 2 #define MOTHERBOARD BOARD_BTT_SKR_V1_4
其他主板型号请查看Marlin固件根目录下的 Marlin/src/core/boards.h,根据自己的主板型号进行修改成对应的即可。
设置串口 BTT SKR V1.4(LPC1768)和BTT SKR V1.4 Turbo(LPC1769)主板都有3个串口,除第一串口必须开启外,其他串口请按需启用。
第一串口 1 2 #define SERIAL_PORT -1 #define BAUDRATE 115200
第二串口 1 2 #define SERIAL_PORT_2 0 #define BAUDRATE_2 115200
第三串口
第一串口为板载USB,需配置为-1,代表使用USB模拟串行端口。 第二串口为TX0/RX0,需配置为0,官方分配给了TFT屏幕接口。 第三串口为TX3/RX3,需配置为1,官方分配给了WIFI接口。
过高的波特率可能会增加通讯失败的概率(受到环境干扰)。
可选波特率:2400, 9600, 19200, 38400, 57600, 115200, 250000, 500000, 1000000
机器类型 1 #define CUSTOM_MACHINE_NAME "Pick and Place Machine"
在OpenPNP检测固件时可以显示机器类型。
UUID设置 1 #define MACHINE_UUID "6a9922cf-9c52-4f8e-ae01-a0cb7f963f31"
机器唯一ID,在某些应用程序中用于区分不同的机器。
电机驱动芯片型号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #define X_DRIVER_TYPE TMC2209 #define Y_DRIVER_TYPE TMC2209 #define Z_DRIVER_TYPE TMC2209 #define I_DRIVER_TYPE TMC2209 #define J_DRIVER_TYPE TMC2209 #define K_DRIVER_TYPE TMC2209 #define U_DRIVER_TYPE TMC2209 #define V_DRIVER_TYPE TMC2209
请按照实际使用到的轴数量进行相应启用,本次DIY的贴片机为2个吸嘴单元,4个吸嘴,所以需要8个轴;不同的芯片型号可以混合使用。
可选电机驱动芯片型号:'A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE'
注意:_STANDALONE
后缀表示不启用UART模式,使用STEP模式。
轴配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #ifdef I_DRIVER_TYPE #define AXIS4_NAME 'A' #define AXIS4_ROTATES #endif #ifdef J_DRIVER_TYPE #define AXIS5_NAME 'B' #define AXIS5_ROTATES #endif #ifdef K_DRIVER_TYPE #define AXIS6_NAME 'C' #define AXIS6_ROTATES #endif #ifdef U_DRIVER_TYPE #define AXIS7_NAME 'U' #define AXIS7_ROTATES #endif #ifdef V_DRIVER_TYPE #define AXIS8_NAME 'V' #endif #ifdef W_DRIVER_TYPE #define AXIS9_NAME 'W' #endif
对于额外的轴,需要配置对应的轴名称及是否为旋转轴,名称不能修改,保持默认即可,而是否为旋转轴请按实际情况配置。
挤出机数量
贴片机无需使用挤出机。
温度传感器 1 2 3 4 #define TEMP_SENSOR_0 998 #define TEMP_SENSOR_1 998 #define TEMP_SENSOR_BED 998
将板载的3个温度传感器接口都定义为998
,即表示让温度恒定为25°C(不使用温度功能,可视情况修改)。
关闭挤出机PID加热控制
关闭挤出机的PID加热控制功能。
运动学
不启用任何运动学即为默认的笛卡尔运动学,请根据实际机器启用对应的运动学。
硬限位 启用上拉 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #define ENDSTOPPULLUPS #if DISABLED(ENDSTOPPULLUPS) #define ENDSTOPPULLUP_XMIN #define ENDSTOPPULLUP_YMIN #define ENDSTOPPULLUP_ZMIN #define ENDSTOPPULLUP_VMIN #endif
启用对应轴的硬限位引脚上拉功能,防止引脚信号浮动造成的异常情况。
判定逻辑 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #define X_MIN_ENDSTOP_HIT_STATE HIGH #define X_MAX_ENDSTOP_HIT_STATE HIGH #define Y_MIN_ENDSTOP_HIT_STATE HIGH #define Y_MAX_ENDSTOP_HIT_STATE HIGH #define Z_MIN_ENDSTOP_HIT_STATE HIGH #define Z_MAX_ENDSTOP_HIT_STATE HIGH #define I_MIN_ENDSTOP_HIT_STATE LOW #define I_MAX_ENDSTOP_HIT_STATE LOW #define J_MIN_ENDSTOP_HIT_STATE LOW #define J_MAX_ENDSTOP_HIT_STATE LOW #define K_MIN_ENDSTOP_HIT_STATE LOW #define K_MAX_ENDSTOP_HIT_STATE LOW #define U_MIN_ENDSTOP_HIT_STATE LOW #define U_MAX_ENDSTOP_HIT_STATE LOW #define V_MIN_ENDSTOP_HIT_STATE HIGH #define V_MAX_ENDSTOP_HIT_STATE HIGH #define W_MIN_ENDSTOP_HIT_STATE HIGH #define W_MAX_ENDSTOP_HIT_STATE HIGH #define Z_MIN_PROBE_ENDSTOP_HIT_STATE HIGH
各轴对应的硬限位逻辑电平判定,根据实际限位接线及触发信号进行修改。
检查归位限位信号 1 #define DETECT_BROKEN_ENDSTOP
检查归位移动时限位开关是否卡住或断开。
每移动1mm所需脉冲数 1 #define DEFAULT_AXIS_STEPS_PER_UNIT { 160, 160, 160, 407.43666, 407.43666, 407.43666, 407.43666, 160 }
分别代表X、Y、Z、I、J、K、U、V轴每移动1mm需要多少脉冲,计算公式:
1 2 3 4 5 6 7 8 同步带传动(通常是X,Y轴): (360°/步距角*细分数)/(齿间距*齿数)=(360/1.8*32)/(2*20)=160 丝杆传动(通常是Z轴): (360°/步距角*细分数)/丝杆导程=(360/1.8*16)/8=400 齿轮传动(通常是E轴): (360°/步距角*细分数)/挤出轮周长=(360/1.8*16)/(7.2Π)=141.542817
启用M92功能 1 #define EDITABLE_STEPS_PER_UNIT
M92可以设置对应轴每移动1mm所需脉冲数,调试时可启用,后续调试好后可以关闭该功能。
默认最大进给率 1 #define DEFAULT_MAX_FEEDRATE { 200, 200, 5, 50, 50, 50, 50, 5 }
分别代表X、Y、Z、I、J、K、U、V轴的默认最大进给率;对于皮带传动,单位为:linear=mm/s,对于旋转运动,单位为:rotational=°/s。
默认最大加速度 1 #define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000, 10000, 10000, 10000, 100 }
分别代表X、Y、Z、I、J、K、U、V轴的默认最大加速度;对于皮带传动,单位为:linear=mm/(s^2),对于旋转运动,单位为:rotational=°/(s^2)。
默认加速度 1 2 3 #define DEFAULT_ACCELERATION 3000 #define DEFAULT_RETRACT_ACCELERATION 3000 #define DEFAULT_TRAVEL_ACCELERATION 5000
分别代表打印时默认加速度,默认回抽加速度,默认空驶加速度(速度随时间变化);对于皮带传动,单位为:linear=mm/(s^2),对于旋转运动,单位为:rotational=°/(s^2)。
S曲线加速度 1 #define S_CURVE_ACCELERATION
控制加速度曲线(S曲线),可以减少机器震动和共振,电机运动更安静平稳。
Z探针
关闭Z探针功能。
喷嘴偏移 1 #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 }
喷嘴偏移都改为0即可。
电机使能 1 2 3 4 5 6 7 8 9 10 #define X_ENABLE_ON LOW #define Y_ENABLE_ON LOW #define Z_ENABLE_ON LOW #define I_ENABLE_ON LOW #define J_ENABLE_ON LOW #define K_ENABLE_ON LOW #define U_ENABLE_ON LOW #define V_ENABLE_ON LOW
各轴电机使能的逻辑电平,LOW:低电平,HIGH:高电平。
电机方向 1 2 3 4 5 6 7 8 9 #define INVERT_X_DIR false #define INVERT_Y_DIR false #define INVERT_Z_DIR false #define INVERT_I_DIR true #define INVERT_J_DIR true #define INVERT_K_DIR true #define INVERT_U_DIR true #define INVERT_V_DIR false
各轴电机旋转方向逻辑电平,当电机旋转方向不对时,反转对应的逻辑电平信号即可。
归位方向 1 2 3 4 5 6 7 8 9 #define X_HOME_DIR -1 #define Y_HOME_DIR -1 #define Z_HOME_DIR -1 #define I_HOME_DIR -1 #define J_HOME_DIR -1 #define K_HOME_DIR -1 #define U_HOME_DIR -1 #define V_HOME_DIR -1
各轴归位时移动的方向,-1:MIN,1:MAX。
机器尺寸 1 2 #define X_BED_SIZE 500 #define Y_BED_SIZE 500
X、Y轴最大移动的距离,请按照实际情况修改。
归位坐标位置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #define X_MIN_POS 0 #define Y_MIN_POS 0 #define Z_MIN_POS 0 #define X_MAX_POS X_BED_SIZE #define Y_MAX_POS Y_BED_SIZE #define Z_MAX_POS 200 #define I_MIN_POS -9999999 #define I_MAX_POS 9999999 #define J_MIN_POS -9999999 #define J_MAX_POS 9999999 #define K_MIN_POS -9999999 #define K_MAX_POS 9999999 #define U_MIN_POS -9999999 #define U_MAX_POS 9999999 #define V_MIN_POS 0 #define V_MAX_POS 200
各轴归位后的坐标点,对于线性轴,指机器实际限位开关的位置,对于旋转轴,最小设置为-9999999,最大设置为9999999。
软限位 最小软限位 1 2 3 4 5 6 7 8 9 10 11 12 #define MIN_SOFTWARE_ENDSTOPS #if ENABLED(MIN_SOFTWARE_ENDSTOPS) #define MIN_SOFTWARE_ENDSTOP_X #define MIN_SOFTWARE_ENDSTOP_Y #define MIN_SOFTWARE_ENDSTOP_Z #define MIN_SOFTWARE_ENDSTOP_V #define MIN_SOFTWARE_ENDSTOP_W #endif
是否启用各轴最小软限位功能,对于线性轴,建议开启,对于旋转轴,建议关闭。
最大软限位 1 2 3 4 5 6 7 8 9 10 11 12 #define MAX_SOFTWARE_ENDSTOPS #if ENABLED(MAX_SOFTWARE_ENDSTOPS) #define MAX_SOFTWARE_ENDSTOP_X #define MAX_SOFTWARE_ENDSTOP_Y #define MAX_SOFTWARE_ENDSTOP_Z #define MAX_SOFTWARE_ENDSTOP_V #define MAX_SOFTWARE_ENDSTOP_W #endif
是否启用各轴最大软限位功能,对于线性轴,建议开启,对于旋转轴,建议关闭。
启用详细记录 1 #define DEBUG_LEVELING_FEATURE
启用执行G28、G29、M48代码的详细记录,需要占用较大的flash空间,请按需考虑是否开启。
手动设置旋转轴起始位置 1 2 3 4 5 6 7 8 9 #define MANUAL_I_HOME_POS 0 #define MANUAL_J_HOME_POS 0 #define MANUAL_K_HOME_POS 0 #define MANUAL_U_HOME_POS 0
对于旋转轴,需要启用并设置为0。
归位速度 1 #define HOMING_FEEDRATE_MM_M { (50*60), (50*60), (4*60), (30*60), (30*60), (30*60), (30*60), (4*60) }
各轴归位时的速度,对于线性轴,单位为mm/min,对于旋转轴,单位为:°/min。
验证归位 1 #define VALIDATE_HOMING_ENDSTOPS
开启归位移动时是否有限位触发。
EEPROM存储
是否启用EEPROM存储功能,调试阶段建议关闭,等调试完成后开启即可。
打印计数功能
贴片机不需要打印计数功能。
无LCD菜单功能
贴片机不需要LCD菜单功能。
Configuration_adv.h 配置驱动参数 1 2 3 4 5 6 7 8 9 #if AXIS_IS_TMC_CONFIG(X) #define X_CURRENT 800 #define X_CURRENT_HOME X_CURRENT #define X_MICROSTEPS 32 #define X_RSENSE 0.11 #define X_CHAIN_POS -1 #endif
此设置只对TMC驱动才有效,上述配置只列举X轴,其他轴的驱动配置以此类推;
X_CURRENT
:电机驱动电流X_CURRENT_HOME
:无限位归位时的电流X_MICROSTEPS
:驱动细分数X_RSENSE
:采样电阻阻值X_CHAIN_POS
:SPI模式的CSX_INTERPOLATE
:TMC驱动插值算法(可降低打印机移动时的噪音,但是会引入少量系统位置误差)X_HOLD_MULTIPLIER
:保持电流
TMC驱动stealthChop模式 1 2 3 4 5 6 7 8 9 10 11 #if HAS_STEALTHCHOP #define STEALTHCHOP_XY #define STEALTHCHOP_Z #define STEALTHCHOP_I #define STEALTHCHOP_J #define STEALTHCHOP_K #define STEALTHCHOP_U #define STEALTHCHOP_V #define STEALTHCHOP_W #define STEALTHCHOP_E #endif
当Configuration.h -> X_DRIVER_TYPE 驱动器型号配置为支持stealthChop模式的TMC驱动时,会默认启用stealthChop模式,如果不想使用可以注释掉对应的(实测Marlin使用spreadCycle模式时,电机运行时有细微的抖动,且噪音明显,不建议启用)。 stealthChop模式:噪音更小,但是会引入系统误差。 spreadCycle模式:提供更大的扭矩和更高的精度,但是会有明显噪音。
优化斩波器参数 1 #define CHOPPER_TIMING CHOPPER_DEFAULT_24V
使用预定义的参数集优化spreadCycle斩波器参数,请按照驱动供电电压来设置正确的斩波器参数。
可选参数:CHOPPER_DEFAULT_12V
CHOPPER_DEFAULT_19V
CHOPPER_DEFAULT_24V
CHOPPER_DEFAULT_36V
CHOPPER_09STEP_24V // 0.9 degree steppers (24V)
CHOPPER_PRUSAMK3_24V // Imported parameters from the official Průša firmware for MK3 (24V)
CHOPPER_MARLIN_119 // Old defaults from Marlin v1.1.9
特别鸣谢