Недавно был обнаружен потрясающий макрос Klipper, BED_MESH_CALIBRATE созданный ChipCE, который делает выравнивание стола более быстрым и эффективным, поэтому решили, что статья будет полезна.
Этот макрос позволяет проверить стол только в той зоне, где будет печататься модель. Например, если вы печатаете 3D Benchy, то будут прощупываться только несколько точек, а не весь стол. Но когда вы решите напечатать модель большего размера, проверяемый участок стола будет автоматически увеличен.
В Raise3D E2 выравнивание стола выполняется аналогичным образом и нам понравилась эта функция, поэтому возможность выполнять ее с помощью Klipper просто великолепна.
Как настроить макрос выравнивания стола?
Отредактируйте файл printer.cfg
Процесс настройки макроса для выравнивания стола очень прост. Сначала нужно открыть файл printer.cfg и добавить макрос в нижнюю часть файла.
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: BED_MESH_CALIBRATE_BASE
; gcode parameters
variable_parameter_AREA_START : 0,0
variable_parameter_AREA_END : 0,0
; the clearance between print area and probe area
variable_mesh_area_offset : 5.0
; number of sample per probe point
variable_probe_samples : 2
; minimum probe count
variable_min_probe_count : 3
; scale up the probe count, should be 1.0 ~ < variable_max_probe_count/variable_min_probe_count
variable_probe_count_scale_factor : 1.0
gcode:
{% if params.AREA_START and params.AREA_END %}
{% set bedMeshConfig = printer["configfile"].config["bed_mesh"] %}
{% set safe_min_x = bedMeshConfig.mesh_min.split(",")[0]|float %}
{% set safe_min_y = bedMeshConfig.mesh_min.split(",")[1]|float %}
{% set safe_max_x = bedMeshConfig.mesh_max.split(",")[0]|float %}
{% set safe_max_y = bedMeshConfig.mesh_max.split(",")[1]|float %}
{% set area_min_x = params.AREA_START.split(",")[0]|float %}
{% set area_min_y = params.AREA_START.split(",")[1]|float %}
{% set area_max_x = params.AREA_END.split(",")[0]|float %}
{% set area_max_y = params.AREA_END.split(",")[1]|float %}
{% set meshPointX = bedMeshConfig.probe_count.split(",")[0]|int %}
{% set meshPointY = bedMeshConfig.probe_count.split(",")[1]|int %}
{% set meshMaxPointX = meshPointX %}
{% set meshMaxPointY = meshPointY %}
{% if (area_min_x < area_max_x) and (area_min_y < area_max_y) %}
{% if area_min_x - mesh_area_offset >= safe_min_x %}
{% set area_min_x = area_min_x - mesh_area_offset %}
{% else %}
{% set area_min_x = safe_min_x %}
{% endif %}
{% if area_min_y - mesh_area_offset >= safe_min_y %}
{% set area_min_y = area_min_y - mesh_area_offset %}
{% else %}
{% set area_min_y = safe_min_y %}
{% endif %}
{% if area_max_x + mesh_area_offset <= safe_max_x %}
{% set area_max_x = area_max_x + mesh_area_offset %}
{% else %}
{% set area_max_x = safe_max_x %}
{% endif %}
{% if area_max_y + mesh_area_offset <= safe_max_y %}
{% set area_max_y = area_max_y + mesh_area_offset %}
{% else %}
{% set area_max_y = safe_max_y %}
{% endif %}
{% set meshPointX = (meshPointX * (area_max_x - area_min_x) / (safe_max_x - safe_min_x) * probe_count_scale_factor)|round(0)|int %}
{% if meshPointX < min_probe_count %}
{% set meshPointX = min_probe_count %}
{% endif %}
{% if meshPointX > meshMaxPointX %}
{% set meshPointX = meshMaxPointX %}
{% endif %}
{% set meshPointY = (meshPointY * (area_max_y -area_min_y ) / (safe_max_y - safe_min_y) * probe_count_scale_factor )|round(0)|int %}
{% if meshPointY < min_probe_count %}
{% set meshPointY = min_probe_count %}
{% endif %}
{% if meshPointY > meshMaxPointY %}
{% set meshPointY = meshMaxPointY %}
{% endif %}
BED_MESH_CALIBRATE_BASE mesh_min={area_min_x},{area_min_y} mesh_max={area_max_x},{area_max_y} probe_count={meshPointX},{meshPointY} samples={probe_samples|int}
{% else %}
BED_MESH_CALIBRATE_BASE
{% endif %}
{% else %}
BED_MESH_CALIBRATE_BASE
{% endif %} Мы добавили макрос между CANCEL_PRINT и SAVE_Config.

После добавления макроса нам необходимо обновить стартовый g-код в нашем слайсере, чтобы вызвать этот макрос и прозондировать стол перед каждой печатью. Именно так настраиваются профили слайсера для принтеров, на которых используется Klipper.
Обновление стартового G-кода в слайсерах
Стартовый G-кода в Cura
В Cura необходимо отредактировать профиль принтера, перейти в раздел Настройки -> Настроить CURA -> Принтеры -> Параметры принтера -> Стартовый G-код и добавить следующий код, как показано на рисунке ниже:
START_PRINT EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0} AREA_START=%MINX%,%MINY% AREA_END=%MAXX%,%MAXY% 
Чтобы макрос работал в слайсере Cura, вам необходимо установить плагин постобработки от Frankbags — В меню Cura Справка -> Показать конфигурационный каталог. Скопируйте скрипт Python из приведенной выше ссылки в папку scripts. Перезапустите Cura. В меню Cura Расширения -> Пост-обработка -> Изменить G-код выберите Klipper print area mesh

Нажмите кнопку OK, чтобы сохранить изменения. Теперь каждый раз при запуске новой печати принтер будет перемещаться домой и прощупывать стол только над тем участком, где будет печататься модель.
Стартовый G-код в IdeaMaker
В IdeaMaker необходимо отредактировать профиль принтера, перейти в раздел GCode -> Start GCode и добавить следующий код, как показано на рисунке ниже:
BED_MESH_CALIBRATE AREA_START={print_pos_min_x},{print_pos_min_y} AREA_END={print_pos_max_x},{print_pos_max_y} 
Нажмите кнопку OK, чтобы сохранить изменения. Теперь каждый раз при запуске новой печати принтер будет дома прощупывать печатную пластину только на участке, где будет печататься модель.
Стартовый G-код в PrusaSlicer
В Prusa Slicer необходимо отредактировать профиль принтера, перейти в раздел Printer Settings -> Custom G-code -> Start G-code и добавить следующий код, как показано на рисунке ниже:
BED_MESH_CALIBRATE AREA_START={first_layer_print_min[0]},{first_layer_print_min[1]} AREA_END={first_layer_print_max[0]},{first_layer_print_max[1]} 
Нажмите кнопку OK, чтобы сохранить изменения. Теперь при каждом запуске новой печати принтер будет дома прощупывать станину только на участке, где будет печататься модель.
Подведем итоги
Макрос BED_MESH_CALIBRATE для быстрого выравнивания стола очень полезен и позволяет сэкономить немало времени при зондировании стола перед печатью. Данный макрос был добавлен на все принтеры Klipper и он нам нравится. Как уже говорилось ранее, все заслуги принадлежат ChipCE, который создал этот замечательный макрос для клиппера.
Загляните на нашу специальную статью о макросах Klipper для автоматизации некоторых задач 3D-печати. Если у вас есть другие замечательные макросы для использования в Klipper, не стесняйтесь оставлять комментарии. Нам очень интересно, что другие люди используют в Klipper.








Вот бы еще Вы объяснили бы как настроить пруша слайсер на корректную смену цвета при печати мультиэкструдером.
Опишите более подробно, какие модели используете, принтер и т.д.
https://www.cdesigner.eu/2020/08/31/mmu-models-slicing-with-prusaslicer-and-prusa-mmu2s/
Доброго времени суток!
Попробовал добавить G-код в прошивку клиппер, в файл конфиг и получил ошибку.
Internal error during connect: Error loading template ‘gcode_macro BED_MESH_CALIBRATE:gcode’
line 20: {% if (area_min_x < area_max_x) and (area_min_y 0 %}
{% set e0_factor = e0_percentage / total %}
{% set e1_factor = e1_percentage / total %}
{% else %}
{% set e0_factor = 0.5 %}
{% set e1_factor = 0.5 %}
{% endif %}
M118 Applying mix: extruder={e0_factor*100}%, extruder1={e1_factor*100}%
{% if e0_factor <= 0 %}
# Только extruder1
SYNC_EXTRUDER_MOTION EXTRUDER=extruder MOTION_QUEUE=
SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder
{% elif e1_factor <= 0 %}
# Только extruder
SYNC_EXTRUDER_MOTION EXTRUDER=extruder MOTION_QUEUE=extruder
SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=
{% else %}
# Оба двигателя
SYNC_EXTRUDER_MOTION EXTRUDER=extruder MOTION_QUEUE=extruder
SYNC_EXTRUDER_MOTION EXTRUDER=extruder1 MOTION_QUEUE=extruder
# Корректируем rotation_distance для правильного смешивания
SET_EXTRUDER_ROTATION_DISTANCE EXTRUDER=extruder DISTANCE={ printer.configfile.settings.extruder.rotation_distance / e0_factor }
SET_EXTRUDER_ROTATION_DISTANCE EXTRUDER=extruder1 DISTANCE={ printer.configfile.settings['extruder_stepper extruder1'].rotation_distance / e1_factor }
{% endif %}
# Макросы инструментов
#[gcode_macro T0]
#gcode:
# M163 S0 P99
#M163 S1 P1
#M164
#M118 T0: 99% extruder, 1% extruder1
[gcode_macro T0]
gcode:
M163 S0 P100
M163 S1 P0
M164
M118 T1: 100% extruder
[gcode_macro T1]
gcode:
M163 S0 P0
M163 S1 P100
M164
M118 T2: 100% extruder1
#[gcode_macro T3]
#gcode:
#M163 S0 P50
#M163 S1 P50
#M164
#M118 T3: 50% extruder, 50% extruder1
[heater_bed]
heater_pin: PH6
sensor_type: Generic 3950
sensor_pin: PK3
min_temp: 0
max_temp: 130
[fan]
pin: PH4
max_power = 1.0
[heater_fan nozzle_cooling_fan]
pin: PH5
max_power = 1.0
[mcu]
serial: /dev/serial/by-id/usb-RRD__www.ru_RUMBA_-_ATmega_2560_co_5563231353835131A031-if00
restart_method: command
[printer]
kinematics: corexy
max_velocity: 300 #300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
# "RepRapDiscount 2004 Smart Controller" type displays
#[display]
#lcd_type: hd44780
#rs_pin: PD2
#e_pin: PL7
#d4_pin: PD3
#d5_pin: PD7
#d6_pin: PG0
#d7_pin: PG1
#encoder_pins: ^PB5, ^PB6
#click_pin: ^!PL6
#"RepRapDiscount 128×64 Full Graphic Smart Controller" type displays
[display]
lcd_type: st7920
cs_pin: PD2
sclk_pin: PD3
sid_pin: PL7
encoder_pins: ^PB5, ^PB6
click_pin: ^!PL6
[virtual_sdcard]
path: /home/klip/printer_coreXY_data/gcodes
on_error_gcode: CANCEL_PRINT
[include fluidd.cfg]
[skew_correction]
#[gcode_macro CANCEL_PRINT] description: Cancel the actual running print rename_existing: CANCEL_PRINT_BASE gcode: TURN_OFF_HEATERS CANCEL_PRINT_BASE.
#*#
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 14.267
#*# pid_ki = 0.377
#*# pid_kd = 134.819
#*#
#*# [heater_bed]
#*# control = pid
#*# pid_kp = 62.551
#*# pid_ki = 0.662
#*# pid_kd = 1477.770
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -0.249944, -0.129589, -0.125280, -0.133591, -0.147442
#*# -0.151444, -0.099731, -0.054483, -0.071720, -0.119739
#*# -0.052944, -0.013852, -0.006772, -0.001539, -0.056945
#*# -0.011081, 0.005233, 0.001539, -0.015391, -0.041247
#*# -0.006156, 0.052328, 0.032012, 0.008927, -0.028934
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 10.0
#*# max_x = 210.0
#*# min_y = 10.0
#*# max_y = 245.0
#*#
#*# [bltouch]
Стартовый G-код ПРУШИ
;Tool: [current_extruder]
{if current_extruder == 0 then
global tool_name=»extruder»
elsif current_extruder == 1 then
global tool_name=»belted_extruder»
else
global tool_name=»unknown»
endif}
{
«ACTIVATE_EXTRUDER EXTRUDER=» + tool_name + »
«;
«SET_PRESSURE_ADVANCE ADVANCE=0 EXTRUDER=»+ tool_name + »
«;
}
G92 E0
M104 S200 ; предварительный нагрев
T0 ; выбор смешивания по умолчанию
M109 S220 ; ждем нагрева
G28 ; home all axes
;bed_mesh_calibrate
G92 E0
G1 Z5 F5000 ; lift nozzle
G-код перед сменой инструмента.
«ACTIVATE_EXTRUDER EXTRUDER=» + tool_name + »
«SET_PRESSURE_ADVANCE ADVANCE=0 EXTRUDER=»+ tool_name + »
Моя проблема.
При попытке напечатать два калибровочных кубика каждый своего цвета происходит следующее. пытается первый слой первого кубика, потом черновая башня, потом происходит смена филамента, печать первого и второго слоя второго кубика и при попытке напечатать черновую башню я получаю ошибку Unable to infer active extruder stepper.
По идее у меня неправильный стартовый G-код. а Правильного я не могу сообразить. Буду очень ВАМ благодарен за помощь.
Макрос существует [gcode_macro BED_MESH_CALIBRATE] в файле конфиг?, вы его вызывали с этой строки ;bed_mesh_calibrate в стартовом.
Удалите в стартовом строку ;bed_mesh_calibrate или прочитайте эту статью, чтобы добавить макрос
На ошибку Unable to infer active extruder stepper. https://www.reddit.com/r/klippers/comments/16vbsgx/why_am_i_getting_unable_to_infer_active_extruder/
Вопрос.
Макрос существует [gcode_macro BED_MESH_CALIBRATE] в файле конфиг?
Ответ. Его не получается добавить в файл конфиг. Ошибка возникает при попытке сохранения конфига.
https://www.reddit.com/r/klippers/comments/16vbsgx/why_am_i_getting_unable_to_infer_active_extruder/
В этой статье описана лишь проблема схожая с моей, в ней нет решения.
Николай. Этот макрос не получается добавить в файл конфиг. При попытке сохранить его вылетает вышеописанная ошибка.
Макрос не существует в файле конфиг потому что вышеописанная ошибка возникает при попытке сохранить файл конфиг.
Николай здравствуйте! Макрос не получается добавить в файл конфиг потому что ошибка возникает при сохранении файла.
https://wiki.yumi-lab.com/PRINTERS/PRUSA_MK3/#mainsail-web-interface
Блин. Мы по ходу не понимаем друг друга. Попробую еще раз. У меня эндер 3. На нем skr mini v3. На ней клиппер. Веб морда fluidd. Все нормально работает. При попытке сохранить Ваш макрос в файл конфигурации printer.cfg возникает ошибка. Вот ссылка на фото с экрана.
https://disk.yandex.ru/i/AQv5R8BFsDqY0g
Получается что прошивку просто не получается сохранить с Вашим мокросом. Прошу прощения за такое количество сообщений. На сайте комментарии появляются не сразу. А я думал что они не работают).
Источник: https://gist.github.com/ChipCE/95fdbd3c2f3a064397f9610f915f7d02