BCJ K1 MAX CFS upgrade kit with Microprobe
Obliczymy ostateczną cenę na podstawie wybranego pliku. Sprawdzisz ją i zaakceptujesz przed płatnością.
Zapisane na tym urządzeniu.
Microprobe and BootyCalls Jones linear rail gantry upgrade for Creality Filament System
- Ocena
- 5 / 5
- Polubienia
- 22
- Pobrania
- 99
- Wydruki
- 1
- Wyświetlenia
- 1532
- Oceny
- 1
Aktualizacja u źródła:
Informacje o modelu
- Źródło
- Printables
- Kategoria
- Creality Parts & Upgrades
- Licencja
- Creative Commons — Attribution — Share Alike
Quick demo: successful filament swaps
Youtube link: https://youtu.be/2iw93cpaT3o
FULL print demo video from start to finish PETG
Youtube link: https://youtu.be/BmRtqx__UgM
CHANGELOG
05/12/2025 - Added box_v3 and gcode_macro_v2 config files that improve reliability of BOX_ macros and allows disabling pre-cut retraction.
22/02/2026 - Added explainations for manual layer PAUSE causes CFS to stop changing filaments.
K1 MAX BCJ gantry upgrade for CFS with Probe
Prerequisite: have installed and configured BCJ linear rail gantry on a K1 MAX with microprobe V2.0 on the toolhead carriage.
When upgrading to the CFS upgrade kit, we need to solve the following problems:
Toolhead PCB signal connections, only 3 GPIOs are easily accessible but we need 4:
2x GPIO for Microprobe (on the TOUCH connector)
1x GPIO for filament runout sensor (on the FILA connector)
1x GPIO for filament cutter detection (spliced on the TACH of part cooling fan)
Position of the filament cutter block
Redesign of the purge bucket to allow for the microprobe and correct travel to the nozzle
Rewriting of the CFS load/unload and filament change macros
1. Fitting the CFS extruder while keeping Microprobe V2.0
To fit the CFS extruder, you need to either reprint your toolhead mount to allow some space for the filament cutter lever or simply cut/sand it down with a dremel tool.
Once that's done, you'll need to rewire the stock CFS extruder cables to adapt the Cutter/Runout cables.
I used MicroJST 1.25 prewired kit to create a splicing cable and keep original cables.(Aliexpress Link)
Microprobe V2.0 is connected directly to the TOUCH connector. Then we split the FILA 3P male connector to Y split into 2x 3.3V and 2x GND + SIGNAL female 3P JST connectors.
1x male prewired 3P microjst (to connect to the toolhead PCB FILA connector)
2x female prewired 3P microjst (to connect the runout and cutter sensors male terminals)
1x male micro JST plastic 3P (to replace the 5P plastic shell of the cutter detect)
1x female prewired 4P microjst (to connect the part cooling fan male terminal)
1x male prewired 4P microjst (to connect to the toolhead PCB part cooling fan connector)
1x male to male prewired 5P microjst for the Microprobe (Aliexpress Link)
1.1 Schematic:

1.2 Assembly instruction:
![]() Solder the wires together as per this drawing | ![]() ![]() Replace the 5P cutter detect plastic connector by a 3P male connector (red/black/yellow) |
![]() Thread the wire and connector to the FILA connector. | ![]() ![]() Reattach the wire clamp piece and thread the filament cutter and runout flat cables through the slot of the USB cable. |
2. Installing the purge hopper/bucket
Follow the original instructions to install the purge bucket like on the original CFS upgrade kit. Install the covers and sliding columns normally and the printed bucket with original kit screws.
Add the Toolhead block to the toolhead carriage by sliding it on the linear rail block.
It should hold by friction.

Print with 4 walls minimum in ABS or ASA with supports ON.

3. Fit the filament cutter block on the left stepper mount
Remove the right screw of the left stepper mount and replace it with a 15mm M3 countersunk screw.
Add the addon block and screw it on.

Print with 4 walls minimum in ABS or ASA, no need for support, just orient the part flat.
4. Add your configuration files
4.1 Microprobe V2.0
Look at microprobe.txt and printer.txt for the microprobe config and disabling pr_touch.
You must also change in Klippy mcu.py the line to TRSYNC_TIMEOUT=0.050.
4.2 K1 (Max) CFS Kit
Use the box_v3.txt file to edit your box.cfg config.
I also use the microprobe.cfg/gcode_macro.cfg/printer.cfg as provided so you can adjust your setup.
[box] section
Here you define the default CFS settings as well as positions for the cutter and bucket.
Adjust cut_pos_x and cut_pos_y to make sure your cutter lever is pressed completely.
Adjust Tn_extrude_temp for the default nozzle temperature for filament load/swap.
Adjust extrude_pos_x, extrude_pos_y and extrude_pos_z for the bucket deployed position.
Make sure your filament_sensor_2 correctly reads the state of the filament in the extruder otherwise you'll have issues with the BOX_ macros.
[gcode_macro pre_cut_box]
Here you define pre-cut retraction information. This performs a filament retraction before cutting to allow saving some filament for each filament swaps.
The parameters were optimized for the stock Unicorn nozzle. (Max saved length is 37mm per filament swaps)
to keep it simple, we retract the "solid" part of the filament before cutting, aka the length of filament before the heatbreak. This is done in 2 steps, first slow retraction, then a fast one.
The total retract distance is variable_pre_cut_retrusion, on Unicorn it must NOT be higher than 37mm otherwise you'll have soft plastic to cut and that doesn't work well.
variable_post_cut_prime_len/speed is the opposite of variable_pre_cut_retrusion. It will preload the “empty” filament length in the nozzle. You can have the same or slightly lower than the retrusion length for best results and maximum filament savings.
variable_purge_length/speed, when loading a filament, you can choose to have a preset flushing amount here, this will determine the size of the blob extruded in the bucket by default. Suggested minimum is 28mm, aka the size of the heated region in Unicorn nozzle (containing the previous color molten filament).
2 examples:
1-Maximum filament saving: (pre-cut retrude, lower reliability for blob size & ejection by the hopper)
[gcode_macro pre_cut_box]
variable_pre_cut_retrusion: 37 # 37mm, heartbreak filament length, so there is approx 65-37 = 28 mm filament left in the nozzle after cutting
variable_pre_cut_retrusion_speed: 33 # mm/s
variable_pre_cut_slow_retrusion: 15 # mm, first slow retrusion
variable_pre_cut_slow_retrusion_speed: 3 # mm/s
variable_post_cut_prime_len: 34 # 34mm should be equivalent to pre_cut_retrusion mm to fill the void left by retracting pre-cut, how much to extrude before moving to the purge tower. We need some pressure there to not print have large holes in the purge tower
variable_post_cut_prime_speed: 10 # mm/svariable_max_wait_for_preload: 30 # sec, how many seconds to wait for preload
variable_purge_length: 28 # mm, amount of filament to purge out after loading the new filament, minimum is the remaining length of old filament in nozzle
variable_purge_speed: 3 # mm/s flowrate mm3/s = 3.14*1.75²/4 * purge_speed mm2/s = 2.4040625 * purge_speed mm/s
-> this configuration only flushes the remaining amount of filament (28mm) in the molten region of the Unicorn nozzle, the resulting blob is often too small to be effectively caught by the hopper system and isn't ejected properly, you need to call the TOOLx macro with LEN parameter to provide extra purge length.
2-No filament saving: (high reliability for blob size in the hopper ejection)
[gcode_macro pre_cut_box]
variable_pre_cut_retrusion: 0
variable_pre_cut_retrusion_speed: 33
variable_pre_cut_slow_retrusion: 15
variable_pre_cut_slow_retrusion_speed: 3
variable_post_cut_prime_len: 0
variable_post_cut_prime_speed: 10
variable_max_wait_for_preload: 30
variable_purge_length: 65
variable_purge_speed: 3
-> this configuration flushes the full nozzle and therefore creates a fairly large blob that's easily caught by the hopper. In this configuration, the use of the TOOLx LEN parameter is less important since the size of the blob is already fairly large.
TOOLx Toolchange macro
use the TOOLx macro to change to the CFS slot number X.
parameters:
S=extrusion temperature of the filament to load (default tn_extrude_temp)
LEN=length of extrusion, used by the slicer to give the filament flushing length of the filament change
END_PRINT macro
It's important to use the modified END_PRINT macro from gcode_macro.cfg file to make sure your custom bucket macro as well as pre-cut retraction occurs properly at the end of a print where the filament is retracted back into the CFS.
5. Prepare your OrcaSlicer profile
Prepare your orca profile for multicolor settings:
Screenshot | Description |
|---|---|
![]() | Make the printer a single extruder multicolor printer. Adjust the loading/unloading times to get realistic print time estimates. |
![]() ![]() ![]() | Start Gcode: The start gcode loads the correct filament slot and homes the Z axis after heating up the bed. it also draws a thick priming line close to the printed object. Filament change Gcode: Here we call the TOOLx macro with the flush length parameters. The filament color change flushing volume is converted to the extrusion length parameter so color changes are crisp.
|
![]() | In you filament gcodes, no need to specify any custom gcode. |
![]() ![]() | When slicing, I suggest adding a very small purge tower, only to avoid small filament blobs and build pressure after loading the new filament in the hopper. Move the purge tower close to your object to the best results. |
CFS doesn't change filaments after gcode file PAUSE
If you want to insert magnets into your prints, you may want to add a PAUSE layer in OrcaSlicer. This creates an issue at least with Firmware 2.5.3.27, where the CFS gets into a locked state.
Creality has heavily modified the virtual_sdcard.py and pause_resume.py files to add the CFS. They have introduced a bug where a PAUSE gcode sent from a gcode file instead of manually through the WEBUI or Screen is locking the CFS that stops swapping colors.
This is due to a new internal variable Creality added in virtual_sdcard.py called do_resume_status.
When the printer starts or when a print finished, this variable is set to False.
It is only set to True IF a PAUSE gcode is coming from the gcode file. And it is never reset until the end of the print or a manual cancellation...
virtual_sdcard.py: Missing reset of the do_resume_status variable, added in RED rectangle.

pause_resume.py: Sets the do_resume_status variable when PAUSE is received from gcode print

box_wrapper CFS:



A function called if_in_resume() is used and checks for do_resume_status=False to allow CFS movements. When it's True, logs will appear in klippy.log showing CFS actions were bypassed/cancelled.
The workaround is to reset the value to False when the virtual_sdcard.do_resume() function is called.
Modify the file /usr/share/klipper/klippy/virtual_sdcard.py as shown.
Restart Klipper of course after modifying the file.
I cannot tell if this issue is fixed in later firmwares like 2.3.5.34 but at least I've got a workaround there.












