MMU2 S Mode spins the BMG gears during C0 (#19429)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							e26edbc623
						
					
				
				
					commit
					def328eec1
				
			| @@ -54,6 +54,8 @@ MMU2 mmu2; | |||||||
| #define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0) | #define MMU_CMD_TIMEOUT 45000UL // 45s timeout for mmu commands (except P0) | ||||||
| #define MMU_P0_TIMEOUT 3000UL   // Timeout for P0 command: 3seconds | #define MMU_P0_TIMEOUT 3000UL   // Timeout for P0 command: 3seconds | ||||||
|  |  | ||||||
|  | #define MMU2_COMMAND(S) tx_str_P(PSTR(S "\n")) | ||||||
|  |  | ||||||
| #if ENABLED(MMU_EXTRUDER_SENSOR) | #if ENABLED(MMU_EXTRUDER_SENSOR) | ||||||
|   uint8_t mmu_idl_sens = 0; |   uint8_t mmu_idl_sens = 0; | ||||||
|   static bool mmu_loading_flag = false; |   static bool mmu_loading_flag = false; | ||||||
| @@ -152,7 +154,7 @@ void MMU2::reset() { | |||||||
|     safe_delay(20); |     safe_delay(20); | ||||||
|     WRITE(MMU2_RST_PIN, HIGH); |     WRITE(MMU2_RST_PIN, HIGH); | ||||||
|   #else |   #else | ||||||
|     tx_str_P(PSTR("X0\n")); // Send soft reset |     MMU2_COMMAND("X0"); // Send soft reset | ||||||
|   #endif |   #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -175,9 +177,7 @@ void MMU2::mmu_loop() { | |||||||
|         DEBUG_ECHOLNPGM("MMU => 'start'"); |         DEBUG_ECHOLNPGM("MMU => 'start'"); | ||||||
|         DEBUG_ECHOLNPGM("MMU <= 'S1'"); |         DEBUG_ECHOLNPGM("MMU <= 'S1'"); | ||||||
|  |  | ||||||
|         // send "read version" request |         MMU2_COMMAND("S1");   // Read Version | ||||||
|         tx_str_P(PSTR("S1\n")); |  | ||||||
|  |  | ||||||
|         state = -2; |         state = -2; | ||||||
|       } |       } | ||||||
|       else if (millis() > 3000000) { |       else if (millis() > 3000000) { | ||||||
| @@ -192,7 +192,7 @@ void MMU2::mmu_loop() { | |||||||
|  |  | ||||||
|         DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); |         DEBUG_ECHOLNPAIR("MMU => ", version, "\nMMU <= 'S2'"); | ||||||
|  |  | ||||||
|         tx_str_P(PSTR("S2\n")); // read build number |         MMU2_COMMAND("S2");   // Read Build Number | ||||||
|         state = -3; |         state = -3; | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
| @@ -208,13 +208,13 @@ void MMU2::mmu_loop() { | |||||||
|         #if ENABLED(MMU2_MODE_12V) |         #if ENABLED(MMU2_MODE_12V) | ||||||
|           DEBUG_ECHOLNPGM("MMU <= 'M1'"); |           DEBUG_ECHOLNPGM("MMU <= 'M1'"); | ||||||
|  |  | ||||||
|           tx_str_P(PSTR("M1\n")); // switch to stealth mode |           MMU2_COMMAND("M1");   // Stealth Mode | ||||||
|           state = -5; |           state = -5; | ||||||
|  |  | ||||||
|         #else |         #else | ||||||
|           DEBUG_ECHOLNPGM("MMU <= 'P0'"); |           DEBUG_ECHOLNPGM("MMU <= 'P0'"); | ||||||
|  |  | ||||||
|           tx_str_P(PSTR("P0\n")); // read finda |           MMU2_COMMAND("P0");   // Read FINDA | ||||||
|           state = -4; |           state = -4; | ||||||
|         #endif |         #endif | ||||||
|       } |       } | ||||||
| @@ -228,7 +228,7 @@ void MMU2::mmu_loop() { | |||||||
|  |  | ||||||
|         DEBUG_ECHOLNPGM("MMU <= 'P0'"); |         DEBUG_ECHOLNPGM("MMU <= 'P0'"); | ||||||
|  |  | ||||||
|         tx_str_P(PSTR("P0\n")); // read finda |         MMU2_COMMAND("P0");   // Read FINDA | ||||||
|         state = -4; |         state = -4; | ||||||
|       } |       } | ||||||
|       break; |       break; | ||||||
| @@ -266,14 +266,14 @@ void MMU2::mmu_loop() { | |||||||
|         else if (cmd == MMU_CMD_C0) { |         else if (cmd == MMU_CMD_C0) { | ||||||
|           // continue loading |           // continue loading | ||||||
|           DEBUG_ECHOLNPGM("MMU <= 'C0'"); |           DEBUG_ECHOLNPGM("MMU <= 'C0'"); | ||||||
|           tx_str_P(PSTR("C0\n")); |           MMU2_COMMAND("C0"); | ||||||
|           state = 3; // wait for response |           state = 3; // wait for response | ||||||
|         } |         } | ||||||
|         else if (cmd == MMU_CMD_U0) { |         else if (cmd == MMU_CMD_U0) { | ||||||
|           // unload current |           // unload current | ||||||
|           DEBUG_ECHOLNPGM("MMU <= 'U0'"); |           DEBUG_ECHOLNPGM("MMU <= 'U0'"); | ||||||
|  |  | ||||||
|           tx_str_P(PSTR("U0\n")); |           MMU2_COMMAND("U0"); | ||||||
|           state = 3; // wait for response |           state = 3; // wait for response | ||||||
|         } |         } | ||||||
|         else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { |         else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { | ||||||
| @@ -286,7 +286,7 @@ void MMU2::mmu_loop() { | |||||||
|         else if (cmd == MMU_CMD_R0) { |         else if (cmd == MMU_CMD_R0) { | ||||||
|           // recover after eject |           // recover after eject | ||||||
|           DEBUG_ECHOLNPGM("MMU <= 'R0'"); |           DEBUG_ECHOLNPGM("MMU <= 'R0'"); | ||||||
|           tx_str_P(PSTR("R0\n")); |           MMU2_COMMAND("R0"); | ||||||
|           state = 3; // wait for response |           state = 3; // wait for response | ||||||
|         } |         } | ||||||
|         else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { |         else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { | ||||||
| @@ -303,8 +303,7 @@ void MMU2::mmu_loop() { | |||||||
|         cmd = MMU_CMD_NONE; |         cmd = MMU_CMD_NONE; | ||||||
|       } |       } | ||||||
|       else if (ELAPSED(millis(), prev_P0_request + 300)) { |       else if (ELAPSED(millis(), prev_P0_request + 300)) { | ||||||
|         // read FINDA |         MMU2_COMMAND("P0"); // Read FINDA | ||||||
|         tx_str_P(PSTR("P0\n")); |  | ||||||
|         state = 2; // wait for response |         state = 2; // wait for response | ||||||
|       } |       } | ||||||
|  |  | ||||||
| @@ -332,19 +331,32 @@ void MMU2::mmu_loop() { | |||||||
|       #if ENABLED(MMU_EXTRUDER_SENSOR) |       #if ENABLED(MMU_EXTRUDER_SENSOR) | ||||||
|         if (mmu_idl_sens) { |         if (mmu_idl_sens) { | ||||||
|           if (FILAMENT_PRESENT() && mmu_loading_flag) { |           if (FILAMENT_PRESENT() && mmu_loading_flag) { | ||||||
|             DEBUG_ECHOLNPGM("MMU <= 'A'\n"); |             DEBUG_ECHOLNPGM("MMU <= 'A'"); | ||||||
|             tx_str_P(PSTR("A\n")); // send 'abort' request |             MMU2_COMMAND("A"); // send 'abort' request | ||||||
|             mmu_idl_sens = 0; |             mmu_idl_sens = 0; | ||||||
|             DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT\n"); |             DEBUG_ECHOLNPGM("MMU IDLER_SENSOR = 0 - ABORT"); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       #endif |       #endif | ||||||
|  |  | ||||||
|       if (rx_ok()) { |       if (rx_ok()) { | ||||||
|         DEBUG_ECHOLNPGM("MMU => 'ok'"); |         // response to C0 mmu command in PRUSA_MMU2_S_MODE | ||||||
|         ready = true; |         bool can_reset = true; | ||||||
|         state = 1; |         if (ENABLED(PRUSA_MMU2_S_MODE) && last_cmd == MMU_CMD_C0) { | ||||||
|         last_cmd = MMU_CMD_NONE; |           if (!mmu2s_triggered) { | ||||||
|  |             can_reset = false; | ||||||
|  |             // MMU ok received but filament sensor not triggered, retrying... | ||||||
|  |             DEBUG_ECHOLNPGM("MMU => 'ok' (filament not present in gears)"); | ||||||
|  |             DEBUG_ECHOLNPGM("MMU <= 'C0' (keep trying)"); | ||||||
|  |             MMU2_COMMAND("C0"); | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |         if (can_reset) { | ||||||
|  |           DEBUG_ECHOLNPGM("MMU => 'ok'"); | ||||||
|  |           ready = true; | ||||||
|  |           state = 1; | ||||||
|  |           last_cmd = MMU_CMD_NONE; | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|       else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { |       else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { | ||||||
|         // resend request after timeout |         // resend request after timeout | ||||||
| @@ -862,9 +874,18 @@ void MMU2::filament_runout() { | |||||||
|  |  | ||||||
|   void MMU2::check_filament() { |   void MMU2::check_filament() { | ||||||
|     const bool present = FILAMENT_PRESENT(); |     const bool present = FILAMENT_PRESENT(); | ||||||
|     if (present && !mmu2s_triggered) { |     if (cmd == MMU_CMD_NONE && last_cmd == MMU_CMD_C0) { | ||||||
|       DEBUG_ECHOLNPGM("MMU <= 'A'"); |       if (present && !mmu2s_triggered) { | ||||||
|       tx_str_P(PSTR("A\n")); |         DEBUG_ECHOLNPGM("MMU <= 'A'"); | ||||||
|  |         tx_str_P(PSTR("A\n")); | ||||||
|  |       } | ||||||
|  |       // Slowly spin the extruder during C0 | ||||||
|  |       else { | ||||||
|  |         while (planner.movesplanned() < 3) { | ||||||
|  |           current_position.e += 0.25; | ||||||
|  |           line_to_current_position(MMM_TO_MMS(120)); | ||||||
|  |         } | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|     mmu2s_triggered = present; |     mmu2s_triggered = present; | ||||||
|   } |   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user