diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 91a3b342b6..5effb31883 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -260,6 +260,7 @@ #define SWITCHING_NOZZLE_SERVO_ANGLES { 0, 90 } // A pair of angles for { E0, E1 }. // For Dual Servo use two pairs: { { lower, raise }, { lower, raise } } #define SWITCHING_NOZZLE_SERVO_DWELL 2500 // Dwell time to wait for servo to make physical move + #define SWITCHING_NOZZLE_LIFT_TO_PROBE // Lift toolheads out of the way while probing #endif // Switch nozzles by bumping the toolhead. Requires EVENT_GCODE_TOOLCHANGE_#. diff --git a/Marlin/src/inc/Conditionals-1-axes.h b/Marlin/src/inc/Conditionals-1-axes.h index e55f69c797..8e84d7d4d4 100644 --- a/Marlin/src/inc/Conditionals-1-axes.h +++ b/Marlin/src/inc/Conditionals-1-axes.h @@ -87,7 +87,7 @@ #endif /** - * Multi-Material-Unit supported models + * Multi-Material-Unit supported models */ #ifdef MMU_MODEL #define HAS_MMU 1 diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index 2456728554..b361a50a58 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -69,6 +69,10 @@ #endif #undef UNUSED_TEMP_SENSOR +#if !HAS_HOTEND + #undef PREHEAT_1_TEMP_HOTEND + #undef PREHEAT_2_TEMP_HOTEND +#endif #if !TEMP_SENSOR_BED #undef TEMP_SENSOR_BED #undef THERMAL_PROTECTION_BED diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cff241db72..8a293b52a8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -736,6 +736,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1." #elif !defined(SWITCHING_NOZZLE_SERVO_NR) #error "SWITCHING_NOZZLE requires SWITCHING_NOZZLE_SERVO_NR." + #elif ALL(SWITCHING_NOZZLE_LIFT_TO_PROBE, NOZZLE_AS_PROBE) + #error "SWITCHING_NOZZLE_LIFT_TO_PROBE cannot be used with NOZZLE_AS_PROBE." #elif SWITCHING_NOZZLE_SERVO_NR == 0 && !PIN_EXISTS(SERVO0) #error "SERVO0_PIN must be defined for your SWITCHING_NOZZLE." #elif SWITCHING_NOZZLE_SERVO_NR == 1 && !PIN_EXISTS(SERVO1) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 4f7d7c7690..9a998ec569 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -406,6 +406,10 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #endif // PAUSE_BEFORE_DEPLOY_STOW + #if ENABLED(SWITCHING_NOZZLE_LIFT_TO_PROBE) + servo[SWITCHING_NOZZLE_SERVO_NR].move(servo_angles[SWITCHING_NOZZLE_SERVO_NR][deploy ? 1 : 0]); + #endif + #if ENABLED(SOLENOID_PROBE) #if HAS_SOLENOID_1 diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 12aca3fff6..fcaa64cefe 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1415,6 +1415,12 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #endif } // (new_tool != old_tool) + else { + // For switching-nozzle-with-servos you may have manually-edited servo angles + // or other functions that can affect angles. So here we ensure a T# command + // restores active tool position even when recalling the same tool. + TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool)); + } planner.synchronize(); diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index cd911a9060..f00efb8341 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -30,7 +30,7 @@ restore_configs opt_set MOTHERBOARD BOARD_MKS_SBASE \ EXTRUDERS 2 TEMP_SENSOR_1 1 \ NUM_SERVOS 2 SERVO_DELAY '{ 300, 300 }' SWITCHING_NOZZLE_SERVO_ANGLES '{ { 0, 90 }, { 90, 0 } }' -opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR EDITABLE_SERVO_ANGLES SERVO_DETACH_GCODE \ +opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR SWITCHING_NOZZLE_LIFT_TO_PROBE EDITABLE_SERVO_ANGLES SERVO_DETACH_GCODE \ ULTIMAKERCONTROLLER REALTIME_REPORTING_COMMANDS FULL_REPORT_TO_HOST_FEATURE exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE, Grbl Realtime Report" "$3"