|
@@ -161,6 +161,7 @@
|
161
|
161
|
// M503 - print the current settings (from memory not from EEPROM)
|
162
|
162
|
// M540 - Use S[0|1] to enable or disable the stop SD card print on endstop hit (requires ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
|
163
|
163
|
// M600 - Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
|
|
164
|
+// M665 - set delta configurations
|
164
|
165
|
// M666 - set delta endstop adjustment
|
165
|
166
|
// M605 - Set dual x-carriage movement mode: S<mode> [ X<duplication x-offset> R<duplication temp offset> ]
|
166
|
167
|
// M907 - Set digital trimpot motor current using axis codes.
|
|
@@ -249,9 +250,21 @@ int EtoPPressure=0;
|
249
|
250
|
#endif
|
250
|
251
|
|
251
|
252
|
#ifdef DELTA
|
252
|
|
-float delta[3] = {0.0, 0.0, 0.0};
|
253
|
|
-#endif
|
254
|
|
-
|
|
253
|
+ float delta[3] = {0.0, 0.0, 0.0};
|
|
254
|
+ #define SIN_60 0.8660254037844386
|
|
255
|
+ #define COS_60 0.5
|
|
256
|
+ // these are the default values, can be overriden with M665
|
|
257
|
+ float delta_radius= DELTA_RADIUS;
|
|
258
|
+ float delta_tower1_x= -SIN_60*delta_radius; // front left tower
|
|
259
|
+ float delta_tower1_y= -COS_60*delta_radius;
|
|
260
|
+ float delta_tower2_x= SIN_60*delta_radius; // front right tower
|
|
261
|
+ float delta_tower2_y= -COS_60*delta_radius;
|
|
262
|
+ float delta_tower3_x= 0.0; // back middle tower
|
|
263
|
+ float delta_tower3_y= delta_radius;
|
|
264
|
+ float delta_diagonal_rod= DELTA_DIAGONAL_ROD;
|
|
265
|
+ float delta_diagonal_rod_2= sq(delta_diagonal_rod);
|
|
266
|
+ float delta_segments_per_second= DELTA_SEGMENTS_PER_SECOND;
|
|
267
|
+#endif
|
255
|
268
|
|
256
|
269
|
//===========================================================================
|
257
|
270
|
//=============================Private Variables=============================
|
|
@@ -2293,6 +2306,19 @@ void process_commands()
|
2293
|
2306
|
}
|
2294
|
2307
|
break;
|
2295
|
2308
|
#ifdef DELTA
|
|
2309
|
+ case 665: // M665 set delta configurations L<diagonal_rod> R<delta_radius> S<segments_per_sec>
|
|
2310
|
+ if(code_seen('L')) {
|
|
2311
|
+ delta_diagonal_rod= code_value();
|
|
2312
|
+ }
|
|
2313
|
+ if(code_seen('R')) {
|
|
2314
|
+ delta_radius= code_value();
|
|
2315
|
+ }
|
|
2316
|
+ if(code_seen('S')) {
|
|
2317
|
+ delta_segments_per_second= code_value();
|
|
2318
|
+ }
|
|
2319
|
+
|
|
2320
|
+ recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
|
2321
|
+ break;
|
2296
|
2322
|
case 666: // M666 set delta endstop adjustemnt
|
2297
|
2323
|
for(int8_t i=0; i < 3; i++)
|
2298
|
2324
|
{
|
|
@@ -3091,19 +3117,30 @@ void clamp_to_software_endstops(float target[3])
|
3091
|
3117
|
}
|
3092
|
3118
|
|
3093
|
3119
|
#ifdef DELTA
|
|
3120
|
+void recalc_delta_settings(float radius, float diagonal_rod)
|
|
3121
|
+{
|
|
3122
|
+ delta_tower1_x= -SIN_60*radius; // front left tower
|
|
3123
|
+ delta_tower1_y= -COS_60*radius;
|
|
3124
|
+ delta_tower2_x= SIN_60*radius; // front right tower
|
|
3125
|
+ delta_tower2_y= -COS_60*radius;
|
|
3126
|
+ delta_tower3_x= 0.0; // back middle tower
|
|
3127
|
+ delta_tower3_y= radius;
|
|
3128
|
+ delta_diagonal_rod_2= sq(diagonal_rod);
|
|
3129
|
+}
|
|
3130
|
+
|
3094
|
3131
|
void calculate_delta(float cartesian[3])
|
3095
|
3132
|
{
|
3096
|
|
- delta[X_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3097
|
|
- - sq(DELTA_TOWER1_X-cartesian[X_AXIS])
|
3098
|
|
- - sq(DELTA_TOWER1_Y-cartesian[Y_AXIS])
|
|
3133
|
+ delta[X_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3134
|
+ - sq(delta_tower1_x-cartesian[X_AXIS])
|
|
3135
|
+ - sq(delta_tower1_y-cartesian[Y_AXIS])
|
3099
|
3136
|
) + cartesian[Z_AXIS];
|
3100
|
|
- delta[Y_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3101
|
|
- - sq(DELTA_TOWER2_X-cartesian[X_AXIS])
|
3102
|
|
- - sq(DELTA_TOWER2_Y-cartesian[Y_AXIS])
|
|
3137
|
+ delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3138
|
+ - sq(delta_tower2_x-cartesian[X_AXIS])
|
|
3139
|
+ - sq(delta_tower2_y-cartesian[Y_AXIS])
|
3103
|
3140
|
) + cartesian[Z_AXIS];
|
3104
|
|
- delta[Z_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3105
|
|
- - sq(DELTA_TOWER3_X-cartesian[X_AXIS])
|
3106
|
|
- - sq(DELTA_TOWER3_Y-cartesian[Y_AXIS])
|
|
3141
|
+ delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3142
|
+ - sq(delta_tower3_x-cartesian[X_AXIS])
|
|
3143
|
+ - sq(delta_tower3_y-cartesian[Y_AXIS])
|
3107
|
3144
|
) + cartesian[Z_AXIS];
|
3108
|
3145
|
/*
|
3109
|
3146
|
SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
|
|
@@ -3133,7 +3170,7 @@ void prepare_move()
|
3133
|
3170
|
if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
|
3134
|
3171
|
if (cartesian_mm < 0.000001) { return; }
|
3135
|
3172
|
float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
|
3136
|
|
- int steps = max(1, int(DELTA_SEGMENTS_PER_SECOND * seconds));
|
|
3173
|
+ int steps = max(1, int(delta_segments_per_second * seconds));
|
3137
|
3174
|
// SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
|
3138
|
3175
|
// SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
|
3139
|
3176
|
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
|