|
@@ -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 adjustemnt
|
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.
|
|
@@ -246,9 +247,21 @@ int EtoPPressure=0;
|
246
|
247
|
#endif
|
247
|
248
|
|
248
|
249
|
#ifdef DELTA
|
249
|
|
-float delta[3] = {0.0, 0.0, 0.0};
|
250
|
|
-#endif
|
251
|
|
-
|
|
250
|
+ float delta[3] = {0.0, 0.0, 0.0};
|
|
251
|
+ #define SIN_60 0.8660254037844386
|
|
252
|
+ #define COS_60 0.5
|
|
253
|
+ // these are the default values, can be overriden with M665
|
|
254
|
+ float delta_radius= DELTA_RADIUS;
|
|
255
|
+ float delta_tower1_x= -SIN_60*delta_radius; // front left tower
|
|
256
|
+ float delta_tower1_y= -COS_60*delta_radius;
|
|
257
|
+ float delta_tower2_x= SIN_60*delta_radius; // front right tower
|
|
258
|
+ float delta_tower2_y= -COS_60*delta_radius;
|
|
259
|
+ float delta_tower3_x= 0.0; // back middle tower
|
|
260
|
+ float delta_tower3_y= delta_radius;
|
|
261
|
+ float delta_diagonal_rod= DELTA_DIAGONAL_ROD;
|
|
262
|
+ float delta_diagonal_rod_2= sq(delta_diagonal_rod);
|
|
263
|
+ float delta_segments_per_second= DELTA_SEGMENTS_PER_SECOND;
|
|
264
|
+#endif
|
252
|
265
|
|
253
|
266
|
//===========================================================================
|
254
|
267
|
//=============================private variables=============================
|
|
@@ -2267,6 +2280,19 @@ void process_commands()
|
2267
|
2280
|
}
|
2268
|
2281
|
break;
|
2269
|
2282
|
#ifdef DELTA
|
|
2283
|
+ case 665: // M665 set delta configurations L<diagonal_rod> R<delta_radius> S<segments_per_sec>
|
|
2284
|
+ if(code_seen('L')) {
|
|
2285
|
+ delta_diagonal_rod= code_value();
|
|
2286
|
+ }
|
|
2287
|
+ if(code_seen('R')) {
|
|
2288
|
+ delta_radius= code_value();
|
|
2289
|
+ }
|
|
2290
|
+ if(code_seen('S')) {
|
|
2291
|
+ delta_segments_per_second= code_value();
|
|
2292
|
+ }
|
|
2293
|
+
|
|
2294
|
+ recalc_delta_settings(delta_radius, delta_diagonal_rod);
|
|
2295
|
+ break;
|
2270
|
2296
|
case 666: // M666 set delta endstop adjustemnt
|
2271
|
2297
|
for(int8_t i=0; i < 3; i++)
|
2272
|
2298
|
{
|
|
@@ -3101,19 +3127,30 @@ void clamp_to_software_endstops(float target[3])
|
3101
|
3127
|
}
|
3102
|
3128
|
|
3103
|
3129
|
#ifdef DELTA
|
|
3130
|
+void recalc_delta_settings(float radius, float diagonal_rod)
|
|
3131
|
+{
|
|
3132
|
+ delta_tower1_x= -SIN_60*radius; // front left tower
|
|
3133
|
+ delta_tower1_y= -COS_60*radius;
|
|
3134
|
+ delta_tower2_x= SIN_60*radius; // front right tower
|
|
3135
|
+ delta_tower2_y= -COS_60*radius;
|
|
3136
|
+ delta_tower3_x= 0.0; // back middle tower
|
|
3137
|
+ delta_tower3_y= radius;
|
|
3138
|
+ delta_diagonal_rod_2= sq(diagonal_rod);
|
|
3139
|
+}
|
|
3140
|
+
|
3104
|
3141
|
void calculate_delta(float cartesian[3])
|
3105
|
3142
|
{
|
3106
|
|
- delta[X_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3107
|
|
- - sq(DELTA_TOWER1_X-cartesian[X_AXIS])
|
3108
|
|
- - sq(DELTA_TOWER1_Y-cartesian[Y_AXIS])
|
|
3143
|
+ delta[X_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3144
|
+ - sq(delta_tower1_x-cartesian[X_AXIS])
|
|
3145
|
+ - sq(delta_tower1_y-cartesian[Y_AXIS])
|
3109
|
3146
|
) + cartesian[Z_AXIS];
|
3110
|
|
- delta[Y_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3111
|
|
- - sq(DELTA_TOWER2_X-cartesian[X_AXIS])
|
3112
|
|
- - sq(DELTA_TOWER2_Y-cartesian[Y_AXIS])
|
|
3147
|
+ delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3148
|
+ - sq(delta_tower2_x-cartesian[X_AXIS])
|
|
3149
|
+ - sq(delta_tower2_y-cartesian[Y_AXIS])
|
3113
|
3150
|
) + cartesian[Z_AXIS];
|
3114
|
|
- delta[Z_AXIS] = sqrt(DELTA_DIAGONAL_ROD_2
|
3115
|
|
- - sq(DELTA_TOWER3_X-cartesian[X_AXIS])
|
3116
|
|
- - sq(DELTA_TOWER3_Y-cartesian[Y_AXIS])
|
|
3151
|
+ delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
|
|
3152
|
+ - sq(delta_tower3_x-cartesian[X_AXIS])
|
|
3153
|
+ - sq(delta_tower3_y-cartesian[Y_AXIS])
|
3117
|
3154
|
) + cartesian[Z_AXIS];
|
3118
|
3155
|
/*
|
3119
|
3156
|
SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
|
|
@@ -3143,7 +3180,7 @@ void prepare_move()
|
3143
|
3180
|
if (cartesian_mm < 0.000001) { cartesian_mm = abs(difference[E_AXIS]); }
|
3144
|
3181
|
if (cartesian_mm < 0.000001) { return; }
|
3145
|
3182
|
float seconds = 6000 * cartesian_mm / feedrate / feedmultiply;
|
3146
|
|
- int steps = max(1, int(DELTA_SEGMENTS_PER_SECOND * seconds));
|
|
3183
|
+ int steps = max(1, int(delta_segments_per_second * seconds));
|
3147
|
3184
|
// SERIAL_ECHOPGM("mm="); SERIAL_ECHO(cartesian_mm);
|
3148
|
3185
|
// SERIAL_ECHOPGM(" seconds="); SERIAL_ECHO(seconds);
|
3149
|
3186
|
// SERIAL_ECHOPGM(" steps="); SERIAL_ECHOLN(steps);
|