Fix PARKING_EXTRUDER homing with solenoid (#20473)
This commit is contained in:
parent
c840bbc970
commit
815c636449
|
@ -28,22 +28,29 @@
|
||||||
|
|
||||||
#include "../module/motion.h" // for active_extruder
|
#include "../module/motion.h" // for active_extruder
|
||||||
|
|
||||||
#if ENABLED(MANUAL_SOLENOID_CONTROL)
|
// PARKING_EXTRUDER options alter the default behavior of solenoids, this ensures compliance of M380-381
|
||||||
#define HAS_SOLENOID(N) HAS_SOLENOID_##N
|
|
||||||
|
#if ENABLED(PARKING_EXTRUDER)
|
||||||
|
#include "../module/tool_change.h"
|
||||||
|
#define SOLENOID_MAGNETIZED_STATE (TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT,!)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE)
|
||||||
#else
|
#else
|
||||||
#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && EXTRUDERS > N)
|
#define SOLENOID_MAGNETIZED_STATE HIGH
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define HAS_SOLENOID(N) (HAS_SOLENOID_##N && TERN(MANUAL_SOLENOID_CONTROL, true, EXTRUDERS > N))
|
||||||
|
|
||||||
// Used primarily with MANUAL_SOLENOID_CONTROL
|
// Used primarily with MANUAL_SOLENOID_CONTROL
|
||||||
static void set_solenoid(const uint8_t num, const bool active) {
|
static void set_solenoid(const uint8_t num, const bool active) {
|
||||||
const uint8_t value = active ? HIGH : LOW;
|
const uint8_t value = active ? SOLENOID_MAGNETIZED_STATE : !SOLENOID_MAGNETIZED_STATE;
|
||||||
switch (num) {
|
switch (num) {
|
||||||
case 0:
|
case 0:
|
||||||
OUT_WRITE(SOL0_PIN, value);
|
OUT_WRITE(SOL0_PIN, value);
|
||||||
|
TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 0) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked
|
||||||
break;
|
break;
|
||||||
#if HAS_SOLENOID(1)
|
#if HAS_SOLENOID(1)
|
||||||
case 1:
|
case 1:
|
||||||
OUT_WRITE(SOL1_PIN, value);
|
OUT_WRITE(SOL1_PIN, value);
|
||||||
|
TERN_(PARKING_EXTRUDER, if (!active && active_extruder == 1) parking_extruder_set_parked()); // If active extruder's solenoid is disabled, carriage is considered parked
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if HAS_SOLENOID(2)
|
#if HAS_SOLENOID(2)
|
||||||
|
|
|
@ -290,6 +290,10 @@ void GcodeSuite::G28() {
|
||||||
#if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)
|
#if DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE)
|
||||||
const uint8_t old_tool_index = active_extruder;
|
const uint8_t old_tool_index = active_extruder;
|
||||||
#endif
|
#endif
|
||||||
|
// PARKING_EXTRUDER homing requires different handling of movement / solenoid activation, depending on the side of homing
|
||||||
|
#if ENABLED(PARKING_EXTRUDER)
|
||||||
|
const bool pe_final_change_must_unpark = parking_extruder_unpark_after_homing(old_tool_index, X_HOME_DIR + 1 == old_tool_index * 2);
|
||||||
|
#endif
|
||||||
tool_change(0, true);
|
tool_change(0, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -443,7 +447,7 @@ void GcodeSuite::G28() {
|
||||||
|
|
||||||
// Restore the active tool after homing
|
// Restore the active tool after homing
|
||||||
#if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE))
|
#if HAS_MULTI_HOTEND && (DISABLED(DELTA) || ENABLED(DELTA_HOME_TO_SAFE_ZONE))
|
||||||
tool_change(old_tool_index, NONE(PARKING_EXTRUDER, DUAL_X_CARRIAGE)); // Do move if one of these
|
tool_change(old_tool_index, TERN(PARKING_EXTRUDER, !pe_final_change_must_unpark, DISABLED(DUAL_X_CARRIAGE))); // Do move if one of these
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_HOMING_CURRENT
|
#if HAS_HOMING_CURRENT
|
||||||
|
|
|
@ -61,16 +61,10 @@ void GcodeSuite::T(const int8_t tool_index) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if EXTRUDERS < 2
|
tool_change(tool_index
|
||||||
|
#if HAS_MULTI_EXTRUDER
|
||||||
tool_change(tool_index);
|
, TERN(PARKING_EXTRUDER, false, tool_index == active_extruder) // For PARKING_EXTRUDER motion is decided in tool_change()
|
||||||
|
|| parser.boolval('S')
|
||||||
#else
|
#endif
|
||||||
|
);
|
||||||
tool_change(
|
|
||||||
tool_index,
|
|
||||||
(tool_index == active_extruder) || parser.boolval('S')
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,6 +277,28 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool extruder_parked = true, do_solenoid_activation = true;
|
||||||
|
|
||||||
|
// Modifies tool_change() behavior based on homing side
|
||||||
|
bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool) {
|
||||||
|
do_solenoid_activation = false; // Tell parking_extruder_tool_change to skip solenoid activation
|
||||||
|
|
||||||
|
if (!extruder_parked) return false; // nothing to do
|
||||||
|
|
||||||
|
if (homed_towards_final_tool) {
|
||||||
|
pe_deactivate_solenoid(1 - final_tool);
|
||||||
|
DEBUG_ECHOLNPAIR("Disengage magnet", (int)(1 - final_tool));
|
||||||
|
pe_activate_solenoid(final_tool);
|
||||||
|
DEBUG_ECHOLNPAIR("Engage magnet", (int)final_tool);
|
||||||
|
extruder_parked = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void parking_extruder_set_parked() { extruder_parked = true; }
|
||||||
|
|
||||||
inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) {
|
inline void parking_extruder_tool_change(const uint8_t new_tool, bool no_move) {
|
||||||
if (!no_move) {
|
if (!no_move) {
|
||||||
|
|
||||||
|
@ -304,27 +326,30 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
|
||||||
|
|
||||||
DEBUG_POS("Start PE Tool-Change", current_position);
|
DEBUG_POS("Start PE Tool-Change", current_position);
|
||||||
|
|
||||||
current_position.x = parkingposx[active_extruder] + x_offset;
|
// Don't park the active_extruder unless unparked
|
||||||
|
if (!extruder_parked) {
|
||||||
|
current_position.x = parkingposx[active_extruder] + x_offset;
|
||||||
|
|
||||||
DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder));
|
DEBUG_ECHOLNPAIR("(1) Park extruder ", int(active_extruder));
|
||||||
DEBUG_POS("Moving ParkPos", current_position);
|
DEBUG_POS("Moving ParkPos", current_position);
|
||||||
|
|
||||||
fast_line_to_current(X_AXIS);
|
fast_line_to_current(X_AXIS);
|
||||||
|
|
||||||
// STEP 2
|
// STEP 2
|
||||||
|
|
||||||
planner.synchronize();
|
planner.synchronize();
|
||||||
DEBUG_ECHOLNPGM("(2) Disengage magnet");
|
DEBUG_ECHOLNPGM("(2) Disengage magnet");
|
||||||
pe_deactivate_solenoid(active_extruder);
|
pe_deactivate_solenoid(active_extruder);
|
||||||
|
|
||||||
// STEP 3
|
// STEP 3
|
||||||
|
|
||||||
current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder
|
current_position.x += active_extruder ? -10 : 10; // move 10mm away from parked extruder
|
||||||
|
|
||||||
DEBUG_ECHOLNPGM("(3) Move near new extruder");
|
DEBUG_ECHOLNPGM("(3) Move near new extruder");
|
||||||
DEBUG_POS("Move away from parked extruder", current_position);
|
DEBUG_POS("Move away from parked extruder", current_position);
|
||||||
|
|
||||||
fast_line_to_current(X_AXIS);
|
fast_line_to_current(X_AXIS);
|
||||||
|
}
|
||||||
|
|
||||||
// STEP 4
|
// STEP 4
|
||||||
|
|
||||||
|
@ -358,13 +383,16 @@ inline void fast_line_to_current(const AxisEnum fr_axis) { _line_to_current(fr_a
|
||||||
planner.synchronize(); // Always sync the final move
|
planner.synchronize(); // Always sync the final move
|
||||||
|
|
||||||
DEBUG_POS("PE Tool-Change done.", current_position);
|
DEBUG_POS("PE Tool-Change done.", current_position);
|
||||||
|
extruder_parked = false;
|
||||||
}
|
}
|
||||||
else { // nomove == true
|
else if (do_solenoid_activation) { // && nomove == true
|
||||||
|
// Deactivate old extruder solenoid
|
||||||
|
TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid, pe_deactivate_solenoid)(active_extruder);
|
||||||
// Only engage magnetic field for new extruder
|
// Only engage magnetic field for new extruder
|
||||||
pe_activate_solenoid(new_tool);
|
TERN(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_deactivate_solenoid, pe_activate_solenoid)(new_tool);
|
||||||
// Just save power for inverted magnets
|
|
||||||
TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, pe_activate_solenoid(active_extruder));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
do_solenoid_activation = true; // Activate solenoid for subsequent tool_change()
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PARKING_EXTRUDER
|
#endif // PARKING_EXTRUDER
|
||||||
|
@ -922,7 +950,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (new_tool != old_tool) {
|
if (new_tool != old_tool || TERN0(PARKING_EXTRUDER, extruder_parked)) { // PARKING_EXTRUDER may need to attach old_tool when homing
|
||||||
destination = current_position;
|
destination = current_position;
|
||||||
|
|
||||||
#if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0
|
#if BOTH(TOOLCHANGE_FILAMENT_SWAP, HAS_FAN) && TOOLCHANGE_FS_FAN >= 0
|
||||||
|
|
|
@ -93,6 +93,9 @@
|
||||||
|
|
||||||
void pe_solenoid_init();
|
void pe_solenoid_init();
|
||||||
|
|
||||||
|
bool parking_extruder_unpark_after_homing(const uint8_t final_tool, bool homed_towards_final_tool);
|
||||||
|
void parking_extruder_set_parked();
|
||||||
|
|
||||||
#elif ENABLED(MAGNETIC_PARKING_EXTRUDER)
|
#elif ENABLED(MAGNETIC_PARKING_EXTRUDER)
|
||||||
|
|
||||||
typedef struct MPESettings {
|
typedef struct MPESettings {
|
||||||
|
|
Loading…
Reference in a new issue