Merge pull request #4900 from thinkyhead/rc_g38_changes

Cleanup of G38.2 / G38.3
This commit is contained in:
Scott Lahteine
2016-10-01 06:57:17 -05:00
committed by GitHub
22 changed files with 257 additions and 3 deletions

View File

@ -117,6 +117,7 @@
* G30 - Single Z probe, probes bed at current XY location.
* G31 - Dock sled (Z_PROBE_SLED only)
* G32 - Undock sled (Z_PROBE_SLED only)
* G38 - Probe target - similar to G28 except it uses the Z_MIN endstop for all three axes
* G90 - Use Absolute Coordinates
* G91 - Use Relative Coordinates
* G92 - Set current position to coordinates given
@ -276,6 +277,11 @@
TWIBus i2c;
#endif
#if ENABLED(G38_PROBE_TARGET)
bool G38_move = false,
G38_endstop_hit = false;
#endif
bool Running = true;
uint8_t marlin_debug_flags = DEBUG_NONE;
@ -1337,7 +1343,7 @@ static void set_home_offset(AxisEnum axis, float v) {
* SCARA should wait until all XY homing is done before setting the XY
* current_position to home, because neither X nor Y is at home until
* both are at home. Z can however be homed individually.
*
*
*/
static void set_axis_is_at_home(AxisEnum axis) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
@ -2325,6 +2331,7 @@ static void clean_up_after_endstop_or_probe_move() {
#endif // AUTO_BED_LEVELING_BILINEAR
/**
* Home an individual linear axis
*/
@ -4158,6 +4165,94 @@ inline void gcode_G28() {
#endif // HAS_BED_PROBE
#if ENABLED(G38_PROBE_TARGET)
static bool G38_run_probe() {
bool G38_pass_fail = false;
// Get direction of move and retract
float retract_mm[XYZ];
LOOP_XYZ(i) {
float dist = destination[i] - current_position[i];
retract_mm[i] = fabs(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm(i) * (dist > 0 ? -1 : 1);
}
stepper.synchronize(); // wait until the machine is idle
// Move until destination reached or target hit
endstops.enable(true);
G38_move = true;
G38_endstop_hit = false;
prepare_move_to_destination();
stepper.synchronize();
G38_move = false;
endstops.hit_on_purpose();
set_current_from_steppers_for_axis(ALL_AXES);
SYNC_PLAN_POSITION_KINEMATIC();
// Only do remaining moves if target was hit
if (G38_endstop_hit) {
G38_pass_fail = true;
// Move away by the retract distance
set_destination_to_current();
LOOP_XYZ(i) destination[i] += retract_mm[i];
endstops.enable(false);
prepare_move_to_destination();
stepper.synchronize();
feedrate_mm_s /= 4;
// Bump the target more slowly
LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2;
endstops.enable(true);
G38_move = true;
prepare_move_to_destination();
stepper.synchronize();
G38_move = false;
set_current_from_steppers_for_axis(ALL_AXES);
SYNC_PLAN_POSITION_KINEMATIC();
}
endstops.hit_on_purpose();
endstops.not_homing();
return G38_pass_fail;
}
/**
* G38.2 - probe toward workpiece, stop on contact, signal error if failure
* G38.3 - probe toward workpiece, stop on contact
*
* Like G28 except uses Z min endstop for all axes
*/
inline void gcode_G38(bool is_38_2) {
// Get X Y Z E F
gcode_get_destination();
setup_for_endstop_or_probe_move();
// If any axis has enough movement, do the move
LOOP_XYZ(i)
if (fabs(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) {
if (!code_seen('F')) feedrate_mm_s = homing_feedrate_mm_s[i];
// If G38.2 fails throw an error
if (!G38_run_probe() && is_38_2) {
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM("Failed to reach target");
}
break;
}
clean_up_after_endstop_or_probe_move();
}
#endif // G38_PROBE_TARGET
/**
* G92: Set current position to given X Y Z E
*/
@ -7279,6 +7374,11 @@ void process_next_command() {
// Skip spaces to get the numeric part
while (*cmd_ptr == ' ') cmd_ptr++;
// Allow for decimal point in command
#if ENABLED(G38_PROBE_TARGET)
uint8_t subcode = 0;
#endif
uint16_t codenum = 0; // define ahead of goto
// Bail early if there's no code
@ -7291,6 +7391,15 @@ void process_next_command() {
cmd_ptr++;
} while (NUMERIC(*cmd_ptr));
// Allow for decimal point in command
#if ENABLED(G38_PROBE_TARGET)
if (*cmd_ptr == '.') {
cmd_ptr++;
while (NUMERIC(*cmd_ptr))
subcode = (subcode * 10) + (*cmd_ptr++ - '0');
}
#endif
// Skip all spaces to get to the first argument, or nul
while (*cmd_ptr == ' ') cmd_ptr++;
@ -7391,6 +7500,13 @@ void process_next_command() {
#endif // Z_PROBE_SLED
#endif // HAS_BED_PROBE
#if ENABLED(G38_PROBE_TARGET)
case 38: // G38.2 & G38.3
if (subcode == 2 || subcode == 3)
gcode_G38(subcode == 2);
break;
#endif
case 90: // G90
relative_mode = false;
break;
@ -8899,7 +9015,7 @@ void prepare_move_to_destination() {
* Morgan SCARA Inverse Kinematics. Results in delta[].
*
* See http://forums.reprap.org/read.php?185,283327
*
*
* Maths and first version by QHARLEY.
* Integrated into Marlin and slightly restructured by Joachim Cerny.
*/