1 / 4
BCJ K1 MAX CFS upgrade kit with Microprobe — zdjęcie 1
1 / 4

BCJ K1 MAX CFS upgrade kit with Microprobe

Zamów wydruk tego modelu

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
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:

  1. Toolhead PCB signal connections, only 3 GPIOs are easily accessible but we need 4:

    1. 2x GPIO for Microprobe (on the TOUCH connector)

    2. 1x GPIO for filament runout sensor (on the FILA connector)

    3. 1x GPIO for filament cutter detection (spliced on the TACH of part cooling fan)

  2. Position of the filament cutter block

  3. Redesign of the purge bucket to allow for the microprobe and correct travel to the nozzle

  4. 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/s

variable_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.

SET_PRINT_STATS_INFO TOTAL_LAYER=[total_layer_count]
M140 S0
M104 S0
M109 S160
M140 S[first_layer_bed_temperature]
G28
TOOL[initial_tool] LEN=40 ; purge line will flush old filament
M109 S[first_layer_temperature]
M190 S[first_layer_bed_temperature]
G28 Z

G1 X{first_layer_print_min[0]+28} Y{first_layer_print_min[1]-13} Z0.8 F6000.0; G92 E0.0 ; reset extruder G1 X{first_layer_print_min[0]+21} Y{first_layer_print_min[1]-20} E10 F360.0 ; G92 E0.0 ; reset extruder G1 X{first_layer_print_min[0]+14} Y{first_layer_print_min[1]-13} E10 F360.0 ; G92 E0.0 ; reset extruder G1 X{first_layer_print_min[0]+7} Y{first_layer_print_min[1]-20} E10 F360.0 ; G92 E0.0 ; reset extruder G1 X{first_layer_print_min[0]} Y{first_layer_print_min[1]-13} E10 F360.0 ; G92 E0.0 ; reset extruder

G1 E-0.6 F2100 ; small retraction G1 Y{first_layer_print_min[1]-3} F6000.0 ; move an additional 10mm without extruding G92 E0.0 ; reset extruder

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.

TOOL{next_extruder} LEN={if purge_in_prime_tower}0{else}{28+second_flush_volume/(filament_diameter[next_extruder]*filament_diameter[next_extruder]*3.14159/4)}{endif} {if new_retract_length_toolchange>0 and old_retract_length_toolchange>0 } RETRACT={new_retract_length_toolchange + retract_restart_extra_toolchange[next_extruder]} PRERETRACT={old_retract_length_toolchange} {endif}
{if z_after_toolchange > 0 } 
G1 Z{z_after_toolchange} F480
{ endif }

 

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.

Tagi