Browse Source

Merge pull request #7096 from thinkyhead/redo_DSE

Support for two switching extruders
Scott Lahteine 8 years ago
parent
commit
7b79f443ef
5 changed files with 75 additions and 49 deletions
  1. 4
    1
      Marlin/Configuration.h
  2. 35
    28
      Marlin/Marlin_main.cpp
  3. 12
    16
      Marlin/SanityCheck.h
  4. 11
    1
      Marlin/pins.h
  5. 13
    3
      Marlin/stepper_indirection.h

+ 4
- 1
Marlin/Configuration.h View File

142
 //#define SWITCHING_EXTRUDER
142
 //#define SWITCHING_EXTRUDER
143
 #if ENABLED(SWITCHING_EXTRUDER)
143
 #if ENABLED(SWITCHING_EXTRUDER)
144
   #define SWITCHING_EXTRUDER_SERVO_NR 0
144
   #define SWITCHING_EXTRUDER_SERVO_NR 0
145
-  #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1
145
+  #define SWITCHING_EXTRUDER_SERVO_ANGLES { 0, 90 } // Angles for E0, E1[, E2, E3]
146
+  #if EXTRUDERS > 3
147
+    #define SWITCHING_EXTRUDER_E23_SERVO_NR 1
148
+  #endif
146
 #endif
149
 #endif
147
 
150
 
148
 // A dual-nozzle that uses a servomotor to raise/lower one of the nozzles
151
 // A dual-nozzle that uses a servomotor to raise/lower one of the nozzles

+ 35
- 28
Marlin/Marlin_main.cpp View File

9843
 }
9843
 }
9844
 
9844
 
9845
 #if ENABLED(SWITCHING_EXTRUDER)
9845
 #if ENABLED(SWITCHING_EXTRUDER)
9846
-  inline void move_extruder_servo(uint8_t e) {
9847
-    const int angles[2] = SWITCHING_EXTRUDER_SERVO_ANGLES;
9848
-    MOVE_SERVO(SWITCHING_EXTRUDER_SERVO_NR, angles[e]);
9849
-    safe_delay(500);
9846
+  #if EXTRUDERS > 3
9847
+    #define REQ_ANGLES 4
9848
+    #define _SERVO_NR (e < 2 ? SWITCHING_EXTRUDER_SERVO_NR : SWITCHING_EXTRUDER_E23_SERVO_NR)
9849
+  #else
9850
+    #define REQ_ANGLES 2
9851
+    #define _SERVO_NR SWITCHING_EXTRUDER_SERVO_NR
9852
+  #endif
9853
+  inline void move_extruder_servo(const uint8_t e) {
9854
+    constexpr int16_t angles[] = SWITCHING_EXTRUDER_SERVO_ANGLES;
9855
+    static_assert(COUNT(angles) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
9856
+    stepper.synchronize();
9857
+    #if EXTRUDERS & 1
9858
+      if (e < EXTRUDERS - 1)
9859
+    #endif
9860
+    {
9861
+      MOVE_SERVO(_SERVO_NR, angles[e]);
9862
+      safe_delay(500);
9863
+    }
9850
   }
9864
   }
9851
-#endif
9865
+#endif // SWITCHING_EXTRUDER
9852
 
9866
 
9853
 #if ENABLED(SWITCHING_NOZZLE)
9867
 #if ENABLED(SWITCHING_NOZZLE)
9854
-  inline void move_nozzle_servo(uint8_t e) {
9855
-    const int angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
9868
+  inline void move_nozzle_servo(const uint8_t e) {
9869
+    const int16_t angles[2] = SWITCHING_NOZZLE_SERVO_ANGLES;
9870
+    stepper.synchronize();
9856
     MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]);
9871
     MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]);
9857
     safe_delay(500);
9872
     safe_delay(500);
9858
   }
9873
   }
9859
 #endif
9874
 #endif
9860
 
9875
 
9861
-inline void invalid_extruder_error(const uint8_t &e) {
9876
+inline void invalid_extruder_error(const uint8_t e) {
9862
   SERIAL_ECHO_START();
9877
   SERIAL_ECHO_START();
9863
   SERIAL_CHAR('T');
9878
   SERIAL_CHAR('T');
9864
   SERIAL_ECHO_F(e, DEC);
9879
   SERIAL_ECHO_F(e, DEC);
9880
+  SERIAL_CHAR(' ');
9865
   SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
9881
   SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
9866
 }
9882
 }
9867
 
9883
 
9881
 
9897
 
9882
   #else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1
9898
   #else // !MIXING_EXTRUDER || MIXING_VIRTUAL_TOOLS <= 1
9883
 
9899
 
9884
-    #if HOTENDS > 1
9900
+    if (tmp_extruder >= EXTRUDERS)
9901
+      return invalid_extruder_error(tmp_extruder);
9885
 
9902
 
9886
-      if (tmp_extruder >= EXTRUDERS)
9887
-        return invalid_extruder_error(tmp_extruder);
9903
+    #if HOTENDS > 1
9888
 
9904
 
9889
       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
9905
       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
9890
 
9906
 
10006
         #else // !DUAL_X_CARRIAGE
10022
         #else // !DUAL_X_CARRIAGE
10007
 
10023
 
10008
           #if ENABLED(SWITCHING_NOZZLE)
10024
           #if ENABLED(SWITCHING_NOZZLE)
10025
+            #define DONT_SWITCH (SWITCHING_EXTRUDER_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR)
10009
             // <0 if the new nozzle is higher, >0 if lower. A bigger raise when lower.
10026
             // <0 if the new nozzle is higher, >0 if lower. A bigger raise when lower.
10010
             const float z_diff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder],
10027
             const float z_diff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder],
10011
                         z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
10028
                         z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
10013
             // Always raise by some amount (destination copied from current_position earlier)
10030
             // Always raise by some amount (destination copied from current_position earlier)
10014
             current_position[Z_AXIS] += z_raise;
10031
             current_position[Z_AXIS] += z_raise;
10015
             planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
10032
             planner.buffer_line_kinematic(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
10016
-            stepper.synchronize();
10017
-
10018
-            move_nozzle_servo(active_extruder);
10019
-          #endif
10020
-
10021
-          #if ENABLED(SWITCHING_EXTRUDER)
10022
-            #if !(ENABLED(SWITCHING_NOZZLE) && (SWITCHING_EXTRUDER_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR))
10023
-              stepper.synchronize();
10024
-              move_extruder_servo(active_extruder);
10025
-            #endif
10033
+            move_nozzle_servo(tmp_extruder);
10026
           #endif
10034
           #endif
10027
 
10035
 
10028
           /**
10036
           /**
10167
 
10175
 
10168
     #else // HOTENDS <= 1
10176
     #else // HOTENDS <= 1
10169
 
10177
 
10170
-      // Set the new active extruder
10171
-      active_extruder = tmp_extruder;
10172
-
10173
       UNUSED(fr_mm_s);
10178
       UNUSED(fr_mm_s);
10174
       UNUSED(no_move);
10179
       UNUSED(no_move);
10175
 
10180
 
10176
-      #if ENABLED(SWITCHING_EXTRUDER)
10177
-        stepper.synchronize();
10178
-        move_extruder_servo(active_extruder);
10179
-      #endif
10181
+      // Set the new active extruder
10182
+      active_extruder = tmp_extruder;
10180
 
10183
 
10181
     #endif // HOTENDS <= 1
10184
     #endif // HOTENDS <= 1
10182
 
10185
 
10186
+    #if ENABLED(SWITCHING_EXTRUDER) && !DONT_SWITCH
10187
+      move_extruder_servo(active_extruder);
10188
+    #endif
10189
+
10183
     SERIAL_ECHO_START();
10190
     SERIAL_ECHO_START();
10184
     SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder);
10191
     SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder);
10185
 
10192
 

+ 12
- 16
Marlin/SanityCheck.h View File

355
 #endif
355
 #endif
356
 
356
 
357
 /**
357
 /**
358
- * A dual nozzle x-carriage with switching servo
358
+ * A Dual Nozzle carriage with switching servo
359
  */
359
  */
360
 #if ENABLED(SWITCHING_NOZZLE)
360
 #if ENABLED(SWITCHING_NOZZLE)
361
-  #if ENABLED(SINGLENOZZLE)
361
+  #if ENABLED(DUAL_X_CARRIAGE)
362
+    #error "SWITCHING_NOZZLE and DUAL_X_CARRIAGE are incompatible."
363
+  #elif ENABLED(SINGLENOZZLE)
362
     #error "SWITCHING_NOZZLE and SINGLENOZZLE are incompatible."
364
     #error "SWITCHING_NOZZLE and SINGLENOZZLE are incompatible."
363
-  #elif EXTRUDERS < 2
365
+  #elif EXTRUDERS != 2
364
     #error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS."
366
     #error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS."
365
   #elif NUM_SERVOS < 1
367
   #elif NUM_SERVOS < 1
366
     #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1."
368
     #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1."
370
 /**
372
 /**
371
  * Single Stepper Dual Extruder with switching servo
373
  * Single Stepper Dual Extruder with switching servo
372
  */
374
  */
373
-#if ENABLED(SWITCHING_EXTRUDER)
374
-  #if ENABLED(DUAL_X_CARRIAGE)
375
-    #error "SWITCHING_EXTRUDER and DUAL_X_CARRIAGE are incompatible."
376
-  #elif EXTRUDERS != 2
377
-    #error "SWITCHING_EXTRUDER requires exactly 2 EXTRUDERS."
378
-  #elif NUM_SERVOS < 1
379
-    #error "SWITCHING_EXTRUDER requires NUM_SERVOS >= 1."
380
-  #endif
375
+#if ENABLED(SWITCHING_EXTRUDER) && NUM_SERVOS < 1
376
+  #error "SWITCHING_EXTRUDER requires NUM_SERVOS >= 1."
381
 #endif
377
 #endif
382
 
378
 
383
 /**
379
 /**
938
 #endif
934
 #endif
939
 
935
 
940
 /**
936
 /**
941
- * Test Extruder Pins
937
+ * Test Extruder Stepper Pins
942
  */
938
  */
943
-#if EXTRUDERS > 4
939
+#if E_STEPPERS > 4
944
   #if !PIN_EXISTS(E4_STEP) || !PIN_EXISTS(E4_DIR) || !PIN_EXISTS(E4_ENABLE)
940
   #if !PIN_EXISTS(E4_STEP) || !PIN_EXISTS(E4_DIR) || !PIN_EXISTS(E4_ENABLE)
945
     #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
941
     #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
946
   #endif
942
   #endif
947
-#elif EXTRUDERS > 3
943
+#elif E_STEPPERS > 3
948
   #if !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE)
944
   #if !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE)
949
     #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
945
     #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
950
   #endif
946
   #endif
951
-#elif EXTRUDERS > 2
947
+#elif E_STEPPERS > 2
952
   #if !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE)
948
   #if !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE)
953
     #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
949
     #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
954
   #endif
950
   #endif
955
-#elif EXTRUDERS > 1
951
+#elif E_STEPPERS > 1
956
   #if !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE)
952
   #if !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE)
957
     #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
953
     #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
958
   #endif
954
   #endif

+ 11
- 1
Marlin/pins.h View File

330
 #define _E3_PINS
330
 #define _E3_PINS
331
 #define _E4_PINS
331
 #define _E4_PINS
332
 
332
 
333
-#if EXTRUDERS > 1
333
+#if ENABLED(SWITCHING_EXTRUDER)
334
+                      // Tools 0 and 1 use E0
335
+  #if EXTRUDERS > 2   // Tools 2 and 3 use E1
336
+    #undef _E1_PINS
337
+    #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN,
338
+    #if EXTRUDERS > 4 // Tools 4 and 5 use E2
339
+      #undef _E2_PINS
340
+      #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN,
341
+    #endif
342
+  #endif
343
+#elif EXTRUDERS > 1
334
   #undef _E1_PINS
344
   #undef _E1_PINS
335
   #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN,
345
   #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN,
336
   #if EXTRUDERS > 2
346
   #if EXTRUDERS > 2

+ 13
- 3
Marlin/stepper_indirection.h View File

416
  * Extruder indirection for the single E axis
416
  * Extruder indirection for the single E axis
417
  */
417
  */
418
 #if ENABLED(SWITCHING_EXTRUDER)
418
 #if ENABLED(SWITCHING_EXTRUDER)
419
-  #define E_STEP_WRITE(v) E0_STEP_WRITE(v)
420
-  #define NORM_E_DIR() E0_DIR_WRITE(current_block->active_extruder ?  INVERT_E0_DIR : !INVERT_E0_DIR)
421
-  #define  REV_E_DIR() E0_DIR_WRITE(current_block->active_extruder ? !INVERT_E0_DIR :  INVERT_E0_DIR)
419
+  #if EXTRUDERS == 2
420
+    #define E_STEP_WRITE(v) E0_STEP_WRITE(v)
421
+    #define NORM_E_DIR() E0_DIR_WRITE(current_block->active_extruder ?  INVERT_E0_DIR : !INVERT_E0_DIR)
422
+    #define  REV_E_DIR() E0_DIR_WRITE(current_block->active_extruder ? !INVERT_E0_DIR :  INVERT_E0_DIR)
423
+  #elif EXTRUDERS > 4
424
+    #define E_STEP_WRITE(v) { if (current_block->active_extruder < 2) E0_STEP_WRITE(v); else if (current_block->active_extruder < 4) E1_STEP_WRITE(v); else E2_STEP_WRITE(v); }
425
+    #define NORM_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(!INVERT_E2_DIR); } }
426
+    #define REV_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 4: E2_DIR_WRITE(INVERT_E2_DIR); } }
427
+  #elif EXTRUDERS > 2
428
+    #define E_STEP_WRITE(v) { if (current_block->active_extruder < 2) E0_STEP_WRITE(v); else if (current_block->active_extruder < 4) E1_STEP_WRITE(v); else E1_STEP_WRITE(v); }
429
+    #define NORM_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(INVERT_E1_DIR); } }
430
+    #define REV_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(INVERT_E0_DIR); break; case 1: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 2: E1_DIR_WRITE(INVERT_E1_DIR); break; case 3: E1_DIR_WRITE(!INVERT_E1_DIR); } }
431
+  #endif
422
 #elif EXTRUDERS > 4
432
 #elif EXTRUDERS > 4
423
   #define E_STEP_WRITE(v) { switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); break; case 4: E4_STEP_WRITE(v); } }
433
   #define E_STEP_WRITE(v) { switch (current_block->active_extruder) { case 0: E0_STEP_WRITE(v); break; case 1: E1_STEP_WRITE(v); break; case 2: E2_STEP_WRITE(v); break; case 3: E3_STEP_WRITE(v); break; case 4: E4_STEP_WRITE(v); } }
424
   #define NORM_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }
434
   #define NORM_E_DIR() { switch (current_block->active_extruder) { case 0: E0_DIR_WRITE(!INVERT_E0_DIR); break; case 1: E1_DIR_WRITE(!INVERT_E1_DIR); break; case 2: E2_DIR_WRITE(!INVERT_E2_DIR); break; case 3: E3_DIR_WRITE(!INVERT_E3_DIR); break; case 4: E4_DIR_WRITE(!INVERT_E4_DIR); } }

Loading…
Cancel
Save