|
@@ -400,7 +400,6 @@ static uint8_t target_extruder;
|
400
|
400
|
|
401
|
401
|
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
|
402
|
402
|
float xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED);
|
403
|
|
- bool bed_leveling_in_progress = false;
|
404
|
403
|
#define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s
|
405
|
404
|
#elif defined(XY_PROBE_SPEED)
|
406
|
405
|
#define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED)
|
|
@@ -658,16 +657,20 @@ inline void sync_plan_position() {
|
658
|
657
|
inline void sync_plan_position_e() { planner.set_e_position_mm(current_position[E_AXIS]); }
|
659
|
658
|
|
660
|
659
|
#if IS_KINEMATIC
|
|
660
|
+
|
661
|
661
|
inline void sync_plan_position_kinematic() {
|
662
|
662
|
#if ENABLED(DEBUG_LEVELING_FEATURE)
|
663
|
663
|
if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_kinematic", current_position);
|
664
|
664
|
#endif
|
665
|
665
|
inverse_kinematics(current_position);
|
666
|
|
- planner.set_position_mm(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
|
|
666
|
+ planner.set_position_mm(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], current_position[E_AXIS]);
|
667
|
667
|
}
|
668
|
668
|
#define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position_kinematic()
|
|
669
|
+
|
669
|
670
|
#else
|
|
671
|
+
|
670
|
672
|
#define SYNC_PLAN_POSITION_KINEMATIC() sync_plan_position()
|
|
673
|
+
|
671
|
674
|
#endif
|
672
|
675
|
|
673
|
676
|
#if ENABLED(SDSUPPORT)
|
|
@@ -795,7 +798,6 @@ void setup_homepin(void) {
|
795
|
798
|
#endif
|
796
|
799
|
}
|
797
|
800
|
|
798
|
|
-
|
799
|
801
|
void setup_photpin() {
|
800
|
802
|
#if HAS_PHOTOGRAPH
|
801
|
803
|
OUT_WRITE(PHOTOGRAPH_PIN, LOW);
|
|
@@ -1479,7 +1481,7 @@ inline void set_destination_to_current() { memcpy(destination, current_position,
|
1479
|
1481
|
#endif
|
1480
|
1482
|
refresh_cmd_timeout();
|
1481
|
1483
|
inverse_kinematics(destination);
|
1482
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], MMS_SCALED(feedrate_mm_s), active_extruder);
|
|
1484
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], destination[E_AXIS], MMS_SCALED(feedrate_mm_s), active_extruder);
|
1483
|
1485
|
set_current_to_destination();
|
1484
|
1486
|
}
|
1485
|
1487
|
#endif
|
|
@@ -3431,8 +3433,6 @@ inline void gcode_G28() {
|
3431
|
3433
|
// Deploy the probe. Probe will raise if needed.
|
3432
|
3434
|
if (DEPLOY_PROBE()) return;
|
3433
|
3435
|
|
3434
|
|
- bed_leveling_in_progress = true;
|
3435
|
|
-
|
3436
|
3436
|
float xProbe, yProbe, measured_z = 0;
|
3437
|
3437
|
|
3438
|
3438
|
#if ENABLED(AUTO_BED_LEVELING_GRID)
|
|
@@ -3573,6 +3573,8 @@ inline void gcode_G28() {
|
3573
|
3573
|
|
3574
|
3574
|
#elif ENABLED(AUTO_BED_LEVELING_LINEAR)
|
3575
|
3575
|
|
|
3576
|
+ // For LINEAR leveling calculate matrix, print reports, correct the position
|
|
3577
|
+
|
3576
|
3578
|
// solve lsq problem
|
3577
|
3579
|
double plane_equation_coefficients[3];
|
3578
|
3580
|
qr_solve(plane_equation_coefficients, abl2, 3, eqnAMatrix, eqnBVector);
|
|
@@ -3666,6 +3668,8 @@ inline void gcode_G28() {
|
3666
|
3668
|
}
|
3667
|
3669
|
} //do_topography_map
|
3668
|
3670
|
|
|
3671
|
+ // For LINEAR and 3POINT leveling correct the current position
|
|
3672
|
+
|
3669
|
3673
|
if (verbose_level > 0)
|
3670
|
3674
|
planner.bed_level_matrix.debug("\n\nBed Level Correction Matrix:");
|
3671
|
3675
|
|
|
@@ -3735,8 +3739,6 @@ inline void gcode_G28() {
|
3735
|
3739
|
if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< gcode_G29");
|
3736
|
3740
|
#endif
|
3737
|
3741
|
|
3738
|
|
- bed_leveling_in_progress = false;
|
3739
|
|
-
|
3740
|
3742
|
report_current_position();
|
3741
|
3743
|
|
3742
|
3744
|
KEEPALIVE_STATE(IN_HANDLER);
|
|
@@ -5075,22 +5077,20 @@ static void report_current_position() {
|
5075
|
5077
|
|
5076
|
5078
|
#if IS_SCARA
|
5077
|
5079
|
SERIAL_PROTOCOLPGM("SCARA Theta:");
|
5078
|
|
- SERIAL_PROTOCOL(delta[X_AXIS]);
|
|
5080
|
+ SERIAL_PROTOCOL(delta[A_AXIS]);
|
5079
|
5081
|
SERIAL_PROTOCOLPGM(" Psi+Theta:");
|
5080
|
|
- SERIAL_PROTOCOL(delta[Y_AXIS]);
|
5081
|
|
- SERIAL_EOL;
|
|
5082
|
+ SERIAL_PROTOCOLLN(delta[B_AXIS]);
|
5082
|
5083
|
|
5083
|
5084
|
SERIAL_PROTOCOLPGM("SCARA Cal - Theta:");
|
5084
|
|
- SERIAL_PROTOCOL(delta[X_AXIS]);
|
|
5085
|
+ SERIAL_PROTOCOL(delta[A_AXIS]);
|
5085
|
5086
|
SERIAL_PROTOCOLPGM(" Psi+Theta (90):");
|
5086
|
|
- SERIAL_PROTOCOL(delta[Y_AXIS] - delta[X_AXIS] - 90);
|
5087
|
|
- SERIAL_EOL;
|
|
5087
|
+ SERIAL_PROTOCOLLN(delta[B_AXIS] - delta[A_AXIS] - 90);
|
5088
|
5088
|
|
5089
|
5089
|
SERIAL_PROTOCOLPGM("SCARA step Cal - Theta:");
|
5090
|
|
- SERIAL_PROTOCOL(delta[X_AXIS] / 90 * planner.axis_steps_per_mm[X_AXIS]);
|
|
5090
|
+ SERIAL_PROTOCOL(delta[A_AXIS] / 90 * planner.axis_steps_per_mm[A_AXIS]);
|
5091
|
5091
|
SERIAL_PROTOCOLPGM(" Psi+Theta:");
|
5092
|
|
- SERIAL_PROTOCOL((delta[Y_AXIS] - delta[X_AXIS]) / 90 * planner.axis_steps_per_mm[Y_AXIS]);
|
5093
|
|
- SERIAL_EOL; SERIAL_EOL;
|
|
5092
|
+ SERIAL_PROTOCOLLN((delta[B_AXIS] - delta[A_AXIS]) / 90 * planner.axis_steps_per_mm[A_AXIS]);
|
|
5093
|
+ SERIAL_EOL;
|
5094
|
5094
|
#endif
|
5095
|
5095
|
}
|
5096
|
5096
|
|
|
@@ -6160,7 +6160,7 @@ inline void gcode_M503() {
|
6160
|
6160
|
// Define runplan for move axes
|
6161
|
6161
|
#if IS_KINEMATIC
|
6162
|
6162
|
#define RUNPLAN(RATE_MM_S) inverse_kinematics(destination); \
|
6163
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], RATE_MM_S, active_extruder);
|
|
6163
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], destination[E_AXIS], RATE_MM_S, active_extruder);
|
6164
|
6164
|
#else
|
6165
|
6165
|
#define RUNPLAN(RATE_MM_S) line_to_destination(RATE_MM_S);
|
6166
|
6166
|
#endif
|
|
@@ -6282,8 +6282,8 @@ inline void gcode_M503() {
|
6282
|
6282
|
#if IS_KINEMATIC
|
6283
|
6283
|
// Move XYZ to starting position, then E
|
6284
|
6284
|
inverse_kinematics(lastpos);
|
6285
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], FILAMENT_CHANGE_XY_FEEDRATE, active_extruder);
|
6286
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], lastpos[E_AXIS], FILAMENT_CHANGE_XY_FEEDRATE, active_extruder);
|
|
6285
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], destination[E_AXIS], FILAMENT_CHANGE_XY_FEEDRATE, active_extruder);
|
|
6286
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], lastpos[E_AXIS], FILAMENT_CHANGE_XY_FEEDRATE, active_extruder);
|
6287
|
6287
|
#else
|
6288
|
6288
|
// Move XY to starting position, then Z, then E
|
6289
|
6289
|
destination[X_AXIS] = lastpos[X_AXIS];
|
|
@@ -7637,6 +7637,48 @@ void ok_to_send() {
|
7637
|
7637
|
|
7638
|
7638
|
#endif
|
7639
|
7639
|
|
|
7640
|
+#if ENABLED(AUTO_BED_LEVELING_NONLINEAR)
|
|
7641
|
+
|
|
7642
|
+ // Get the Z adjustment for non-linear bed leveling
|
|
7643
|
+ float nonlinear_z_offset(float cartesian[XYZ]) {
|
|
7644
|
+ if (nonlinear_grid_spacing[X_AXIS] == 0 || nonlinear_grid_spacing[Y_AXIS] == 0) return 0; // G29 not done!
|
|
7645
|
+
|
|
7646
|
+ int half_x = (ABL_GRID_POINTS_X - 1) / 2,
|
|
7647
|
+ half_y = (ABL_GRID_POINTS_Y - 1) / 2;
|
|
7648
|
+ float hx2 = half_x - 0.001, hx1 = -hx2,
|
|
7649
|
+ hy2 = half_y - 0.001, hy1 = -hy2,
|
|
7650
|
+ grid_x = max(hx1, min(hx2, RAW_X_POSITION(cartesian[X_AXIS]) / nonlinear_grid_spacing[X_AXIS])),
|
|
7651
|
+ grid_y = max(hy1, min(hy2, RAW_Y_POSITION(cartesian[Y_AXIS]) / nonlinear_grid_spacing[Y_AXIS]));
|
|
7652
|
+ int floor_x = floor(grid_x), floor_y = floor(grid_y);
|
|
7653
|
+ float ratio_x = grid_x - floor_x, ratio_y = grid_y - floor_y,
|
|
7654
|
+ z1 = bed_level_grid[floor_x + half_x][floor_y + half_y],
|
|
7655
|
+ z2 = bed_level_grid[floor_x + half_x][floor_y + half_y + 1],
|
|
7656
|
+ z3 = bed_level_grid[floor_x + half_x + 1][floor_y + half_y],
|
|
7657
|
+ z4 = bed_level_grid[floor_x + half_x + 1][floor_y + half_y + 1],
|
|
7658
|
+ left = (1 - ratio_y) * z1 + ratio_y * z2,
|
|
7659
|
+ right = (1 - ratio_y) * z3 + ratio_y * z4;
|
|
7660
|
+
|
|
7661
|
+ /*
|
|
7662
|
+ SERIAL_ECHOPAIR("grid_x=", grid_x);
|
|
7663
|
+ SERIAL_ECHOPAIR(" grid_y=", grid_y);
|
|
7664
|
+ SERIAL_ECHOPAIR(" floor_x=", floor_x);
|
|
7665
|
+ SERIAL_ECHOPAIR(" floor_y=", floor_y);
|
|
7666
|
+ SERIAL_ECHOPAIR(" ratio_x=", ratio_x);
|
|
7667
|
+ SERIAL_ECHOPAIR(" ratio_y=", ratio_y);
|
|
7668
|
+ SERIAL_ECHOPAIR(" z1=", z1);
|
|
7669
|
+ SERIAL_ECHOPAIR(" z2=", z2);
|
|
7670
|
+ SERIAL_ECHOPAIR(" z3=", z3);
|
|
7671
|
+ SERIAL_ECHOPAIR(" z4=", z4);
|
|
7672
|
+ SERIAL_ECHOPAIR(" left=", left);
|
|
7673
|
+ SERIAL_ECHOPAIR(" right=", right);
|
|
7674
|
+ SERIAL_ECHOPAIR(" offset=", (1 - ratio_x) * left + ratio_x * right);
|
|
7675
|
+ //*/
|
|
7676
|
+
|
|
7677
|
+ return (1 - ratio_x) * left + ratio_x * right;
|
|
7678
|
+ }
|
|
7679
|
+
|
|
7680
|
+#endif // AUTO_BED_LEVELING_NONLINEAR
|
|
7681
|
+
|
7640
|
7682
|
#if ENABLED(DELTA)
|
7641
|
7683
|
|
7642
|
7684
|
/**
|
|
@@ -7827,50 +7869,6 @@ void ok_to_send() {
|
7827
|
7869
|
forward_kinematics_DELTA(point[A_AXIS], point[B_AXIS], point[C_AXIS]);
|
7828
|
7870
|
}
|
7829
|
7871
|
|
7830
|
|
- #if ENABLED(AUTO_BED_LEVELING_NONLINEAR)
|
7831
|
|
-
|
7832
|
|
- // Adjust print surface height by linear interpolation over the bed_level array.
|
7833
|
|
- void adjust_delta(float cartesian[XYZ]) {
|
7834
|
|
- if (nonlinear_grid_spacing[X_AXIS] == 0 || nonlinear_grid_spacing[Y_AXIS] == 0) return; // G29 not done!
|
7835
|
|
-
|
7836
|
|
- int half_x = (ABL_GRID_POINTS_X - 1) / 2,
|
7837
|
|
- half_y = (ABL_GRID_POINTS_Y - 1) / 2;
|
7838
|
|
- float hx2 = half_x - 0.001, hx1 = -hx2,
|
7839
|
|
- hy2 = half_y - 0.001, hy1 = -hy2,
|
7840
|
|
- grid_x = max(hx1, min(hx2, RAW_X_POSITION(cartesian[X_AXIS]) / nonlinear_grid_spacing[X_AXIS])),
|
7841
|
|
- grid_y = max(hy1, min(hy2, RAW_Y_POSITION(cartesian[Y_AXIS]) / nonlinear_grid_spacing[Y_AXIS]));
|
7842
|
|
- int floor_x = floor(grid_x), floor_y = floor(grid_y);
|
7843
|
|
- float ratio_x = grid_x - floor_x, ratio_y = grid_y - floor_y,
|
7844
|
|
- z1 = bed_level_grid[floor_x + half_x][floor_y + half_y],
|
7845
|
|
- z2 = bed_level_grid[floor_x + half_x][floor_y + half_y + 1],
|
7846
|
|
- z3 = bed_level_grid[floor_x + half_x + 1][floor_y + half_y],
|
7847
|
|
- z4 = bed_level_grid[floor_x + half_x + 1][floor_y + half_y + 1],
|
7848
|
|
- left = (1 - ratio_y) * z1 + ratio_y * z2,
|
7849
|
|
- right = (1 - ratio_y) * z3 + ratio_y * z4,
|
7850
|
|
- offset = (1 - ratio_x) * left + ratio_x * right;
|
7851
|
|
-
|
7852
|
|
- delta[X_AXIS] += offset;
|
7853
|
|
- delta[Y_AXIS] += offset;
|
7854
|
|
- delta[Z_AXIS] += offset;
|
7855
|
|
-
|
7856
|
|
- /**
|
7857
|
|
- SERIAL_ECHOPAIR("grid_x=", grid_x);
|
7858
|
|
- SERIAL_ECHOPAIR(" grid_y=", grid_y);
|
7859
|
|
- SERIAL_ECHOPAIR(" floor_x=", floor_x);
|
7860
|
|
- SERIAL_ECHOPAIR(" floor_y=", floor_y);
|
7861
|
|
- SERIAL_ECHOPAIR(" ratio_x=", ratio_x);
|
7862
|
|
- SERIAL_ECHOPAIR(" ratio_y=", ratio_y);
|
7863
|
|
- SERIAL_ECHOPAIR(" z1=", z1);
|
7864
|
|
- SERIAL_ECHOPAIR(" z2=", z2);
|
7865
|
|
- SERIAL_ECHOPAIR(" z3=", z3);
|
7866
|
|
- SERIAL_ECHOPAIR(" z4=", z4);
|
7867
|
|
- SERIAL_ECHOPAIR(" left=", left);
|
7868
|
|
- SERIAL_ECHOPAIR(" right=", right);
|
7869
|
|
- SERIAL_ECHOLNPAIR(" offset=", offset);
|
7870
|
|
- */
|
7871
|
|
- }
|
7872
|
|
- #endif // AUTO_BED_LEVELING_NONLINEAR
|
7873
|
|
-
|
7874
|
7872
|
#endif // DELTA
|
7875
|
7873
|
|
7876
|
7874
|
/**
|
|
@@ -7992,9 +7990,9 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
|
7992
|
7990
|
* This calls planner.buffer_line several times, adding
|
7993
|
7991
|
* small incremental moves for DELTA or SCARA.
|
7994
|
7992
|
*/
|
7995
|
|
- inline bool prepare_kinematic_move_to(float target[NUM_AXIS]) {
|
|
7993
|
+ inline bool prepare_kinematic_move_to(float logical[NUM_AXIS]) {
|
7996
|
7994
|
float difference[NUM_AXIS];
|
7997
|
|
- LOOP_XYZE(i) difference[i] = target[i] - current_position[i];
|
|
7995
|
+ LOOP_XYZE(i) difference[i] = logical[i] - current_position[i];
|
7998
|
7996
|
|
7999
|
7997
|
float cartesian_mm = sqrt(sq(difference[X_AXIS]) + sq(difference[Y_AXIS]) + sq(difference[Z_AXIS]));
|
8000
|
7998
|
if (UNEAR_ZERO(cartesian_mm)) cartesian_mm = abs(difference[E_AXIS]);
|
|
@@ -8013,18 +8011,14 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
|
8013
|
8011
|
float fraction = float(s) * inv_steps;
|
8014
|
8012
|
|
8015
|
8013
|
LOOP_XYZE(i)
|
8016
|
|
- target[i] = current_position[i] + difference[i] * fraction;
|
|
8014
|
+ logical[i] = current_position[i] + difference[i] * fraction;
|
8017
|
8015
|
|
8018
|
|
- inverse_kinematics(target);
|
|
8016
|
+ inverse_kinematics(logical);
|
8019
|
8017
|
|
8020
|
|
- #if ENABLED(DELTA) && ENABLED(AUTO_BED_LEVELING_NONLINEAR)
|
8021
|
|
- if (!bed_leveling_in_progress) adjust_delta(target);
|
8022
|
|
- #endif
|
8023
|
|
-
|
8024
|
|
- //DEBUG_POS("prepare_kinematic_move_to", target);
|
|
8018
|
+ //DEBUG_POS("prepare_kinematic_move_to", logical);
|
8025
|
8019
|
//DEBUG_POS("prepare_kinematic_move_to", delta);
|
8026
|
8020
|
|
8027
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], target[E_AXIS], _feedrate_mm_s, active_extruder);
|
|
8021
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], logical[E_AXIS], _feedrate_mm_s, active_extruder);
|
8028
|
8022
|
}
|
8029
|
8023
|
return true;
|
8030
|
8024
|
}
|
|
@@ -8156,20 +8150,20 @@ void prepare_move_to_destination() {
|
8156
|
8150
|
* options for G2/G3 arc generation. In future these options may be GCode tunable.
|
8157
|
8151
|
*/
|
8158
|
8152
|
void plan_arc(
|
8159
|
|
- float target[NUM_AXIS], // Destination position
|
8160
|
|
- float* offset, // Center of rotation relative to current_position
|
8161
|
|
- uint8_t clockwise // Clockwise?
|
|
8153
|
+ float logical[NUM_AXIS], // Destination position
|
|
8154
|
+ float* offset, // Center of rotation relative to current_position
|
|
8155
|
+ uint8_t clockwise // Clockwise?
|
8162
|
8156
|
) {
|
8163
|
8157
|
|
8164
|
8158
|
float radius = HYPOT(offset[X_AXIS], offset[Y_AXIS]),
|
8165
|
8159
|
center_X = current_position[X_AXIS] + offset[X_AXIS],
|
8166
|
8160
|
center_Y = current_position[Y_AXIS] + offset[Y_AXIS],
|
8167
|
|
- linear_travel = target[Z_AXIS] - current_position[Z_AXIS],
|
8168
|
|
- extruder_travel = target[E_AXIS] - current_position[E_AXIS],
|
|
8161
|
+ linear_travel = logical[Z_AXIS] - current_position[Z_AXIS],
|
|
8162
|
+ extruder_travel = logical[E_AXIS] - current_position[E_AXIS],
|
8169
|
8163
|
r_X = -offset[X_AXIS], // Radius vector from center to current location
|
8170
|
8164
|
r_Y = -offset[Y_AXIS],
|
8171
|
|
- rt_X = target[X_AXIS] - center_X,
|
8172
|
|
- rt_Y = target[Y_AXIS] - center_Y;
|
|
8165
|
+ rt_X = logical[X_AXIS] - center_X,
|
|
8166
|
+ rt_Y = logical[Y_AXIS] - center_Y;
|
8173
|
8167
|
|
8174
|
8168
|
// CCW angle of rotation between position and target from the circle center. Only one atan2() trig computation required.
|
8175
|
8169
|
float angular_travel = atan2(r_X * rt_Y - r_Y * rt_X, r_X * rt_X + r_Y * rt_Y);
|
|
@@ -8177,7 +8171,7 @@ void prepare_move_to_destination() {
|
8177
|
8171
|
if (clockwise) angular_travel -= RADIANS(360);
|
8178
|
8172
|
|
8179
|
8173
|
// Make a circle if the angular rotation is 0
|
8180
|
|
- if (angular_travel == 0 && current_position[X_AXIS] == target[X_AXIS] && current_position[Y_AXIS] == target[Y_AXIS])
|
|
8174
|
+ if (angular_travel == 0 && current_position[X_AXIS] == logical[X_AXIS] && current_position[Y_AXIS] == logical[Y_AXIS])
|
8181
|
8175
|
angular_travel += RADIANS(360);
|
8182
|
8176
|
|
8183
|
8177
|
float mm_of_travel = HYPOT(angular_travel * radius, fabs(linear_travel));
|
|
@@ -8271,10 +8265,7 @@ void prepare_move_to_destination() {
|
8271
|
8265
|
|
8272
|
8266
|
#if IS_KINEMATIC
|
8273
|
8267
|
inverse_kinematics(arc_target);
|
8274
|
|
- #if ENABLED(DELTA) && ENABLED(AUTO_BED_LEVELING_NONLINEAR)
|
8275
|
|
- adjust_delta(arc_target);
|
8276
|
|
- #endif
|
8277
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], arc_target[E_AXIS], fr_mm_s, active_extruder);
|
|
8268
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], arc_target[E_AXIS], fr_mm_s, active_extruder);
|
8278
|
8269
|
#else
|
8279
|
8270
|
planner.buffer_line(arc_target[X_AXIS], arc_target[Y_AXIS], arc_target[Z_AXIS], arc_target[E_AXIS], fr_mm_s, active_extruder);
|
8280
|
8271
|
#endif
|
|
@@ -8282,13 +8273,10 @@ void prepare_move_to_destination() {
|
8282
|
8273
|
|
8283
|
8274
|
// Ensure last segment arrives at target location.
|
8284
|
8275
|
#if IS_KINEMATIC
|
8285
|
|
- inverse_kinematics(target);
|
8286
|
|
- #if ENABLED(DELTA) && ENABLED(AUTO_BED_LEVELING_NONLINEAR)
|
8287
|
|
- adjust_delta(target);
|
8288
|
|
- #endif
|
8289
|
|
- planner.buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], target[E_AXIS], fr_mm_s, active_extruder);
|
|
8276
|
+ inverse_kinematics(logical);
|
|
8277
|
+ planner.buffer_line(delta[A_AXIS], delta[B_AXIS], delta[C_AXIS], logical[E_AXIS], fr_mm_s, active_extruder);
|
8290
|
8278
|
#else
|
8291
|
|
- planner.buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], fr_mm_s, active_extruder);
|
|
8279
|
+ planner.buffer_line(logical[X_AXIS], logical[Y_AXIS], logical[Z_AXIS], logical[E_AXIS], fr_mm_s, active_extruder);
|
8292
|
8280
|
#endif
|
8293
|
8281
|
|
8294
|
8282
|
// As far as the parser is concerned, the position is now == target. In reality the
|
|
@@ -8303,7 +8291,7 @@ void prepare_move_to_destination() {
|
8303
|
8291
|
void plan_cubic_move(const float offset[4]) {
|
8304
|
8292
|
cubic_b_spline(current_position, destination, offset, MMS_SCALED(feedrate_mm_s), active_extruder);
|
8305
|
8293
|
|
8306
|
|
- // As far as the parser is concerned, the position is now == target. In reality the
|
|
8294
|
+ // As far as the parser is concerned, the position is now == destination. In reality the
|
8307
|
8295
|
// motion control system might still be processing the action and the real tool position
|
8308
|
8296
|
// in any intermediate location.
|
8309
|
8297
|
set_current_to_destination();
|
|
@@ -8376,7 +8364,7 @@ void prepare_move_to_destination() {
|
8376
|
8364
|
//*/
|
8377
|
8365
|
}
|
8378
|
8366
|
|
8379
|
|
- void inverse_kinematics(const float cartesian[XYZ]) {
|
|
8367
|
+ void inverse_kinematics(const float logical[XYZ]) {
|
8380
|
8368
|
// Inverse kinematics.
|
8381
|
8369
|
// Perform SCARA IK and place results in delta[].
|
8382
|
8370
|
// The maths and first version were done by QHARLEY.
|
|
@@ -8384,8 +8372,8 @@ void prepare_move_to_destination() {
|
8384
|
8372
|
|
8385
|
8373
|
static float C2, S2, SK1, SK2, THETA, PSI;
|
8386
|
8374
|
|
8387
|
|
- float sx = RAW_X_POSITION(cartesian[X_AXIS]) - SCARA_OFFSET_X, //Translate SCARA to standard X Y
|
8388
|
|
- sy = RAW_Y_POSITION(cartesian[Y_AXIS]) - SCARA_OFFSET_Y; // With scaling factor.
|
|
8375
|
+ float sx = RAW_X_POSITION(logical[X_AXIS]) - SCARA_OFFSET_X, // Translate SCARA to standard X Y
|
|
8376
|
+ sy = RAW_Y_POSITION(logical[Y_AXIS]) - SCARA_OFFSET_Y; // With scaling factor.
|
8389
|
8377
|
|
8390
|
8378
|
#if (L1 == L2)
|
8391
|
8379
|
C2 = HYPOT2(sx, sy) / (2 * L1_2) - 1;
|
|
@@ -8403,10 +8391,10 @@ void prepare_move_to_destination() {
|
8403
|
8391
|
|
8404
|
8392
|
delta[A_AXIS] = DEGREES(THETA); // theta is support arm angle
|
8405
|
8393
|
delta[B_AXIS] = DEGREES(THETA + PSI); // equal to sub arm angle (inverted motor)
|
8406
|
|
- delta[Z_AXIS] = cartesian[Z_AXIS];
|
|
8394
|
+ delta[C_AXIS] = logical[Z_AXIS];
|
8407
|
8395
|
|
8408
|
|
- /**
|
8409
|
|
- DEBUG_POS("SCARA IK", cartesian);
|
|
8396
|
+ /*
|
|
8397
|
+ DEBUG_POS("SCARA IK", logical);
|
8410
|
8398
|
DEBUG_POS("SCARA IK", delta);
|
8411
|
8399
|
SERIAL_ECHOPAIR(" SCARA (x,y) ", sx);
|
8412
|
8400
|
SERIAL_ECHOPAIR(",", sy);
|