diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 2d816d9e46..7bc21b4753 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -404,6 +404,7 @@ * PRUSA_MMU3 : Průša MMU3 (Requires MK3S extruder with motion sensor and MMU firmware version 3.x.x, EXTRUDERS = 5) * EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) * EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) + * CHAMELEON : Chameleon with up to 4 switchable filaments * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * See additional options in Configuration_adv.h. diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index c5ed503b4c..c0bc6f3862 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -4688,6 +4688,37 @@ #endif // HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3 +#if HAS_CHAMELEON + + #define CHAMELEON_BUTTON1_X X_MAX_POS // Button 1 depressed position + #define CHAMELEON_BUTTON2_X X_MIN_POS // Button 2 depressed position (Used for EXTRUDERS > 2) + //#define CHAMELEON_TOOLCHANGE_Y Y_CENTER // A standard Y position for all tool-changes + //#define CHAMELEON_TOOLCHANGE_Z Z_MAX_POS // Enable and adjust if the switch is top-mounted + + // Design the ramming sequence to first retract out of the hotend, + // then do blob elimination at the tip, then retract all the way + // back out of the feeder splitter. + #define CHAMELEON_RAMMING_SEQUENCE \ + { -10, 10000 }, /* < fast (shape) */ \ + { -40, 600 }, /* < slow (cool) */ \ + { +50, 10000 }, /* > fast (shape) */ \ + { -10, 10000 }, /* < fast (shape) */ \ + { -40, 600 }, /* < slow (cool) */ \ + { +51, 10000 }, /* > fast (unblob) */ \ + { -11, 10000 }, /* < fast (shape) */ \ + { +11, 10000 }, /* > fast (unblob) */ \ + { -11, 10000 }, /* < fast (shape) */ \ + { +11, 10000 }, /* > fast (unblob) */ \ + { -11, 10000 }, /* < fast (shape) */ \ + { -40, 100 }, /* < slow (cool) */ \ + { -110, 10000 }, /* < fast (shape) */ \ + { +40, 1000 }, /* > fast (shape) */ \ + { -40, 1000 }, /* < fast (shape) */ \ + { +40, 1000 }, /* > fast (shape) */ \ + { -130, 5000 } /* < fast (unload) */ + +#endif // HAS_CHAMELEON + /** * Advanced Print Counter settings * @section stats diff --git a/Marlin/src/feature/mmu/chameleon.cpp b/Marlin/src/feature/mmu/chameleon.cpp new file mode 100644 index 0000000000..31136155e3 --- /dev/null +++ b/Marlin/src/feature/mmu/chameleon.cpp @@ -0,0 +1,128 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_CHAMELEON + +#include "chameleon.h" +//#include "../../MarlinCore.h" +#include "../../module/planner.h" +#include "../../module/stepper.h" +#include "../../lcd/marlinui.h" + +//#define DEBUG_OUT ENABLED(DEBUG_CHAMELEON) +#include "../../core/debug_out.h" + +Chameleon chameleon; + +struct E_Step { + float extrude; + feedRate_t feedRate; +}; + +// Change tools the Chameleon 3D way +void Chameleon::tool_change(const uint8_t index) { + const uint8_t switches = active_extruder ^ index; + if (!switches) return; + + ui.status_printf(0, GET_TEXT_F(MSG_MMU2_LOADING_FILAMENT), int(index + 1)); + + #ifdef CHAMELEON_TOOLCHANGE_Y + current_position.y = CHAMELEON_TOOLCHANGE_Y; + #endif + #ifdef CHAMELEON_TOOLCHANGE_Z + NOLESS(current_position.z, CHAMELEON_TOOLCHANGE_Z); + line_to_current_position(5000); + #endif + if (switches & 0x1) { + current_position.x = CHAMELEON_BUTTON1_X + (X_CENTER > (CHAMELEON_BUTTON1_X)) ? 10 : -10; + } + else { + #if EXTRUDERS > 2 + if (switches & 0x2) + current_position.x = CHAMELEON_BUTTON2_X + (X_CENTER > (CHAMELEON_BUTTON2_X)) ? 10 : -10; + #endif + } + line_to_current_position(5000); + + static constexpr E_Step ramming_sequence[] PROGMEM = { CHAMELEON_RAMMING_SEQUENCE }; + execute_extruder_sequence(ramming_sequence, COUNT(ramming_sequence)); + + toggle(switches); + + active_extruder = index; + + ui.reset_status(); +} + +// Execute a list of E moves +void Chameleon::execute_extruder_sequence(const E_Step * const sequence, const uint8_t steps) { + planner.synchronize(); + stepper.enable_extruder(); + + const E_Step *step = sequence; + + for (uint8_t i = 0; i < steps; ++i) { + const float es = pgm_read_float(&(step->extrude)); + const uint16_t fr_or_ms = pgm_read_float(&(step->feedRate)); + + DEBUG_ECHO_MSG("Move E", es, " @ ", fr_or_ms); + + if (es) { + current_position.e += es; + line_to_current_position(MMM_TO_MMS(fr_or_ms)); + planner.synchronize(); + } + else + safe_delay(fr_or_ms); + + step++; + } + + // Reset E to 0 for the new extruder tool + current_position.e = 0; + sync_plan_position_e(); + + stepper.disable_extruder(); +} + +// Bump the switches needed to change feeders +void Chameleon::toggle(const uint8_t switches) { + if (switches & 0x1) { + current_position.x = CHAMELEON_BUTTON1_X; + line_to_current_position(2000); + current_position.x += (X_CENTER > (CHAMELEON_BUTTON1_X)) ? 10 : -10; + line_to_current_position(2000); + } + #if EXTRUDERS > 2 + if (switches & 0x2) { + current_position.x = CHAMELEON_BUTTON2_X; + line_to_current_position(2000); + current_position.x += (X_CENTER > (CHAMELEON_BUTTON2_X)) ? 10 : -10; + line_to_current_position(2000); + } + #endif + planner.synchronize(); +} + +#endif // HAS_CHAMELEON diff --git a/Marlin/src/feature/mmu/chameleon.h b/Marlin/src/feature/mmu/chameleon.h new file mode 100644 index 0000000000..a33b96e156 --- /dev/null +++ b/Marlin/src/feature/mmu/chameleon.h @@ -0,0 +1,38 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ +#pragma once + +#include + +struct E_Step; + +class Chameleon { + public: + Chameleon() {} + static void tool_change(const uint8_t new_tool); + + private: + static void execute_extruder_sequence(const E_Step * const sequence, const uint8_t steps); + static void toggle(const uint8_t switches); +}; + +extern Chameleon chameleon; diff --git a/Marlin/src/inc/Conditionals-1-axes.h b/Marlin/src/inc/Conditionals-1-axes.h index 1ad256b3b8..6025094e8a 100644 --- a/Marlin/src/inc/Conditionals-1-axes.h +++ b/Marlin/src/inc/Conditionals-1-axes.h @@ -101,6 +101,7 @@ #define _PRUSA_MMU2 2 #define _PRUSA_MMU2S 3 #define _PRUSA_MMU3 4 + #define _CHAMELEON 5 #define _EXTENDABLE_EMU_MMU2 12 #define _EXTENDABLE_EMU_MMU2S 13 #define _EXTENDABLE_EMU_MMU3 14 @@ -115,6 +116,8 @@ #define HAS_PRUSA_MMU2S 1 #elif _MMU % 10 == _PRUSA_MMU3 #define HAS_PRUSA_MMU3 1 + #elif _MMU % 10 == _CHAMELEON + #define HAS_CHAMELEON 1 #endif #if _MMU == _EXTENDABLE_EMU_MMU2 || _MMU == _EXTENDABLE_EMU_MMU2S #define HAS_EXTENDABLE_MMU 1 @@ -125,6 +128,7 @@ #undef _PRUSA_MMU2 #undef _PRUSA_MMU2S #undef _PRUSA_MMU3 + #undef _CHAMELEON #undef _EXTENDABLE_EMU_MMU2 #undef _EXTENDABLE_EMU_MMU2S #undef _EXTENDABLE_EMU_MMU3 @@ -161,7 +165,7 @@ #define E_STEPPERS EXTRUDERS #define E_MANUAL EXTRUDERS -#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3 // Průša Multi-Material Unit v2/v3 +#elif HAS_PRUSA_MMU2 || HAS_PRUSA_MMU3 || HAS_CHAMELEON // Multi-Material Unit #define E_STEPPERS 1 #define E_MANUAL 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 868b0e9fb8..1b806f11e2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -626,13 +626,22 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #endif #endif +#if HAS_CHAMELEON + #if EXTRUDERS > 32 + #undef SINGLENOZZLE + #error "CHAMELEON only supports up to 32 EXTRUDERS. Please update your Configuration." + #endif +#endif + /** * Options only for EXTRUDERS > 1 */ #if HAS_MULTI_EXTRUDER #ifndef MAX_EXTRUDERS - #if HAS_EXTENDABLE_MMU + #if HAS_CHAMELEON + #define MAX_EXTRUDERS 32 + #elif HAS_EXTENDABLE_MMU #define MAX_EXTRUDERS 15 #else #define MAX_EXTRUDERS 8 diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 05adff7a4e..5a899d092e 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -668,6 +668,12 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define FWD_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? HIGH : LOW ); }while(0) #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 0) ? LOW : HIGH); }while(0) +#elif ENABLED(CHAMELEON) // One multiplexed stepper driver, reversed on T2/T3, T6/T7, T10/T11, etc. + + #define E_STEP_WRITE(E,V) E0_STEP_WRITE(V) + #define NORM_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 1) ? HIGH : LOW ); }while(0) + #define REV_E_DIR(E) do{ E0_DIR_WRITE(TEST(E, 1) ? LOW : HIGH); }while(0) + #elif E_STEPPERS > 1 #if E_STEPPERS > 7 diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 85254ea598..9ab4e7041c 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -82,6 +82,8 @@ #include "../feature/mmu/mmu2.h" #elif HAS_PRUSA_MMU1 #include "../feature/mmu/mmu.h" +#elif HAS_CHAMELEON + #include "../feature/mmu/chameleon.h" #endif #if HAS_MARLINUI_MENU @@ -1130,6 +1132,12 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { mmu3.tool_change(new_tool); + #elif HAS_CHAMELEON + + UNUSED(no_move); + + chameleon.tool_change(new_tool); + #elif HAS_PRUSA_MMU2 UNUSED(no_move); diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index f90e2074ab..3180cafb31 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -40,20 +40,20 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language # use_example_configs AnimationExample -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE jp_kana DEFAULT_EJERK 10 \ - EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 5 TEMP_SENSOR_3 20 TEMP_SENSOR_4 1000 TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO \ + EXTRUDERS 8 TEMP_SENSOR_BED 1 MMU_MODEL CHAMELEON DEFAULT_EJERK 10 LCD_LANGUAGE jp_kana opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ SDSUPPORT LONG_FILENAME_WRITE_SUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ Z_PROBE_SLED AUTO_BED_LEVELING_UBL UBL_HILBERT_CURVE UBL_TILT_ON_MESH_POINTS UBL_TILT_ON_MESH_POINTS_3POINT \ RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN \ - MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ + NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ - BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_DISPLAY_TOTAL opt_disable SEGMENT_LEVELED_MOVES -exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" +exec_test $1 $2 "Azteeg X3 Pro | Chameleon (x8) | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" # # 4 runout sensors with distinct states diff --git a/docs/Chameleon3D-WIP.md b/docs/Chameleon3D-WIP.md new file mode 100644 index 0000000000..dab7c9a002 --- /dev/null +++ b/docs/Chameleon3D-WIP.md @@ -0,0 +1,218 @@ +# 3D Chameleon - WIP + +The 3D Chameleon is an "up to the extruder" filament changing device that turns any single extruder printer into a multi-color master. The Chameleon does the bulk of the filament changing labor, loading the filament as far as the extruder gears, at which point the printer takes over. The Chameleon is perfectly suited for lightweight direct drive extruders and Bowden printers with reliable feeding mechanisms. Combine with a dry box for the ultimate in filament changing powers. + +Different versions of Chameleon may require different moves, but we'll just aim for Chameleon MK4 firmware and encourage Chameleon users to update. + +See https://www.youtube.com/playlist?list=PLB_0YGFjbOnbGTlFWEU46AW1Y504RGmI0 + +### Basic operation example: + +- PULSE x 7, RELEASE: HOME and SELECT E0 + +- PULSE x 2, RELEASE: SELECT E1 +- HOLD : LOAD E1 (~1in/second) +- RELEASE : OPEN + +- PULSE x 4, RELEASE: SELECT E1 +- HOLD : UNLOAD E1 (~1in/second) +- RELEASE : SELECT E3 +- HOLD : LOAD E3 (~1in/second) +- RELEASE: OPEN + +### G-code Notes: + +The [Chameleon MK4 G-code generator](https://www.3dchameleon.com/mk3-mode-3-gcode-generator) gives the Prusa Slicer Tool-change output below for [ X-Axis, 222mm, 4s, +86mm ]: + +```gcode +; Auto generated 3D Chameleon Mk4 Tool Change GCode for PrusaSlicer +; - 3D Chameleon Mk4 Tool T{next_extruder} - + +; begin switch from extruder {previous_extruder} to extruder #{next_extruder} +M117 Unloading Tool T[previous_extruder] +M83 ; turn relative distances for the extruder + +; unload extruder {previous_extruder} +G92 E0 + +; go to holding position to unload the stock extruder +G0 X219 F2000 ; <<----- EDIT THIS LINE TO SET THE INITIAL LOCATION OF THE BUTTON + +; if this is the first load, then don't unload +G91 ; move to relative mode +M83 + +; load extruder #{next_extruder} +M117 Loading Tool T{next_extruder} + +{if previous_extruder>-1} + +; back out the filament for cutting +G0 E-20 F500 ; retract a bit, adjust this to tune waste + +; <<<< insert mechanical cutter code here! >>>> + +;<<< Start Of Tip Shaping- Not Needed If You Have A 3DClippy Filament Cutter! >>> + +M109 R180 ; cool down to prevent swelling +M302 S0 ; enable cold extrusion +M106 S255 +G0 E20 F1500 +G0 E-5 F500 +M109 R165 ; cool down to prevent swelling +G0 E5 F1500 +G0 E-1 F500 +M109 R155 ; cool down to prevent swelling +G0 E1 F1500 +G0 E-25 F500 +M109 R150; cool down to prevent swelling +G0 E24 F1500 ; last tip dip with cold tip +G0 E-24 ; last tip dip with cold tip +M109 R180 ; ok... go back up in temp so we can move the extruder +G0 E-80 F500 ; back out of the extruder +G92 E0 +M104 S[temperature] + +;<<< End Of Tip Shaping >>> + +; we skipped to here if it was extruder -1 +{endif} + +{if previous_extruder>-1} + +; retract it back out of the extruder +G92 E0 +G0 E-86 F2000 +G92 E0 + +G0 E-30 F2000 ; <<<---- if mechanical cutter, change to a positive value of at least 5mm +G92 E0 + +; ok - out of extruder - press button to remove it all the way +G91 ; move to relative mode +M82 + +; we skipped to here if it was extruder -1 +{endif} + +; press the button to select the new extruder +G0 X3 F2000 + +{if next_extruder==0} +G4 P500 ; dwell for .5 seconds - adjust this to match your machines single pulse time +{endif} +{if next_extruder==1} +G4 P1000 ; dwell for 1.0 seconds - adjust this to match your machines two pulse time +{endif} +{if next_extruder==2} +G4 P1500 ; dwell for 1.5 seconds - adjust this to match your machines three pulse time +{endif} +{if next_extruder==3} +G4 P2000 ; dwell for 2.0 seconds - adjust this to match your machines four pulse time +{endif} +G0 X-3 + +G4 P2000 ; wait for cutter to work + +; ok command selected - back out filament if needed after cut + +{if previous_extruder>-1} + +; UNLOAD TO SPLITTER (25mm/s) + +G0 X3 F2000 +G4 P2500 +G0 X-3 +G4 P400 + +{endif} + +; RELOAD TO SPLITTER (100ms per mm?) + +G0 X3 F2000 +G4 P2500 +G0 E25 F1500 ; <<<--- adjust this E value to tune extruder loading +G0 X-3 +G4 P400 + +G92 E0 +G90 ; move back to absolute mode +M83 ; but make sure the extruder stays in relative + +; reload filament all the way into extruder + +G92 E0 +G0 E61 F2000 ; <<<<<----------- EDIT THIS DISTANCE TO FINE TUNE THE FILAMENT LOADING TO STOP BLOBBING OR UNDEREXTRUSION +G92 E0 + +M83 ; turn relative distances for the extruder +M302 S180 ; prevent cold extrusion + +M117 3D Chameleon Tool T{next_extruder} +``` + +- Setup requires XYZ position of switch, switch axis, switch direction, and pulse duration. +- An inch is ~25mm +- 7 pulses (e.g., hold 3.5 seconds) to "home" the 3D Chameleon. +- TODO: MarlinUI editable button press distance (default 3mm). Allow other end button mounting. + +### Color Change Sequence: + +- Move (X) to "initial free position" (button - 3) + +- Changing from some other color? (oldtool>-1) + - Slow Retract (8mm/s) -20mm of filament (for cut) (-20) + - Mechanical Cutter (optional) + + - Cool down to 180C + - Allow cold E moves + - Turn cooling fan to high + + - Fast (25mm/s) extrude +20, Slow (8mm/s) retract -5 ( -5) + - Then 165C - Fast extrude +5, Slow retract -1 ( -1) + - Then 155C - Fast extrude +1, Slow retract -25 (-25) + - Then 150C - Fast extrude +24, Fast retract -24 (-25) + + - Heat up to 180C + - Slow retract -80 (eject from extruder) (-105) + - Turn heat back up to Target Temperature (no wait) + - Speedy (33mm/s) retract -86 extruder-to-hotend (-191) + - Speedy retract -30 (-221) + (for mechanical cutter use forward move >= +5) + +- Select the New Color + - Speedy Move (X) +3mm to "pressed position" + - Dwell for PULSE * TOOL = SELECT COLOR + - Speedy Move (X) -3mm to "free position" + - Dwell 2000 waiting for CUTTER + +- UNLOAD Old Color (if oldtool>-1) + - Speedy Move (X) to "pressed position" (UNLOAD OLD COLOR) + - Dwell for 4s (~100mm) + - Speedy Move (X) to "free position" (OPEN) + - Dwell 400ms to settle + +- LOAD New Color + - Speedy Move (X) to "pressed position" (LOAD NEW COLOR) + - Dwell for 4s (~100mm) + - LOAD Extruder 25mm at 25mm/s (around ~1s). + Configure extruder to catch the filament just before the Chameleon releases it. + - Speedy Move (X) to "free position" (OPEN) + - Dwell 400ms to settle + + - Speedy Move E +61mm (86mm - 25mm) to load to extruder + +### Configurable Settings +- Initial E Retract Distance (for optional cut). +- BUTTON Standby Position { 211, 0, 0 } and Press Distance { +3, 0, 0 }. +- Speedy 2000 (33), Fast 1500 (25), and Slow 500 (8) Feedrates. +- Tipping Moves, e.g., { 180, -20, +20, -5, 165, +5, -1, 155, +1, -25, 150, +24, -24 } + - Split them up? + - Tipping Temps, e.g., { 180, 165, 155, 150 } + - Hot Moves, { -20, +20, -5 } (20 == Initial Retract) + - Warm Moves { +5, -1 } + - Cool Moves { +1, -25 } + - Cold Moves { +24, -24 } + +### Wired Switch +The 3D Chameleon can also be wired to a GPIO pin with a transistor for direct digital control with significantly shortened pulses. diff --git a/ini/features.ini b/ini/features.ini index 1c10302fb0..50e5cdd112 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -255,6 +255,7 @@ TEMP_STAT_LEDS = build_src_filter=+ + HAS_MEATPACK = build_src_filter=+ MIXING_EXTRUDER = build_src_filter=+ + +HAS_CHAMELEON = build_src_filter=+ HAS_PRUSA_MMU1 = build_src_filter=+ HAS_PRUSA_MMU2 = build_src_filter=+ + HAS_PRUSA_MMU3 = build_src_filter=+ +