Browse Source

MMU2 S Mode spins the BMG gears during C0 (#19429)

Trocololo 4 years ago
parent
commit
88d7f4d7be
No account linked to committer's email address
1 changed files with 44 additions and 23 deletions
  1. 44
    23
      Marlin/src/feature/mmu2/mmu2.cpp

+ 44
- 23
Marlin/src/feature/mmu2/mmu2.cpp View File

54
 #define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0)
54
 #define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0)
55
 #define MMU_P0_TIMEOUT 3000UL   // Timeout for P0 command: 3seconds
55
 #define MMU_P0_TIMEOUT 3000UL   // Timeout for P0 command: 3seconds
56
 
56
 
57
+#define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n"))
58
+
57
 #if ENABLED(MMU_EXTRUDER_SENSOR)
59
 #if ENABLED(MMU_EXTRUDER_SENSOR)
58
   uint8_t mmu_idl_sens = 0;
60
   uint8_t mmu_idl_sens = 0;
59
   static bool mmu_loading_flag = false;
61
   static bool mmu_loading_flag = false;
152
     safe_delay(20);
154
     safe_delay(20);
153
     WRITE(MMU2_RST_PIN, HIGH);
155
     WRITE(MMU2_RST_PIN, HIGH);
154
   #else
156
   #else
155
-    tx_str_P(PSTR("X0\n")); // Send soft reset
157
+    MMU2_COMMAND("X0"); // Send soft reset
156
   #endif
158
   #endif
157
 }
159
 }
158
 
160
 
175
         DEBUG_ECHOLNPGM("MMU => 'start'");
177
         DEBUG_ECHOLNPGM("MMU => 'start'");
176
         DEBUG_ECHOLNPGM("MMU <= 'S1'");
178
         DEBUG_ECHOLNPGM("MMU <= 'S1'");
177
 
179
 
178
-        // send "read version" request
179
-        tx_str_P(PSTR("S1\n"));
180
-
180
+        MMU2_COMMAND("S1");   // Read Version
181
         state = -2;
181
         state = -2;
182
       }
182
       }
183
       else if (millis() > 3000000) {
183
       else if (millis() > 3000000) {
192
 
192
 
193
         DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'");
193
         DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'");
194
 
194
 
195
-        tx_str_P(PSTR("S2\n")); // read build number
195
+        MMU2_COMMAND("S2");   // Read Build Number
196
         state = -3;
196
         state = -3;
197
       }
197
       }
198
       break;
198
       break;
208
         #if ENABLED(MMU2_MODE_12V)
208
         #if ENABLED(MMU2_MODE_12V)
209
           DEBUG_ECHOLNPGM("MMU <= 'M1'");
209
           DEBUG_ECHOLNPGM("MMU <= 'M1'");
210
 
210
 
211
-          tx_str_P(PSTR("M1\n")); // switch to stealth mode
211
+          MMU2_COMMAND("M1");   // Stealth Mode
212
           state = -5;
212
           state = -5;
213
 
213
 
214
         #else
214
         #else
215
           DEBUG_ECHOLNPGM("MMU <= 'P0'");
215
           DEBUG_ECHOLNPGM("MMU <= 'P0'");
216
 
216
 
217
-          tx_str_P(PSTR("P0\n")); // read finda
217
+          MMU2_COMMAND("P0");   // Read FINDA
218
           state = -4;
218
           state = -4;
219
         #endif
219
         #endif
220
       }
220
       }
228
 
228
 
229
         DEBUG_ECHOLNPGM("MMU <= 'P0'");
229
         DEBUG_ECHOLNPGM("MMU <= 'P0'");
230
 
230
 
231
-        tx_str_P(PSTR("P0\n")); // read finda
231
+        MMU2_COMMAND("P0");   // Read FINDA
232
         state = -4;
232
         state = -4;
233
       }
233
       }
234
       break;
234
       break;
266
         else if (cmd == MMU_CMD_C0) {
266
         else if (cmd == MMU_CMD_C0) {
267
           // continue loading
267
           // continue loading
268
           DEBUG_ECHOLNPGM("MMU <= 'C0'");
268
           DEBUG_ECHOLNPGM("MMU <= 'C0'");
269
-          tx_str_P(PSTR("C0\n"));
269
+          MMU2_COMMAND("C0");
270
           state = 3; // wait for response
270
           state = 3; // wait for response
271
         }
271
         }
272
         else if (cmd == MMU_CMD_U0) {
272
         else if (cmd == MMU_CMD_U0) {
273
           // unload current
273
           // unload current
274
           DEBUG_ECHOLNPGM("MMU <= 'U0'");
274
           DEBUG_ECHOLNPGM("MMU <= 'U0'");
275
 
275
 
276
-          tx_str_P(PSTR("U0\n"));
276
+          MMU2_COMMAND("U0");
277
           state = 3; // wait for response
277
           state = 3; // wait for response
278
         }
278
         }
279
         else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) {
279
         else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) {
286
         else if (cmd == MMU_CMD_R0) {
286
         else if (cmd == MMU_CMD_R0) {
287
           // recover after eject
287
           // recover after eject
288
           DEBUG_ECHOLNPGM("MMU <= 'R0'");
288
           DEBUG_ECHOLNPGM("MMU <= 'R0'");
289
-          tx_str_P(PSTR("R0\n"));
289
+          MMU2_COMMAND("R0");
290
           state = 3; // wait for response
290
           state = 3; // wait for response
291
         }
291
         }
292
         else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) {
292
         else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) {
303
         cmd = MMU_CMD_NONE;
303
         cmd = MMU_CMD_NONE;
304
       }
304
       }
305
       else if (ELAPSED(millis(), prev_P0_request + 300)) {
305
       else if (ELAPSED(millis(), prev_P0_request + 300)) {
306
-        // read FINDA
307
-        tx_str_P(PSTR("P0\n"));
306
+        MMU2_COMMAND("P0"); // Read FINDA
308
         state = 2; // wait for response
307
         state = 2; // wait for response
309
       }
308
       }
310
 
309
 
332
       #if ENABLED(MMU_EXTRUDER_SENSOR)
331
       #if ENABLED(MMU_EXTRUDER_SENSOR)
333
         if (mmu_idl_sens) {
332
         if (mmu_idl_sens) {
334
           if (FILAMENT_PRESENT() && mmu_loading_flag) {
333
           if (FILAMENT_PRESENT() && mmu_loading_flag) {
335
-            DEBUG_ECHOLNPGM("MMU <= 'A'\n");
336
-            tx_str_P(PSTR("A\n")); // send 'abort' request
334
+            DEBUG_ECHOLNPGM("MMU <= 'A'");
335
+            MMU2_COMMAND("A"); // send 'abort' request
337
             mmu_idl_sens = 0;
336
             mmu_idl_sens = 0;
338
-            DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT\n");
337
+            DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT");
339
           }
338
           }
340
         }
339
         }
341
       #endif
340
       #endif
342
 
341
 
343
       if (rx_ok()) {
342
       if (rx_ok()) {
344
-        DEBUG_ECHOLNPGM("MMU => 'ok'");
345
-        ready = true;
346
-        state = 1;
347
-        last_cmd = MMU_CMD_NONE;
343
+        // response to C0 mmu command in PRUSA_MMU2_S_MODE
344
+        bool can_reset = true;
345
+        if (ENABLED(PRUSA_MMU2_S_MODE) && last_cmd == MMU_CMD_C0) {
346
+          if (!mmu2s_triggered) {
347
+            can_reset = false;
348
+            // MMU ok received but filament sensor not triggered, retrying...
349
+            DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)");
350
+            DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)");
351
+            MMU2_COMMAND("C0");
352
+          }
353
+        }
354
+        if (can_reset) {
355
+          DEBUG_ECHOLNPGM("MMU => 'ok'");
356
+          ready = true;
357
+          state = 1;
358
+          last_cmd = MMU_CMD_NONE;
359
+        }
348
       }
360
       }
349
       else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) {
361
       else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) {
350
         // resend request after timeout
362
         // resend request after timeout
862
 
874
 
863
   void MMU2::check_filament() {
875
   void MMU2::check_filament() {
864
     const bool present = FILAMENT_PRESENT();
876
     const bool present = FILAMENT_PRESENT();
865
-    if (present && !mmu2s_triggered) {
866
-      DEBUG_ECHOLNPGM("MMU <= 'A'");
867
-      tx_str_P(PSTR("A\n"));
877
+    if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) {
878
+      if (present && !mmu2s_triggered) {
879
+        DEBUG_ECHOLNPGM("MMU <= 'A'");
880
+        tx_str_P(PSTR("A\n"));
881
+      }
882
+      // Slowly spin the extruder during C0
883
+      else {
884
+        while (planner.movesplanned() < 3) {
885
+          current_position.e += 0.25;
886
+          line_to_current_position(MMM_TO_MMS(120));
887
+        }
888
+      }
868
     }
889
     }
869
     mmu2s_triggered = present;
890
     mmu2s_triggered = present;
870
   }
891
   }

Loading…
Cancel
Save