소스 검색

Support for two switching extruders

Scott Lahteine 7 년 전
부모
커밋
907cafcbfd
5개의 변경된 파일75개의 추가작업 그리고 49개의 파일을 삭제
  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 파일 보기

@@ -142,7 +142,10 @@
142 142
 //#define SWITCHING_EXTRUDER
143 143
 #if ENABLED(SWITCHING_EXTRUDER)
144 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 149
 #endif
147 150
 
148 151
 // A dual-nozzle that uses a servomotor to raise/lower one of the nozzles

+ 35
- 28
Marlin/Marlin_main.cpp 파일 보기

@@ -9843,25 +9843,41 @@ inline void gcode_M999() {
9843 9843
 }
9844 9844
 
9845 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 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 9871
     MOVE_SERVO(SWITCHING_NOZZLE_SERVO_NR, angles[e]);
9857 9872
     safe_delay(500);
9858 9873
   }
9859 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 9877
   SERIAL_ECHO_START();
9863 9878
   SERIAL_CHAR('T');
9864 9879
   SERIAL_ECHO_F(e, DEC);
9880
+  SERIAL_CHAR(' ');
9865 9881
   SERIAL_ECHOLN(MSG_INVALID_EXTRUDER);
9866 9882
 }
9867 9883
 
@@ -9881,10 +9897,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
9881 9897
 
9882 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 9905
       const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
9890 9906
 
@@ -10006,6 +10022,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
10006 10022
         #else // !DUAL_X_CARRIAGE
10007 10023
 
10008 10024
           #if ENABLED(SWITCHING_NOZZLE)
10025
+            #define DONT_SWITCH (SWITCHING_EXTRUDER_SERVO_NR == SWITCHING_NOZZLE_SERVO_NR)
10009 10026
             // <0 if the new nozzle is higher, >0 if lower. A bigger raise when lower.
10010 10027
             const float z_diff = hotend_offset[Z_AXIS][active_extruder] - hotend_offset[Z_AXIS][tmp_extruder],
10011 10028
                         z_raise = 0.3 + (z_diff > 0.0 ? z_diff : 0.0);
@@ -10013,16 +10030,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
10013 10030
             // Always raise by some amount (destination copied from current_position earlier)
10014 10031
             current_position[Z_AXIS] += z_raise;
10015 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 10034
           #endif
10027 10035
 
10028 10036
           /**
@@ -10167,19 +10175,18 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
10167 10175
 
10168 10176
     #else // HOTENDS <= 1
10169 10177
 
10170
-      // Set the new active extruder
10171
-      active_extruder = tmp_extruder;
10172
-
10173 10178
       UNUSED(fr_mm_s);
10174 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 10184
     #endif // HOTENDS <= 1
10182 10185
 
10186
+    #if ENABLED(SWITCHING_EXTRUDER) && !DONT_SWITCH
10187
+      move_extruder_servo(active_extruder);
10188
+    #endif
10189
+
10183 10190
     SERIAL_ECHO_START();
10184 10191
     SERIAL_ECHOLNPAIR(MSG_ACTIVE_EXTRUDER, (int)active_extruder);
10185 10192
 

+ 12
- 16
Marlin/SanityCheck.h 파일 보기

@@ -355,12 +355,14 @@
355 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 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 364
     #error "SWITCHING_NOZZLE and SINGLENOZZLE are incompatible."
363
-  #elif EXTRUDERS < 2
365
+  #elif EXTRUDERS != 2
364 366
     #error "SWITCHING_NOZZLE requires exactly 2 EXTRUDERS."
365 367
   #elif NUM_SERVOS < 1
366 368
     #error "SWITCHING_NOZZLE requires NUM_SERVOS >= 1."
@@ -370,14 +372,8 @@
370 372
 /**
371 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 377
 #endif
382 378
 
383 379
 /**
@@ -938,21 +934,21 @@ static_assert(1 >= 0
938 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 940
   #if !PIN_EXISTS(E4_STEP) || !PIN_EXISTS(E4_DIR) || !PIN_EXISTS(E4_ENABLE)
945 941
     #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board."
946 942
   #endif
947
-#elif EXTRUDERS > 3
943
+#elif E_STEPPERS > 3
948 944
   #if !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE)
949 945
     #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board."
950 946
   #endif
951
-#elif EXTRUDERS > 2
947
+#elif E_STEPPERS > 2
952 948
   #if !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE)
953 949
     #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board."
954 950
   #endif
955
-#elif EXTRUDERS > 1
951
+#elif E_STEPPERS > 1
956 952
   #if !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE)
957 953
     #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board."
958 954
   #endif

+ 11
- 1
Marlin/pins.h 파일 보기

@@ -330,7 +330,17 @@
330 330
 #define _E3_PINS
331 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 344
   #undef _E1_PINS
335 345
   #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN,
336 346
   #if EXTRUDERS > 2

+ 13
- 3
Marlin/stepper_indirection.h 파일 보기

@@ -416,9 +416,19 @@
416 416
  * Extruder indirection for the single E axis
417 417
  */
418 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 432
 #elif EXTRUDERS > 4
423 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 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…
취소
저장