From fb44b53ae396bfc3d039ea0841a2df59d03dbaf4 Mon Sep 17 00:00:00 2001 From: Christian Bohn Date: Mon, 11 May 2015 23:22:19 +0200 Subject: [PATCH 1/3] sled improvements - create sled pin definition - G28 Works with sled --- Marlin/Conditionals.h | 7 +++ Marlin/Marlin_main.cpp | 99 +++++++++++++++++++++-------------- Marlin/pins_SANGUINOLOLU_11.h | 4 ++ 3 files changed, 72 insertions(+), 38 deletions(-) diff --git a/Marlin/Conditionals.h b/Marlin/Conditionals.h index fa574083d8..f09a8a2fe8 100644 --- a/Marlin/Conditionals.h +++ b/Marlin/Conditionals.h @@ -276,6 +276,13 @@ #define MAX_PROBE_Y (min(Y_MAX_POS, Y_MAX_POS + Y_PROBE_OFFSET_FROM_EXTRUDER)) #endif + /** + * Sled Options + */ + #ifdef Z_PROBE_SLED + #define Z_SAFE_HOMING + #endif + /** * MAX_STEP_FREQUENCY differs for TOSHIBA */ diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 5517b8e18f..52b48e21db 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -650,8 +650,8 @@ void setup() { #endif #ifdef Z_PROBE_SLED - pinMode(SERVO0_PIN, OUTPUT); - digitalWrite(SERVO0_PIN, LOW); // turn it off + pinMode(SLED_PIN, OUTPUT); + digitalWrite(SLED_PIN, LOW); // turn it off #endif // Z_PROBE_SLED setup_homepin(); @@ -1516,6 +1516,48 @@ inline void set_destination_to_current() { memcpy(destination, current_position, #endif // ENABLE_AUTO_BED_LEVELING + +#ifdef Z_PROBE_SLED + + #ifndef SLED_DOCKING_OFFSET + #define SLED_DOCKING_OFFSET 0 + #endif + + /** + * Method to dock/undock a sled designed by Charles Bell. + * + * dock[in] If true, move to MAX_X and engage the electromagnet + * offset[in] The additional distance to move to adjust docking location + */ + static void dock_sled(bool dock, int offset=0) { + if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) { + LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); + return; + } + + if (dock) { + float oldXpos = current_position[X_AXIS]; // save x position + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING); // rise Z + do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1, current_position[Y_AXIS], current_position[Z_AXIS]); // Dock sled a bit closer to ensure proper capturing + digitalWrite(SLED_PIN, LOW); // turn off magnet + do_blocking_move_to(oldXpos, current_position[Y_AXIS], current_position[Z_AXIS]); // return to position before docking + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - Z_RAISE_AFTER_PROBING); + } else { + float oldXpos = current_position[X_AXIS]; // save x position + float z_loc = current_position[Z_AXIS]; + if (z_loc < Z_RAISE_BEFORE_PROBING + 5) z_loc = Z_RAISE_BEFORE_PROBING; + do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset, current_position[Y_AXIS], z_loc); // this also updates current_position + digitalWrite(SLED_PIN, HIGH); // turn on magnet + do_blocking_move_to(oldXpos, current_position[Y_AXIS], current_position[Z_AXIS]); // return to position before docking + } + } + +#endif // Z_PROBE_SLED + + + /** * Home an individual axis */ @@ -1538,6 +1580,13 @@ static void homeaxis(AxisEnum axis) { current_position[axis] = 0; sync_plan_position(); + #ifdef Z_PROBE_SLED + // Get Probe + if (axis == Z_AXIS) { + if (axis_home_dir < 0) dock_sled(false); + } + #endif + #if SERVO_LEVELING && !defined(Z_PROBE_SLED) // Deploy a probe if there is one, and homing towards the bed @@ -1634,6 +1683,13 @@ static void homeaxis(AxisEnum axis) { endstops_hit_on_purpose(); // clear endstop hit flags axis_known_position[axis] = true; + #ifdef Z_PROBE_SLED + // bring probe back + if (axis == Z_AXIS) { + if (axis_home_dir < 0) dock_sled(true); + } + #endif + #if SERVO_LEVELING && !defined(Z_PROBE_SLED) // Deploy a probe if there is one, and homing towards the bed @@ -1708,39 +1764,6 @@ static void homeaxis(AxisEnum axis) { #endif // FWRETRACT -#ifdef Z_PROBE_SLED - - #ifndef SLED_DOCKING_OFFSET - #define SLED_DOCKING_OFFSET 0 - #endif - - /** - * Method to dock/undock a sled designed by Charles Bell. - * - * dock[in] If true, move to MAX_X and engage the electromagnet - * offset[in] The additional distance to move to adjust docking location - */ - static void dock_sled(bool dock, int offset=0) { - if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) { - LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN); - SERIAL_ECHO_START; - SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN); - return; - } - - if (dock) { - do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset, current_position[Y_AXIS], current_position[Z_AXIS]); // this also updates current_position - digitalWrite(SERVO0_PIN, LOW); // turn off magnet - } else { - float z_loc = current_position[Z_AXIS]; - if (z_loc < Z_RAISE_BEFORE_PROBING + 5) z_loc = Z_RAISE_BEFORE_PROBING; - do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset, Y_PROBE_OFFSET_FROM_EXTRUDER, z_loc); // this also updates current_position - digitalWrite(SERVO0_PIN, HIGH); // turn on magnet - } - } - -#endif // Z_PROBE_SLED - /** * * G-Code Handler functions @@ -2000,12 +2023,12 @@ inline void gcode_G28() { if (home_all_axis || homeZ) { - #ifdef Z_SAFE_HOMING + #ifdef Z_SAFE_HOMING if (home_all_axis) { current_position[Z_AXIS] = 0; - sync_plan_position(); + sync_plan_position(); // // Set the probe (or just the nozzle) destination to the safe homing point @@ -2586,7 +2609,7 @@ inline void gcode_G28() { #endif // !DELTA #ifdef Z_PROBE_SLED - dock_sled(true, -SLED_DOCKING_OFFSET); // dock the probe, correcting for over-travel + dock_sled(true); // dock the probe #elif defined(Z_PROBE_ALLEN_KEY) //|| defined(SERVO_LEVELING) stow_z_probe(); #endif diff --git a/Marlin/pins_SANGUINOLOLU_11.h b/Marlin/pins_SANGUINOLOLU_11.h index e7bdd974ea..3eaec67068 100644 --- a/Marlin/pins_SANGUINOLOLU_11.h +++ b/Marlin/pins_SANGUINOLOLU_11.h @@ -44,6 +44,10 @@ #define FAN_PIN 4 #endif +#ifdef Z_PROBE_SLED + #define SLED_PIN 27 +#endif + #ifdef NUM_SERVOS #define SERVO0_PIN -1 From 27a3b1d8954090e8114606ff4c2f5d7c5320d25c Mon Sep 17 00:00:00 2001 From: Christian Bohn Date: Tue, 12 May 2015 08:51:01 +0200 Subject: [PATCH 2/3] disable sled pin by default --- Marlin/Marlin_main.cpp | 4 ++-- Marlin/pins_SANGUINOLOLU_11.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 52b48e21db..1bcec95795 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -2023,12 +2023,12 @@ inline void gcode_G28() { if (home_all_axis || homeZ) { - #ifdef Z_SAFE_HOMING + #ifdef Z_SAFE_HOMING if (home_all_axis) { current_position[Z_AXIS] = 0; - sync_plan_position(); + sync_plan_position(); // // Set the probe (or just the nozzle) destination to the safe homing point diff --git a/Marlin/pins_SANGUINOLOLU_11.h b/Marlin/pins_SANGUINOLOLU_11.h index 3eaec67068..ca41bdd970 100644 --- a/Marlin/pins_SANGUINOLOLU_11.h +++ b/Marlin/pins_SANGUINOLOLU_11.h @@ -45,7 +45,7 @@ #endif #ifdef Z_PROBE_SLED - #define SLED_PIN 27 + #define SLED_PIN -1 #endif #ifdef NUM_SERVOS From f48599f172bfbf08dcd17a051a7426f0a60cbb91 Mon Sep 17 00:00:00 2001 From: Christian Bohn Date: Tue, 12 May 2015 10:02:23 +0200 Subject: [PATCH 3/3] add pin definition to some motherboards --- Marlin/Marlin_main.cpp | 1 - Marlin/pins_MEGATRONICS_3.h | 5 +++++ Marlin/pins_RAMBO.h | 4 ++++ Marlin/pins_RAMPS_13.h | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 1bcec95795..e6609e28ca 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -1543,7 +1543,6 @@ inline void set_destination_to_current() { memcpy(destination, current_position, do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1, current_position[Y_AXIS], current_position[Z_AXIS]); // Dock sled a bit closer to ensure proper capturing digitalWrite(SLED_PIN, LOW); // turn off magnet do_blocking_move_to(oldXpos, current_position[Y_AXIS], current_position[Z_AXIS]); // return to position before docking - do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] - Z_RAISE_AFTER_PROBING); } else { float oldXpos = current_position[X_AXIS]; // save x position float z_loc = current_position[Z_AXIS]; diff --git a/Marlin/pins_MEGATRONICS_3.h b/Marlin/pins_MEGATRONICS_3.h index 6b4016bf41..ed627274ce 100644 --- a/Marlin/pins_MEGATRONICS_3.h +++ b/Marlin/pins_MEGATRONICS_3.h @@ -8,6 +8,11 @@ #define LARGE_FLASH true + +#ifdef Z_PROBE_SLED + #define SLED_PIN -1 +#endif + // Servo support #ifdef NUM_SERVOS #define SERVO0_PIN 46 //AUX3-6 diff --git a/Marlin/pins_RAMBO.h b/Marlin/pins_RAMBO.h index 6d782b9d9c..4c008d6ce3 100644 --- a/Marlin/pins_RAMBO.h +++ b/Marlin/pins_RAMBO.h @@ -22,6 +22,10 @@ #endif #endif +#ifdef Z_PROBE_SLED + #define SLED_PIN -1 +#endif + #undef X_MS1_PIN #undef X_MS2_PIN #undef Y_MS1_PIN diff --git a/Marlin/pins_RAMPS_13.h b/Marlin/pins_RAMPS_13.h index af1d2d3bbc..87ac9230f5 100644 --- a/Marlin/pins_RAMPS_13.h +++ b/Marlin/pins_RAMPS_13.h @@ -134,6 +134,10 @@ #endif #endif +#ifdef Z_PROBE_SLED + #define SLED_PIN -1 +#endif + #ifdef ULTRA_LCD #ifdef NEWPANEL