소스 검색

Add M605 to dynamically set delta configuration

Save above configs in eeprom
fix docs in createTemperatureLookupMarlin.py
add missing azteegX3pro digipot settings in delta example config
Jim Morris 10 년 전
부모
커밋
af9395ac2e

+ 21
- 4
Marlin/ConfigurationStore.cpp 파일 보기

@@ -37,7 +37,7 @@ void _EEPROM_readData(int &pos, uint8_t* value, uint8_t size)
37 37
 // the default values are used whenever there is a change to the data, to prevent
38 38
 // wrong data being written to the variables.
39 39
 // ALSO:  always make sure the variables in the Store and retrieve sections are in the same order.
40
-#define EEPROM_VERSION "V10"
40
+#define EEPROM_VERSION "V11"
41 41
 
42 42
 #ifdef EEPROM_SETTINGS
43 43
 void Config_StoreSettings() 
@@ -59,6 +59,9 @@ void Config_StoreSettings()
59 59
   EEPROM_WRITE_VAR(i,add_homeing);
60 60
   #ifdef DELTA
61 61
   EEPROM_WRITE_VAR(i,endstop_adj);
62
+  EEPROM_WRITE_VAR(i,delta_radius);
63
+  EEPROM_WRITE_VAR(i,delta_diagonal_rod);
64
+  EEPROM_WRITE_VAR(i,delta_segments_per_second);
62 65
   #endif
63 66
   #ifndef ULTIPANEL
64 67
   int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED;
@@ -156,7 +159,14 @@ void Config_PrintSettings()
156 159
     SERIAL_ECHOPAIR("  M666 X",endstop_adj[0] );
157 160
     SERIAL_ECHOPAIR(" Y" ,endstop_adj[1] );
158 161
     SERIAL_ECHOPAIR(" Z" ,endstop_adj[2] );
159
-    SERIAL_ECHOLN("");
162
+	SERIAL_ECHOLN("");
163
+	SERIAL_ECHO_START;
164
+	SERIAL_ECHOLNPGM("Delta settings: L=delta_diagonal_rod, R=delta_radius, S=delta_segments_per_second");
165
+	SERIAL_ECHO_START;
166
+	SERIAL_ECHOPAIR("  M665 L",delta_diagonal_rod );
167
+	SERIAL_ECHOPAIR(" R" ,delta_radius );
168
+	SERIAL_ECHOPAIR(" S" ,delta_segments_per_second );
169
+	SERIAL_ECHOLN("");
160 170
 #endif
161 171
 #ifdef PIDTEMP
162 172
     SERIAL_ECHO_START;
@@ -199,7 +209,10 @@ void Config_RetrieveSettings()
199 209
         EEPROM_READ_VAR(i,max_e_jerk);
200 210
         EEPROM_READ_VAR(i,add_homeing);
201 211
         #ifdef DELTA
202
-        EEPROM_READ_VAR(i,endstop_adj);
212
+		EEPROM_READ_VAR(i,endstop_adj);
213
+		EEPROM_READ_VAR(i,delta_radius);
214
+		EEPROM_READ_VAR(i,delta_diagonal_rod);
215
+		EEPROM_READ_VAR(i,delta_segments_per_second);
203 216
         #endif
204 217
         #ifndef ULTIPANEL
205 218
         int plaPreheatHotendTemp, plaPreheatHPBTemp, plaPreheatFanSpeed;
@@ -264,7 +277,11 @@ void Config_ResetDefault()
264 277
     max_e_jerk=DEFAULT_EJERK;
265 278
     add_homeing[0] = add_homeing[1] = add_homeing[2] = 0;
266 279
 #ifdef DELTA
267
-    endstop_adj[0] = endstop_adj[1] = endstop_adj[2] = 0;
280
+	endstop_adj[0] = endstop_adj[1] = endstop_adj[2] = 0;
281
+	delta_radius= DELTA_RADIUS;
282
+	delta_diagonal_rod= DELTA_DIAGONAL_ROD;
283
+	delta_segments_per_second= DELTA_SEGMENTS_PER_SECOND;
284
+	recalc_delta_settings(delta_radius, delta_diagonal_rod);
268 285
 #endif
269 286
 #ifdef ULTIPANEL
270 287
     plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP;

+ 4
- 0
Marlin/Marlin.h 파일 보기

@@ -209,6 +209,10 @@ extern float current_position[NUM_AXIS] ;
209 209
 extern float add_homeing[3];
210 210
 #ifdef DELTA
211 211
 extern float endstop_adj[3];
212
+extern float delta_radius;
213
+extern float delta_diagonal_rod;
214
+extern float delta_segments_per_second;
215
+void recalc_delta_settings(float radius, float diagonal_rod);
212 216
 #endif
213 217
 extern float min_pos[3];
214 218
 extern float max_pos[3];

+ 50
- 13
Marlin/Marlin_main.cpp 파일 보기

@@ -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);

+ 5
- 4
Marlin/createTemperatureLookupMarlin.py 파일 보기

@@ -16,9 +16,9 @@ Usage: python createTemperatureLookup.py [options]
16 16
 Options:
17 17
   -h, --help        show this help
18 18
   --rp=...          pull-up resistor
19
-  --t0=ttt:rrr      low temperature temperature:resistance point (around 25C)
20
-  --t1=ttt:rrr      middle temperature temperature:resistance point (around 150C)
21
-  --t2=ttt:rrr      high temperature temperature:resistance point (around 250C)
19
+  --t1=ttt:rrr      low temperature temperature:resistance point (around 25C)
20
+  --t2=ttt:rrr      middle temperature temperature:resistance point (around 150C)
21
+  --t3=ttt:rrr      high temperature temperature:resistance point (around 250C)
22 22
   --num-temps=...   the number of temperature points to calculate (default: 20)
23 23
 """
24 24
 
@@ -98,7 +98,8 @@ def main(argv):
98 98
     
99 99
     try:
100 100
         opts, args = getopt.getopt(argv, "h", ["help", "rp=", "t1=", "t2=", "t3=", "num-temps="])
101
-    except getopt.GetoptError:
101
+    except getopt.GetoptError as err:
102
+        print  str(err)
102 103
         usage()
103 104
         sys.exit(2)
104 105
         

+ 1
- 12
Marlin/example_configurations/delta/Configuration.h 파일 보기

@@ -51,6 +51,7 @@
51 51
 // 65 = Azteeg X1
52 52
 // 66 = Melzi with ATmega1284 (MaKr3d version)
53 53
 // 67 = Azteeg X3
54
+// 68 = Azteeg X3 Pro
54 55
 // 7  = Ultimaker
55 56
 // 71 = Ultimaker (Older electronics. Pre 1.5.4. This is rare)
56 57
 // 77 = 3Drag Controller
@@ -119,18 +120,6 @@
119 120
 // Effective horizontal distance bridged by diagonal push rods.
120 121
 #define DELTA_RADIUS (DELTA_SMOOTH_ROD_OFFSET-DELTA_EFFECTOR_OFFSET-DELTA_CARRIAGE_OFFSET)
121 122
 
122
-#define DELTA_DIAGONAL_ROD_2 sq(DELTA_DIAGONAL_ROD)
123
-
124
-// Effective X/Y positions of the three vertical towers.
125
-#define SIN_60 0.8660254037844386
126
-#define COS_60 0.5
127
-#define DELTA_TOWER1_X -SIN_60*DELTA_RADIUS // front left tower
128
-#define DELTA_TOWER1_Y -COS_60*DELTA_RADIUS
129
-#define DELTA_TOWER2_X SIN_60*DELTA_RADIUS // front right tower
130
-#define DELTA_TOWER2_Y -COS_60*DELTA_RADIUS
131
-#define DELTA_TOWER3_X 0.0 // back middle tower
132
-#define DELTA_TOWER3_Y DELTA_RADIUS
133
-
134 123
 //===========================================================================
135 124
 //=============================Thermal Settings  ============================
136 125
 //===========================================================================

+ 6
- 0
Marlin/example_configurations/delta/Configuration_adv.h 파일 보기

@@ -270,6 +270,12 @@
270 270
 // Motor Current setting (Only functional when motor driver current ref pins are connected to a digital trimpot on supported boards)
271 271
 #define DIGIPOT_MOTOR_CURRENT {135,135,135,135,135} // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A)
272 272
 
273
+// uncomment to enable an I2C based DIGIPOT like on the Azteeg X3 Pro
274
+//#define DIGIPOT_I2C
275
+// Number of channels available for I2C digipot, For Azteeg X3 Pro we have 8
276
+#define DIGIPOT_I2C_NUM_CHANNELS 8
277
+// actual motor currents in Amps, need as many here as DIGIPOT_I2C_NUM_CHANNELS
278
+#define DIGIPOT_I2C_MOTOR_CURRENTS {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0}
273 279
 
274 280
 //===========================================================================
275 281
 //=============================Additional Features===========================

Loading…
취소
저장