Skip to content

Instantly share code, notes, and snippets.

@StefanKruk
Last active October 15, 2025 21:06
Show Gist options
  • Select an option

  • Save StefanKruk/24bad4b4887b5f01f8370a23bd7d6597 to your computer and use it in GitHub Desktop.

Select an option

Save StefanKruk/24bad4b4887b5f01f8370a23bd7d6597 to your computer and use it in GitHub Desktop.
SOVOL SV08 MMX integration with Demon Klipper Essentials Unified

Introduction

Happy Hare Setup for my Sovol SV08 with "Demon Klipper Essentials Unified" and Microswiss Hotend. MMX is connected directly via USB to the Printer (no U2C)

It is still a Work in Progress Documentation.

Links

https://www.printables.com/model/1181017-mmx-multi-material-extruder-exclusive-final-releas https://www.printables.com/model/1314513-low-rider-mmu-for-any-klipper-printer

LayerCore3D provided a video tutorial. While it is in spanish (which I don not speak) it was very helpfull for me

Installing Happy Hare

Reference: https://github.com/moggieuk/Happy-Hare/wiki/Installation During Installation you will be asked a few questions:

Question Answere
What type of MMU are you running? 13 (MMX)
Number of gates? 4
Select mcu board type used to control MMU 13 (Not in list / Unknown)
Would you like to have neopixel LEDs seup now for your MMU? y
Which servoe are you using? 1 (MG996R)

All other questions are based on your current setup and liking.

After installation, make sure you add following lines to your printer.cfg

# Happy Hare
[include mmu/base/*.cfg]
[include mmu/optional/mmu_menu.cfg]
[include mmu/optional/client_macros.cfg]

When using DEMON Klipper Essentials Unified you have most likely defined:

[save_variables]
filename = ~/demon_vars.cfg

add mmu__revision = 0 to this file as recommended by ~/printer_data/config/mmu/mmu_vars.cfg

Configuration of Happy Hare

Configure MMU Files

Reference: https://github.com/moggieuk/Happy-Hare/wiki#---setup-and-installation-pages

Configure Pins

First configure mmu/base/mmu.cfg and provide the correct board_pins. Refer to the Documentation provided by the MMX Project and Low Rider MMU Project. The Configuration should be as follow:}

Hardware Pin
Gate 0 PB7
Gate 1 PB5
Gate 2 PB6
Gate 3 PB8
Servo PB9
Neopixel LEDs PD3

For the Stepper

Hardware Pin
UART PA15
STEP PD0
DIR PD1
ENABLE PD2

For the Gate Sensor we use the SOVOL SV08 Stock Filament Runoutsensor. My Final Configuration is:

[board_pins mmu]
mcu: mmu # Assumes using an external / extra mcu dedicated to MMU
aliases:
    MMU_GEAR_UART=PA15,
    MMU_GEAR_STEP=PD0,
    MMU_GEAR_DIR=PD1,
    MMU_GEAR_ENABLE=PD2,
    MMU_GEAR_DIAG=,

    MMU_GEAR_UART_1=PA15,
    MMU_GEAR_STEP_1=PD0,
    MMU_GEAR_DIR_1=PD1,
    MMU_GEAR_ENABLE_1=PD2,
    MMU_GEAR_DIAG_1=,

    MMU_GEAR_UART_2=PA15,
    MMU_GEAR_STEP_2=PD0,
    MMU_GEAR_DIR_2=PD1,
    MMU_GEAR_ENABLE_2=PD2,
    MMU_GEAR_DIAG_2=,

    MMU_GEAR_UART_3=PA15,
    MMU_GEAR_STEP_3=PD0,
    MMU_GEAR_DIR_3=PD1,
    MMU_GEAR_ENABLE_3=PD2,
    MMU_GEAR_DIAG_3=,

    MMU_SEL_UART=PB9,
    MMU_SEL_STEP=,
    MMU_SEL_DIR=,
    MMU_SEL_ENABLE=,
    MMU_SEL_DIAG=,
    MMU_SEL_ENDSTOP=,
    MMU_SEL_SERVO=PB9,

    MMU_ENCODER=,
    MMU_GATE_SENSOR=,
    MMU_NEOPIXEL=PD3,

    MMU_PRE_GATE_0=PB7,
    MMU_PRE_GATE_1=PB5,
    MMU_PRE_GATE_2=PB6,
    MMU_PRE_GATE_3=PB8,
    MMU_PRE_GATE_4=,
    MMU_PRE_GATE_5=,
    MMU_PRE_GATE_6=,
    MMU_PRE_GATE_7=,
    MMU_PRE_GATE_8=,
    MMU_PRE_GATE_9=,
    MMU_PRE_GATE_10=,
    MMU_PRE_GATE_11=,

    MMU_POST_GEAR_0=,
    MMU_POST_GEAR_1=,
    MMU_POST_GEAR_2=,
    MMU_POST_GEAR_3=,
    MMU_POST_GEAR_4=,
    MMU_POST_GEAR_5=,
    MMU_POST_GEAR_6=,
    MMU_POST_GEAR_7=,
    MMU_POST_GEAR_8=,
    MMU_POST_GEAR_9=,
    MMU_POST_GEAR_10=,
    MMU_POST_GEAR_11=,

    #MMU_ESPOOLER_RWD_0={espooler_rwd_0_pin},
    #MMU_ESPOOLER_FWD_0={espooler_fwd_0_pin},
    #MMU_ESPOOLER_EN_0={espooler_en_0_pin},
    #MMU_ESPOOLER_TRIG_0=,
    #MMU_ESPOOLER_RWD_1={espooler_rwd_1_pin},
    #MMU_ESPOOLER_FWD_1={espooler_fwd_1_pin},
    #MMU_ESPOOLER_EN_1={espooler_en_1_pin},
    #MMU_ESPOOLER_TRIG_1=,
    #MMU_ESPOOLER_RWD_2={espooler_rwd_2_pin},
    #MMU_ESPOOLER_FWD_2={espooler_fwd_2_pin},
    #MMU_ESPOOLER_EN_2={espooler_en_2_pin},
    #MMU_ESPOOLER_TRIG_2=,
    #MMU_ESPOOLER_RWD_3={espooler_rwd_3_pin},
    #MMU_ESPOOLER_FWD_3={espooler_fwd_3_pin},
    #MMU_ESPOOLER_EN_3={espooler_en_3_pin},
    #MMU_ESPOOLER_TRIG_3=,

In mmu/base/mmu_hardware.cfg configure

gate_switch_pin: ^mcu:PE9

For LEDs to work properly configure under [neopixel mmu_leds]

color_order: RGB

I also recommend to increase the hold_current as 0.1 was, in my case, to low for the speed that the Sovol SV08 can reach.

hold_current=0.4

Configure other MMU Settings

First of all we need to enable Motor sync in mmu/base/mmu_parameters.cfg. Set

sync_to_extruder: 1                     # Gear motor is synchronized to extruder during print
sync_gear_current: 70                   # % of gear_stepper current (10%-100%) to use when syncing with extruder during print
sync_form_tip: 1                        # Synchronize during standalone tip formation (initial part of unload)
sync_purge: 1				            # Synchronize during standalone purging (last part of load)

Also make sure toolhead is correctly configured. In my case i have set those values: (I did not meassure everything 100% correclty so meassure your setup again; also i use a Microswiss Hotend)

toolhead_extruder_to_nozzle: 78		# Distance from extruder gears (entrance) to nozzle
toolhead_sensor_to_nozzle: 62		# Distance from toolhead sensor to nozzle (ignored if not fitted)
toolhead_entry_to_extruder: 29		# Distance from extruder "entry" sensor to extruder gears (ignored if not fitted)

# This setting represents how much residual filament is left behind in the nozzle when filament is removed, it is thus
# used to reduce the extruder loading length and prevent excessive blobbing but also in the calculation of purge volume.
# Note that this value can also be measured with the `MMU_CALIBRATE_TOOLHEAD` procedure
#
toolhead_residual_filament: 25		# Reduction in extruder loading length because of residual filament left behind

Now we need to adjust the Park Positions. In my case i use the Blob Bucket that is recommended by the Demon Klipper Unified Essentials Setup: https://www.printables.com/model/873006-sovol-sv08-silicone-nozzle-cleaner-purge-bucket-mi

Adjust in mmu/base/mmu_macro_vars.cfg the variable_park_... Positions Reference: https://github.com/moggieuk/Happy-Hare/wiki/Toolchange-Movement My Settings:

variable_min_toolchange_z       : 10.0		; The absolute minimum safety floor (z-height) for ALL parking moves
...
variable_park_toolchange        : 255, 363, 5,  0, 2	; x,y,z-hop,z_hop_ramp,retract for "toolchange" operations (toolchange,load,unload)
variable_park_runout            : 255, 363, 5,  5, 2	; x,y,z-hop,z_hop_ramp,retract
variable_park_pause             : 255, 363, 5,  0, 2	; x,y,z-hop,z_hop_ramp,retract (park position when mmu error occurs)
variable_park_cancel            : 255, 363, 10, 0, 2	; x,y,z-hop,z_hop_ramp,retract
variable_park_complete          : 255, 363, 10, 0, 2	; x,y,z-hop,z_hop_ramp,retract
...
variable_park_travel_speed      : 60		; Speed for any travel movement XY(Z) in mm/s

I also disabled WIPETOWER and therefore needed to set force_purge_standalone: 1

Finally restart your Firmeware and check if the Gate Sensors are properly working.

Configure Print Files

As we use the default Filament Sensor and we use it as MMU_GATE we need to disable it in the printer.cfg. Either remove or comment the whole section [filament_switch_sensor filament_sensor]

Also set variable_runout_sensor=False in Demon_User_Files/demon_user_settings_vx.x.x.cfg

Calibration

Calibrate Servo

Reference: https://github.com/moggieuk/Happy-Hare/wiki/MMU-Calibration-TypeA#---step-2-calibrate-your-servo Calibrate your servo with MMU_CALIBRATE_SELECTOR ANGLE=0,60,120,180 (or anything between 0-180) and note down the gate it selects at a specific angle.

Run MMU_CALIBRATE_SELECTOR SPACING=60 GATE=3 this will add mmu_selector_angles as propery to your specified [save_variables].

Now run

service klipper stop
sudo nano /path/to/my/save_variables_file

Modify the property mmu_selector_anglesto have the angle at the correct Gate. For me the Servo Angle's need to be mmu_selector_angles = [180, 120, 60, 0] and Start Klipper again via service klipper start

in mmu/base/mmu_parameters.cfg the value for selector_gate_angles can also be adjusted instead of going through calibration if you already know which angle will trigger which gate.

Calibrate Gates

Reference: https://github.com/moggieuk/Happy-Hare/wiki/MMU-Calibration-TypeA#---step-3-calibrate-your-gear-stepper Insert Filament in Gate 0 so that it can be messured afterwards. First select the Gate 0 with MMU_SELECT GATE=0 and make a test extrusion via MMU_TEST_MOVE MOVE=100. Finally meassure the Distance and calibrate it via MMU_CALIBRATE_GEAR MEASURED=<myValue>

For Gate 1-3 this can be simplified, as we only have one motor for all gates, by running: MMU_SELECT GATE=1,2,3 and calibrate Distance via MMU_CALIBRATE_GEAR MEASURED=<myValue>

Calibrate Bowden

Reference: https://github.com/moggieuk/Happy-Hare/wiki/MMU-Calibration-TypeA#---step-5-calibrate-bowden-length As the Stock Sovol SV08 only have a normal Filament Runout sensor we push the Filament until it reaches the Toolhead Gears and then run MMU_CALIBRATE_BOWDEN BOWDEN_LENGTH=1000 MANUAL=1 This will reverse check the distance and will save the value in the [save_variables] under mmu_calibration_bowden_lengths

Also configure/set the distance the Filament needs to travel additionaly after Unloading so that the PTFE Splitter is free via gate_parking_distance in mmu/base/mmu_parameters.cfg

Calibrate Blogging & Stringing

Reference: https://github.com/moggieuk/Happy-Hare/wiki/Blobbing-and-Stringing#---calibrating-toolhead

Calibrate Tip Forming

Reference: https://github.com/moggieuk/Happy-Hare/wiki/Tip-Forming-and-Purging https://github.com/moggieuk/Happy-Hare/wiki/Configuring-mmu_macro_vars.cfg

In mmu/base/mmu_macro_vars.cfg configure correct values for:

variable_cooling_tube_position=
variable_cooling_tube_length=
  1. Unload the Filament from the MMU
  2. Remove PTFE Tube from Extruder and insert a Filament
  3. Heat nozzle to Filament Target Temperature and execute MMU_LOAD EXTRUDER_ONLY=1 to load the Extruder
  4. Execute MMU_TEST_FORM_TIP to execute a Test Tip Forming. In this Process the used Variables are also printed
  5. Inspect the tip. If not satifsying, execute with adjusted values MMU_TEST_FORM_TIP <variable>=<value> .....
  6. Repeat Step 5 until satisfying result
MMU_TEST_FORM_TIP 
cooling_tube_length=25
cooling_tube_position=30
ramming_volume=2.15
cooling_moves=6
cooling_zone_pause=260
use_skinnydip=True
skinnydip_distance=31
dip_extraction_speed=95
  • Enable gear sync in START_GCODE in slicer
  • Clean Nozzle after Load, in mmu/base/mmu_macro_vars.cfg
    variable_user_post_load_extension     : 'CLEAN_NOZZLE'	; Executed after default logic but before restoring toolhead position
  • if still using DEMON MACRO PRINT_END and PAUSE Location is defined as x=255 y=363 the PRINT_END Macro will relatively move the head by x=5 y=5 and therefore into an Out or Range area. This will cause a cancel in the end sequence. You can either remove PRINT_END or enable _CUSTOM_PRE_END in Demon_User_Files/demon_custom_expansion_vx.x.xcfg to move the head x=-5 y=-5 before moving it back again.
variable_ceal_master_enable: TRUE
...
variable_pre_end: True
...

[gcode_macro _CUSTOM_PRE_END] # Before the PRINT_END macro starts
gcode:
 G91 # RELATIVE POSITIONING
 G0 X-5 Y-5 F12000 
 G90 # ABSOLUTE POSITIONING
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment