######################################################################################################################## # Happy Hare MMU Software # # EDIT THIS FILE BASED ON YOUR SETUP # # Copyright (C) 2022-2025 moggieuk#6538 (discord) # moggieuk@hotmail.com # This file may be distributed under the terms of the GNU GPLv3 license. # # Goal: Happy Hare MMU hardware config file with config for MMB11 MCU board # # (\_/) # ( *,*) # (")_(") Happy Hare Ready # # # Notes about setup of common external MCUs can be found here: # https://github.com/moggieuk/Happy-Hare/blob/main/doc/mcu_notes.md # # Note about "touch" endstops: Happy Hare provides extremely flexible homing options using both single steppers or # synced steppers. The "touch" option leverages stallguard and thus requires the appropriate 'diag_pin' and stallguard # parameters set on the TMC driver section. If you have the diag_pin exposed, it is harmless to define this because # they will only be used when explicitly needed and configured. # # Touch option for each stepper provides these benefits / possibilities (experimental): # - on extruder stepper allows for the automatic detection of the nozzle! # - on selector stepper allows for the automatic detection of filament stuck in the gate and subsequent recovery # - on gear stepper allows for the automatic detection of the extruder entrance # # These sound wonderful right? They are, but there are caveats: # - Some external MCUs are terrible at detecting stallguard and often result in an "undervoltage error" # It is generally possible to get selector touch (TMC2209) tuned especially if you set 'stealthchop_threshold' # to a value greater than homing speeds and less than move speed. I.e. the stepper runs in stealthchop mode when # homing. [klipper experts will know that it switches the chip mode automatically to stealthchop and then back for # Stallguard2 support, however the automatic switching back to spreadcycle at the end homing move seems to provoke # the error condition and setting 'stealthchop_threshold' appropriately avoids this condition. More than you wanted # to know I'm sure! # - I have not had much luck with touch (stallguard) on the gear stepper with EASY-BRD and ERB MCUs and you really # want the extra torque of spreadcycle so adjusting 'stealthchop_threshold' is not really an option # - Enabling on the extruder stepper is viable but you will likely have to change jumpers on your main mcu to expose # the DIAG pin for whichever driver the extruder stepper is connected to. # # In summary, "touch" homing with your MMU is an advanced option that requires patience and careful tuning. Everything # works with regular endstops and there are workaround options for certain homing points (like extruder entry) in # the absence of any endstop. I'm really interested in creative setups. Ping me on Discord (moggieuk#6538) # # See 'mmu.cfg' for serial definition and pins aliases # # HOMING CAPABLE EXTRUDER (VERY ADVANCED) ----------------------------------------------------------------------------- # With Happy Hare installed even the extruder can be homed. You will find the usual 'endstop' parameters can be added # to your '[extruder]' section. Useless you have some clever load cell attached to your nozzle it only really makes # sense to configure stallguard style "touch" homing. To do this add lines similar to this to your existing # '[extruder]' definition in printer.cfg. # # [extruder] # endstop_pin: tmc2209_extruder:virtual_endstop # # Also be sure to add the appropriate stallguard config to the TMC section, e.g. # # [tmc2209 extruder] # diag_pin: E_DIAG # Set to MCU pin connected to TMC DIAG pin for extruder # driver_SGTHRS: 100 # 255 is most sensitive value, 0 is least sensitive # # Happy Hare will take care of the rest and add a 'mmu_ext_touch' endstop automatically # # MMU MACHINE / TYPE --------------------------------------------------------------------------------------------------- # ███╗ ███╗███╗ ███╗██╗ ██╗ ███╗ ███╗ █████╗ ██████╗██╗ ██╗██╗███╗ ██╗███████╗ # ████╗ ████║████╗ ████║██║ ██║ ████╗ ████║██╔══██╗██╔════╝██║ ██║██║████╗ ██║██╔════╝ # ██╔████╔██║██╔████╔██║██║ ██║ ██╔████╔██║███████║██║ ███████║██║██╔██╗ ██║█████╗ # ██║╚██╔╝██║██║╚██╔╝██║██║ ██║ ██║╚██╔╝██║██╔══██║██║ ██╔══██║██║██║╚██╗██║██╔══╝ # ██║ ╚═╝ ██║██║ ╚═╝ ██║╚██████╔╝ ██║ ╚═╝ ██║██║ ██║╚██████╗██║ ██║██║██║ ╚████║███████╗ # ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝ [mmu_machine] # Number of selectable gate on (each) MMU. Generally this is a single number, but with multi-mmu (type-B) setups # it can be a comma separated list of the number of gates per unit. # E.g. 'num_gates: 4,4,2' for a 2xBox Turtle and 1xNight Owl multiplexed setup # num_gates: 8 # MMU Vendor & Version is used to automatically configure some parameters and validate configuration # If custom set to "Other" and uncomment the additional parameters below # # ERCF 1.1 add "s" suffix for Springy, "b" for Binky, "t" for Triple-Decky # e.g. "1.1sb" for v1.1 with Springy mod and Binky encoder # ERCF 2.0 community edition ERCFv2 # Tradrack 1.0 add "e" if encoder is fitted (assumed to be Binky) # AngryBeaver 1.0 # BoxTurtle 1.0 # NightOwl 1.0 # 3MS 1.0 # 3D Chameleon 1.0 # Prusa 3.0 NOT YET SUPPORTED - COMING SOON # Other Generic setup that may require further customization of 'cad' parameters. See doc in mmu_parameters.cfg # mmu_vendor: ERCF # MMU family mmu_version: 2.0 # MMU hardware version number (add mod suffix documented above) # The following attributes are set internally from vendor/version above. Only uncomment to customize the vendor # default or for custom ("Other") designs # #selector_type: LinearSelector # E.g. LinearSelector (type-A), VirtualSelector (type-B), MacroSelector, RotarySelector, ... #variable_bowden_lengths: 0 # 1 = If MMU design has different bowden lengths per gate, 0 = bowden length is the same #variable_rotation_distances: 1 # 1 = If MMU design has dissimilar drive/BMG gears, thus rotation distance, 0 = One drive gear (e.g. Tradrack) #require_bowden_move: 1 # 1 = If MMU design has bowden move that is included in load/unload, 0 = zero length bowden (skip bowden move) #filament_always_gripped: 0 # 1 = Filament is always trapped by MMU (most type-B designs), 0 = MMU can release filament #has_bypass: 0 # 1 = Bypass gate available, 0 = No filament bypass possible # Uncomment to change the display name in UI's. Defaults to the vendor name #display_name: My Precious homing_extruder: 1 # CAUTION: Normally this should be 1. 0 will disable the homing extruder capability # FILAMENT DRIVE GEAR STEPPER(S) -------------------------------------------------------------------------------------- # ██████╗ ███████╗ █████╗ ██████╗ # ██╔════╝ ██╔════╝██╔══██╗██╔══██╗ # ██║ ███╗█████╗ ███████║██████╔╝ # ██║ ██║██╔══╝ ██╔══██║██╔══██╗ # ╚██████╔╝███████╗██║ ██║██║ ██║ # ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═╝ # Note that 'toolhead' & 'mmu_gear' endstops will automatically be added if a toolhead sensor or gate sensor is defined # # The default values are tested with the ERCF BOM NEMA14 motor. Please adapt these values to the motor you are using # Example : for NEMA17 motors, you'll usually use higher current # [tmc2209 stepper_mmu_gear] uart_pin: mmu:MMU_GEAR_UART run_current: 0.5 # ERCF BOM NEMA14 motor hold_current: 0.1 # Recommend to be small if not using "touch" or move (TMC stallguard) interpolate: True sense_resistor: 0.110 # Usually 0.11, 0.15 for BTT TMC2226 stealthchop_threshold: 0 # Spreadcycle has more torque and better at speed # # Uncomment two lines below if you have TMC and want the ability to use filament "touch" homing with gear stepper #diag_pin: ^mmu:MMU_GEAR_DIAG # Set to MCU pin connected to TMC DIAG pin for gear stepper #driver_SGTHRS: 60 # 255 is most sensitive value, 0 is least sensitive [stepper_mmu_gear] step_pin: mmu:MMU_GEAR_STEP dir_pin: !mmu:MMU_GEAR_DIR enable_pin: !mmu:MMU_GEAR_ENABLE rotation_distance: 22.7316868 # Bondtech 5mm Drive Gears. Overridden by 'mmu_gear_rotation_distance' in mmu_vars.cfg gear_ratio: 80:20 # E.g. ERCF 80:20, Tradrack 50:17 microsteps: 16 # Recommend 16. Increase only if you "step compress" issues when syncing full_steps_per_rotation: 200 # 200 for 1.8 degree, 400 for 0.9 degree # # Uncomment the two lines below to enable filament "touch" homing option with gear motor #extra_endstop_pins: tmc2209_stepper_mmu_gear:virtual_endstop #extra_endstop_names: mmu_gear_touch # SELECTOR STEPPER ---------------------------------------------------------------------------------------------------- # ███████╗███████╗██╗ ███████╗ ██████╗████████╗ ██████╗ ██████╗ # ██╔════╝██╔════╝██║ ██╔════╝██╔════╝╚══██╔══╝██╔═══██╗██╔══██╗ # ███████╗█████╗ ██║ █████╗ ██║ ██║ ██║ ██║██████╔╝ # ╚════██║██╔══╝ ██║ ██╔══╝ ██║ ██║ ██║ ██║██╔══██╗ # ███████║███████╗███████╗███████╗╚██████╗ ██║ ╚██████╔╝██║ ██║ # ╚══════╝╚══════╝╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ # Consult doc if you want to setup selector for "touch" homing instead or physical endstop # [tmc2209 stepper_mmu_selector] uart_pin: mmu:MMU_SEL_UART run_current: 0.4 # ERCF BOM NEMA17 motor hold_current: 0.2 # Can be small if not using "touch" movement (TMC stallguard) interpolate: True sense_resistor: 0.110 stealthchop_threshold: 100 # Stallguard "touch" movement (slower speeds) best done with stealthchop # # Uncomment two lines below if you have TMC and want to use selector "touch" movement #diag_pin: ^mmu:MMU_SEL_DIAG # Set to MCU pin connected to TMC DIAG pin for selector stepper #driver_SGTHRS: 75 # 255 is most sensitive value, 0 is least sensitive [stepper_mmu_selector] step_pin: mmu:MMU_SEL_STEP dir_pin: !mmu:MMU_SEL_DIR enable_pin: !mmu:MMU_SEL_ENABLE rotation_distance: 40 microsteps: 16 # Don't need high fidelity full_steps_per_rotation: 200 # 200 for 1.8 degree, 400 for 0.9 degree endstop_pin: ^mmu:MMU_SEL_ENDSTOP # Selector microswitch endstop_name: mmu_sel_home # Uncomment this line only if default endstop above is using stallguard #homing_retract_dist: 0 # # Uncomment two lines below to give option of selector "touch" movement #extra_endstop_pins: tmc2209_stepper_mmu_selector:virtual_endstop #extra_endstop_names: mmu_sel_touch # SERVOS --------------------------------------------------------------------------------------------------------------- # ███████╗███████╗██████╗ ██╗ ██╗ ██████╗ ███████╗ # ██╔════╝██╔════╝██╔══██╗██║ ██║██╔═══██╗██╔════╝ # ███████╗█████╗ ██████╔╝██║ ██║██║ ██║███████╗ # ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║ ██║╚════██║ # ███████║███████╗██║ ██║ ╚████╔╝ ╚██████╔╝███████║ # ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═════╝ ╚══════╝ # Basic servo PWM setup. If these values are changed then the angles defined for different positions will also change # # SELECTOR SERVO ------------------------------------------------------------------------------------------------------- # [mmu_servo selector_servo] pin: mmu:MMU_SEL_SERVO maximum_servo_angle: 180 minimum_pulse_width: 0.00085 maximum_pulse_width: 0.00215 # # OPTIONAL GANTRY SERVO FOR TOOLHEAD FILAMENT CUTTER ------------------------------------------------------------------ # # (uncomment this section if you have a gantry servo for toolhead cutter pin) #[mmu_servo mmu_gantry_servo] #pin: #maximum_servo_angle:180 #minimum_pulse_width: 0.00075 #maximum_pulse_width: 0.00225 #initial_angle: 180 # FILAMENT SENSORS ----------------------------------------------------------------------------------------------------- # ███████╗███████╗███╗ ██╗███████╗ ██████╗ ██████╗ ███████╗ # ██╔════╝██╔════╝████╗ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝ # ███████╗█████╗ ██╔██╗ ██║███████╗██║ ██║██████╔╝███████╗ # ╚════██║██╔══╝ ██║╚██╗██║╚════██║██║ ██║██╔══██╗╚════██║ # ███████║███████╗██║ ╚████║███████║╚██████╔╝██║ ██║███████║ # ╚══════╝╚══════╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ # Define the pins for optional sensors in the filament path. All but the pre-gate sensors will be automatically setup as # both endstops (for homing) and sensors for visibility purposes. # # 'pre_gate_switch_pin_X' .. 'mmu_pre_gate_X' sensor detects filament at entry to MMU. X=gate number (0..N) # 'gate_switch_pin' .. 'mmu_gate' shared sensor detects filament past the gate of the MMU # or # 'post_gear_switch_pin_X' .. 'mmu_gear_X' post gear sensor for each filament # 'extruder_switch_pin' .. 'extruder' sensor detects filament just before the extruder entry # 'toolhead_switch_pin' .. 'toolhead' sensor detects filament after extruder entry # # Sync motor feedback will typically have a tension switch (most important for syncing) or both tension and compression. # Note that compression switch is useful for use as a endstop to detect hitting the extruder entrance # 'sync_feedback_tension_pin' .. pin for switch activated when filament is under tension # 'sync_feedback_compression_pin' .. pin for switch activated when filament is under compression # # Configuration is flexible: Simply define pins for any sensor you want to enable, if pin is not set (or the alias is empty) # it will be ignored. You can also just comment out what you are not using. # [mmu_sensors] pre_gate_switch_pin_0: ^mmu:MMU_PRE_GATE_0 pre_gate_switch_pin_1: ^mmu:MMU_PRE_GATE_1 pre_gate_switch_pin_2: ^mmu:MMU_PRE_GATE_2 pre_gate_switch_pin_3: ^mmu:MMU_PRE_GATE_3 pre_gate_switch_pin_4: ^mmu:MMU_PRE_GATE_4 pre_gate_switch_pin_5: ^mmu:MMU_PRE_GATE_5 pre_gate_switch_pin_6: ^mmu:MMU_PRE_GATE_6 pre_gate_switch_pin_7: ^mmu:MMU_PRE_GATE_7 pre_gate_switch_pin_8: ^mmu:MMU_PRE_GATE_8 pre_gate_switch_pin_9: ^mmu:MMU_PRE_GATE_9 pre_gate_switch_pin_10: ^mmu:MMU_PRE_GATE_10 pre_gate_switch_pin_11: ^mmu:MMU_PRE_GATE_11 post_gear_switch_pin_0: ^mmu:MMU_POST_GEAR_0 post_gear_switch_pin_1: ^mmu:MMU_POST_GEAR_1 post_gear_switch_pin_2: ^mmu:MMU_POST_GEAR_2 post_gear_switch_pin_3: ^mmu:MMU_POST_GEAR_3 post_gear_switch_pin_4: ^mmu:MMU_POST_GEAR_4 post_gear_switch_pin_5: ^mmu:MMU_POST_GEAR_5 post_gear_switch_pin_6: ^mmu:MMU_POST_GEAR_6 post_gear_switch_pin_7: ^mmu:MMU_POST_GEAR_7 post_gear_switch_pin_8: ^mmu:MMU_POST_GEAR_8 post_gear_switch_pin_9: ^mmu:MMU_POST_GEAR_9 post_gear_switch_pin_10: ^mmu:MMU_POST_GEAR_10 post_gear_switch_pin_11: ^mmu:MMU_POST_GEAR_11 # These sensors can be replicated in a multi-mmu, type-B setup (see num_gates comment). # If so, then use a comma separated list of per-unit pins instead of single pin gate_switch_pin: ^mmu:MMU_GATE_SENSOR sync_feedback_tension_pin: sync_feedback_compression_pin: # These sensors are on the toolhead and often controlled by the main printer mcu extruder_switch_pin: toolhead_switch_pin: # ENCODER ------------------------------------------------------------------------------------------------------------- # ███████╗███╗ ██╗ ██████╗ ██████╗ ██████╗ ███████╗██████╗ # ██╔════╝████╗ ██║██╔════╝██╔═══██╗██╔══██╗██╔════╝██╔══██╗ # █████╗ ██╔██╗ ██║██║ ██║ ██║██║ ██║█████╗ ██████╔╝ # ██╔══╝ ██║╚██╗██║██║ ██║ ██║██║ ██║██╔══╝ ██╔══██╗ # ███████╗██║ ╚████║╚██████╗╚██████╔╝██████╔╝███████╗██║ ██║ # ╚══════╝╚═╝ ╚═══╝ ╚═════╝ ╚═════╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝ # Encoder measures distance, monitors for runout and clogging and constantly calculates % flow rate # Note that the encoder_resolution set here is purely a default to get started. It will be correcly set after calibration # with the value stored in mmu_vars.cfg # # The encoder resolution will be calibrated but it needs a default approximation # If BMG gear based: # resolution = bmg_circumfrance / (2 * teeth) # 24 / (2 * 17) = 0.7059 for TRCT5000 based sensor # 24 / (2 * 12) = 1.0 for Binky with 12 tooth disc # [mmu_encoder mmu_encoder] encoder_pin: ^mmu:MMU_ENCODER encoder_resolution: 1.0 # This is just a starter value. Overriden by calibrated 'mmu_encoder_resolution' in mmm_vars.cfg desired_headroom: 5.0 # The clog/runout headroom that MMU attempts to maintain (closest point to triggering runout) average_samples: 4 # The "damping" effect of last measurement (higher value means slower automatic clog_length reduction) flowrate_samples: 20 # How many "movements" of the extruder to measure average flowrate over # MMU OPTIONAL NEOPIXEL LED SUPPORT ------------------------------------------------------------------------------------ # ██╗ ███████╗██████╗ ███████╗ # ██║ ██╔════╝██╔══██╗██╔════╝ # ██║ █████╗ ██║ ██║███████╗ # ██║ ██╔══╝ ██║ ██║╚════██║ # ███████╗███████╗██████╔╝███████║ # ╚══════╝╚══════╝╚═════╝ ╚══════╝ # Define the led connection, type and length # # (comment out this section if you don't have leds or have them defined elsewhere) [neopixel mmu_leds] pin: mmu:MMU_NEOPIXEL chain_count: 18 # Need number gates x1 or x2 + status leds color_order: GRBW # Set based on your particular neopixel specification (can be comma separated list) # MMU LED EFFECT SEGMENTS ---------------------------------------------------------------------------------------------- # Define neopixel LEDs for your MMU. The chain_count must be large enough for your desired ranges: # exit .. this set of LEDs, one for every gate, usually would be mounted at the exit point of the gate # entry .. this set of LEDs, one for every gate, could be mounted at the entry point of filament into the MMU/buffer # status .. these LED. represents the status of the MMU (and selected filament). More than one status LED is possible # logo .. these LEDs don't change during operation and are designed for driving a logo. More than one logo LED is possible # # Note that all sets are optional. You can opt to just have the 'exit' set for example. The advantage to having # both entry and exit LEDs is, for example, so that 'entry' can display gate status while 'exit' displays the color # # The animation effects requires the installation of Julian Schill's awesome LED effect module otherwise the LEDs # will be static: # https://github.com/julianschill/klipper-led_effect # # LED's are indexed in the chain from 1..N. Thus to set up LED's on 'exit' and a single 'status' LED on a 4 gate MMU: # # exit_leds: neopixel:mmu_leds (1,2,3,4) # status_leds: neopixel:mmu_leds (5) # # In this example no 'entry' set is configured. Note that constructs like "mmu_leds (1-3,4)" are also valid # # The range is completely flexible and can be comprised of different led strips, individual LEDs, or combinations of # both on different pins. In addition, the ordering is flexible based on your wiring, thus (1-4) and (4-1) both represent # the same LED range but mapped to increasing or decreasing gates respectively. E.g if you have two Box Turtle MMUs, one # with a chain of LEDs wired in reverse order and another with individual LEDs, to define 8 exit LEDs: # # exit_leds: neopixel:bt_1 (4-1) # neopixel:bt_2a # neopixel:bt_2b # neopixel:bt_2c # neopixel:bt_2d # # Note the use of separate lines for each part of the definition, # # ADVANCED: Happy Hare provides a convenience wrapper [mmu_led_effect] that not only creates an effect on each of the # [mmu_leds] specified segments as a whole but also each individual LED for atomic control. See mmu_leds.cfg for examples # # (comment out this whole section if you don't have/want leds; uncomment/edit LEDs fitted on your MMU) [mmu_leds] exit_leds: neopixel:mmu_leds (1-8) #entry_leds: neopixel:mmu_leds (9-16) #status_leds: neopixel:mmu_leds (17) #logo_leds: neopixel:mmu_leds (18) frame_rate: 24