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
Bob-the-Kuhn 9 years ago
parent
commit
2911aa7ffa
5 changed files with 258 additions and 110 deletions
  1. 52
    107
      Marlin/Configuration.h
  2. 3
    3
      Marlin/Configuration_adv.h
  3. 6
    0
      Marlin/Marlin.h
  4. 177
    0
      Marlin/Marlin_main.cpp
  5. 20
    0
      Marlin/endstops.cpp

+ 52
- 107
Marlin/Configuration.h View File

@@ -86,7 +86,7 @@
86 86
 // User-specified version info of this build to display in [Pronterface, etc] terminal window during
87 87
 // startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
88 88
 // build by the user have been successfully uploaded into firmware.
89
-#define STRING_CONFIG_H_AUTHOR "(none, default config)" // Who made the changes.
89
+#define STRING_CONFIG_H_AUTHOR "Bob Kuhn, G2/G3 radius testing" // Who made the changes.
90 90
 #define SHOW_BOOTSCREEN
91 91
 #define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1
92 92
 #define STRING_SPLASH_LINE2 WEBSITE_URL         // will be shown during bootup in line 2
@@ -105,24 +105,15 @@
105 105
 //#define SHOW_CUSTOM_BOOTSCREEN
106 106
 // @section machine
107 107
 
108
-/**
109
- * Select which serial port on the board will be used for communication with the host.
110
- * This allows the connection of wireless adapters (for instance) to non-default port pins.
111
- * Serial port 0 is always used by the Arduino bootloader regardless of this setting.
112
- *
113
- * :[0,1,2,3,4,5,6,7]
114
- */
108
+// SERIAL_PORT selects which serial port should be used for communication with the host.
109
+// This allows the connection of wireless adapters (for instance) to non-default port pins.
110
+// Serial port 0 is still used by the Arduino bootloader regardless of this setting.
111
+// :[0,1,2,3,4,5,6,7]
115 112
 #define SERIAL_PORT 0
116 113
 
117
-#define BAUDRATE 250000
118
-/**
119
- * This setting determines the communication speed of the printer.
120
- *
121
- * 250000 works in most cases, but you might try a lower speed if
122
- * you commonly experience drop-outs during host printing.
123
- *
124
- * :[2400,9600,19200,38400,57600,115200,250000]
125
- */
114
+// This determines the communication speed of the printer
115
+// :[2400,9600,19200,38400,57600,115200,250000]
116
+#define BAUDRATE 115200
126 117
 
127 118
 // Enable the Bluetooth serial interface on AT90USB devices
128 119
 //#define BLUETOOTH
@@ -130,7 +121,7 @@
130 121
 // The following define selects which electronics board you have.
131 122
 // Please choose the name from boards.h that matches your setup
132 123
 #ifndef MOTHERBOARD
133
-  #define MOTHERBOARD BOARD_RAMPS_14_EFB
124
+  #define MOTHERBOARD BOARD_AZTEEG_X3_PRO     
134 125
 #endif
135 126
 
136 127
 // Optional custom name for your RepStrap or other custom machine
@@ -178,22 +169,14 @@
178 169
 //#define HOTEND_OFFSET_X {0.0, 20.00} // (in mm) for each extruder, offset of the hotend on the X axis
179 170
 //#define HOTEND_OFFSET_Y {0.0, 5.00}  // (in mm) for each extruder, offset of the hotend on the Y axis
180 171
 
181
-/**
182
- * Select your power supply here. Use 0 if you haven't connected the PS_ON_PIN
183
- *
184
- * 0 = No Power Switch
185
- * 1 = ATX
186
- * 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
187
- *
188
- * :{0:'No power switch',1:'ATX',2:'X-Box 360'}
189
- */
190
-#define POWER_SUPPLY 0
172
+//// The following define selects which power supply you have. Please choose the one that matches your setup
173
+// 1 = ATX
174
+// 2 = X-Box 360 203Watts (the blue wire connected to PS_ON and the red wire to VCC)
175
+// :{1:'ATX',2:'X-Box 360'}
176
+#define POWER_SUPPLY 1
191 177
 
192
-#if POWER_SUPPLY > 0
193
-  // Enable this option to leave the PSU off at startup.
194
-  // Power to steppers and heaters will need to be turned on with M80.
195
-  //#define PS_DEFAULT_OFF
196
-#endif
178
+// Define this to have the electronics keep the power supply off on startup. If you don't know what this is leave it.
179
+//#define PS_DEFAULT_OFF
197 180
 
198 181
 // @section temperature
199 182
 
@@ -239,10 +222,10 @@
239 222
 // 110 is Pt100 with 1k pullup (non standard)
240 223
 // 998 and 999 are Dummy Tables. They will ALWAYS read 25°C or the temperature defined below.
241 224
 //     Use it for Testing or Development purposes. NEVER for production machine.
242
-//#define DUMMY_THERMISTOR_998_VALUE 25
225
+#define DUMMY_THERMISTOR_998_VALUE 25
243 226
 //#define DUMMY_THERMISTOR_999_VALUE 100
244 227
 // :{ '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" }
245
-#define TEMP_SENSOR_0 1
228
+#define TEMP_SENSOR_0 998
246 229
 #define TEMP_SENSOR_1 0
247 230
 #define TEMP_SENSOR_2 0
248 231
 #define TEMP_SENSOR_3 0
@@ -372,9 +355,8 @@
372 355
 #define EXTRUDE_MINTEMP 170
373 356
 
374 357
 // This option prevents a single extrusion longer than EXTRUDE_MAXLENGTH.
375
-// Note that for Bowden Extruders a too-small value here may prevent loading.
376 358
 #define PREVENT_LENGTHY_EXTRUDE
377
-#define EXTRUDE_MAXLENGTH 200
359
+#define EXTRUDE_MAXLENGTH (X_MAX_LENGTH+Y_MAX_LENGTH)
378 360
 
379 361
 //===========================================================================
380 362
 //======================== Thermal Runaway Protection =======================
@@ -421,9 +403,9 @@
421 403
 #define USE_XMIN_PLUG
422 404
 #define USE_YMIN_PLUG
423 405
 #define USE_ZMIN_PLUG
424
-//#define USE_XMAX_PLUG
425
-//#define USE_YMAX_PLUG
426
-//#define USE_ZMAX_PLUG
406
+#define USE_XMAX_PLUG
407
+#define USE_YMAX_PLUG
408
+#define USE_ZMAX_PLUG
427 409
 
428 410
 // coarse Endstop Settings
429 411
 #define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -440,13 +422,13 @@
440 422
 #endif
441 423
 
442 424
 // Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
443
-#define X_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
444
-#define Y_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
445
-#define Z_MIN_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
446
-#define X_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
447
-#define Y_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
448
-#define Z_MAX_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
449
-#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.
425
+#define X_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
426
+#define Y_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
427
+#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
428
+#define X_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
429
+#define Y_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
430
+#define Z_MAX_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
431
+#define Z_MIN_PROBE_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.
450 432
 
451 433
 
452 434
 //=============================================================================
@@ -454,56 +436,20 @@
454 436
 //=============================================================================
455 437
 // @section motion
456 438
 
457
-/**
458
- * Default Settings
459
- *
460
- * These settings can be reset by M502
461
- *
462
- * Note that if EEPROM is enabled, saved values will override these.
463
- */
464
-
465
-/**
466
- * Default Axis Steps Per Unit (steps/mm)
467
- * Override with M92
468
- */
469
-#define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 4000, 500 }
470
-
471
-/**
472
- * Default Max Feed Rate (mm/s)
473
- * Override with M203
474
- */
475
-#define DEFAULT_MAX_FEEDRATE          { 300, 300, 5, 25 }
476
-
477
-/**
478
- * Default Max Acceleration (change/s) change = mm/s
479
- * Override with M201
480
- *
481
- * Maximum start speed for accelerated moves: { X, Y, Z, E }
482
- */
483
-#define DEFAULT_MAX_ACCELERATION      { 3000, 3000, 100, 10000 }
439
+#define DEFAULT_AXIS_STEPS_PER_UNIT   {8*24.8139,8*24.8139,8*24.8139,100}  
440
+#define DEFAULT_MAX_FEEDRATE          {35, 35, 25, 25}        // (mm/sec)
441
+#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.
484 442
 
485
-/**
486
- * Default Acceleration (change/s) change = mm/s
487
- * Override with M204
488
- *
489
- *   M204 P    Acceleration
490
- *   M204 R    Retract Acceleration
491
- *   M204 T    Travel Acceleration
492
- */
493
-#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E acceleration for printing moves
494
-#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration for retracts
495
-#define DEFAULT_TRAVEL_ACCELERATION   3000    // X, Y, Z acceleration for travel (non printing) moves
443
+#define DEFAULT_ACCELERATION          3000    // X, Y, Z and E acceleration in mm/s^2 for printing moves
444
+#define DEFAULT_RETRACT_ACCELERATION  3000    // E acceleration in mm/s^2 for retracts
445
+#define DEFAULT_TRAVEL_ACCELERATION   3000    // X, Y, Z acceleration in mm/s^2 for travel (non printing) moves
496 446
 
497
-/**
498
- * Defult Jerk (mm/s)
499
- *
500
- * "Jerk" specifies the minimum speed change that requires acceleration.
501
- * When changing speed and direction, if the difference is less than the
502
- * value set here, it may happen instantaneously.
503
- */
504
-#define DEFAULT_XYJERK                20.0
505
-#define DEFAULT_ZJERK                  0.4
506
-#define DEFAULT_EJERK                  5.0
447
+// "Jerk" specifies the minimum speed change that requires acceleration.
448
+// When changing speed and direction, if the difference is less than the
449
+// value set here, it may happen instantaneously.
450
+#define DEFAULT_XYJERK                20.0    // (mm/sec)
451
+#define DEFAULT_ZJERK                  0.4    // (mm/sec)
452
+#define DEFAULT_EJERK                  5.0    // (mm/sec)
507 453
 
508 454
 
509 455
 //===========================================================================
@@ -528,7 +474,6 @@
528 474
 //#define FIX_MOUNTED_PROBE
529 475
 
530 476
 // The BLTouch probe emulates a servo probe.
531
-// The default connector is SERVO 0. Set Z_ENDSTOP_SERVO_NR below to override.
532 477
 //#define BLTOUCH
533 478
 
534 479
 // Z Servo Probe, such as an endstop switch on a rotating arm.
@@ -665,9 +610,9 @@
665 610
 // @section machine
666 611
 
667 612
 // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
668
-#define INVERT_X_DIR false
669
-#define INVERT_Y_DIR true
670
-#define INVERT_Z_DIR false
613
+#define INVERT_X_DIR true    // positive is away from the motor
614
+#define INVERT_Y_DIR false    // positive is towards the motor
615
+#define INVERT_Z_DIR true    // positive is away from the motor
671 616
 
672 617
 // @section extruder
673 618
 
@@ -695,12 +640,12 @@
695 640
 // @section machine
696 641
 
697 642
 // Travel limits after homing (units are in mm)
698
-#define X_MIN_POS 0
699
-#define Y_MIN_POS 0
700
-#define Z_MIN_POS 0
701
-#define X_MAX_POS 200
702
-#define Y_MAX_POS 200
703
-#define Z_MAX_POS 200
643
+#define X_MIN_POS -100
644
+#define Y_MIN_POS -100
645
+#define Z_MIN_POS -100
646
+#define X_MAX_POS 375
647
+#define Y_MAX_POS 450
648
+#define Z_MAX_POS 450
704 649
 
705 650
 //===========================================================================
706 651
 //========================= Filament Runout Sensor ==========================
@@ -1060,7 +1005,7 @@
1060 1005
 // SD Card support is disabled by default. If your controller has an SD slot,
1061 1006
 // you must uncomment the following option or it won't work.
1062 1007
 //
1063
-//#define SDSUPPORT
1008
+#define SDSUPPORT
1064 1009
 
1065 1010
 //
1066 1011
 // SD CARD: SPI SPEED
@@ -1077,7 +1022,7 @@
1077 1022
 //
1078 1023
 // Use CRC checks and retries on the SD communication.
1079 1024
 //
1080
-//#define SD_CHECK_AND_RETRY
1025
+#define SD_CHECK_AND_RETRY
1081 1026
 
1082 1027
 //
1083 1028
 // ENCODER SETTINGS

+ 3
- 3
Marlin/Configuration_adv.h View File

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

+ 6
- 0
Marlin/Marlin.h View File

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

+ 177
- 0
Marlin/Marlin_main.cpp View File

@@ -117,6 +117,7 @@
117 117
  * G30 - Single Z probe, probes bed at current XY location.
118 118
  * G31 - Dock sled (Z_PROBE_SLED only)
119 119
  * G32 - Undock sled (Z_PROBE_SLED only)
120
+ * G38 - Probe target - similar to G28 except it uses the Z_Probe for all three axis
120 121
  * G90 - Use Absolute Coordinates
121 122
  * G91 - Use Relative Coordinates
122 123
  * G92 - Set current position to coordinates given
@@ -276,6 +277,11 @@
276 277
   TWIBus i2c;
277 278
 #endif
278 279
 
280
+#ifdef G38_2_3
281
+bool G38_flag = false;   // init G38 flags
282
+bool G38_flag_pass = false;
283
+#endif
284
+
279 285
 bool Running = true;
280 286
 
281 287
 uint8_t marlin_debug_flags = DEBUG_NONE;
@@ -2325,6 +2331,146 @@ static void clean_up_after_endstop_or_probe_move() {
2325 2331
 
2326 2332
 #endif // AUTO_BED_LEVELING_BILINEAR
2327 2333
 
2334
+
2335
+#ifdef G38_2_3
2336
+
2337
+#define G38_minimum_move  0.0275   // minimum distance in mm that will produce a move (determined using the print statement in check_move)
2338
+
2339
+bool check_move()  //checks that at least one of the axis in the command line has an actual move
2340
+                   // motion planner only does moves of 0.001mm and larger
2341
+{
2342
+	
2343
+  bool move_flag = false;
2344
+  for(int8_t i=0; i < 3; i++) {
2345
+/* debug used to determine prints
2346
+		SERIAL_PROTOCOLPGM("axis: ");
2347
+		SERIAL_PROTOCOL(axis_codes[i]);
2348
+		SERIAL_PROTOCOLPGM("  code_seen :  ");
2349
+		SERIAL_PROTOCOL(code_seen(axis_codes[i]));
2350
+		SERIAL_PROTOCOLPGM("  destination : ");
2351
+		SERIAL_PROTOCOL(destination[i]);
2352
+		SERIAL_PROTOCOLPGM("  current : ");
2353
+		SERIAL_PROTOCOL(current_position[i]);
2354
+		SERIAL_PROTOCOLPGM("  dif x 1000 : ");
2355
+		SERIAL_PROTOCOLLN((destination[i] - current_position[i]) * 1000);
2356
+ */		
2357
+  if (code_seen(axis_codes[i]) && (fabs(destination[i] - current_position[i]) >= G38_minimum_move)) move_flag = true ;
2358
+/*
2359
+ ??  0.0275mm produced a move on my machine along with an updated current position. 
2360
+     0.0265mm did NOT produce a move and did NOT change the current position
2361
+     this is very different than the 0.001 in the planner.
2362
+       0.001" is .0254mm so maybe the 0.0275 observed comes from digital storage limitations/conversion/rounding
2363
+ */
2364
+  }
2365
+  return move_flag;
2366
+}
2367
+
2368
+
2369
+static void G38_run_probe(bool *G38_pass_fail) {
2370
+ 
2371
+  G38_flag = true;  //tell the interrupt handler that we're doing a G38 probe
2372
+  *G38_pass_fail = false;  
2373
+  
2374
+#ifdef X_HOME_BUMP_MM
2375
+#ifdef Y_HOME_BUMP_MM
2376
+#ifdef Z_HOME_BUMP_MM
2377
+  float G38_X_retract_mm = home_bump_mm(X_AXIS);
2378
+  float G38_Y_retract_mm = home_bump_mm(Y_AXIS);
2379
+  float G38_Z_retract_mm = home_bump_mm(Z_AXIS);
2380
+  
2381
+#else
2382
+    
2383
+  float G38_X_retract_mm = 5;
2384
+  float G38_Y_retract_mm = 5;
2385
+  float G38_Z_retract_mm = 2;
2386
+
2387
+#endif
2388
+#endif  
2389
+#endif  
2390
+  
2391
+  // only retract the axis if the axis is in the command
2392
+  if( (!code_seen('X') || (code_value_axis_units(X_AXIS) == 0)))  G38_X_retract_mm = 0;   
2393
+  if( (!code_seen('Y') || (code_value_axis_units(Y_AXIS) == 0)))  G38_Y_retract_mm = 0;
2394
+  if( (!code_seen('Z') || (code_value_axis_units(Z_AXIS) == 0)))  G38_Z_retract_mm = 0;
2395
+
2396
+  // change the direction of the retract if needed
2397
+  if ((destination[X_AXIS] - current_position[X_AXIS])>0) G38_X_retract_mm = -G38_X_retract_mm;
2398
+  if ((destination[Y_AXIS] - current_position[Y_AXIS])>0) G38_Y_retract_mm = -G38_Y_retract_mm;
2399
+  if ((destination[Z_AXIS] - current_position[Z_AXIS])>0) G38_Z_retract_mm = -G38_Z_retract_mm;
2400
+
2401
+  
2402
+  stepper.synchronize();  // wait until the machine is idle
2403
+  
2404
+  bool save_endstops = endstops.enabled;    //remember state of endstops so we can retore them at the end
2405
+  endstops.enable(true);
2406
+    
2407
+  // move until you reach the destination or hit an endstop or hit the target
2408
+  // it's an error unless have hit the target
2409
+  G38_flag_pass = false;
2410
+  *G38_pass_fail = false;
2411
+  
2412
+  planner.buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate_mm_s, active_extruder);
2413
+  stepper.synchronize();
2414
+
2415
+  // we have to let the planner know where we are right now as it is not where we said to go.
2416
+  //  and we need to update current_position[axis]
2417
+  current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
2418
+  current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
2419
+  current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
2420
+  planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
2421
+
2422
+  *G38_pass_fail = G38_flag_pass ;  // only care if hit target on the first move
2423
+    
2424
+  if (*G38_pass_fail) {  // no sense in doing the remaining moves if we didn't hit the endstop  
2425
+    // move away the retract distance
2426
+    float xPosition = current_position[X_AXIS] + G38_X_retract_mm;
2427
+    float yPosition = current_position[Y_AXIS] + G38_Y_retract_mm;
2428
+    float zPosition = current_position[Z_AXIS] + G38_Z_retract_mm;
2429
+     
2430
+
2431
+  
2432
+    // disable endstops on retract otherwise sometimes can't get away  
2433
+    endstops.enable(false);
2434
+    G38_flag = false; 
2435
+    
2436
+    planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
2437
+    stepper.synchronize();
2438
+
2439
+
2440
+    // move back slowly
2441
+    xPosition -= G38_X_retract_mm * 2;
2442
+    yPosition -= G38_Y_retract_mm * 2;
2443
+    zPosition -= G38_Z_retract_mm * 2;
2444
+ 
2445
+
2446
+    // enable endstops on move back
2447
+    endstops.enable(true);
2448
+    G38_flag = true; 
2449
+    
2450
+    planner.buffer_line(xPosition, yPosition , zPosition , current_position[E_AXIS], feedrate_mm_s/4, active_extruder);
2451
+    stepper.synchronize();
2452
+
2453
+    // we have to let the planner know where we are right now as it is not where we said to go.
2454
+    //  and we need to update current_position[axis]
2455
+    current_position[X_AXIS] = stepper.get_axis_position_mm(X_AXIS);
2456
+    current_position[Y_AXIS] = stepper.get_axis_position_mm(Y_AXIS);
2457
+    current_position[Z_AXIS] = stepper.get_axis_position_mm(Z_AXIS);
2458
+    planner.set_position_mm(current_position[X_AXIS], current_position[Y_AXIS] , current_position[Z_AXIS] , current_position[E_AXIS]);
2459
+    
2460
+  }  
2461
+  
2462
+//  clean_up_after_endstop_move();
2463
+
2464
+  endstops.enable(save_endstops);   //restore endstops to same state as when we started
2465
+
2466
+  endstops.hit_on_purpose();
2467
+  G38_flag = false;  //tell the interrupt handler that we're done
2468
+  
2469
+}
2470
+
2471
+#endif  //G38_2_3
2472
+
2473
+
2328 2474
 /**
2329 2475
  * Home an individual linear axis
2330 2476
  */
@@ -4160,6 +4306,26 @@ inline void gcode_G28() {
4160 4306
 
4161 4307
 #endif // HAS_BED_PROBE
4162 4308
 
4309
+#ifdef G38_2_3
4310
+  inline void gcode_G38(float code_num) { 
4311
+  #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  
4312
+    if ((code_num == 38.2 || code_num == 38.3  ) && (code_seen('X') || code_seen('Y') || code_seen('Z'))) {
4313
+      gcode_get_destination(); // For X Y Z E F
4314
+      if (check_move()) {   // see if the commanded movement will result in a physical movement
4315
+		bool G38_pass_fail = false;
4316
+		G38_run_probe(&G38_pass_fail);
4317
+        if (!G38_pass_fail && (code_num == 38.2) ) SERIAL_PROTOCOLLNPGM(" ERROR - failed to reach target ");
4318
+      }
4319
+    }
4320
+  }
4321
+#else
4322
+ 
4323
+    SERIAL_PROTOCOLLNPGM(" ERROR - Z_MIN_PROBE must be enabled ");	
4324
+  }
4325
+#endif	
4326
+#endif //G38_2_3
4327
+
4328
+
4163 4329
 /**
4164 4330
  * G92: Set current position to given X Y Z E
4165 4331
  */
@@ -7287,6 +7453,11 @@ void process_next_command() {
7287 7453
   bool code_is_good = NUMERIC(*cmd_ptr);
7288 7454
   if (!code_is_good) goto ExitUnknownCommand;
7289 7455
 
7456
+#ifdef G38_2_3
7457
+  double codenum_float;
7458
+  codenum_float = atof(cmd_ptr);  //allow for decimal point in command
7459
+#endif
7460
+
7290 7461
   // Get and skip the code number
7291 7462
   do {
7292 7463
     codenum = (codenum * 10) + (*cmd_ptr - '0');
@@ -7393,6 +7564,12 @@ void process_next_command() {
7393 7564
         #endif // Z_PROBE_SLED
7394 7565
       #endif // HAS_BED_PROBE
7395 7566
 
7567
+      #ifdef G38_2_3
7568
+	   case 38:  //G38.2 & G38.3
7569
+	     gcode_G38(codenum_float);
7570
+          break;
7571
+	 #endif
7572
+ 
7396 7573
       case 90: // G90
7397 7574
         relative_mode = false;
7398 7575
         break;

+ 20
- 0
Marlin/endstops.cpp View File

@@ -243,6 +243,24 @@ void Endstops::update() {
243 243
   // COPY_BIT: copy the value of COPY_BIT to BIT in bits
244 244
   #define COPY_BIT(bits, COPY_BIT, BIT) SET_BIT(bits, BIT, TEST(bits, COPY_BIT))
245 245
 
246
+ 
247
+#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  
248
+  #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
249
+      UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
250
+      if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
251
+        _ENDSTOP_HIT(AXIS); \
252
+        stepper.endstop_triggered(_AXIS(AXIS)); \
253
+      } \
254
+      if (G38_flag) {\
255
+        UPDATE_ENDSTOP_BIT(Z, MIN); \
256
+        if (TEST_ENDSTOP(_ENDSTOP(Z, MIN)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
257
+          _ENDSTOP_HIT(AXIS); \
258
+          stepper.endstop_triggered(_AXIS(AXIS)); \
259
+		  G38_flag_pass = true;\
260
+        } \
261
+      } \
262
+    } while(0)
263
+#else	
246 264
   #define UPDATE_ENDSTOP(AXIS,MINMAX) do { \
247 265
       UPDATE_ENDSTOP_BIT(AXIS, MINMAX); \
248 266
       if (TEST_ENDSTOP(_ENDSTOP(AXIS, MINMAX)) && stepper.current_block->steps[_AXIS(AXIS)] > 0) { \
@@ -250,6 +268,8 @@ void Endstops::update() {
250 268
         stepper.endstop_triggered(_AXIS(AXIS)); \
251 269
       } \
252 270
     } while(0)
271
+	
272
+#endif	  		
253 273
 
254 274
   #if ENABLED(COREXY) || ENABLED(COREXZ)
255 275
     // Head direction in -X axis for CoreXY and CoreXZ bots.

Loading…
Cancel
Save