Ok.
Ill try to make a video showing my experimental rig and controller, working with your plugin, in sync with the terminal and macros, and will upload the macros to Github. The printer was built for experimentation, but it’s a bed slinger, so it’s impossible to reproduce what @BelgarionNL is describing.
Will take some time : my video editing skills are on the low end !
For now, here’s the important gcodes, with comments (hopefully it’ll be understandable…) :
Dockable_Probe.cfg :
#####################################################################
# Dockable_Probe.cfg
#####################################################################
#___________________________________________________________________
[delayed_gcode autorun]
initial_duration: 1
gcode:
{% set x_probe = 317 | float %} ; = dockable_probe position for reference Z offset (countersunk screw)
SAVE_VARIABLE VARIABLE=x_probe VALUE={x_probe}
#___________________________________________________________________
; https://github.com/TypQxQ/KnobProbe_Klipper
[knobprobe]
pin: !P1.27 ; SKR 1.4 Z- STOP
deactivate_on_each_sample: False
z_offset: 0.0
speed: 5 ; /!\ 10 too fast for good repeatability, unlike bltouch
sample_retract_dist: 2.0
lift_speed: 100 ;5
; zero retries when setting 'samples_tolerance' to 0.01 -> 1 is enough
;samples_tolerance: 0.01 ; 100% success
samples: 1
;samples_tolerance_retries: 2
#___________________________________________________________________
[gcode_macro KNOBPROBE_ACCURACY]
description : KnobProbe Z-height accuracy at dock position, and return to previous position
gcode:
{% set pos = printer.gcode_move.gcode_position %}
{% set lift_speed = printer.configfile.settings.dockable_probe.lift_speed | float %} ; mm/s
{% set travel_speed = printer.configfile.settings.dockable_probe.travel_speed | float %} ; mm/s
MOVE_TO_EXTRACT_PROBE
PROBE_KNOBACCURACY {rawparams}
DETACH_PROBE
SAVE_GCODE_STATE NAME=state_KNOBPROBE_ACCURACY
G90
G0 Z{pos.z} F{60 * lift_speed}
G0 X{pos.x} Y{pos.y} F{60 * travel_speed}
RESTORE_GCODE_STATE NAME=state_KNOBPROBE_ACCURACY
#___________________________________________________________________
[dockable_probe]
pin: ^P0.10 ; SKR 1.4 BLTouch probe pin ; NC switch
dock_sense_pin: !P1.0 ; SKR 1.4 Z+ STOP / PwrDet
;probe_sense_pin: !P2.0 ; SKR 1.4 BLTouch servo out
x_offset: -1.84
y_offset: 20.84
z_offset: 2.55 ; increasing value lowers the nozzle
approach_position: 327.5, 150.0, 15.0 ; z also for lifting before probing the coountersunk screw
dock_position: 327.5, 150.0
detach_position: 290.0, 150.0, 1.0 ; wipe left @ Z = 1 mm
z_hop: 15.0 ; also used before probing countersunk screw reference
speed: 5 ; probing speed ; /!\ 10 too fast for good repeatability, unlike bltouch
lift_speed: 100.0 ; 50.0 ;15.0 ; default = speed
attach_speed: 150.0 ; speed for MOVE_TO_DOCK_PROBE
detach_speed: 150.0 ; speed for MOVE_TO_DETACH_PROBE
travel_speed: 150.0 ; speed for MOVE_TO_APPROACH_PROBE
; zero retries when setting 'samples_tolerance' to 0.01 -> 1 sample is enough
;samples_tolerance: 0.01 ; 100% success
samples: 1 ; default = 1
sample_retract_dist: 2.0 ; default = 2.0
;samples_result: average
;samples_tolerance_retries: 2
check_open_attach: True
dock_retries: 0 ; not relevant
#___________________________________________________________________
[gcode_macro MOVE_TO_APPROACH_PROBE]
description: Move close to the probe dock before attaching
rename_existing: MOVE_TO_APPROACH_PROBE_BASE
gcode:
;RESPOND MSG="MOVE_TO_APPROACH_PROBE"
{% set x_approach, y_dummy, z_dummy = printer.configfile.settings.dockable_probe.approach_position.replace(' ', '').split(',') %}
{% set travel_speed = printer.configfile.settings.dockable_probe.travel_speed | float %} ; mm/s
{% set z_speed = printer.configfile.settings.dockable_probe.attach_speed | float %} ; mm/s
{% set x_dummy, y_dummy, z_detach = printer.configfile.settings.dockable_probe.detach_position.replace(' ', '').split(',') %}
{% set z_hop = printer.configfile.settings.dockable_probe.z_hop | float %} ; mm/s
SAVE_GCODE_STATE NAME=state_MOVE_TO_APPROACH_PROBE
G90
G0 Z{z_hop} F{60 * z_speed}
G0 X{x_approach} F{60 * travel_speed}
G0 Z{z_detach} F{60 * z_speed}
RESTORE_GCODE_STATE NAME=state_MOVE_TO_APPROACH_PROBE
#___________________________________________________________________
[gcode_macro MOVE_TO_INSERT_PROBE]
description: Move near the dock with the probe attached before detaching. Default : alias for MOVE_TO_APPROACH_PROBE
rename_existing: MOVE_TO_INSERT_PROBE_BASE
gcode:
;RESPOND MSG="MOVE_TO_INSERT_PROBE"
{% set z_speed = printer.configfile.settings.dockable_probe.attach_speed | float %} ; mm/s
{% set z_hop = printer.configfile.settings.dockable_probe.z_hop | float %} ; mm/s
SAVE_GCODE_STATE NAME=state_MOVE_TO_INSERT_PROBE
G90
G0 Z{z_hop} F{60 * z_speed}
RESTORE_GCODE_STATE NAME=state_MOVE_TO_INSERT_PROBE
MOVE_TO_INSERT_PROBE_BASE
#___________________________________________________________________
[gcode_macro ATTACH_PROBE]
description: Check probe status and attach probe using the movement gcodes
rename_existing: ATTACH_PROBE_BASE
gcode:
;RESPOND MSG="ATTACH_PROBE"
{% set pos = printer.gcode_move.gcode_position %}
{% set travel_speed = printer.configfile.settings.dockable_probe.travel_speed | float %} ; mm/s
{% set lift_speed = printer.configfile.settings.dockable_probe.lift_speed | float %} ; mm/s
ATTACH_PROBE_BASE
SAVE_GCODE_STATE NAME=state_ATTACH_PROBE
G90
G0 Z{pos.z} F{60 * lift_speed}
G0 X{pos.x} Y{pos.y} F{60 * travel_speed}
RESTORE_GCODE_STATE NAME=state_ATTACH_PROBE
#___________________________________________________________________
[gcode_macro DETACH_PROBE]
description: Check probe status and detach probe using the movement gcodes
rename_existing: DETACH_PROBE_BASE
gcode:
;RESPOND MSG="DETACH_PROBE"
DETACH_PROBE_BASE
#___________________________________________________________________
[gcode_macro MOVE_TO_DOCK_PROBE]
description: Move to connect the toolhead/dock to the probe"
rename_existing: MOVE_TO_DOCK_PROBE_BASE
gcode:
;RESPOND MSG="MOVE_TO_DOCK_PROBE"
MOVE_TO_DOCK_PROBE_BASE
#___________________________________________________________________
[gcode_macro MOVE_TO_EXTRACT_PROBE]
description: Move away from the dock with the probe attached. Default : alias for MOVE_TO_APPROACH_PROBE.
rename_existing: MOVE_TO_EXTRACT_PROBE_BASE
gcode:
;RESPOND MSG="MOVE_TO_EXTRACT_PROBE"
MOVE_TO_EXTRACT_PROBE_BASE
#___________________________________________________________________
[gcode_macro MOVE_TO_DETACH_PROBE]
description: Move away from the dock to detach the probe
rename_existing: MOVE_TO_DETACH_PROBE_BASE
gcode:
;RESPOND MSG="MOVE_TO_DETACH_PROBE"
MOVE_TO_DETACH_PROBE_BASE
#___________________________________________________________________
[homing_override]
; parameters :
; X, Y, Z (separated with a blank space)
; M : performs a bed leveling after homing : saves detach + reattach moves
axes: xyz
gcode:
; parameters ; TODO : XY if instead of X Y
{% set _X_ = params.X|default("false") %}
{% set _Y_ = params.Y|default("false") %}
{% set _Z_ = params.Z|default("false") %}
{% set _O_ = params.O|default("false") %}
{% set _M_ = params.M|default("false") %}
{% set _XY_ = "false" %} ; workaround : G28 X Y sets Z to true ; we need to fix this !
; RESPOND MSG="_X_ : "{_X_}
; RESPOND MSG="_Y_ : "{_Y_}
; RESPOND MSG="_Z_ : "{_Z_}
; RESPOND MSG="_O_ : "{_O_}
; RESPOND MSG="_XY_ : "{_XY_}
{% if _X_ != "false" %} {% set _X_ = "true" %} {% endif %}
{% if _Y_ != "false" %} {% set _Y_ = "true" %} {% endif %}
{% if _Z_ != "false" %} {% set _Z_ = "true" %} {% endif %}
{% if _O_ != "false" %} {% set _O_ = "true" %} {% endif %}
{% if _M_ != "false" %} {% set _M_ = "true" %} {% endif %}
; G28 XY
{% if _X_ == "true" and _Y_ == "true" and _Z_ == "true" %}
{% set _XY_ = "true" %}
{% endif %}
; G28 = G28 XYZ
{% if _X_ == "false" and _Y_ == "false" and _Z_ == "false" %}
{% set _X_ = "true" %}
{% set _Y_ = "true" %}
{% set _Z_ = "true" %}
{% set _XY_= "true" %}
{% endif %}
; RESPOND MSG="_X_ : "{_X_}
; RESPOND MSG="_Y_ : "{_Y_}
; RESPOND MSG="_Z_ : "{_Z_}
; RESPOND MSG="_O_ : "{_O_}
{% if'x' in printer.toolhead.homed_axes %}
{% set _X_is_homed = "true" %}
{% else %}
{% set _X_is_homed = "false" %}
{% endif %}
{% if'y' in printer.toolhead.homed_axes %}
{% set _Y_is_homed = "true" %}
{% else %}
{% set _Y_is_homed = "false" %}
{% endif %}
{% if'z' in printer.toolhead.homed_axes %}
{% set _Z_is_homed = "true" %}
{% else %}
{% set _Z_is_homed = "false" %}
{% endif %}
; defined in startup delayed macro (see printer.cfg) ; stored in variables.cfg
; = dockable_probe position for reference Z offset (countersunk screw)
{% set x_probe = printer.save_variables.variables.x_probe | float %}
; printer settings
{% set x_bed_center, y_bed_center = printer.configfile.config.bed_mesh.zero_reference_position.replace(' ', '').split(',') %}
{% set z_max = printer.configfile.config.stepper_z.position_max | float %}
{% set lift_accel = printer.configfile.config.printer.max_z_accel | float %} ; mm/s²
; dockable_probe settings
{% set travel_speed = printer.configfile.config.dockable_probe.travel_speed | float %} ; mm/s
{% set lift_speed = printer.configfile.config.dockable_probe.lift_speed | float %} ; mm/s
{% set z_hop = printer.configfile.settings.dockable_probe.z_hop | float %}
{% set x_knobprobe, y_dummy = printer.configfile.config.dockable_probe.dock_position.replace(' ', '').split(',') %}
SB_STATUS_HOMING ; Neopixel Stealthburner
{% if _X_ == "true" or _Y_ == "true" or _Z_ == true %}
FORCE_MOVE STEPPER=stepper_z DISTANCE={z_hop} VELOCITY={lift_speed} ACCEL={lift_accel} ; lift z, mm/s, mm/s²
{% if _X_ == "false" and _Y_ == "false" and _Z_ == "false" %}
{% set _Z_ = "true" %}
{% endif %}
{% endif %}
; individual homings ; TODO : 'O' flag
{% if _X_ == "true" %}
RESPOND MSG="Homing X..."
G28 X
{% endif %}
{% if _Y_ == "true" %}
RESPOND MSG="Homing Y..."
G28 Y
{% endif %}
; Z calibration, auto Z offset, home Z, optional bed mesh
{% if _Z_ == "true" %}
SB_STATUS_CALIBRATING_Z ; Neopixel Stealthburner
RESPOND MSG="Attaching probe and calibrating Z offset..."
SAVE_GCODE_STATE NAME=state_G28
SET_DOCKABLE_PROBE AUTO_ATTACH_DETACH=0
; probe is attached while knobprobing (probing nozzle)
G90 ; absolute
G0 X{x_knobprobe} F{60 * travel_speed} ; KnobProbe position
{% set z_kinpos = z_max - z_hop - 10 %}
SET_KINEMATIC_POSITION Z={z_kinpos} ; gives "headroom" when moving the head down
KNOBPROBE SAMPLES=3 SAMPLE_RETRACT_DIST=2 ; attaches the Klicky probe + gets nozzle position : 1st reference
; probe reference spot
G91 ; relative
G0 Z{z_hop} F{60 * lift_speed} ; lift
G90 ; absolute
G0 X{x_probe} F{60 * travel_speed} ; probe is attached, align with countersunk screw
PROBE SAMPLES=3 SAMPLE_RETRACT_DIST=2 ; get Klicky position against countersunk screw : 2nd reference
_SAVE_GCODE_OFFSET ; auto Z offset
SB_STATUS_HOMING ; Neopixel Stealthburner
RESPOND MSG="Homing Z..."
; reset Z, move to center, home Z
SET_KINEMATIC_POSITION Z=0
G91 ; relative
G0 Z{z_hop} F{60 * lift_speed} ; lift
G90 ; absolute
G0 X{x_bed_center} Y{y_bed_center} F{60 * travel_speed} ; bed center
RESTORE_GCODE_STATE NAME=state_G28
G28 Z
; bed mesh
{% if _M_ == "true" and _X_ == "true" and _Y_ == "true" and _Z_ == "true" %}
SB_STATUS_MESHING ; Neopixel Stealthburner
RESPOND MSG="Meshing..."
BED_MESH_CALIBRATE
{% endif %}
; end
DETACH_PROBE
SET_DOCKABLE_PROBE AUTO_ATTACH_DETACH=1
SB_STATUS_READY ; Neopixel Stealthburner
RESPOND MSG="Ready..."
{% endif %}
#___________________________________________________________________
[gcode_macro BED_MESH_CALIBRATE]
description: Perform Mesh Bed Leveling
rename_existing: BASE_BED_MESH_CALIBRATE
gcode:
ATTACH_PROBE
BASE_BED_MESH_CALIBRATE
#___________________________________________________________________
[gcode_macro AUTO_GCODE_OFFSET]
description: To be inserted in the start gcode, after G28, before first move
gcode:
{% set gcode_offset = printer.save_variables.variables.gcode_offset | float %}
RESPOND TYPE=command MSG="AUTO GCODE OFFSET : SET_GCODE_OFFSET Z="{gcode_offset}
SET_GCODE_OFFSET Z={gcode_offset}
#___________________________________________________________________
[gcode_macro SET_REF_Z_OFFSET]
description: Save reference delta Z after calibration
; calls G28 and saves delta_z as ref_delta_z ; /!\ DO *NOT* REFACTORIZE /!\
gcode:
SAVE_VARIABLE VARIABLE=ref_delta_z VALUE={3.14159265358979323846} ; dummy ref_delta_z = flag
G28 ; G28 will automatically reset ref_delta_z
#___________________________________________________________________
[gcode_macro _SAVE_GCODE_OFFSET]
description: Calculates and save the gcode offset given reference delta Z and current delta Z
; called by G28 ; /!\ DO *NOT* REFACTORIZE /!\
gcode:
{% set ref_delta_z = printer.save_variables.variables.ref_delta_z | default(3.14159265358979323846) | float %}
{% if ref_delta_z == 3.14159265358979323846 %} ; flag : ref_delta_z == pi : not initialized
_SAVE_REF_DELTA_Z ; save the the difference between KNOBPROBE and PROBE
{% endif %}
_SAVE_CUR_DELTA_Z ; save the the difference between KNOBPROBE and PROBE
_CALC_GCODE_OFFSET ; calculate and save the gcode offset ( = reference delta_z - current delta_z)
#___________________________________________________________________
[gcode_macro _SAVE_REF_DELTA_Z]
description: Save nozzle delta Z as reference offset
; called by _SAVE_GCODE_OFFSET ; /!\ DO *NOT* REFACTORIZE /!\
gcode:
{% set probe_z = printer.probe.last_z_result %} ; ABL probe Z probing
{% set knobprobe_z = printer.knobprobe.last_z_result %} ; KnobProbe Z probing
{% set delta_z = printer.probe.last_z_result - printer.knobprobe.last_z_result %} ; delta z for ref. tool
SAVE_VARIABLE VARIABLE=ref_delta_z VALUE={delta_z} ; save ref delta Z
#___________________________________________________________________
[gcode_macro _SAVE_CUR_DELTA_Z]
description: Save current nozzle delta Z
; called by _SAVE_GCODE_OFFSET ; /!\ DO *NOT* REFACTORIZE /!\
gcode:
{% set probe_z = printer.probe.last_z_result %} ; ABL Z probing
{% set knobprobe_z = printer.knobprobe.last_z_result %} ; knobprobe Z probing
{% set cur_delta_z = probe_z - knobprobe_z %} ; delta z for current tool
SAVE_VARIABLE VARIABLE=cur_delta_z VALUE={cur_delta_z} ; save current probing offsets
#___________________________________________________________________
[gcode_macro _CALC_GCODE_OFFSET]
description: Calculate and save gcode offset
; called by _SAVE_GCODE_OFFSET ; /!\ DO *NOT* REFACTORIZE /!\
gcode:
{% set ref_delta_z = printer.save_variables.variables.ref_delta_z | default(3.14159265358979323846) | float %}
{% set cur_delta_z = printer.save_variables.variables.cur_delta_z %}
{% set gcode_offset = ref_delta_z - cur_delta_z %} ; gcode offset = difference
SAVE_VARIABLE VARIABLE=gcode_offset VALUE={gcode_offset} ; save gcode offset
Start_End_gcode.cfg :
; Cura : http://files.fieldofview.com/cura/Replacement_Patterns.html
; Prusa Slicer : https://help.prusa3d.com/article/list-of-placeholders_205643
; Super Slicer : https://github.com/supermerill/SuperSlicer/wiki/Macro-&-Variable-list
;
; Cura Start G-code :
;
; START_PRINT NOZZLE_DIAM={machine_nozzle_size} BED_TEMP={material_bed_temperature_layer_0} TOOL_TEMP={material_print_temperature_layer_0}
;
; For saving a custom PID Profile : PID_CALIBRATE HEATER=<config_name> TARGET=<temperature> PROFILE=<profile_name>
; for loading a custom PID Profile : PID_PROFILE_LOAD HEATER=<heater> PROFILE=<profile_name> [DEFAULT=<default_profile>]
; DEFAULT is optional and behaves like a getordefault method
#___________________________________________________________________
[gcode_macro PRINT_START]
description: Start G-Code
gcode:
;RESPOND MSG="PRINT_START received, calling START_PRINT"
START_PRINT {rawparams}
#___________________________________________________________________
[gcode_macro START_PRINT]
description: Start G-Code
; ex. : START_PRINT NOZZLE_DIAM=0.4 BED_TEMP=60 TOOL_TEMP=200 CHAMBER_TEMP=0
gcode:
{% set nozzle_diam = params.NOZZLE_DIAM|float %} ; Cura : {machine_nozzle_size}
{% set tool_temp = params.TOOL_TEMP|float %} ; Cura : {material_print_temperature_layer_0}
{% set bed_temp = params.BED_TEMP|float %} ; Cura : {material_bed_temperature_layer_0}
;{% set chamber_temp = params.CHAMBER_TEMP|float %} ; Cura : {build_volume_temperature}
RESPOND TYPE=command MSG="START_PRINT"
;RESPOND TYPE=command MSG="Selected : Nozzle : "{nozzle_diam} #"mm ; Tool : "{tool_temp}"°C, "Bed : "{bed_temp}"°C, "Chamber :"{chamber_temp}"°C"
RESPOND TYPE=command MSG="Selected : Nozzle : "{nozzle_diam} #"mm ; Tool : "{tool_temp}"°C, "Bed : "{bed_temp}"°C"
; https://github.com/Zeanon/klipper/tree/pid_profiles
; heaters.py led.py pid_calibrate.py
{% if nozzle_diam == 0.2 %}
PID_PROFILE HEATER=extruder LOAD=V6_02 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_02"'
{% elif nozzle_diam == 0.3 %}
PID_PROFILE HEATER=extruder LOAD=V6_03 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_03"'
{% elif nozzle_diam == 0.4 %}
PID_PROFILE HEATER=extruder LOAD=V6_04 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_04"'
{% elif nozzle_diam == 0.5 %}
PID_PROFILE HEATER=extruder LOAD=V6_05 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_05"'
{% elif nozzle_diam == 0.6 %}
PID_PROFILE HEATER=extruder LOAD=V6_06 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_06"'
{% elif nozzle_diam == 0.8 %}
PID_PROFILE HEATER=extruder LOAD=V6_08 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_08"'
{% elif nozzle_diam == 1.0 %}
PID_PROFILE HEATER=extruder LOAD=V6_10 ;DEFAULT=V6_04
SAVE_VARIABLE VARIABLE=cur_tool VALUE='"V6_10"'
{% else %}
RESPOND TYPE=error MSG={nozzle_diam}"mm nozzle ? Are you kidding me ???"
;_PRINT_ABORT
CANCEL_PRINT
{% endif %}
; M117 Heating... ; LCD = Heating
SB_STATUS_HEATING ; Neopixel Stealthburner
M140 S{bed_temp} ; heat bed, don't wait
M104 S{tool_temp} ; heat tool, don't wait
;M141 S{chamber_temp} ; heat chamber, don't wait TODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODO
M190 S{bed_temp} ; wait for bed temp
M109 S{tool_temp} ; wait for tool temp
;M191 S{chamber_temp} ; wait for chamber temp TODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODOTODO
G21 ; metric
G90 ; absolute coordinates
M82 ; absolute extrusion mode
G92 E0 ; set extruder to zero
G28 M ; home + bed mesh calibrate ; see CFG/Dockable_Probe.cfg
; stops heating after loading profiles ???
M190 S{bed_temp} ; wait for bed temp
M109 S{tool_temp} ; wait for tool temp
AUTO_GCODE_OFFSET ; from CFG/Dockable_Probe.cfg
; M117 Cleaning... ; LCD = Cleaning
SB_STATUS_CLEANING ; Neopixel Stealthburner
G0 X5 Y10 F20000 ; move in 5x10mm from edge
G0 Z0.2 F1000 ; move up 0.2mm
G1 Y100 E12 F500 ; priming : extrude 12mm filament 100mm long
G0 Y180 F4000 ; quick wipe 80mm long
G0 Z2 F1000 ; move up 2mm to prevent scratching
; M117 Printing... ; LCD = Printing...
SB_STATUS_PRINTING ; Neopixel Stealthburner
G90 ; absolute coordinates
#___________________________________________________________________
[gcode_macro PRINT_END]
description: End G-Code
gcode:
END_PRINT {rawparams}
#___________________________________________________________________
[gcode_macro END_PRINT]
description: End G-Code
gcode:
;G27 ; park
G91 ; relative coordinates
G0 Z+5 F1000 ; move up 5mm
G90 ; absolute coordinates
G0 X5 Y295 F10000 ; move in 5x10mm from edge
M84 ; disable motors
M104 S0 ; hotend off, continue
M140 S0 ; bed off, continue
SB_STATUS_READY ; Neopixel Stealthburner
The dock that can compute auto Z offset, with it’s opto dock sensor (ABS) :
A “few” earlier prototypes (PLA) :
Designed to be easily printable, @45° :
This could be a severe limitation : the printer was designed so the nozzle can go 20mm off the bed… (uses the full X extrusion, not sure it could be done with a stock Ender)
More information about the design : Building a CoreXY : machined or printed parts ?
Will update on Reprap forums later, when everything is 100% completed.
This printer was made to learn Kllipper, and learn about designing printers (wanted to make a Voron 2.4, will be a downsized Voron 24" when it will be made public ; meanwhile, maybe a Voron 0.2)
The core is Dockable_Probe for full automation, and PID profiles by Zeanon. Works perfectly, with brims within ±0.02 mm at worst.
It’s also a proof of concept for Auto Z offset integrated in Dockable_Probe