Merge pull request #4134 from thinkyhead/rc_followup_4021
Additional cleanup to probing/leveling
This commit is contained in:
		
						commit
						de0e6d5f13
					
				| @ -1173,18 +1173,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1592,9 +1592,6 @@ inline void set_destination_to_current() { memcpy(destination, current_position, | ||||
| //  - Reset the command timeout
 | ||||
| //  - Enable the endstops (for endstop moves)
 | ||||
| //
 | ||||
| // clean_up_after_endstop_move() restores
 | ||||
| // feedrates, sets endstops back to global state.
 | ||||
| //
 | ||||
| static void setup_for_endstop_or_probe_move() { | ||||
|   #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|     if (DEBUGGING(LEVELING)) DEBUG_POS("setup_for_endstop_or_probe_move", current_position); | ||||
| @ -1619,12 +1616,6 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
| } | ||||
| 
 | ||||
| #if HAS_BED_PROBE | ||||
| 
 | ||||
|   static void clean_up_after_endstop_move() { | ||||
|     clean_up_after_endstop_or_probe_move(); | ||||
|     endstops.not_homing(); | ||||
|   } | ||||
| 
 | ||||
|   #if ENABLED(DELTA) | ||||
|     /**
 | ||||
|      * Calculate delta, start a line, and set current_position to destination | ||||
| @ -1666,18 +1657,25 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
| 
 | ||||
|     #else | ||||
| 
 | ||||
|       feedrate = homing_feedrate[Z_AXIS]; | ||||
| 
 | ||||
|       current_position[Z_AXIS] = z; | ||||
|       line_to_current_position(); | ||||
|       stepper.synchronize(); | ||||
|       // If Z needs to raise, do it before moving XY
 | ||||
|       if (current_position[Z_AXIS] < z) { | ||||
|         feedrate = homing_feedrate[Z_AXIS]; | ||||
|         current_position[Z_AXIS] = z; | ||||
|         line_to_current_position(); | ||||
|       } | ||||
| 
 | ||||
|       feedrate = XY_PROBE_FEEDRATE; | ||||
| 
 | ||||
|       current_position[X_AXIS] = x; | ||||
|       current_position[Y_AXIS] = y; | ||||
|       line_to_current_position(); | ||||
| 
 | ||||
|       // If Z needs to lower, do it after moving XY
 | ||||
|       if (current_position[Z_AXIS] > z) { | ||||
|         feedrate = homing_feedrate[Z_AXIS]; | ||||
|         current_position[Z_AXIS] = z; | ||||
|         line_to_current_position(); | ||||
|       } | ||||
| 
 | ||||
|     #endif | ||||
| 
 | ||||
|     stepper.synchronize(); | ||||
| @ -1722,11 +1720,6 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   inline void raise_z_after_probing() { | ||||
|     #if Z_RAISE_AFTER_PROBING > 0 | ||||
|       do_probe_raise(Z_RAISE_AFTER_PROBING); | ||||
|     #endif | ||||
|   } | ||||
| #endif //HAS_BED_PROBE
 | ||||
| 
 | ||||
| #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_SAFE_HOMING) || HAS_PROBING_PROCEDURE | ||||
| @ -1774,7 +1767,9 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     float oldXpos = current_position[X_AXIS]; // save x position
 | ||||
|     float old_feedrate = feedrate; | ||||
|     if (dock) { | ||||
|       raise_z_after_probing(); // raise Z
 | ||||
|       #if Z_RAISE_AFTER_PROBING > 0 | ||||
|         do_probe_raise(Z_RAISE_AFTER_PROBING); | ||||
|       #endif | ||||
|       // Dock sled a bit closer to ensure proper capturing
 | ||||
|       feedrate = XY_PROBE_FEEDRATE; | ||||
|       do_blocking_move_to_x(X_MAX_POS + SLED_DOCKING_OFFSET + offset - 1); | ||||
| @ -1804,15 +1799,17 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
| 
 | ||||
|     if (endstops.z_probe_enabled) return; | ||||
| 
 | ||||
|     // Make room for probe
 | ||||
|     #if Z_RAISE_BEFORE_PROBING > 0 | ||||
|       do_probe_raise(Z_RAISE_BEFORE_PROBING); | ||||
|     #endif | ||||
| 
 | ||||
|     #if ENABLED(Z_PROBE_SLED) | ||||
| 
 | ||||
|       dock_sled(false); | ||||
| 
 | ||||
|     #elif HAS_Z_SERVO_ENDSTOP | ||||
| 
 | ||||
|       // Make room for Z Servo
 | ||||
|       do_probe_raise(Z_RAISE_BEFORE_PROBING); | ||||
| 
 | ||||
|       // Engage Z Servo endstop if enabled
 | ||||
|       DEPLOY_Z_SERVO(); | ||||
| 
 | ||||
| @ -1906,15 +1903,17 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
| 
 | ||||
|     if (!endstops.z_probe_enabled) return; | ||||
| 
 | ||||
|     // Make more room for the servo
 | ||||
|     #if Z_RAISE_AFTER_PROBING > 0 | ||||
|       do_probe_raise(Z_RAISE_AFTER_PROBING); | ||||
|     #endif | ||||
| 
 | ||||
|     #if ENABLED(Z_PROBE_SLED) | ||||
| 
 | ||||
|       dock_sled(true); | ||||
| 
 | ||||
|     #elif HAS_Z_SERVO_ENDSTOP | ||||
| 
 | ||||
|       // Make room for the servo
 | ||||
|       do_probe_raise(Z_RAISE_AFTER_PROBING); | ||||
| 
 | ||||
|       // Change the Z servo angle
 | ||||
|       STOW_Z_SERVO(); | ||||
| 
 | ||||
| @ -2080,27 +2079,24 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     return current_position[Z_AXIS]; | ||||
|   } | ||||
| 
 | ||||
| #endif // HAS_BED_PROBE
 | ||||
| 
 | ||||
| #if HAS_PROBING_PROCEDURE | ||||
| 
 | ||||
|   inline void do_blocking_move_to_xy(float x, float y) { | ||||
|     do_blocking_move_to(x, y, current_position[Z_AXIS]); | ||||
|   } | ||||
| 
 | ||||
|   enum ProbeAction { | ||||
|     ProbeStay          = 0, | ||||
|     ProbeDeploy        = _BV(0), | ||||
|     ProbeStow          = _BV(1), | ||||
|     ProbeDeployAndStow = (ProbeDeploy | ProbeStow) | ||||
|   }; | ||||
| 
 | ||||
|   // Probe bed height at position (x,y), returns the measured z value
 | ||||
|   static float probe_pt(float x, float y, float z_raise, ProbeAction probe_action = ProbeDeployAndStow, int verbose_level = 1) { | ||||
|   //
 | ||||
|   // - Move to the given XY
 | ||||
|   // - Deploy the probe, if not already deployed
 | ||||
|   // - Probe the bed, get the Z position
 | ||||
|   // - Depending on the 'stow' flag
 | ||||
|   //   - Stow the probe, or
 | ||||
|   //   - Raise to the BETWEEN height
 | ||||
|   // - Return the probed Z position
 | ||||
|   //
 | ||||
|   static float probe_pt(float x, float y, bool stow = true, int verbose_level = 1) { | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) { | ||||
|         SERIAL_ECHOLNPGM("probe_pt >>>"); | ||||
|         SERIAL_ECHOPAIR("> ProbeAction:", probe_action); | ||||
|         SERIAL_ECHOPAIR("> stow:", stow); | ||||
|         SERIAL_EOL; | ||||
|         DEBUG_POS("", current_position); | ||||
|       } | ||||
| @ -2111,39 +2107,37 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     // Raise by z_raise, then move the Z probe to the given XY
 | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) { | ||||
|         SERIAL_ECHOPAIR("Z Raise by z_raise ", z_raise); | ||||
|         SERIAL_EOL; | ||||
|       } | ||||
|     #endif | ||||
|     do_probe_raise(z_raise); // this also updates current_position
 | ||||
| 
 | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) { | ||||
|         SERIAL_ECHOPAIR("> do_blocking_move_to_xy ", x - (X_PROBE_OFFSET_FROM_EXTRUDER)); | ||||
|         SERIAL_ECHOPAIR("> do_blocking_move_to ", x - (X_PROBE_OFFSET_FROM_EXTRUDER)); | ||||
|         SERIAL_ECHOPAIR(", ", y - (Y_PROBE_OFFSET_FROM_EXTRUDER)); | ||||
|         SERIAL_ECHOPAIR(", ", max(current_position[Z_AXIS], Z_RAISE_BETWEEN_PROBINGS)); | ||||
|         SERIAL_EOL; | ||||
|       } | ||||
|     #endif | ||||
| 
 | ||||
|     // this also updates current_position
 | ||||
|     feedrate = XY_PROBE_FEEDRATE; | ||||
|     do_blocking_move_to_xy(x - (X_PROBE_OFFSET_FROM_EXTRUDER), y - (Y_PROBE_OFFSET_FROM_EXTRUDER)); | ||||
| 
 | ||||
|     if (probe_action & ProbeDeploy) { | ||||
|       #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|         if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> ProbeDeploy"); | ||||
|       #endif | ||||
|       deploy_z_probe(); | ||||
|     } | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> deploy_z_probe"); | ||||
|     #endif | ||||
|     deploy_z_probe(); | ||||
| 
 | ||||
|     float measured_z = run_z_probe(); | ||||
| 
 | ||||
|     if (probe_action & ProbeStow) { | ||||
|     if (stow) { | ||||
|       #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|         if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> ProbeStow (stow_z_probe will do Z Raise)"); | ||||
|         if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> stow_z_probe"); | ||||
|       #endif | ||||
|       stow_z_probe(); | ||||
|     } | ||||
|     #if Z_RAISE_BETWEEN_PROBINGS > 0 | ||||
|       else { | ||||
|         #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|           if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> do_probe_raise"); | ||||
|         #endif | ||||
|         do_probe_raise(Z_RAISE_BETWEEN_PROBINGS); | ||||
|       } | ||||
|     #endif | ||||
| 
 | ||||
|     if (verbose_level > 2) { | ||||
|       SERIAL_PROTOCOLPGM("Bed X: "); | ||||
| @ -2164,7 +2158,7 @@ static void clean_up_after_endstop_or_probe_move() { | ||||
|     return measured_z; | ||||
|   } | ||||
| 
 | ||||
| #endif // AUTO_BED_LEVELING_FEATURE || Z_MIN_PROBE_REPEATABILITY_TEST
 | ||||
| #endif // HAS_BED_PROBE
 | ||||
| 
 | ||||
| #if ENABLED(AUTO_BED_LEVELING_FEATURE) | ||||
| 
 | ||||
| @ -3383,8 +3377,10 @@ inline void gcode_G28() { | ||||
| 
 | ||||
|     bool dryrun = code_seen('D'); | ||||
| 
 | ||||
|     #if DISABLED(Z_PROBE_SLED) && DISABLED(Z_PROBE_ALLEN_KEY) | ||||
|       bool deploy_probe_for_each_reading = code_seen('E'); | ||||
|     #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|       const bool stow_probe_after_each = false; | ||||
|     #else | ||||
|       bool stow_probe_after_each = code_seen('E'); | ||||
|     #endif | ||||
| 
 | ||||
|     #if ENABLED(AUTO_BED_LEVELING_GRID) | ||||
| @ -3541,42 +3537,13 @@ inline void gcode_G28() { | ||||
|         for (int xCount = xStart; xCount != xStop; xCount += xInc) { | ||||
|           double xProbe = left_probe_bed_position + xGridSpacing * xCount; | ||||
| 
 | ||||
|           // raise extruder
 | ||||
|           float measured_z, | ||||
|                 z_raise = probePointCounter ? Z_RAISE_BETWEEN_PROBINGS : Z_RAISE_BEFORE_PROBING; | ||||
| 
 | ||||
|           #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|             if (DEBUGGING(LEVELING)) { | ||||
|               SERIAL_ECHOPGM("z_raise = ("); | ||||
|               if (probePointCounter) | ||||
|                 SERIAL_ECHOPGM("between) "); | ||||
|               else | ||||
|                 SERIAL_ECHOPGM("before) "); | ||||
|               SERIAL_ECHOLN(z_raise); | ||||
|             } | ||||
|           #endif | ||||
| 
 | ||||
|           #if ENABLED(DELTA) | ||||
|             // Avoid probing the corners (outside the round or hexagon print surface) on a delta printer.
 | ||||
|             float distance_from_center = sqrt(xProbe * xProbe + yProbe * yProbe); | ||||
|             if (distance_from_center > DELTA_PROBEABLE_RADIUS) continue; | ||||
|           #endif //DELTA
 | ||||
| 
 | ||||
|           #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|             const ProbeAction act = ProbeStay; | ||||
|           #else | ||||
|             ProbeAction act; | ||||
|             if (deploy_probe_for_each_reading) // G29 E - Stow between probes
 | ||||
|               act = ProbeDeployAndStow; | ||||
|             else if (yCount == 0 && xCount == xStart) | ||||
|               act = ProbeDeploy; | ||||
|             else if (yCount == auto_bed_leveling_grid_points - 1 && xCount == xStop - xInc) | ||||
|               act = ProbeStow; | ||||
|             else | ||||
|               act = ProbeStay; | ||||
|           #endif | ||||
| 
 | ||||
|           measured_z = probe_pt(xProbe, yProbe, z_raise, act, verbose_level); | ||||
|           float measured_z = probe_pt(xProbe, yProbe, stow_probe_after_each, verbose_level); | ||||
| 
 | ||||
|           #if DISABLED(DELTA) | ||||
|             mean += measured_z; | ||||
| @ -3597,10 +3564,39 @@ inline void gcode_G28() { | ||||
|         } //xProbe
 | ||||
|       } //yProbe
 | ||||
| 
 | ||||
|     #else // !AUTO_BED_LEVELING_GRID
 | ||||
| 
 | ||||
|       #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|         if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); | ||||
|         if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> 3-point Leveling"); | ||||
|       #endif | ||||
| 
 | ||||
|       // Probe at 3 arbitrary points
 | ||||
|       float z_at_pt_1 = probe_pt( ABL_PROBE_PT_1_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_1_Y + home_offset[Y_AXIS], | ||||
|                                   stow_probe_after_each, verbose_level), | ||||
|             z_at_pt_2 = probe_pt( ABL_PROBE_PT_2_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_2_Y + home_offset[Y_AXIS], | ||||
|                                   stow_probe_after_each, verbose_level), | ||||
|             z_at_pt_3 = probe_pt( ABL_PROBE_PT_3_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_3_Y + home_offset[Y_AXIS], | ||||
|                                   stow_probe_after_each, verbose_level); | ||||
| 
 | ||||
|       if (!dryrun) set_bed_level_equation_3pts(z_at_pt_1, z_at_pt_2, z_at_pt_3); | ||||
| 
 | ||||
|     #endif // !AUTO_BED_LEVELING_GRID
 | ||||
| 
 | ||||
|     // Raise to Z_RAISE_AFTER_PROBING. Stow the probe.
 | ||||
|     stow_z_probe(); | ||||
| 
 | ||||
|     // Restore state after probing
 | ||||
|     clean_up_after_endstop_or_probe_move(); | ||||
| 
 | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position); | ||||
|     #endif | ||||
| 
 | ||||
|     // Calculate leveling, print reports, correct the position
 | ||||
|     #if ENABLED(AUTO_BED_LEVELING_GRID) | ||||
|       #if ENABLED(DELTA) | ||||
| 
 | ||||
|         if (!dryrun) extrapolate_unprobed_bed_level(); | ||||
| @ -3696,41 +3692,7 @@ inline void gcode_G28() { | ||||
|           } | ||||
|         } //do_topography_map
 | ||||
|       #endif //!DELTA
 | ||||
| 
 | ||||
|     #else // !AUTO_BED_LEVELING_GRID
 | ||||
| 
 | ||||
|       #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|         if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> 3-point Leveling"); | ||||
|       #endif | ||||
| 
 | ||||
|       #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|         const ProbeAction p1 = ProbeStay, p2 = ProbeStay, p3 = ProbeStay; | ||||
|       #else | ||||
|         // Actions for each probe
 | ||||
|         ProbeAction p1, p2, p3; | ||||
|         if (deploy_probe_for_each_reading) | ||||
|           p1 = p2 = p3 = ProbeDeployAndStow; | ||||
|         else | ||||
|           p1 = ProbeDeploy, p2 = ProbeStay, p3 = ProbeStow; | ||||
|       #endif | ||||
| 
 | ||||
|       // Probe at 3 arbitrary points
 | ||||
|       float z_at_pt_1 = probe_pt( ABL_PROBE_PT_1_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_1_Y + home_offset[Y_AXIS], | ||||
|                                   Z_RAISE_BEFORE_PROBING, | ||||
|                                   p1, verbose_level), | ||||
|             z_at_pt_2 = probe_pt( ABL_PROBE_PT_2_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_2_Y + home_offset[Y_AXIS], | ||||
|                                   Z_RAISE_BETWEEN_PROBINGS, | ||||
|                                   p2, verbose_level), | ||||
|             z_at_pt_3 = probe_pt( ABL_PROBE_PT_3_X + home_offset[X_AXIS], | ||||
|                                   ABL_PROBE_PT_3_Y + home_offset[Y_AXIS], | ||||
|                                   Z_RAISE_BETWEEN_PROBINGS, | ||||
|                                   p3, verbose_level); | ||||
| 
 | ||||
|       if (!dryrun) set_bed_level_equation_3pts(z_at_pt_1, z_at_pt_2, z_at_pt_3); | ||||
| 
 | ||||
|     #endif // !AUTO_BED_LEVELING_GRID
 | ||||
|     #endif // AUTO_BED_LEVELING_GRID
 | ||||
| 
 | ||||
|     #if DISABLED(DELTA) | ||||
|       if (verbose_level > 0) | ||||
| @ -3745,13 +3707,12 @@ inline void gcode_G28() { | ||||
|         float x_tmp = current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER, | ||||
|               y_tmp = current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER, | ||||
|               z_tmp = current_position[Z_AXIS], | ||||
|               real_z = stepper.get_axis_position_mm(Z_AXIS);  //get the real Z (since planner.adjusted_position is now correcting the plane)
 | ||||
|               stepper_z = stepper.get_axis_position_mm(Z_AXIS);  //get the real Z (since planner.adjusted_position is now correcting the plane)
 | ||||
| 
 | ||||
|         #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|           if (DEBUGGING(LEVELING)) { | ||||
|             SERIAL_ECHOPAIR("> BEFORE apply_rotation_xyz > z_tmp  = ", z_tmp); | ||||
|             SERIAL_EOL; | ||||
|             SERIAL_ECHOPAIR("> BEFORE apply_rotation_xyz > real_z = ", real_z); | ||||
|             SERIAL_ECHOPAIR("> BEFORE apply_rotation_xyz > stepper_z = ", stepper_z); | ||||
|             SERIAL_ECHOPAIR(" ... z_tmp  = ", z_tmp); | ||||
|             SERIAL_EOL; | ||||
|           } | ||||
|         #endif | ||||
| @ -3759,28 +3720,6 @@ inline void gcode_G28() { | ||||
|         // Apply the correction sending the Z probe offset
 | ||||
|         apply_rotation_xyz(planner.bed_level_matrix, x_tmp, y_tmp, z_tmp); | ||||
| 
 | ||||
|         /*
 | ||||
|          * Get the current Z position and send it to the planner. | ||||
|          * | ||||
|          * >> (z_tmp - real_z) : The rotated current Z minus the uncorrected Z | ||||
|          * (most recent planner.set_position_mm/sync_plan_position) | ||||
|          * | ||||
|          * >> zprobe_zoffset : Z distance from nozzle to Z probe | ||||
|          * (set by default, M851, EEPROM, or Menu) | ||||
|          * | ||||
|          * >> Z_RAISE_AFTER_PROBING : The distance the Z probe will have lifted | ||||
|          * after the last probe | ||||
|          * | ||||
|          * >> Should home_offset[Z_AXIS] be included? | ||||
|          * | ||||
|          * | ||||
|          *   Discussion: home_offset[Z_AXIS] was applied in G28 to set the | ||||
|          *   starting Z. If Z is not tweaked in G29 -and- the Z probe in G29 is | ||||
|          *   not actually "homing" Z... then perhaps it should not be included | ||||
|          *   here. The purpose of home_offset[] is to adjust for inaccurate | ||||
|          *   endstops, not for reasonably accurate probes. If it were added | ||||
|          *   here, it could be seen as a compensating factor for the Z probe. | ||||
|          */ | ||||
|         #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|           if (DEBUGGING(LEVELING)) { | ||||
|             SERIAL_ECHOPAIR("> AFTER apply_rotation_xyz > z_tmp  = ", z_tmp); | ||||
| @ -3788,30 +3727,16 @@ inline void gcode_G28() { | ||||
|           } | ||||
|         #endif | ||||
| 
 | ||||
|         current_position[Z_AXIS] = -zprobe_zoffset + (z_tmp - real_z) | ||||
|           #if HAS_Z_SERVO_ENDSTOP || ENABLED(Z_PROBE_ALLEN_KEY) || ENABLED(Z_PROBE_SLED) | ||||
|              + Z_RAISE_AFTER_PROBING | ||||
|           #endif | ||||
|         ; | ||||
|         // current_position[Z_AXIS] += home_offset[Z_AXIS]; // The Z probe determines Z=0, not "Z home"
 | ||||
|         // Adjust the current Z and send it to the planner.
 | ||||
|         current_position[Z_AXIS] += z_tmp - stepper_z; | ||||
|         SYNC_PLAN_POSITION_KINEMATIC(); | ||||
| 
 | ||||
|         #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|           if (DEBUGGING(LEVELING)) DEBUG_POS("> corrected Z in G29", current_position); | ||||
|         #endif | ||||
|       } | ||||
| 
 | ||||
|     #endif // !DELTA
 | ||||
| 
 | ||||
|     // Final raise of Z axis after probing.
 | ||||
|     raise_z_after_probing(); | ||||
| 
 | ||||
|     // Stow the probe. Servo will raise if needed.
 | ||||
|     stow_z_probe(); | ||||
| 
 | ||||
|     // Restore state after probing
 | ||||
|     clean_up_after_endstop_or_probe_move(); | ||||
| 
 | ||||
|     #ifdef Z_PROBE_END_SCRIPT | ||||
|       #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|         if (DEBUGGING(LEVELING)) { | ||||
| @ -3824,9 +3749,7 @@ inline void gcode_G28() { | ||||
|     #endif | ||||
| 
 | ||||
|     #if ENABLED(DEBUG_LEVELING_FEATURE) | ||||
|       if (DEBUGGING(LEVELING)) { | ||||
|         SERIAL_ECHOLNPGM("<<< gcode_G29"); | ||||
|       } | ||||
|       if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< gcode_G29"); | ||||
|     #endif | ||||
| 
 | ||||
|     bed_leveling_in_progress = false; | ||||
| @ -3847,12 +3770,10 @@ inline void gcode_G28() { | ||||
| 
 | ||||
|     setup_for_endstop_or_probe_move(); | ||||
| 
 | ||||
|     deploy_z_probe(); | ||||
| 
 | ||||
|     stepper.synchronize(); | ||||
| 
 | ||||
|     // TODO: clear the leveling matrix or the planner will be set incorrectly
 | ||||
|     float measured_z = run_z_probe(); // clears the ABL non-delta matrix only
 | ||||
|     float measured_z = probe_pt(current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER, | ||||
|                                 current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER, | ||||
|                                 true, 1); | ||||
| 
 | ||||
|     SERIAL_PROTOCOLPGM("Bed X: "); | ||||
|     SERIAL_PROTOCOL(current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER + 0.0001); | ||||
| @ -3862,13 +3783,25 @@ inline void gcode_G28() { | ||||
|     SERIAL_PROTOCOL(measured_z + 0.0001); | ||||
|     SERIAL_EOL; | ||||
| 
 | ||||
|     stow_z_probe(); | ||||
| 
 | ||||
|     clean_up_after_endstop_or_probe_move(); | ||||
| 
 | ||||
|     report_current_position(); | ||||
|   } | ||||
| 
 | ||||
|   #if ENABLED(Z_PROBE_SLED) | ||||
| 
 | ||||
|     /**
 | ||||
|      * G31: Deploy the Z probe | ||||
|      */ | ||||
|     inline void gcode_G31() { deploy_z_probe(); } | ||||
| 
 | ||||
|     /**
 | ||||
|      * G32: Stow the Z probe | ||||
|      */ | ||||
|     inline void gcode_G32() { stow_z_probe(); } | ||||
| 
 | ||||
|   #endif // Z_PROBE_SLED
 | ||||
| 
 | ||||
| #endif // HAS_BED_PROBE
 | ||||
| 
 | ||||
| /**
 | ||||
| @ -4210,9 +4143,9 @@ inline void gcode_M42() { | ||||
|            Y_current = current_position[Y_AXIS]; | ||||
| 
 | ||||
|     #if ENABLED(Z_PROBE_SLED) || ENABLED(Z_PROBE_ALLEN_KEY) | ||||
|       const bool deploy_probe_for_each_reading = false; | ||||
|       const bool stow_probe_after_each = false; | ||||
|     #else | ||||
|       bool deploy_probe_for_each_reading = code_seen('E'); | ||||
|       bool stow_probe_after_each = code_seen('E'); | ||||
|     #endif | ||||
| 
 | ||||
|     float X_probe_location = code_seen('X') ? code_value_axis_units(X_AXIS) : X_current + X_PROBE_OFFSET_FROM_EXTRUDER; | ||||
| @ -4265,24 +4198,8 @@ inline void gcode_M42() { | ||||
| 
 | ||||
|     setup_for_endstop_or_probe_move(); | ||||
| 
 | ||||
|     do_probe_raise(Z_RAISE_BEFORE_PROBING); | ||||
| 
 | ||||
|     feedrate = XY_PROBE_FEEDRATE; | ||||
|     do_blocking_move_to_xy(X_probe_location - (X_PROBE_OFFSET_FROM_EXTRUDER), Y_probe_location - (Y_PROBE_OFFSET_FROM_EXTRUDER)); | ||||
| 
 | ||||
|     /**
 | ||||
|      * OK, do the initial probe to get us close to the bed. | ||||
|      * Then retrace the right amount and use that in subsequent probes | ||||
|      */ | ||||
| 
 | ||||
|     // Height before each probe (except the first)
 | ||||
|     float z_between = deploy_probe_for_each_reading ? Z_RAISE_BEFORE_PROBING : Z_RAISE_BETWEEN_PROBINGS; | ||||
| 
 | ||||
|     // Deploy the probe and probe the first point
 | ||||
|     probe_pt(X_probe_location, Y_probe_location, | ||||
|       Z_RAISE_BEFORE_PROBING, | ||||
|       deploy_probe_for_each_reading ? ProbeDeployAndStow : ProbeDeploy, | ||||
|       verbose_level); | ||||
|     // Move to the first point, deploy, and probe
 | ||||
|     probe_pt(X_probe_location, Y_probe_location, stow_probe_after_each, verbose_level); | ||||
| 
 | ||||
|     randomSeed(millis()); | ||||
| 
 | ||||
| @ -4302,12 +4219,9 @@ inline void gcode_M42() { | ||||
|         if (verbose_level > 3) { | ||||
|           SERIAL_ECHOPAIR("Starting radius: ", radius); | ||||
|           SERIAL_ECHOPAIR("   angle: ", angle); | ||||
|           delay(100); | ||||
|           if (dir > 0) | ||||
|             SERIAL_ECHO(" Direction: Counter Clockwise \n"); | ||||
|           else | ||||
|             SERIAL_ECHO(" Direction: Clockwise \n"); | ||||
|           delay(100); | ||||
|           SERIAL_ECHO(" Direction: "); | ||||
|           if (dir > 0) SERIAL_ECHO("Counter "); | ||||
|           SERIAL_ECHOLN("Clockwise"); | ||||
|         } | ||||
| 
 | ||||
|         for (uint8_t l = 0; l < n_legs - 1; l++) { | ||||
| @ -4346,7 +4260,6 @@ inline void gcode_M42() { | ||||
|                 SERIAL_ECHOPAIR("Pulling point towards center:", X_current); | ||||
|                 SERIAL_ECHOPAIR(", ", Y_current); | ||||
|                 SERIAL_EOL; | ||||
|                 delay(50); | ||||
|               } | ||||
|             } | ||||
|           #endif | ||||
| @ -4356,22 +4269,13 @@ inline void gcode_M42() { | ||||
|             SERIAL_ECHOPAIR("y: ", Y_current); | ||||
|             SERIAL_ECHOPAIR("  z: ", current_position[Z_AXIS]); | ||||
|             SERIAL_EOL; | ||||
|             delay(55); | ||||
|           } | ||||
|           do_blocking_move_to_xy(X_current, Y_current); | ||||
|         } // n_legs loop
 | ||||
|       } // n_legs
 | ||||
| 
 | ||||
|       // The last probe will differ
 | ||||
|       bool last_probe = (n == n_samples - 1); | ||||
| 
 | ||||
|       // Probe a single point
 | ||||
|       sample_set[n] = probe_pt( | ||||
|         X_probe_location, Y_probe_location, | ||||
|         z_between, | ||||
|         deploy_probe_for_each_reading ? ProbeDeployAndStow : last_probe ? ProbeStow : ProbeStay, | ||||
|         verbose_level | ||||
|       ); | ||||
|       sample_set[n] = probe_pt(X_probe_location, Y_probe_location, stow_probe_after_each, verbose_level); | ||||
| 
 | ||||
|       /**
 | ||||
|        * Get the current mean for the data points we have so far | ||||
| @ -4397,7 +4301,6 @@ inline void gcode_M42() { | ||||
|           SERIAL_PROTOCOL((int)n_samples); | ||||
|           SERIAL_PROTOCOLPGM("   z: "); | ||||
|           SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6); | ||||
|           delay(50); | ||||
|           if (verbose_level > 2) { | ||||
|             SERIAL_PROTOCOLPGM(" mean: "); | ||||
|             SERIAL_PROTOCOL_F(mean, 6); | ||||
| @ -4408,17 +4311,10 @@ inline void gcode_M42() { | ||||
|         SERIAL_EOL; | ||||
|       } | ||||
| 
 | ||||
|       // Raise before the next loop for the legs,
 | ||||
|       // or do the final raise after the last probe
 | ||||
|       if (last_probe) | ||||
|         do_probe_raise(Z_RAISE_AFTER_PROBING); | ||||
|       else if (n_legs) { | ||||
|         do_probe_raise(z_between); | ||||
|         if (!last_probe) delay(500); | ||||
|       } | ||||
| 
 | ||||
|     } // End of probe loop
 | ||||
| 
 | ||||
|     stow_z_probe(); | ||||
| 
 | ||||
|     if (verbose_level > 0) { | ||||
|       SERIAL_PROTOCOLPGM("Mean: "); | ||||
|       SERIAL_PROTOCOL_F(mean, 6); | ||||
| @ -5967,16 +5863,12 @@ inline void gcode_M400() { stepper.synchronize(); } | ||||
|   /**
 | ||||
|    * M401: Engage Z Servo endstop if available | ||||
|    */ | ||||
|   inline void gcode_M401() { | ||||
|     deploy_z_probe(); | ||||
|   } | ||||
|   inline void gcode_M401() { deploy_z_probe(); } | ||||
| 
 | ||||
|   /**
 | ||||
|    * M402: Retract Z Servo endstop if enabled | ||||
|    */ | ||||
|   inline void gcode_M402() { | ||||
|     stow_z_probe(); | ||||
|   } | ||||
|   inline void gcode_M402() { stow_z_probe(); } | ||||
| 
 | ||||
| #endif // HAS_BED_PROBE
 | ||||
| 
 | ||||
| @ -6858,10 +6750,11 @@ void process_next_command() { | ||||
|         #if ENABLED(Z_PROBE_SLED) | ||||
| 
 | ||||
|             case 31: // G31: dock the sled
 | ||||
|               stow_z_probe(); | ||||
|               gcode_G31(); | ||||
|               break; | ||||
| 
 | ||||
|             case 32: // G32: undock the sled
 | ||||
|               deploy_z_probe(); | ||||
|               gcode_G32(); | ||||
|               break; | ||||
| 
 | ||||
|         #endif // Z_PROBE_SLED
 | ||||
|  | ||||
| @ -593,8 +593,6 @@ | ||||
|   #error "Z_LATE_ENABLE can't be used with COREXZ." | ||||
| #elif defined(X_HOME_RETRACT_MM) | ||||
|   #error "[XYZ]_HOME_RETRACT_MM settings have been renamed [XYZ]_HOME_BUMP_MM." | ||||
| #elif defined(PROBE_SERVO_DEACTIVATION_DELAY) | ||||
|   #error "PROBE_SERVO_DEACTIVATION_DELAY has been replaced with DEACTIVATE_SERVOS_AFTER_MOVE and SERVO_DEACTIVATION_DELAY." | ||||
| #elif defined(BEEPER) | ||||
|   #error "BEEPER is now BEEPER_PIN. Please update your pins definitions." | ||||
| #elif defined(SDCARDDETECT) | ||||
| @ -635,6 +633,10 @@ | ||||
|   #error "X_ENDSTOP_SERVO_NR and Y_ENDSTOP_SERVO_NR are deprecated and should be removed." | ||||
| #elif defined(XY_TRAVEL_SPEED) | ||||
|   #error "XY_TRAVEL_SPEED is deprecated. Use XY_PROBE_SPEED instead." | ||||
| #elif defined(PROBE_SERVO_DEACTIVATION_DELAY) | ||||
|   #error "PROBE_SERVO_DEACTIVATION_DELAY is deprecated. Use DEACTIVATE_SERVOS_AFTER_MOVE instead." | ||||
| #elif defined(SERVO_DEACTIVATION_DELAY) | ||||
|   #error "SERVO_DEACTIVATION_DELAY is deprecated. Use SERVO_DELAY instead." | ||||
| #endif | ||||
| 
 | ||||
| #endif //SANITYCHECK_H
 | ||||
|  | ||||
| @ -1172,18 +1172,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1156,18 +1156,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1154,18 +1154,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1165,18 +1165,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1167,18 +1167,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1190,18 +1190,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1173,18 +1173,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1170,18 +1170,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| #define NUM_SERVOS 0 // DGlass3D - Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1181,18 +1181,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1194,18 +1194,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1165,18 +1165,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1173,18 +1173,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1258,18 +1258,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1252,18 +1252,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1255,18 +1255,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1255,18 +1255,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1257,18 +1257,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1176,18 +1176,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -1167,18 +1167,16 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo | ||||
| //
 | ||||
| //#define NUM_SERVOS 3 // Servo index starts with 0 for M280 command
 | ||||
| 
 | ||||
| // Delay (in microseconds) before the next move will start, to give the servo time to reach its target angle.
 | ||||
| // 300ms is a good value but you can try less delay.
 | ||||
| // If the servo can't reach the requested position, increase it.
 | ||||
| #define SERVO_DELAY 300 | ||||
| 
 | ||||
| // Servo deactivation
 | ||||
| //
 | ||||
| // With this option servos are powered only during movement, then turned off to prevent jitter.
 | ||||
| //#define DEACTIVATE_SERVOS_AFTER_MOVE
 | ||||
| 
 | ||||
| #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|   // Delay (in microseconds) before turning the servo off. This depends on the servo speed.
 | ||||
|   // 300ms is a good value but you can try less delay.
 | ||||
|   // If the servo can't reach the requested position, increase it.
 | ||||
|   #define SERVO_DEACTIVATION_DELAY 300 | ||||
| #endif | ||||
| 
 | ||||
| /**********************************************************************\
 | ||||
|  * Support for a filament diameter sensor | ||||
|  * Also allows adjustment of diameter at print time (vs  at slicing) | ||||
|  | ||||
| @ -21,50 +21,35 @@ | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
|  servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 | ||||
|  Copyright (c) 2009 Michael Margolis.  All right reserved. | ||||
| 
 | ||||
|  This library is free software; you can redistribute it and/or | ||||
|  modify it under the terms of the GNU Lesser General Public | ||||
|  License as published by the Free Software Foundation; either | ||||
|  version 2.1 of the License, or (at your option) any later version. | ||||
| 
 | ||||
|  This library is distributed in the hope that it will be useful, | ||||
|  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||
|  Lesser General Public License for more details. | ||||
| 
 | ||||
|  You should have received a copy of the GNU Lesser General Public | ||||
|  License along with this library; if not, write to the Free Software | ||||
|  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA | ||||
|  * servo.cpp - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2 | ||||
|  * Copyright (c) 2009 Michael Margolis.  All right reserved. | ||||
|  */ | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|  A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. | ||||
|  The servos are pulsed in the background using the value most recently written using the write() method | ||||
| 
 | ||||
|  Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. | ||||
|  Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. | ||||
| 
 | ||||
|  The methods are: | ||||
| 
 | ||||
|  Servo - Class for manipulating servo motors connected to Arduino pins. | ||||
| 
 | ||||
|  attach(pin )  - Attaches a servo motor to an i/o pin. | ||||
|  attach(pin, min, max  ) - Attaches to a pin setting min and max values in microseconds | ||||
|  default min is 544, max is 2400 | ||||
| 
 | ||||
|  write()     - Sets the servo angle in degrees.  (invalid angle that is valid as pulse in microseconds is treated as microseconds) | ||||
|  writeMicroseconds() - Sets the servo pulse width in microseconds | ||||
|  move(pin, angle) - Sequence of attach(pin), write(angle). | ||||
|                     With DEACTIVATE_SERVOS_AFTER_MOVE it waits SERVO_DEACTIVATION_DELAY and detaches. | ||||
|  read()      - Gets the last written servo pulse width as an angle between 0 and 180. | ||||
|  readMicroseconds()   - Gets the last written servo pulse width in microseconds. (was read_us() in first release) | ||||
|  attached()  - Returns true if there is a servo attached. | ||||
|  detach()    - Stops an attached servos from pulsing its i/o pin. | ||||
| 
 | ||||
| */ | ||||
|  * A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method. | ||||
|  * The servos are pulsed in the background using the value most recently written using the write() method | ||||
|  * | ||||
|  * Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached. | ||||
|  * Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four. | ||||
|  * | ||||
|  * The methods are: | ||||
|  * | ||||
|  * Servo - Class for manipulating servo motors connected to Arduino pins. | ||||
|  * | ||||
|  * attach(pin)           - Attach a servo motor to an i/o pin. | ||||
|  * attach(pin, min, max) - Attach to a pin, setting min and max values in microseconds | ||||
|  *                         Default min is 544, max is 2400 | ||||
|  * | ||||
|  * write()               - Set the servo angle in degrees. (Invalid angles —over MIN_PULSE_WIDTH— are treated as µs.) | ||||
|  * writeMicroseconds()   - Set the servo pulse width in microseconds. | ||||
|  * move(pin, angle)      - Sequence of attach(pin), write(angle), delay(SERVO_DELAY). | ||||
|  *                         With DEACTIVATE_SERVOS_AFTER_MOVE it detaches after SERVO_DELAY. | ||||
|  * read()                - Get the last-written servo pulse width as an angle between 0 and 180. | ||||
|  * readMicroseconds()    - Get the last-written servo pulse width in microseconds. | ||||
|  * attached()            - Return true if a servo is attached. | ||||
|  * detach()              - Stop an attached servo from pulsing its i/o pin. | ||||
|  * | ||||
|  */ | ||||
| #include "Configuration.h" | ||||
| 
 | ||||
| #if HAS_SERVOS | ||||
| @ -238,6 +223,7 @@ static void finISR(timer16_Sequence_t timer) { | ||||
|     } | ||||
|   #else //!WIRING
 | ||||
|     // For arduino - in future: call here to a currently undefined function to reset the timer
 | ||||
| 	UNUSED(timer); | ||||
|   #endif | ||||
| } | ||||
| 
 | ||||
| @ -324,8 +310,8 @@ bool Servo::attached() { return servo_info[this->servoIndex].Pin.isActive; } | ||||
| void Servo::move(int value) { | ||||
|   if (this->attach(0) >= 0) { | ||||
|     this->write(value); | ||||
|     delay(SERVO_DELAY); | ||||
|     #if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) | ||||
|       delay(SERVO_DEACTIVATION_DELAY); | ||||
|       this->detach(); | ||||
|     #endif | ||||
|   } | ||||
|  | ||||
| @ -63,7 +63,7 @@ | ||||
|    attached()  - Returns true if there is a servo attached. | ||||
|    detach()    - Stops an attached servos from pulsing its i/o pin. | ||||
|    move(angle) - Sequence of attach(0), write(angle), | ||||
|                    With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DEACTIVATION_DELAY and detach. | ||||
|                    With DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY and detach. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef servo_h | ||||
| @ -147,7 +147,7 @@ class Servo { | ||||
|     void writeMicroseconds(int value); // write pulse width in microseconds
 | ||||
|     void move(int value);              // attach the servo, then move to value
 | ||||
|                                        // if value is < 200 it is treated as an angle, otherwise as pulse width in microseconds
 | ||||
|                                        // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DEACTIVATION_DELAY, then detach
 | ||||
|                                        // if DEACTIVATE_SERVOS_AFTER_MOVE wait SERVO_DELAY, then detach
 | ||||
|     int read();                        // returns current pulse width as an angle between 0 and 180 degrees
 | ||||
|     int readMicroseconds();            // returns current pulse width in microseconds for this servo (was read_us() in first release)
 | ||||
|     bool attached();                   // return true if this servo is attached, otherwise false
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user