Add SMUFF support

- Changed MMU definition to a per model basis
- Added SMUFF support (that will actually only expand multicolor up to 15 colors)
This commit is contained in:
GMagician 2020-10-27 22:56:32 +01:00
parent 8bdde8d7a0
commit 0b752435f4
26 changed files with 279 additions and 242 deletions

View file

@ -158,33 +158,22 @@
#endif #endif
/** /**
* Průša MK2 Single Nozzle Multi-Material Multiplexer, and variants. * Multi-Material Unit
* *
* This device allows one stepper driver on a control board to drive * Supported unit models:
* two to eight stepper motors, one at a time, in a manner suitable * PRUSA_MMU1: Průša MMU1 (This is the multiplexer version)
* for extruders. * PRUSA_MMU2: Průša MMU2
* * PRUSA_MMU2S Průša MMU2S (This mode requires a MK3S extruder with a sensor at the extruder idler)
* This option only allows the multiplexer to switch on tool-change. * SMUFF_EMU_MMU2: Christian Gegg SMUFF (Průša MMU2 emulation mode)
* Additional options to configure custom E moves are pending. * SMUFF_EMU_MMU2S: Christian Gegg SMUFF (Průša MMU2S emulation mode)
*/
//#define MK2_MULTIPLEXER
#if ENABLED(MK2_MULTIPLEXER)
// Override the default DIO selector pins here, if needed.
// Some pins files may provide defaults for these pins.
//#define E_MUX0_PIN 40 // Always Required
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
#endif
/**
* Průša Multi-Material Unit v2
* *
* Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails.
* Requires EXTRUDERS = 5 * MMU2 requires EXTRUDERS = 5
* SMUFF supports EXTRUDERS = up to 15 but these are limited to 8 because of Marlin limit
* *
* For additional configuration see Configuration_adv.h * For additional configuration see Configuration_adv.h
*/ */
//#define PRUSA_MMU2 //#define MMU_MODEL PRUSA_MMU2
// A dual extruder that uses a single stepper motor // A dual extruder that uses a single stepper motor
//#define SWITCHING_EXTRUDER //#define SWITCHING_EXTRUDER

View file

@ -3506,11 +3506,29 @@
//#include "Configuration_Secure.h" // External file with WiFi SSID / Password //#include "Configuration_Secure.h" // External file with WiFi SSID / Password
#endif #endif
/** #if MMU_MODEL == PRUSA_MMU1
* Průša Multi-Material Unit v2 /**
* Průša Multi-Material-Unit multiplexed
* Enable in Configuration.h
*
* This device allows one stepper driver on a control board to drive
* two to eight stepper motors, one at a time, in a manner suitable
* for extruders.
*
* This option only allows the multiplexer to switch on tool-change.
* Additional options to configure custom E moves are pending.
*
* Override the default DIO selector pins here, if needed.
* Some pins files may provide defaults for these pins.
*/
//#define E_MUX0_PIN 40 // Always Required
//#define E_MUX1_PIN 42 // Needed for 3 to 8 inputs
//#define E_MUX2_PIN 44 // Needed for 5 to 8 inputs
#elif MMU_MODEL == PRUSA_MMU2 || MMU_MODEL == PRUSA_MMU2S
/**
* Průša Multi-Material-Unit v2
* Enable in Configuration.h * Enable in Configuration.h
*/ */
#if ENABLED(PRUSA_MMU2)
// Serial port used for communication with MMU2. // Serial port used for communication with MMU2.
// For AVR enable the UART port used for the MMU. (e.g., mmuSerial) // For AVR enable the UART port used for the MMU. (e.g., mmuSerial)
@ -3554,29 +3572,12 @@
{ -50.0, 2000 } { -50.0, 2000 }
#endif #endif
/**
* MMU Extruder Sensor
*
* Support for a Průša (or other) IR Sensor to detect filament near the extruder
* and make loading more reliable. Suitable for an extruder equipped with a filament
* sensor less than 38mm from the gears.
*
* During loading the extruder will stop when the sensor is triggered, then do a last
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
* If all attempts fail, a filament runout will be triggered.
*/
//#define MMU_EXTRUDER_SENSOR
#if ENABLED(MMU_EXTRUDER_SENSOR)
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
#endif
/** /**
* Using a sensor like the MMU2S * Using a sensor like the MMU2S
* This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S. * This mode requires a MK3S extruder with a sensor at the extruder idler, like the MMU2S.
* See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11 * See https://help.prusa3d.com/en/guide/3b-mk3s-mk2-5s-extruder-upgrade_41560, step 11
*/ */
//#define PRUSA_MMU2_S_MODE #if MMU_MODEL == PRUSA_MMU2S
#if ENABLED(PRUSA_MMU2_S_MODE)
#define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries) #define MMU2_C0_RETRY 5 // Number of retries (total time = timeout*retries)
#define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min) #define MMU2_CAN_LOAD_FEEDRATE 800 // (mm/min)
@ -3592,11 +3593,29 @@
#define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \ #define MMU2_CAN_LOAD_INCREMENT_SEQUENCE \
{ -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE } { -MMU2_CAN_LOAD_INCREMENT, MMU2_CAN_LOAD_FEEDRATE }
#else
/**
* MMU1 Extruder Sensor
*
* Support for a Průša (or other) IR Sensor to detect filament near the extruder
* and make loading more reliable. Suitable for an extruder equipped with a filament
* sensor less than 38mm from the gears.
*
* During loading the extruder will stop when the sensor is triggered, then do a last
* move up to the gears. If no filament is detected, the MMU2 can make some more attempts.
* If all attempts fail, a filament runout will be triggered.
*/
//#define MMU_EXTRUDER_SENSOR
#if ENABLED(MMU_EXTRUDER_SENSOR)
#define MMU_LOADING_ATTEMPTS_NR 5 // max. number of attempts to load filament if first load fail
#endif
#endif #endif
//#define MMU2_DEBUG // Write debug info to serial output //#define MMU2_DEBUG // Write debug info to serial output
#endif // PRUSA_MMU2 #endif // MMU_MODEL == PRUSA_MMU2 || MMU_MODEL == PRUSA_MMU2S
/** /**
* Advanced Print Counter settings * Advanced Print Counter settings

View file

@ -97,8 +97,8 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o
#define IS_RX0(P) (P == P0_03) #define IS_RX0(P) (P == P0_03)
#if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI)
#error "Serial port pins (0) conflict with Trinamic SPI pins!" #error "Serial port pins (0) conflict with Trinamic SPI pins!"
#elif ENABLED(MK2_MULTIPLEXER) && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN)) #elif HAS_PRUSA_MMU1 && (IS_TX0(E_MUX1_PIN) || IS_RX0(E_MUX0_PIN))
#error "Serial port pins (0) conflict with MK2 multiplexer pins!" #error "Serial port pins (0) conflict with Multi-Material-Unit multiplexer pins!"
#elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN)) #elif (AXIS_HAS_SPI(X) && IS_TX0(X_CS_PIN)) || (AXIS_HAS_SPI(Y) && IS_RX0(Y_CS_PIN))
#error "Serial port pins (0) conflict with X/Y axis SPI pins!" #error "Serial port pins (0) conflict with X/Y axis SPI pins!"
#endif #endif

View file

@ -213,8 +213,8 @@
#include "feature/controllerfan.h" #include "feature/controllerfan.h"
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "feature/mmu2/mmu2.h" #include "feature/mmu/mmu2.h"
#endif #endif
#if HAS_L64XX #if HAS_L64XX
@ -772,7 +772,9 @@ void idle(TERN_(ADVANCED_PAUSE_FEATURE, bool no_stepper_sleep/*=false*/)) {
#endif #endif
// Update the Průša MMU2 // Update the Průša MMU2
TERN_(PRUSA_MMU2, mmu2.mmu_loop()); #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
mmu2.mmu_loop();
#endif
// Handle Joystick jogging // Handle Joystick jogging
TERN_(POLL_JOG, joystick.inject_jog_moves()); TERN_(POLL_JOG, joystick.inject_jog_moves());
@ -1179,8 +1181,8 @@ void setup() {
SETUP_RUN(caselight.update_brightness()); SETUP_RUN(caselight.update_brightness());
#endif #endif
#if ENABLED(MK2_MULTIPLEXER) #if HAS_PRUSA_MMU1
SETUP_LOG("MK2_MULTIPLEXER"); SETUP_LOG("PRUSA MMU1 MULTIPLEXER");
SET_OUTPUT(E_MUX0_PIN); SET_OUTPUT(E_MUX0_PIN);
SET_OUTPUT(E_MUX1_PIN); SET_OUTPUT(E_MUX1_PIN);
SET_OUTPUT(E_MUX2_PIN); SET_OUTPUT(E_MUX2_PIN);
@ -1260,7 +1262,7 @@ void setup() {
SETUP_RUN(test_tmc_connection(true, true, true, true)); SETUP_RUN(test_tmc_connection(true, true, true, true));
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
SETUP_RUN(mmu2.init()); SETUP_RUN(mmu2.init());
#endif #endif

View file

@ -516,3 +516,12 @@
#define MAP0(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP1) (f, peek, __VA_ARGS__) #define MAP0(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP1) (f, peek, __VA_ARGS__)
#define MAP1(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP0) (f, peek, __VA_ARGS__) #define MAP1(f, x, peek, ...) f(x) MAP_NEXT (peek, MAP0) (f, peek, __VA_ARGS__)
#define MAP(f, ...) EVAL512 (MAP1 (f, __VA_ARGS__, (), 0)) #define MAP(f, ...) EVAL512 (MAP1 (f, __VA_ARGS__, (), 0))
//
// Multi-Material-Unit models
//
#define PRUSA_MMU1 1
#define PRUSA_MMU2 2
#define PRUSA_MMU2S 3
#define SMUFF_EMU_MMU2 4
#define SMUFF_EMU_MMU2S 5

View file

@ -22,7 +22,7 @@
#include "../inc/MarlinConfig.h" #include "../inc/MarlinConfig.h"
#if ENABLED(MK2_MULTIPLEXER) #if HAS_PRUSA_MMU1
#include "../module/stepper.h" #include "../module/stepper.h"
@ -35,4 +35,4 @@ void select_multiplexed_stepper(const uint8_t e) {
safe_delay(100); safe_delay(100);
} }
#endif // MK2_MULTIPLEXER #endif // HAS_PRUSA_MMU1

View file

@ -22,7 +22,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "mmu2.h" #include "mmu2.h"
#include "../../lcd/menu/menu_mmu2.h" #include "../../lcd/menu/menu_mmu2.h"
@ -94,7 +94,7 @@ MMU2 mmu2;
#define mmuSerial MMU2_SERIAL #define mmuSerial MMU2_SERIAL
bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved; bool MMU2::enabled, MMU2::ready, MMU2::mmu_print_saved;
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
bool MMU2::mmu2s_triggered; bool MMU2::mmu2s_triggered;
#endif #endif
uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder; uint8_t MMU2::cmd, MMU2::cmd_arg, MMU2::last_cmd, MMU2::extruder;
@ -115,7 +115,7 @@ char MMU2::rx_buffer[MMU_RX_SIZE], MMU2::tx_buffer[MMU_TX_SIZE];
static constexpr E_Step static constexpr E_Step
ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE } ramming_sequence[] PROGMEM = { MMU2_RAMMING_SEQUENCE }
, load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE } , load_to_nozzle_sequence[] PROGMEM = { MMU2_LOAD_TO_NOZZLE_SEQUENCE }
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
, can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE } , can_load_sequence[] PROGMEM = { MMU2_CAN_LOAD_SEQUENCE }
, can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE } , can_load_increment_sequence[] PROGMEM = { MMU2_CAN_LOAD_INCREMENT_SEQUENCE }
#endif #endif
@ -162,7 +162,7 @@ uint8_t MMU2::get_current_tool() {
return extruder == MMU2_NO_TOOL ? -1 : extruder; return extruder == MMU2_NO_TOOL ? -1 : extruder;
} }
#if EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) #if HAS_PRUSA_MMU2S || ENABLED(MMU_EXTRUDER_SENSOR)
#define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE) #define FILAMENT_PRESENT() (READ(FIL_RUNOUT_PIN) != FIL_RUNOUT_STATE)
#endif #endif
@ -242,7 +242,7 @@ void MMU2::mmu_loop() {
enabled = true; enabled = true;
state = 1; state = 1;
TERN_(PRUSA_MMU2_S_MODE, mmu2s_triggered = false); TERN_(HAS_PRUSA_MMU2S, mmu2s_triggered = false);
} }
break; break;
@ -307,7 +307,7 @@ void MMU2::mmu_loop() {
state = 2; // wait for response state = 2; // wait for response
} }
TERN_(PRUSA_MMU2_S_MODE, check_filament()); TERN_(HAS_PRUSA_MMU2S, check_filament());
break; break;
case 2: // response to command P0 case 2: // response to command P0
@ -324,7 +324,7 @@ void MMU2::mmu_loop() {
else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s)
state = 1; state = 1;
TERN_(PRUSA_MMU2_S_MODE, check_filament()); TERN_(HAS_PRUSA_MMU2S, check_filament());
break; break;
case 3: // response to mmu commands case 3: // response to mmu commands
@ -340,9 +340,9 @@ void MMU2::mmu_loop() {
#endif #endif
if (rx_ok()) { if (rx_ok()) {
// Response to C0 mmu command in PRUSA_MMU2_S_MODE // Response to C0 mmu command in MMU2S model
bool can_reset = true; bool can_reset = true;
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) { if (!mmu2s_triggered && last_cmd == MMU_CMD_C0) {
can_reset = false; can_reset = false;
// MMU ok received but filament sensor not triggered, retrying... // MMU ok received but filament sensor not triggered, retrying...
@ -367,7 +367,7 @@ void MMU2::mmu_loop() {
} }
state = 1; state = 1;
} }
TERN_(PRUSA_MMU2_S_MODE, check_filament()); TERN_(HAS_PRUSA_MMU2S, check_filament());
break; break;
} }
} }
@ -487,7 +487,7 @@ static void mmu2_not_responding() {
BUZZ(100, 659); BUZZ(100, 659);
} }
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
bool MMU2::load_to_gears() { bool MMU2::load_to_gears() {
command(MMU_CMD_C0); command(MMU_CMD_C0);
@ -542,9 +542,8 @@ static void mmu2_not_responding() {
*/ */
void MMU2::tool_change(const char* special) { void MMU2::tool_change(const char* special) {
if (!enabled) return;
#if ENABLED(MMU2_MENUS) #if ENABLED(MMU2_MENUS)
if (!enabled) return;
set_runout_valid(false); set_runout_valid(false);
@ -626,10 +625,10 @@ static void mmu2_not_responding() {
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
*/ */
void MMU2::tool_change(const char* special) { void MMU2::tool_change(const char* special) {
if (!enabled) return;
#if ENABLED(MMU2_MENUS) #if ENABLED(MMU2_MENUS)
if (!enabled) return;
set_runout_valid(false); set_runout_valid(false);
switch (*special) { switch (*special) {
@ -682,12 +681,12 @@ static void mmu2_not_responding() {
mmu_idl_sens = 0; mmu_idl_sens = 0;
} }
#elif DISABLED(MMU_EXTRUDER_SENSOR) && DISABLED(PRUSA_MMU2_S_MODE) #else // !HAS_PRUSA_MMU2S && DISABLED(MMU_EXTRUDER_SENSOR)
/** /**
* Handle tool change * Handle tool change
*/ */
void MMU2::tool_change(const uint8_t index) { void MMU2::tool_change(const uint8_t index) {
if (!enabled) return; if (!enabled) return;
set_runout_valid(false); set_runout_valid(false);
@ -707,20 +706,20 @@ void MMU2::tool_change(const uint8_t index) {
} }
set_runout_valid(true); set_runout_valid(true);
} }
/** /**
* Handle special T?/Tx/Tc commands * Handle special T?/Tx/Tc commands
* *
* T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically * T? Gcode to extrude shouldn't have to follow, load to extruder wheels is done automatically
* Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load.
* Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated.
*/ */
void MMU2::tool_change(const char* special) { void MMU2::tool_change(const char* special) {
if (!enabled) return;
#if ENABLED(MMU2_MENUS) #if ENABLED(MMU2_MENUS)
if (!enabled) return;
set_runout_valid(false); set_runout_valid(false);
switch (*special) { switch (*special) {
@ -758,7 +757,7 @@ void MMU2::tool_change(const char* special) {
#endif #endif
} }
#endif // MMU_EXTRUDER_SENSOR #endif // HAS_PRUSA_MMU2S
/** /**
* Set next command * Set next command
@ -866,7 +865,7 @@ void MMU2::filament_runout() {
planner.synchronize(); planner.synchronize();
} }
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
void MMU2::check_filament() { void MMU2::check_filament() {
const bool present = FILAMENT_PRESENT(); const bool present = FILAMENT_PRESENT();
@ -1065,4 +1064,4 @@ void MMU2::filament_runout() {
#endif // HAS_LCD_MENU && MMU2_MENUS #endif // HAS_LCD_MENU && MMU2_MENUS
#endif // PRUSA_MMU2 #endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S

View file

@ -80,7 +80,7 @@ private:
static void filament_runout(); static void filament_runout();
#if ENABLED(PRUSA_MMU2_S_MODE) #if HAS_PRUSA_MMU2S
static bool mmu2s_triggered; static bool mmu2s_triggered;
static void check_filament(); static void check_filament();
static bool can_load(); static bool can_load();

View file

@ -31,13 +31,13 @@
* *
* Report the current speed percentage factor if no parameter is specified * Report the current speed percentage factor if no parameter is specified
* *
* With PRUSA_MMU2... * With MMU_MODEL=PRUSA_MMU2/PRUSA_MMU2S/SMUFF_EMU_MMU2/SMUFF_EMU_MMU2S...
* B : Flag to back up the current factor * B : Flag to back up the current factor
* R : Flag to restore the last-saved factor * R : Flag to restore the last-saved factor
*/ */
void GcodeSuite::M220() { void GcodeSuite::M220() {
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
static int16_t backup_feedrate_percentage = 100; static int16_t backup_feedrate_percentage = 100;
if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage; if (parser.seen('B')) backup_feedrate_percentage = feedrate_percentage;
if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage; if (parser.seen('R')) feedrate_percentage = backup_feedrate_percentage;

View file

@ -27,8 +27,8 @@
#include "../../module/motion.h" #include "../../module/motion.h"
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "../../feature/mmu2/mmu2.h" #include "../../feature/mmu/mmu2.h"
#endif #endif
#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE)
@ -40,7 +40,7 @@
* F[units/min] Set the movement feedrate * F[units/min] Set the movement feedrate
* S1 Don't move the tool in XY after change * S1 Don't move the tool in XY after change
* *
* For PRUSA_MMU2: * For PRUSA_MMU2/PRUSA_MMU2S/SMUFF_EMU_MMU2PRUSA_MMU2S:
* T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels.
* T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically.
* Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load.
@ -54,7 +54,7 @@ void GcodeSuite::T(const int8_t tool_index) {
// Count this command as movement / activity // Count this command as movement / activity
reset_stepper_timeout(); reset_stepper_timeout();
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
if (parser.string_arg) { if (parser.string_arg) {
mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc mmu2.tool_change(parser.string_arg); // Special commands T?/Tx/Tc
return; return;

View file

@ -38,8 +38,8 @@
#include "../../../lcd/marlinui.h" #include "../../../lcd/marlinui.h"
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "../../../feature/mmu2/mmu2.h" #include "../../../feature/mmu/mmu2.h"
#endif #endif
#if ENABLED(MIXING_EXTRUDER) #if ENABLED(MIXING_EXTRUDER)
@ -86,7 +86,7 @@ void GcodeSuite::M701() {
// Show initial "wait for load" message // Show initial "wait for load" message
TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder)); TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_LOAD, PAUSE_MODE_LOAD_FILAMENT, target_extruder));
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Change toolhead if specified // Change toolhead if specified
uint8_t active_extruder_before_filament_change = active_extruder; uint8_t active_extruder_before_filament_change = active_extruder;
if (active_extruder != target_extruder) if (active_extruder != target_extruder)
@ -98,7 +98,7 @@ void GcodeSuite::M701() {
do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
// Load filament // Load filament
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
mmu2.load_filament_to_nozzle(target_extruder); mmu2.load_filament_to_nozzle(target_extruder);
#else #else
constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH, constexpr float purge_length = ADVANCED_PAUSE_PURGE_LENGTH,
@ -121,7 +121,7 @@ void GcodeSuite::M701() {
if (park_point.z > 0) if (park_point.z > 0)
do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Restore toolhead if it was changed // Restore toolhead if it was changed
if (active_extruder_before_filament_change != active_extruder) if (active_extruder_before_filament_change != active_extruder)
tool_change(active_extruder_before_filament_change, false); tool_change(active_extruder_before_filament_change, false);
@ -186,7 +186,7 @@ void GcodeSuite::M702() {
// Show initial "wait for unload" message // Show initial "wait for unload" message
TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder)); TERN_(HAS_LCD_MENU, lcd_pause_show_message(PAUSE_MESSAGE_UNLOAD, PAUSE_MODE_UNLOAD_FILAMENT, target_extruder));
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Change toolhead if specified // Change toolhead if specified
uint8_t active_extruder_before_filament_change = active_extruder; uint8_t active_extruder_before_filament_change = active_extruder;
if (active_extruder != target_extruder) if (active_extruder != target_extruder)
@ -198,7 +198,7 @@ void GcodeSuite::M702() {
do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); do_blocking_move_to_z(_MIN(current_position.z + park_point.z, Z_MAX_POS), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
// Unload filament // Unload filament
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
mmu2.unload(); mmu2.unload();
#else #else
#if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS) #if BOTH(HAS_MULTI_EXTRUDER, FILAMENT_UNLOAD_ALL_EXTRUDERS)
@ -227,7 +227,7 @@ void GcodeSuite::M702() {
if (park_point.z > 0) if (park_point.z > 0)
do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE)); do_blocking_move_to_z(_MAX(current_position.z - park_point.z, 0), feedRate_t(NOZZLE_PARK_Z_FEEDRATE));
#if HAS_MULTI_EXTRUDER && DISABLED(PRUSA_MMU2) #if HAS_MULTI_EXTRUDER && (HAS_PRUSA_MMU1 || !HAS_MMU)
// Restore toolhead if it was changed // Restore toolhead if it was changed
if (active_extruder_before_filament_change != active_extruder) if (active_extruder_before_filament_change != active_extruder)
tool_change(active_extruder_before_filament_change, false); tool_change(active_extruder_before_filament_change, false);

View file

@ -22,10 +22,10 @@
#include "../../../inc/MarlinConfigPre.h" #include "../../../inc/MarlinConfigPre.h"
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "../../gcode.h" #include "../../gcode.h"
#include "../../../feature/mmu2/mmu2.h" #include "../../../feature/mmu/mmu2.h"
/** /**
* M403: Set filament type for MMU2 * M403: Set filament type for MMU2
@ -46,4 +46,4 @@ void GcodeSuite::M403() {
SERIAL_ECHO_MSG("M403 - bad arguments."); SERIAL_ECHO_MSG("M403 - bad arguments.");
} }
#endif // PRUSA_MMU2 #endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S

View file

@ -699,7 +699,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 402: M402(); break; // M402: Stow probe case 402: M402(); break; // M402: Stow probe
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
case 403: M403(); break; case 403: M403(); break;
#endif #endif

View file

@ -181,7 +181,7 @@
* M217 - Set filament swap parameters: "M217 S<length> P<feedrate> R<feedrate>". (Requires SINGLENOZZLE) * M217 - Set filament swap parameters: "M217 S<length> P<feedrate> R<feedrate>". (Requires SINGLENOZZLE)
* M218 - Set/get a tool offset: "M218 T<index> X<offset> Y<offset>". (Requires 2 or more extruders) * M218 - Set/get a tool offset: "M218 T<index> X<offset> Y<offset>". (Requires 2 or more extruders)
* M220 - Set Feedrate Percentage: "M220 S<percent>" (i.e., "FR" on the LCD) * M220 - Set Feedrate Percentage: "M220 S<percent>" (i.e., "FR" on the LCD)
* Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires PRUSA_MMU2) * Use "M220 B" to back up the Feedrate Percentage and "M220 R" to restore it. (Requires MMU_MODEL=PRUSA_MMU2/PRUSA_MMU2S/SMUFF_EMU_MMU2/SMUFF_EMU_MMU2S)
* M221 - Set Flow Percentage: "M221 S<percent>" * M221 - Set Flow Percentage: "M221 S<percent>"
* M226 - Wait until a pin is in a given state: "M226 P<pin> S<state>" (Requires DIRECT_PIN_CONTROL) * M226 - Wait until a pin is in a given state: "M226 P<pin> S<state>" (Requires DIRECT_PIN_CONTROL)
* M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE) * M240 - Trigger a camera to take a photograph. (Requires PHOTO_GCODE)
@ -735,7 +735,9 @@ private:
static void M402(); static void M402();
#endif #endif
TERN_(PRUSA_MMU2, static void M403()); #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
static void M403();
#endif
#if ENABLED(FILAMENT_WIDTH_SENSOR) #if ENABLED(FILAMENT_WIDTH_SENSOR)
static void M404(); static void M404();

View file

@ -155,7 +155,7 @@ void GCodeParser::parse(char *p) {
// Skip spaces to get the numeric part // Skip spaces to get the numeric part
while (*p == ' ') p++; while (*p == ' ') p++;
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
if (letter == 'T') { if (letter == 'T') {
// check for special MMU2 T?/Tx/Tc commands // check for special MMU2 T?/Tx/Tc commands
if (*p == '?' || *p == 'x' || *p == 'c') { if (*p == '?' || *p == 'x' || *p == 'c') {

View file

@ -495,6 +495,23 @@
#endif #endif
#endif #endif
/**
* Multi-Material-Unit supported models
*/
#ifdef MMU_MODEL
#define HAS_MMU 1
#if MMU_MODEL == PRUSA_MMU1
#define HAS_PRUSA_MMU1 1
#elif MMU_MODEL == PRUSA_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2
#define HAS_PRUSA_MMU2 1
#elif MMU_MODEL == PRUSA_MMU2S || MMU_MODEL == SMUFF_EMU_MMU2S
#define HAS_PRUSA_MMU2S 1
#endif
#if MMU_MODEL == SMUFF_EMU_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2S
#define HAS_SMUFF 1
#endif
#endif
/** /**
* Extruders have some combination of stepper motors and hotends * Extruders have some combination of stepper motors and hotends
* so we separate these concepts into the defines: * so we separate these concepts into the defines:
@ -512,8 +529,6 @@
#undef SWITCHING_EXTRUDER #undef SWITCHING_EXTRUDER
#undef SWITCHING_NOZZLE #undef SWITCHING_NOZZLE
#undef MIXING_EXTRUDER #undef MIXING_EXTRUDER
#undef MK2_MULTIPLEXER
#undef PRUSA_MMU2
#undef HOTEND_IDLE_TIMEOUT #undef HOTEND_IDLE_TIMEOUT
#elif EXTRUDERS > 1 #elif EXTRUDERS > 1
#define HAS_MULTI_EXTRUDER 1 #define HAS_MULTI_EXTRUDER 1
@ -539,17 +554,17 @@
#elif ENABLED(SWITCHING_TOOLHEAD) #elif ENABLED(SWITCHING_TOOLHEAD)
#define E_STEPPERS EXTRUDERS #define E_STEPPERS EXTRUDERS
#define E_MANUAL EXTRUDERS #define E_MANUAL EXTRUDERS
#elif ENABLED(PRUSA_MMU2) #elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#define E_STEPPERS 1 #define E_STEPPERS 1
#endif #endif
// No inactive extruders with MK2_MULTIPLEXER or SWITCHING_NOZZLE // No inactive extruders with SWITCHING_NOZZLE or Průša MMU1
#if EITHER(MK2_MULTIPLEXER, SWITCHING_NOZZLE) #if ENABLED(SWITCHING_NOZZLE) || HAS_PRUSA_MMU1
#undef DISABLE_INACTIVE_EXTRUDER #undef DISABLE_INACTIVE_EXTRUDER
#endif #endif
// Průša MK2 Multiplexer and MMU 2.0 force SINGLENOZZLE // Průša MMU1, MMU 2.0, MMUS 2.0 and SMUFF force SINGLENOZZLE
#if EITHER(MK2_MULTIPLEXER, PRUSA_MMU2) #if HAS_MMU
#define SINGLENOZZLE #define SINGLENOZZLE
#endif #endif

View file

@ -909,17 +909,23 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
#error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1. Please update your Configuration_adv.h." #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1. Please update your Configuration_adv.h."
#endif #endif
#elif ENABLED(MK2_MULTIPLEXER) #elif HAS_PRUSA_MMU1 || HAS_SMUFF
#error "MK2_MULTIPLEXER requires 2 or more EXTRUDERS." #error "Multi-Material-Unit requires 2 or more EXTRUDERS."
#elif ENABLED(SINGLENOZZLE) #elif ENABLED(SINGLENOZZLE)
#error "SINGLENOZZLE requires 2 or more EXTRUDERS." #error "SINGLENOZZLE requires 2 or more EXTRUDERS."
#endif #endif
/** /**
* Sanity checking for the Průša MK2 Multiplexer * Sanity checking for all Průša MMU
*/ */
#ifdef SNMM #ifdef SNMM
#error "SNMM is now MK2_MULTIPLEXER. Please update your configuration." #error "SNMM is now MMU_MODEL = PRUSA_MMU1. Please update your configuration."
#elif ENABLED(MK2_MULTIPLEXER)
#error "MK2_MULTIPLEXER is now MMU_MODEL = PRUSA_MMU1. Please update your configuration."
#elif ENABLED(PRUSA_MMU2)
#error "PRUSA_MMU2 is now MMU_MODEL = PRUSA_MMU2. Please update your configuration."
#elif ENABLED(PRUSA_MMU2_S_MODE)
#error "PRUSA_MMU2_S_MODE is now MMU_MODEL = PRUSA_MMU2S. Please update your configuration."
#endif #endif
/** /**
@ -1886,8 +1892,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
/** /**
* Test Extruder Stepper Pins * Test Extruder Stepper Pins
*/ */
#if DISABLED(MK2_MULTIPLEXER) // MK2_MULTIPLEXER uses E0 stepper only #if E_STEPPERS
#if E_STEPPERS
#if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) #if !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE)
#error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board."
#endif #endif
@ -1926,8 +1931,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
#endif // E_STEPPERS > 3 #endif // E_STEPPERS > 3
#endif // E_STEPPERS > 2 #endif // E_STEPPERS > 2
#endif // E_STEPPERS > 1 #endif // E_STEPPERS > 1
#endif // E_STEPPERS #endif // E_STEPPERS
#endif
/** /**
* Endstop Tests * Endstop Tests
@ -2951,19 +2955,19 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#endif #endif
/** /**
* Průša MMU2 requirements * Multi-Material-Unit requirements
*/ */
#if ENABLED(PRUSA_MMU2) #if HAS_SMUFF && EXTRUDERS > 15
#error "MMU_MODEL=SMUFF_EMU_MMU2/SMUFF_EMU_MMU2S requires EXTRUDERS <= 15."
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#if EXTRUDERS != 5 #if EXTRUDERS != 5
#error "PRUSA_MMU2 requires EXTRUDERS = 5." #error "MMU_MODEL=PRUSA_MMU2/PRUSA_MMU2S requires EXTRUDERS = 5."
#elif DISABLED(NOZZLE_PARK_FEATURE) #elif DISABLED(NOZZLE_PARK_FEATURE)
#error "PRUSA_MMU2 requires NOZZLE_PARK_FEATURE. Enable it to continue." #error "MMU_MODEL=PRUSA_MMU2/PRUSA_MMU2S requires NOZZLE_PARK_FEATURE. Enable it to continue."
#elif EITHER(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR) #elif EITHER(HAS_PRUSA_MMU2S, MMU_EXTRUDER_SENSOR) && DISABLED(FILAMENT_RUNOUT_SENSOR)
#error "PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue." #error "MMU_MODEL=PRUSA_MMU2S or MMU_EXTRUDER_SENSOR requires FILAMENT_RUNOUT_SENSOR. Enable it to continue."
#elif BOTH(PRUSA_MMU2_S_MODE, MMU_EXTRUDER_SENSOR)
#error "Enable only one of PRUSA_MMU2_S_MODE or MMU_EXTRUDER_SENSOR."
#elif DISABLED(ADVANCED_PAUSE_FEATURE) #elif DISABLED(ADVANCED_PAUSE_FEATURE)
static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2."); static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with MMU_MODEL=PRUSA_MMU2/PRUSA_MMU2S/SMUFF_EMU_MMU2/SMUFF_EMU_MMU2S.");
#endif #endif
#endif #endif

View file

@ -46,7 +46,7 @@
#define MACHINE_CAN_PAUSE 1 #define MACHINE_CAN_PAUSE 1
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "../../lcd/menu/menu_mmu2.h" #include "../../lcd/menu/menu_mmu2.h"
#endif #endif

View file

@ -24,7 +24,7 @@
#if BOTH(HAS_LCD_MENU, MMU2_MENUS) #if BOTH(HAS_LCD_MENU, MMU2_MENUS)
#include "../../feature/mmu2/mmu2.h" #include "../../feature/mmu/mmu2.h"
#include "menu_mmu2.h" #include "menu_mmu2.h"
#include "menu_item.h" #include "menu_item.h"

View file

@ -417,16 +417,17 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset
#define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0) #define NORM_E_DIR(E) do{ E0_DIR_WRITE(E ? INVERT_E0_DIR : !INVERT_E0_DIR); }while(0)
#define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(E ? !INVERT_E0_DIR : INVERT_E0_DIR); }while(0)
#endif #endif
#elif ENABLED(PRUSA_MMU2)
#define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
#define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR)
#define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR)
#elif ENABLED(MK2_MULTIPLEXER) // One multiplexed stepper driver, reversed on odd index #elif HAS_PRUSA_MMU1 // One multiplexed stepper driver, reversed on odd index
#define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
#define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0) #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? !INVERT_E0_DIR: INVERT_E0_DIR); }while(0)
#define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? INVERT_E0_DIR: !INVERT_E0_DIR); }while(0)
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#define E_STEP_WRITE(E,V) E0_STEP_WRITE(V)
#define NORM_E_DIR(E) E0_DIR_WRITE(!INVERT_E0_DIR)
#define REV_E_DIR(E) E0_DIR_WRITE( INVERT_E0_DIR)
#elif E_STEPPERS > 1 #elif E_STEPPERS > 1
#if E_STEPPERS > 7 #if E_STEPPERS > 7

View file

@ -73,10 +73,6 @@
#include "../feature/solenoid.h" #include "../feature/solenoid.h"
#endif #endif
#if ENABLED(MK2_MULTIPLEXER)
#include "../feature/snmm.h"
#endif
#if ENABLED(MIXING_EXTRUDER) #if ENABLED(MIXING_EXTRUDER)
#include "../feature/mixing.h" #include "../feature/mixing.h"
#endif #endif
@ -89,8 +85,10 @@
#include "../feature/fanmux.h" #include "../feature/fanmux.h"
#endif #endif
#if ENABLED(PRUSA_MMU2) #if HAS_PRUSA_MMU1
#include "../feature/mmu2/mmu2.h" #include "../feature/mmu/mmu.h"
#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
#include "../feature/mmu/mmu2.h"
#endif #endif
#if HAS_LCD_MENU #if HAS_LCD_MENU
@ -863,7 +861,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
mixer.T(new_tool); mixer.T(new_tool);
#endif #endif
#elif ENABLED(PRUSA_MMU2) #elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU2S
UNUSED(no_move); UNUSED(no_move);
@ -1171,8 +1169,6 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]); do_blocking_move_to_z(destination.z, planner.settings.max_feedrate_mm_s[Z_AXIS]);
#endif #endif
TERN_(PRUSA_MMU2, mmu2.tool_change(new_tool));
TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool)); TERN_(SWITCHING_NOZZLE_TWO_SERVOS, lower_nozzle(new_tool));
} // (new_tool != old_tool) } // (new_tool != old_tool)
@ -1184,7 +1180,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
enable_solenoid_on_active_extruder(); enable_solenoid_on_active_extruder();
#endif #endif
#if ENABLED(MK2_MULTIPLEXER) #if HAS_PRUSA_MMU1
if (new_tool >= E_STEPPERS) return invalid_extruder_error(new_tool); if (new_tool >= E_STEPPERS) return invalid_extruder_error(new_tool);
select_multiplexed_stepper(new_tool); select_multiplexed_stepper(new_tool);
#endif #endif

View file

@ -131,9 +131,9 @@
#define PIN_P2_11 P2_11 // Interrupt Capable #define PIN_P2_11 P2_11 // Interrupt Capable
// //
// Průša i3 MK2 Multi Material Multiplexer Support // Průša i3 MMU1 (Multi Material Multiplexer) Support
// //
#if ENABLED(MK2_MULTIPLEXER) #if HAS_PRUSA_MMU1
#define E_MUX0_PIN P1_23 // J8-3 #define E_MUX0_PIN P1_23 // J8-3
#define E_MUX1_PIN P2_12 // J8-4 #define E_MUX1_PIN P2_12 // J8-4
#define E_MUX2_PIN P2_11 // J8-5 #define E_MUX2_PIN P2_11 // J8-5

View file

@ -66,14 +66,15 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sle
# #
restore_configs restore_configs
opt_set LCD_LANGUAGE zh_CN opt_set LCD_LANGUAGE zh_CN
opt_set MMU_MODEL PRUSA_MMU2S
opt_set EXTRUDERS 5 opt_set EXTRUDERS 5
opt_set NUM_SERVOS 1 opt_set NUM_SERVOS 1
opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \ opt_enable ZONESTAR_LCD Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE BOOT_MARLIN_LOGO_ANIMATED \
AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \
NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \
PRUSA_MMU2 MMU2_MENUS PRUSA_MMU2_S_MODE DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ MMU2_MENUS DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \
FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING
exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2 | Servo | 3-Point + Debug | G38 ..." exec_test $1 $2 "RAMPS | ZONESTAR + Chinese | MMU2S | Servo | 3-Point + Debug | G38 ..."
# #
# Test MINIRAMBO with PWM_MOTOR_CURRENT and many features # Test MINIRAMBO with PWM_MOTOR_CURRENT and many features

View file

@ -91,7 +91,8 @@ default_src_filter = +<src/*> -<src/config> -<src/HAL> +<src/HAL/shared>
-<src/feature/leds/tempstat.cpp> -<src/feature/leds/tempstat.cpp>
-<src/feature/max7219.cpp> -<src/feature/max7219.cpp>
-<src/feature/mixing.cpp> -<src/feature/mixing.cpp>
-<src/feature/mmu2> -<src/gcode/feature/prusa_MMU2> -<src/feature/mmu/mmu.cpp>
-<src/feature/mmu/mmu2.cpp> -<src/gcode/feature/prusa_MMU2>
-<src/feature/password> -<src/gcode/feature/password> -<src/feature/password> -<src/gcode/feature/password>
-<src/feature/pause.cpp> -<src/feature/pause.cpp>
-<src/feature/power.cpp> -<src/feature/power.cpp>
@ -99,7 +100,6 @@ default_src_filter = +<src/*> -<src/config> -<src/HAL> +<src/HAL/shared>
-<src/feature/powerloss.cpp> -<src/gcode/feature/powerloss> -<src/feature/powerloss.cpp> -<src/gcode/feature/powerloss>
-<src/feature/probe_temp_comp.cpp> -<src/feature/probe_temp_comp.cpp>
-<src/feature/runout.cpp> -<src/gcode/feature/runout> -<src/feature/runout.cpp> -<src/gcode/feature/runout>
-<src/feature/snmm.cpp>
-<src/feature/solenoid.cpp> -<src/gcode/control/M380_M381.cpp> -<src/feature/solenoid.cpp> -<src/gcode/control/M380_M381.cpp>
-<src/feature/spindle_laser.cpp> -<src/gcode/control/M3-M5.cpp> -<src/feature/spindle_laser.cpp> -<src/gcode/control/M3-M5.cpp>
-<src/feature/tmc_util.cpp> -<src/module/stepper/trinamic.cpp> -<src/feature/tmc_util.cpp> -<src/module/stepper/trinamic.cpp>
@ -300,7 +300,8 @@ PRINTER_EVENT_LEDS = src_filter=+<src/feature/leds/printer_event_leds.cpp>
TEMP_STAT_LEDS = src_filter=+<src/feature/leds/tempstat.cpp> TEMP_STAT_LEDS = src_filter=+<src/feature/leds/tempstat.cpp>
MAX7219_DEBUG = src_filter=+<src/feature/max7219.cpp> +<src/gcode/feature/leds/M7219.cpp> MAX7219_DEBUG = src_filter=+<src/feature/max7219.cpp> +<src/gcode/feature/leds/M7219.cpp>
MIXING_EXTRUDER = src_filter=+<src/feature/mixing.cpp> +<src/gcode/feature/mixing/M163-M165.cpp> MIXING_EXTRUDER = src_filter=+<src/feature/mixing.cpp> +<src/gcode/feature/mixing/M163-M165.cpp>
PRUSA_MMU2 = src_filter=+<src/feature/mmu2> +<src/gcode/feature/prusa_MMU2> HAS_PRUSA_MMU1 = src_filter=+<src/feature/mmu/mmu.cpp>
HAS_PRUSA_MMU2|HAS_PRUSA_MMU2S = src_filter=+<src/feature/mmu/mmu2.cpp> +<src/gcode/feature/prusa_MMU2>
PASSWORD_FEATURE = src_filter=+<src/feature/password> +<src/gcode/feature/password> PASSWORD_FEATURE = src_filter=+<src/feature/password> +<src/gcode/feature/password>
ADVANCED_PAUSE_FEATURE = src_filter=+<src/feature/pause.cpp> +<src/gcode/feature/pause/M600.cpp> +<src/gcode/feature/pause/M603.cpp> ADVANCED_PAUSE_FEATURE = src_filter=+<src/feature/pause.cpp> +<src/gcode/feature/pause/M600.cpp> +<src/gcode/feature/pause/M603.cpp>
AUTO_POWER_CONTROL = src_filter=+<src/feature/power.cpp> AUTO_POWER_CONTROL = src_filter=+<src/feature/power.cpp>
@ -308,7 +309,6 @@ HAS_POWER_MONITOR = src_filter=+<src/feature/power_monitor.cpp> +<src/gcod
POWER_LOSS_RECOVERY = src_filter=+<src/feature/powerloss.cpp> +<src/gcode/feature/powerloss> POWER_LOSS_RECOVERY = src_filter=+<src/feature/powerloss.cpp> +<src/gcode/feature/powerloss>
PROBE_TEMP_COMPENSATION = src_filter=+<src/feature/probe_temp_comp.cpp> +<src/gcode/calibrate/G76_M192_M871.cpp> PROBE_TEMP_COMPENSATION = src_filter=+<src/feature/probe_temp_comp.cpp> +<src/gcode/calibrate/G76_M192_M871.cpp>
HAS_FILAMENT_SENSOR = src_filter=+<src/feature/runout.cpp> +<src/gcode/feature/runout> HAS_FILAMENT_SENSOR = src_filter=+<src/feature/runout.cpp> +<src/gcode/feature/runout>
MK2_MULTIPLEXER = src_filter=+<src/feature/snmm.cpp>
EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+<src/feature/solenoid.cpp> +<src/gcode/control/M380_M381.cpp> EXT_SOLENOID|MANUAL_SOLENOID_CONTROL = src_filter=+<src/feature/solenoid.cpp> +<src/gcode/control/M380_M381.cpp>
HAS_CUTTER = src_filter=+<src/feature/spindle_laser.cpp> +<src/gcode/control/M3-M5.cpp> HAS_CUTTER = src_filter=+<src/feature/spindle_laser.cpp> +<src/gcode/control/M3-M5.cpp>
EXPERIMENTAL_I2CBUS = src_filter=+<src/feature/twibus.cpp> +<src/gcode/feature/i2c> EXPERIMENTAL_I2CBUS = src_filter=+<src/feature/twibus.cpp> +<src/gcode/feature/i2c>