Browse Source

code changes to implement G38 commands

1) modified 3 code files
Marlin.h
Marlin_main.cpp
endstops.cpp

2) modified config files so I could test on my machine

Testing was done on an AzteegX3pro based machine.

The probe was hooked to the Z_MIN endstop.

My controller doesn't have a dedicated Z_PROBE input so I couldn't test
that functionality.

Verified that a large file (without any G38 commands) executed the same
before and after the changes.

Verified that the head moves as expected when G38.2 and G38.3 commands
are issued. Single & multiple axis moves were tested along with + and -
directions.

Code was added to the main ISR. In normal operation only one extra IF
statement is evaluated. I didn't notice any performance degradation
because of the added code.

The G38 commands are expected to be issued manually by the operator
during machine setup. The G38 commands wait until the machine is idle
before proceeding. That way the other commands are minimally impacted
by the extra ISR overhead when a G38 command is in the queue.

The G38 commands are very similar to the G28 commands except 1) only the
Z_PROBE is used and movement can be in the + or - direction.

See issue 4677 for a discussion on adding G38 commands to Marlin.
Feature request: add ability to use G38.2 command (CNC)
MarlinFirmware/Marlin#4677
pull/1/head
Bob-the-Kuhn 8 years ago
committed by Scott Lahteine
parent
commit
2911aa7ffa
  1. 159
      Marlin/Configuration.h
  2. 6
      Marlin/Configuration_adv.h
  3. 6
      Marlin/Marlin.h
  4. 177
      Marlin/Marlin_main.cpp
  5. 20
      Marlin/endstops.cpp

159
Marlin/Configuration.h

@ -86,7 +86,7 @@
// User-specified version info of this build to display in [Pronterface, etc] terminal window during // User-specified version info of this build to display in [Pronterface, etc] terminal window during
// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
// build by the user have been successfully uploaded into firmware. // build by the user have been successfully uploaded into firmware.
#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes. #define STRING_CONFIG_H_AUTHOR "Bob Kuhn, G2/G3 radius testing" // Who made the changes.
#define SHOW_BOOTSCREEN #define SHOW_BOOTSCREEN
#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1 #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1
#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2 #define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2
@ -105,24 +105,15 @@
//#define SHOW_CUSTOM_BOOTSCREEN //#define SHOW_CUSTOM_BOOTSCREEN
// @section machine // @section machine
/** // SERIAL_PORT selects which serial port should be used for communication with the host.
* Select which serial port on the board will be used for communication with the host. // This allows the connection of wireless adapters (for instance) to non-default port pins.
* This allows the connection of wireless adapters (for instance) to non-default port pins. // Serial port 0 is still used by the Arduino bootloader regardless of this setting.
* Serial port 0 is always used by the Arduino bootloader regardless of this setting. // :[0,1,2,3,4,5,6,7]
*
* :[0,1,2,3,4,5,6,7]
*/
#define SERIAL_PORT 0 #define SERIAL_PORT 0
#define BAUDRATE 250000 // This determines the communication speed of the printer
/** // :[2400,9600,19200,38400,57600,115200,250000]
* This setting determines the communication speed of the printer. #define BAUDRATE 115200
*
* 250000 works in most cases, but you might try a lower speed if
* you commonly experience drop-outs during host printing.
*
* :[2400,9600,19200,38400,57600,115200,250000]
*/
// Enable the Bluetooth serial interface on AT90USB devices // Enable the Bluetooth serial interface on AT90USB devices
//#define BLUETOOTH //#define BLUETOOTH
@ -130,7 +121,7 @@
// The following define selects which electronics board you have. // The following define selects which electronics board you have.
// Please choose the name from boards.h that matches your setup // Please choose the name from boards.h that matches your setup
#ifndef MOTHERBOARD #ifndef MOTHERBOARD
#define MOTHERBOARD BOARD_RAMPS_14_EFB #define MOTHERBOARD BOARD_AZTEEG_X3_PRO
#endif #endif
// Optional custom name for your RepStrap or other custom machine // Optional custom name for your RepStrap or other custom machine
@ -178,22 +169,14 @@
//#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis //#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis
//#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis //#define HOTEND_OFFSET_Y {0.0, 5.00} // (in mm) for each extruder, offset of the hotend on the Y axis
/** //// The following define selects which power supply you have. Please choose the one that matches your setup
* Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN // 1 = ATX
* // 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
* 0 = No Power Switch // :{1:'ATX',2:'X-Box 360'}
* 1 = ATX #define POWER_SUPPLY 1
* 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
*
* :{0:'No power switch',1:'ATX',2:'X-Box 360'}
*/
#define POWER_SUPPLY 0
#if POWER_SUPPLY > 0 // Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it.
// Enable this option to leave the PSU off at startup. //#define PS_DEFAULT_OFF
// Power to steppers and heaters will need to be turned on with M80.
//#define PS_DEFAULT_OFF
#endif
// @section temperature // @section temperature
@ -239,10 +222,10 @@
// 110 is Pt100 with 1k pullup (non standard) // 110 is Pt100 with 1k pullup (non standard)
// 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below. // 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below.
// Use it for Testing or Development purposes. NEVER for production machine. // Use it for Testing or Development purposes. NEVER for production machine.
//#define DUMMY_THERMISTOR_998_VALUE 25 #define DUMMY_THERMISTOR_998_VALUE 25
//#define DUMMY_THERMISTOR_999_VALUE 100 //#define DUMMY_THERMISTOR_999_VALUE 100
// :{ '0': "Not used",'1':"100k / 4.7k - EPCOS",'2':"200k / 4.7k - ATC Semitec 204GT-2",'3':"Mendel-parts / 4.7k",'4':"10k !! do not use for a hotend. Bad resolution at high temp. !!",'5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'6':"100k / 4.7k EPCOS - Not as accurate as Table 1",'7':"100k / 4.7k Honeywell 135-104LAG-J01",'8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT",'9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1",'10':"100k / 4.7k RS 198-961",'11':"100k / 4.7k beta 3950 1%",'12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)",'13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'",'20':"PT100 (Ultimainboard V2.x)",'51':"100k / 1k - EPCOS",'52':"200k / 1k - ATC Semitec 204GT-2",'55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950",'66':"Dyze Design 4.7M High Temperature thermistor",'70':"the 100K thermistor found in the bq Hephestos 2",'71':"100k / 4.7k Honeywell 135-104LAF-J01",'147':"Pt100 / 4.7k",'1047':"Pt1000 / 4.7k",'110':"Pt100 / 1k (non-standard)",'1010':"Pt1000 / 1k (non standard)",'-3':"Thermocouple + MAX31855 (only for sensor 0)",'-2':"Thermocouple + MAX6675 (only for sensor 0)",'-1':"Thermocouple + AD595",'998':"Dummy 1",'999':"Dummy 2" } // :{ '0': "Not used",'1':"100k / 4.7k - EPCOS",'2':"200k / 4.7k - ATC Semitec 204GT-2",'3':"Mendel-parts / 4.7k",'4':"10k !! do not use for a hotend. Bad resolution at high temp. !!",'5':"100K / 4.7k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'6':"100k / 4.7k EPCOS - Not as accurate as Table 1",'7':"100k / 4.7k Honeywell 135-104LAG-J01",'8':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT",'9':"100k / 4.7k GE Sensing AL03006-58.2K-97-G1",'10':"100k / 4.7k RS 198-961",'11':"100k / 4.7k beta 3950 1%",'12':"100k / 4.7k 0603 SMD Vishay NTCS0603E3104FXT (calibrated for Makibox hot bed)",'13':"100k Hisens 3950 1% up to 300°C for hotend 'Simple ONE ' & hotend 'All In ONE'",'20':"PT100 (Ultimainboard V2.x)",'51':"100k / 1k - EPCOS",'52':"200k / 1k - ATC Semitec 204GT-2",'55':"100k / 1k - ATC Semitec 104GT-2 (Used in ParCan & J-Head)",'60':"100k Maker's Tool Works Kapton Bed Thermistor beta=3950",'66':"Dyze Design 4.7M High Temperature thermistor",'70':"the 100K thermistor found in the bq Hephestos 2",'71':"100k / 4.7k Honeywell 135-104LAF-J01",'147':"Pt100 / 4.7k",'1047':"Pt1000 / 4.7k",'110':"Pt100 / 1k (non-standard)",'1010':"Pt1000 / 1k (non standard)",'-3':"Thermocouple + MAX31855 (only for sensor 0)",'-2':"Thermocouple + MAX6675 (only for sensor 0)",'-1':"Thermocouple + AD595",'998':"Dummy 1",'999':"Dummy 2" }
#define TEMP_SENSOR_0 1 #define TEMP_SENSOR_0 998
#define TEMP_SENSOR_1 0 #define TEMP_SENSOR_1 0
#define TEMP_SENSOR_2 0 #define TEMP_SENSOR_2 0
#define TEMP_SENSOR_3 0 #define TEMP_SENSOR_3 0
@ -372,9 +355,8 @@
#define EXTRUDE_MINTEMP 170 #define EXTRUDE_MINTEMP 170
// This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH. // This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH.
// Note that for Bowden Extruders a too-small value here may prevent loading.
#define PREVENT_LENGTHY_EXTRUDE #define PREVENT_LENGTHY_EXTRUDE
#define EXTRUDE_MAXLENGTH 200 #define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH)
//=========================================================================== //===========================================================================
//======================== Thermal Runaway Protection ======================= //======================== Thermal Runaway Protection =======================
@ -421,9 +403,9 @@
#define USE_XMIN_PLUG #define USE_XMIN_PLUG
#define USE_YMIN_PLUG #define USE_YMIN_PLUG
#define USE_ZMIN_PLUG #define USE_ZMIN_PLUG
//#define USE_XMAX_PLUG #define USE_XMAX_PLUG
//#define USE_YMAX_PLUG #define USE_YMAX_PLUG
//#define USE_ZMAX_PLUG #define USE_ZMAX_PLUG
// coarse Endstop Settings // coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors #define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@ -440,13 +422,13 @@
#endif #endif
// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup). // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop. #define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
//============================================================================= //=============================================================================
@ -454,56 +436,20 @@
//============================================================================= //=============================================================================
// @section motion // @section motion
/** #define DEFAULT_AXIS_STEPS_PER_UNIT {8*24.8139,8*24.8139,8*24.8139,100}
* Default Settings #define DEFAULT_MAX_FEEDRATE {35, 35, 25, 25} // (mm/sec)
* #define DEFAULT_MAX_ACCELERATION {3000,3000,100,10000} // X, Y, Z, E maximum start speed for accelerated moves. E default values are good for Skeinforge 40+, for older versions raise them a lot.
* These settings can be reset by M502
*
* Note that if EEPROM is enabled, saved values will override these.
*/
/**
* Default Axis Steps Per Unit (steps/mm)
* Override with M92
*/
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 4000, 500 }
/**
* Default Max Feed Rate (mm/s)
* Override with M203
*/
#define DEFAULT_MAX_FEEDRATE { 300, 300, 5, 25 }
/**
* Default Max Acceleration (change/s) change = mm/s
* Override with M201
*
* Maximum start speed for accelerated moves: { X, Y, Z, E }
*/
#define DEFAULT_MAX_ACCELERATION { 3000, 3000, 100, 10000 }
/** #define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration in mm/s^2 for printing moves
* Default Acceleration (change/s) change = mm/s #define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration in mm/s^2 for retracts
* Override with M204 #define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves
*
* M204 P Acceleration
* M204 R Retract Acceleration
* M204 T Travel Acceleration
*/
#define DEFAULT_ACCELERATION 3000 // X, Y, Z and E acceleration for printing moves
#define DEFAULT_RETRACT_ACCELERATION 3000 // E acceleration for retracts
#define DEFAULT_TRAVEL_ACCELERATION 3000 // X, Y, Z acceleration for travel (non printing) moves
/** // "Jerk" specifies the minimum speed change that requires acceleration.
* Defult Jerk (mm/s) // When changing speed and direction, if the difference is less than the
* // value set here, it may happen instantaneously.
* "Jerk" specifies the minimum speed change that requires acceleration. #define DEFAULT_XYJERK 20.0 // (mm/sec)
* When changing speed and direction, if the difference is less than the #define DEFAULT_ZJERK 0.4 // (mm/sec)
* value set here, it may happen instantaneously. #define DEFAULT_EJERK 5.0 // (mm/sec)
*/
#define DEFAULT_XYJERK 20.0
#define DEFAULT_ZJERK 0.4
#define DEFAULT_EJERK 5.0
//=========================================================================== //===========================================================================
@ -528,7 +474,6 @@
//#define FIX_MOUNTED_PROBE //#define FIX_MOUNTED_PROBE
// The BLTouch probe emulates a servo probe. // The BLTouch probe emulates a servo probe.
// The default connector is SERVO 0. Set Z_ENDSTOP_SERVO_NR below to override.
//#define BLTOUCH //#define BLTOUCH
// Z Servo Probe, such as an endstop switch on a rotating arm. // Z Servo Probe, such as an endstop switch on a rotating arm.
@ -665,9 +610,9 @@
// @section machine // @section machine
// Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way. // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
#define INVERT_X_DIR false #define INVERT_X_DIR true // positive is away from the motor
#define INVERT_Y_DIR true #define INVERT_Y_DIR false // positive is towards the motor
#define INVERT_Z_DIR false #define INVERT_Z_DIR true // positive is away from the motor
// @section extruder // @section extruder
@ -695,12 +640,12 @@
// @section machine // @section machine
// Travel limits after homing (units are in mm) // Travel limits after homing (units are in mm)
#define X_MIN_POS 0 #define X_MIN_POS -100
#define Y_MIN_POS 0 #define Y_MIN_POS -100
#define Z_MIN_POS 0 #define Z_MIN_POS -100
#define X_MAX_POS 200 #define X_MAX_POS 375
#define Y_MAX_POS 200 #define Y_MAX_POS 450
#define Z_MAX_POS 200 #define Z_MAX_POS 450
//=========================================================================== //===========================================================================
//========================= Filament Runout Sensor ========================== //========================= Filament Runout Sensor ==========================
@ -1060,7 +1005,7 @@
// SD Card support is disabled by default. If your controller has an SD slot, // SD Card support is disabled by default. If your controller has an SD slot,
// you must uncomment the following option or it won't work. // you must uncomment the following option or it won't work.
// //
//#define SDSUPPORT #define SDSUPPORT
// //
// SD CARD: SPI SPEED // SD CARD: SPI SPEED
@ -1077,7 +1022,7 @@
// //
// Use CRC checks and retries on the SD communication. // Use CRC checks and retries on the SD communication.
// //
//#define SD_CHECK_AND_RETRY #define SD_CHECK_AND_RETRY
// //
// ENCODER SETTINGS // ENCODER SETTINGS

6
Marlin/Configuration_adv.h

@ -244,16 +244,16 @@
// Dual Y Steppers // Dual Y Steppers
// Uncomment this option to drive two Y axis motors. // Uncomment this option to drive two Y axis motors.
// The next unused E driver will be assigned to the second Y stepper. // The next unused E driver will be assigned to the second Y stepper.
//#define Y_DUAL_STEPPER_DRIVERS #define Y_DUAL_STEPPER_DRIVERS
#if ENABLED(Y_DUAL_STEPPER_DRIVERS) #if ENABLED(Y_DUAL_STEPPER_DRIVERS)
// Set true if the two Y motors need to rotate in opposite directions // Set true if the two Y motors need to rotate in opposite directions
#define INVERT_Y2_VS_Y_DIR true #define INVERT_Y2_VS_Y_DIR false
#endif #endif
// A single Z stepper driver is usually used to drive 2 stepper motors. // A single Z stepper driver is usually used to drive 2 stepper motors.
// Uncomment this option to use a separate stepper driver for each Z axis motor. // Uncomment this option to use a separate stepper driver for each Z axis motor.
// The next unused E driver will be assigned to the second Z stepper. // The next unused E driver will be assigned to the second Z stepper.
//#define Z_DUAL_STEPPER_DRIVERS #define Z_DUAL_STEPPER_DRIVERS
#if ENABLED(Z_DUAL_STEPPER_DRIVERS) #if ENABLED(Z_DUAL_STEPPER_DRIVERS)

6
Marlin/Marlin.h

@ -209,6 +209,12 @@ void manage_inactivity(bool ignore_stepper_queue = false);
#endif // !MIXING_EXTRUDER #endif // !MIXING_EXTRUDER
#define G38_2_3
#ifdef G38_2_3
extern bool G38_flag ; //flag to tell the interrupt handler that a G38 command is being run
extern bool G38_flag_pass ; //flag from the interrupt handler to indicate if the endstop went active
#endif
/** /**
* The axis order in all axis related arrays is X, Y, Z, E * The axis order in all axis related arrays is X, Y, Z, E
*/ */

177
Marlin/Marlin_main.cpp

@ -117,6 +117,7 @@
* G30 - Single Z probe, probes bed at current XY location. * G30 - Single Z probe, probes bed at current XY location.
* G31 - Dock sled (Z_PROBE_SLED only) * G31 - Dock sled (Z_PROBE_SLED only)
* G32 - Undock sled (Z_PROBE_SLED only) * G32 - Undock sled (Z_PROBE_SLED only)
* G38 - Probe target - similar to G28 except it uses the Z_Probe for all three axis
* G90 - Use Absolute Coordinates * G90 - Use Absolute Coordinates
* G91 - Use Relative Coordinates * G91 - Use Relative Coordinates
* G92 - Set current position to coordinates given * G92 - Set current position to coordinates given
@ -276,6 +277,11 @@
TWIBus i2c; TWIBus i2c;
#endif #endif
#ifdef G38_2_3
bool G38_flag = false; // init G38 flags
bool G38_flag_pass = false;
#endif
bool Running = true; bool Running = true;
uint8_t marlin_debug_flags = DEBUG_NONE; uint8_t marlin_debug_flags = DEBUG_NONE;
@ -2325,6 +2331,146 @@ static void clean_up_after_endstop_or_probe_move() {
#endif // AUTO_BED_LEVELING_BILINEAR #endif // AUTO_BED_LEVELING_BILINEAR
#ifdef G38_2_3
#define G38_minimum_move 0.0275 // minimum distance in mm that will produce a move (determined using the print statement in check_move)
bool check_move() //checks that at least one of the axis in the command line has an actual move
// motion planner only does moves of 0.001mm and larger
{
bool move_flag = false;
for(int8_t i=0; i < 3; i++) {
/* debug used to determine prints
SERIAL_PROTOCOLPGM("axis: ");
SERIAL_PROTOCOL(axis_codes[i]);
SERIAL_PROTOCOLPGM(" code_seen : ");
SERIAL_PROTOCOL(code_seen(axis_codes[i]));
SERIAL_PROTOCOLPGM(" destination : ");
SERIAL_PROTOCOL(destination[i]);
SERIAL_PROTOCOLPGM(" current : ");
SERIAL_PROTOCOL(current_position[i]);
SERIAL_PROTOCOLPGM(" dif x 1000 : ");
SERIAL_PROTOCOLLN((destination[i] - current_position[i]) * 1000);
*/
if (code_seen(axis_codes[i]) && (fabs(destination[i] - current_position[i]) >= G38_minimum_move)) move_flag = true ;
/*
?? 0.0275mm produced a move on my machine along with an updated current position.
0.0265mm did NOT produce a move and did NOT change the current position
this is very different than the 0.001 in the planner.
0.001" is .0254mm so maybe the 0.0275 observed comes from digital storage limitations/conversion/rounding
*/
}
return move_flag;
}
static void G38_run_probe(bool *G38_pass_fail) {
G38_flag = true; //tell the interrupt handler that we're doing a G38 probe
*G38_pass_fail = false;
#ifdef X_HOME_BUMP_MM
#ifdef Y_HOME_BUMP_MM
#ifdef Z_HOME_BUMP_MM
float G38_X_retract_mm = home_bump_mm(X_AXIS);
float G38_Y_retract_mm = home_bump_mm(Y_AXIS);
float G38_Z_retract_mm = home_bump_mm(Z_AXIS);
#else
float G38_X_retract_mm = 5;
float G38_Y_retract_mm = 5;
float G38_Z_retract_mm = 2;
#endif
#endif
#endif
// only retract the axis if the axis is in the command
if( (!code_seen('X') || (code_value_axis_units(X_AXIS) == 0))) G38_X_retract_mm = 0;
if( (!code_seen('Y') || (code_value_axis_units(Y_AXIS) == 0))) G38_Y_retract_mm = 0;
if( (!code_seen('Z') || (code_value_axis_units(Z_AXIS) == 0))) G38_Z_retract_mm = 0;
// change the direction of the retract if needed
if ((destination[X_AXIS] - current_position[X_AXIS])>0) G38_X_retract_mm = -G38_X_retract_mm;
if ((destination[Y_AXIS] - current_position[Y_AXIS])>0) G38_Y_retract_mm = -G38_Y_retract_mm;
if ((destination[Z_AXIS] - current_position[Z_AXIS])>0) G38_Z_retract_mm = -G38_Z_retract_mm;
stepper.synchronize(); // wait until the machine is idle
bool save_endstops = endstops.enabled; //remember state of endstops so we can retore them at the end
endstops.enable(true);
// move until you reach the destination or hit an endstop or hit the target
// it's an error unless have hit the target
G38_flag_pass = false;
*G38_pass_fail = false;
planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate_mm_s, active_extruder);
stepper.synchronize();
// we have to let the planner know where we are right now as it is not where we said to go.
// and we need to update current_position[axis]
current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
*G38_pass_fail = G38_flag_pass ; // only care if hit target on the first move
if (*G38_pass_fail) { // no sense in doing the remaining moves if we didn't hit the endstop
// move away the retract distance
float xPosition = current_position[X_AXIS] + G38_X_retract_mm;
float yPosition = current_position[Y_AXIS] + G38_Y_retract_mm;
float zPosition = current_position[Z_AXIS] + G38_Z_retract_mm;
// disable endstops on retract otherwise sometimes can't get away
endstops.enable(false);
G38_flag = false;
planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
stepper.synchronize();
// move back slowly
xPosition -= G38_X_retract_mm * 2;
yPosition -= G38_Y_retract_mm * 2;
zPosition -= G38_Z_retract_mm * 2;
// enable endstops on move back
endstops.enable(true);
G38_flag = true;
planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
stepper.synchronize();
// we have to let the planner know where we are right now as it is not where we said to go.
// and we need to update current_position[axis]
current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
}
// clean_up_after_endstop_move();
endstops.enable(save_endstops); //restore endstops to same state as when we started
endstops.hit_on_purpose();
G38_flag = false; //tell the interrupt handler that we're done
}
#endif //G38_2_3
/** /**
* Home an individual linear axis * Home an individual linear axis
*/ */
@ -4160,6 +4306,26 @@ inline void gcode_G28() {
#endif // HAS_BED_PROBE #endif // HAS_BED_PROBE
#ifdef G38_2_3
inline void gcode_G38(float code_num) {
#if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) || ENABLED(Z_MIN_PROBE_ENDSTOP) //must have valid Z_MIN_PROBE definition for this command to work
if ((code_num == 38.2 || code_num == 38.3 ) && (code_seen('X') || code_seen('Y') || code_seen('Z'))) {
gcode_get_destination(); // For X Y Z E F
if (check_move()) { // see if the commanded movement will result in a physical movement
bool G38_pass_fail = false;
G38_run_probe(&G38_pass_fail);
if (!G38_pass_fail && (code_num == 38.2) ) SERIAL_PROTOCOLLNPGM(" ERROR - failed to reach target ");
}
}
}
#else
SERIAL_PROTOCOLLNPGM(" ERROR - Z_MIN_PROBE must be enabled ");
}
#endif
#endif //G38_2_3
/** /**
* G92: Set current position to given X Y Z E * G92: Set current position to given X Y Z E
*/ */
@ -7287,6 +7453,11 @@ void process_next_command() {
bool code_is_good = NUMERIC(*cmd_ptr); bool code_is_good = NUMERIC(*cmd_ptr);
if (!code_is_good) goto ExitUnknownCommand; if (!code_is_good) goto ExitUnknownCommand;
#ifdef G38_2_3
double codenum_float;
codenum_float = atof(cmd_ptr); //allow for decimal point in command
#endif
// Get and skip the code number // Get and skip the code number
do { do {
codenum = (codenum * 10) + (*cmd_ptr - '0'); codenum = (codenum * 10) + (*cmd_ptr - '0');
@ -7393,6 +7564,12 @@ void process_next_command() {
#endif // Z_PROBE_SLED #endif // Z_PROBE_SLED
#endif // HAS_BED_PROBE #endif // HAS_BED_PROBE
#ifdef G38_2_3
case 38: //G38.2 & G38.3
gcode_G38(codenum_float);
break;
#endif
case 90: // G90 case 90: // G90
relative_mode = false; relative_mode = false;
break; break;

20
Marlin/endstops.cpp

@ -243,13 +243,33 @@ void Endstops::update() {
// COPY_BIT: copy the value of COPY_BIT to BIT in bits // COPY_BIT: copy the value of COPY_BIT to BIT in bits
#define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT)) #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT))
#if defined(G38_2_3) && defined(Z_MIN_PIN) && Z_MIN_PIN > -1 // If G38 command then check Z_MIN for every axis and every direction
#define UPDATE_ENDSTOP(AXIS,MINMAX) do { \ #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \ UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \ if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
_ENDSTOP_HIT(AXIS); \ _ENDSTOP_HIT(AXIS); \
stepper.endstop_triggered(_AXIS(AXIS)); \ stepper.endstop_triggered(_AXIS(AXIS)); \
} \ } \
if (G38_flag) {\
UPDATE_ENDSTOP_BIT(Z, MIN); \
if (TEST_ENDSTOP(_ENDSTOP(Z, MIN)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
_ENDSTOP_HIT(AXIS); \
stepper.endstop_triggered(_AXIS(AXIS)); \
G38_flag_pass = true;\
} \
} \
} while(0) } while(0)
#else
#define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
_ENDSTOP_HIT(AXIS); \
stepper.endstop_triggered(_AXIS(AXIS)); \
} \
} while(0)
#endif
#if ENABLED(COREXY) || ENABLED(COREXZ) #if ENABLED(COREXY) || ENABLED(COREXZ)
// Head direction in -X axis for CoreXY and CoreXZ bots. // Head direction in -X axis for CoreXY and CoreXZ bots.

Loading…
Cancel
Save