Макрос Klipper для быстрого выравнивания стола

Макрос Klipper для более быстрого зондирования стола

Недавно был обнаружен потрясающий макрос 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.

Код между 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%
Стартовый G-код

Чтобы макрос работал в слайсере Cura, вам необходимо установить плагин постобработки от Frankbags — В меню Cura Справка -> Показать конфигурационный каталог. Скопируйте скрипт Python из приведенной выше ссылки в папку scripts. Перезапустите Cura. В меню Cura Расширения -> Пост-обработка -> Изменить G-код выберите Klipper print area mesh

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]}
изображение 1 | Макрос ускоренного зондирования клипперного слоя

Нажмите кнопку OK, чтобы сохранить изменения. Теперь при каждом запуске новой печати принтер будет дома прощупывать станину только на участке, где будет печататься модель.

Подведем итоги

Макрос BED_MESH_CALIBRATE для быстрого выравнивания стола очень полезен и позволяет сэкономить немало времени при зондировании стола перед печатью. Данный макрос был добавлен на все принтеры Klipper и он нам нравится. Как уже говорилось ранее, все заслуги принадлежат ChipCE, который создал этот замечательный макрос для клиппера.

Загляните на нашу специальную статью о макросах Klipper для автоматизации некоторых задач 3D-печати. Если у вас есть другие замечательные макросы для использования в Klipper, не стесняйтесь оставлять комментарии. Нам очень интересно, что другие люди используют в Klipper.

Николай

Я всегда рад вашим комментариям, предложениям или новостям из первых уст.

Оцените автора
Добавить комментарий

  1. Евгений

    Вот бы еще Вы объяснили бы как настроить пруша слайсер на корректную смену цвета при печати мультиэкструдером.

    Ответить
    1. Николай автор

      Опишите более подробно, какие модели используете, принтер и т.д.
      https://www.cdesigner.eu/2020/08/31/mmu-models-slicing-with-prusaslicer-and-prusa-mmu2s/

      Ответить
      1. Евгений

        Доброго времени суток!
        Попробовал добавить 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-код. а Правильного я не могу сообразить. Буду очень ВАМ благодарен за помощь.

        Ответить
        1. Николай автор

          Макрос существует [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/

          Ответить
          1. Евгений

            Вопрос.
            Макрос существует [gcode_macro BED_MESH_CALIBRATE] в файле конфиг?
            Ответ. Его не получается добавить в файл конфиг. Ошибка возникает при попытке сохранения конфига.

          2. Евгений

            https://www.reddit.com/r/klippers/comments/16vbsgx/why_am_i_getting_unable_to_infer_active_extruder/
            В этой статье описана лишь проблема схожая с моей, в ней нет решения.

          3. Евгений

            Николай. Этот макрос не получается добавить в файл конфиг. При попытке сохранить его вылетает вышеописанная ошибка.

  2. Евгений

    Макрос не существует в файле конфиг потому что вышеописанная ошибка возникает при попытке сохранить файл конфиг.

    Ответить
  3. Евгений

    Николай здравствуйте! Макрос не получается добавить в файл конфиг потому что ошибка возникает при сохранении файла.

    Ответить
    1. Николай автор

      https://wiki.yumi-lab.com/PRINTERS/PRUSA_MK3/#mainsail-web-interface

      Ответить
      1. Евгений

        Блин. Мы по ходу не понимаем друг друга. Попробую еще раз. У меня эндер 3. На нем skr mini v3. На ней клиппер. Веб морда fluidd. Все нормально работает. При попытке сохранить Ваш макрос в файл конфигурации printer.cfg возникает ошибка. Вот ссылка на фото с экрана.
        https://disk.yandex.ru/i/AQv5R8BFsDqY0g
        Получается что прошивку просто не получается сохранить с Вашим мокросом. Прошу прощения за такое количество сообщений. На сайте комментарии появляются не сразу. А я думал что они не работают).

        Ответить
        1. Николай автор

          Источник: https://gist.github.com/ChipCE/95fdbd3c2f3a064397f9610f915f7d02

          Ответить