Chat
Ask me anything
Ithy Logo
Sign in to save

Масштабирование осей X и Y в Klipper: Автоматизируйте точность ваших G0/G1 команд!

Узнайте, как создать мощные макросы для динамической коррекции перемещений вашего 3D-принтера.

klipper-axis-scaling-macro-jpzywube

Управление точностью размеров печатаемых деталей – ключевой аспект 3D-печати. Иногда из-за усадки материала или других факторов размеры детали могут отличаться от заданных в модели. Klipper, благодаря своей гибкости и мощной системе макросов, позволяет решить эту проблему путем динамического масштабирования команд перемещения по осям X и Y. Этот подход позволяет вам задавать коэффициенты, например, 0.999, чтобы уменьшить перемещение (10 мм превратятся в 9.99 мм), тем самым компенсируя неточности.

Ключевые моменты решения

  • Автоматическое масштабирование: Макросы перехватывают команды G0 (быстрое перемещение) и G1 (линейное перемещение с экструзией) и применяют к ним заданные коэффициенты масштабирования по осям X и Y.
  • Независимые коэффициенты: Вы можете устанавливать отдельные коэффициенты для оси X и оси Y, что обеспечивает точную настройку под особенности вашего принтера и материала.
  • Динамическая настройка: Коэффициенты можно изменять во время работы принтера или перед началом печати с помощью специальной команды, без необходимости перезагрузки Klipper или изменения G-кода.

Введение в макросы Klipper для масштабирования осей

Klipper использует прошивку, работающую на одноплатном компьютере (например, Raspberry Pi) в связке с микроконтроллером принтера. Это позволяет реализовывать сложную логику, такую как пользовательские макросы, непосредственно на уровне обработки G-кода. Для автоматического масштабирования координат X и Y в командах G0 и G1 мы создадим несколько макросов в вашем конфигурационном файле printer.cfg.

Основная идея заключается в следующем:

  1. Создать макрос для хранения и установки коэффициентов масштабирования (например, SCALE_AXES).
  2. Переопределить стандартные команды G0 и G1. Новые макросы G0 и G1 будут выполнять роль "оберток": они будут получать оригинальные параметры команды, применять к координатам X и Y масштабирование, используя коэффициенты из макроса SCALE_AXES, а затем вызывать оригинальные (переименованные) команды Klipper с уже измененными параметрами.

Для этого активно используется язык шаблонов Jinja2, который позволяет Klipper динамически генерировать G-код внутри макросов.

Интерфейс Klipper с макросами

Пример интерфейса Klipper, где можно управлять макросами.


Реализация макросов для масштабирования

Ниже приведены макросы, которые необходимо добавить в ваш файл `printer.cfg`. Они обеспечивают функциональность масштабирования.

Макрос `SCALE_AXES`: Управление коэффициентами масштабирования

Этот макрос предназначен для хранения текущих коэффициентов масштабирования для осей X и Y, а также для их изменения. По умолчанию коэффициенты установлены в 1.0 (нет масштабирования).


[gcode_macro SCALE_AXES]
variable_scale_x: 1.0
variable_scale_y: 1.0
gcode:
    {% if 'X' in params %}
        {% set new_scale_x = params.X|float %}
        SET_GCODE_VARIABLE MACRO=SCALE_AXES VARIABLE=scale_x VALUE={new_scale_x}
        { action_respond_info("Масштаб по оси X установлен: %.4f" % new_scale_x) }
    {% endif %}
    {% if 'Y' in params %}
        {% set new_scale_y = params.Y|float %}
        SET_GCODE_VARIABLE MACRO=SCALE_AXES VARIABLE=scale_y VALUE={new_scale_y}
        { action_respond_info("Масштаб по оси Y установлен: %.4f" % new_scale_y) }
    {% endif %}
    {% if 'X' not in params and 'Y' not in params %}
        { action_respond_info("Текущие коэффициенты масштабирования: X=%.4f, Y=%.4f" % (printer["gcode_macro SCALE_AXES"].scale_x, printer["gcode_macro SCALE_AXES"].scale_y)) }
    {% endif %}
    

Как это работает:

  • variable_scale_x: 1.0 и variable_scale_y: 1.0: Определяют переменные внутри макроса `SCALE_AXES` для хранения коэффициентов. Klipper автоматически убирает префикс `variable_` при доступе к ним через `SET_GCODE_VARIABLE` или при чтении из других макросов (становятся `scale_x` и `scale_y`).
  • params.X|float: Получает параметр X, переданный команде `SCALE_AXES` (например, `SCALE_AXES X=0.999`), и преобразует его в число с плавающей точкой.
  • SET_GCODE_VARIABLE MACRO=SCALE_AXES VARIABLE=scale_x VALUE={new_scale_x}: Обновляет значение переменной `scale_x` в макросе `SCALE_AXES`.
  • action_respond_info(...): Выводит информационное сообщение в консоль Klipper (например, Mainsail или Fluidd), подтверждающее изменение или отображающее текущие значения.

Переопределение команды G0

Этот макрос перехватывает все команды G0. Он извлекает параметры, применяет масштабирование к X и Y, а затем вызывает оригинальную команду Klipper G0 (переименованную в `G0_BASE`).


[gcode_macro G0]
rename_existing: G0_BASE
gcode:
    {% set X = params.X|default(None) %}
    {% set Y = params.Y|default(None) %}
    {% set Z = params.Z|default(None) %}
    {% set E = params.E|default(None) %}
    {% set F = params.F|default(printer.toolhead.max_velocity) %}

    {% set current_scale_x = printer["gcode_macro SCALE_AXES"].scale_x %}
    {% set current_scale_y = printer["gcode_macro SCALE_AXES"].scale_y %}

    {% if X is not none %}
        {% set X = X|float * current_scale_x %}
    {% endif %}
    {% if Y is not none %}
        {% set Y = Y|float * current_scale_y %}
    {% endif %}

    G0_BASE {% if X is not none %}X{X|round(5)}{% endif %} {% if Y is not none %}Y{Y|round(5)}{% endif %} {% if Z is not none %}Z{Z|round(5)}{% endif %} {% if E is not none %}E{E|round(5)}{% endif %} F{F}
    

Переопределение команды G1

Аналогично макросу G0, этот макрос перехватывает команды G1, применяет масштабирование и вызывает `G1_BASE`.


[gcode_macro G1]
rename_existing: G1_BASE
gcode:
    {% set X = params.X|default(None) %}
    {% set Y = params.Y|default(None) %}
    {% set Z = params.Z|default(None) %}
    {% set E = params.E|default(None) %}
    {% set F = params.F|default(printer.toolhead.max_velocity) %} # Может потребоваться более точное значение по умолчанию для F в G1

    {% set current_scale_x = printer["gcode_macro SCALE_AXES"].scale_x %}
    {% set current_scale_y = printer["gcode_macro SCALE_AXES"].scale_y %}

    {% if X is not none %}
        {% set X = X|float * current_scale_x %}
    {% endif %}
    {% if Y is not none %}
        {% set Y = Y|float * current_scale_y %}
    {% endif %}

    G1_BASE {% if X is not none %}X{X|round(5)}{% endif %} {% if Y is not none %}Y{Y|round(5)}{% endif %} {% if Z is not none %}Z{Z|round(5)}{% endif %} {% if E is not none %}E{E|round(5)}{% endif %} F{F}
    

Как работают макросы G0 и G1:

  • rename_existing: G0_BASE (или G1_BASE): Эта директива переименовывает оригинальную команду Klipper (например, G0) в G0_BASE. Это позволяет нашему макросу с именем G0 вызывать оригинальную функциональность после обработки.
  • params.X|default(None): Извлекает параметр (например, X) из полученной команды G0/G1. Если параметр отсутствует, ему присваивается значение `None`.
  • printer["gcode_macro SCALE_AXES"].scale_x: Получает текущее значение коэффициента масштабирования из макроса `SCALE_AXES`.
  • {% if X is not none %}X{X|round(5)}{% endif %}: Если параметр X присутствовал в оригинальной команде, он включается в вызов `G0_BASE` (или `G1_BASE`) с уже масштабированным значением. Округление `|round(5)` используется для ограничения количества знаков после запятой.
  • Параметры Z (высота), E (экструзия) и F (скорость) передаются без изменений, так как масштабирование применяется только к X и Y.

Схема взаимодействия макросов

Для лучшего понимания процесса масштабирования, рассмотрим, как макросы взаимодействуют друг с другом при обработке G-кода:

mindmap root["Масштабирование G-кода в Klipper"] id1["Команда G0/G1 из файла G-кода"] id1_1["Оригинальные параметры X, Y"] id2["Обработка в Klipper"] id2_1["Макрос-обертка G0 или G1"] id2_1_1["Получение оригинальных параметров (X, Y, Z, E, F)"] id2_1_2["Обращение к макросу SCALE_AXES"] id2_1_2_1["Чтение scale_x, scale_y"] id2_1_3["Расчет масштабированных X', Y'"] id2_1_3_1["X' = X * scale_x"] id2_1_3_2["Y' = Y * scale_y"] id2_1_4["Выполнение G0_BASE / G1_BASE"] id2_1_4_1["С масштабированными X', Y' и оригинальными Z, E, F"] id3["Макрос SCALE_AXES"] id3_1["Хранит переменные variable_scale_x, variable_scale_y"] id3_2["Команда: SCALE_AXES X=... Y=..."] id3_2_1["Обновляет scale_x, scale_y через SET_GCODE_VARIABLE"]

Эта диаграмма показывает, что команда G0 или G1 из вашего файла G-кода сначала попадает в соответствующий макрос-обертку (новый `G0` или `G1`). Этот макрос запрашивает текущие коэффициенты масштабирования у макроса `SCALE_AXES`, применяет их к координатам X и Y, а затем передает измененную команду на выполнение базовой (оригинальной) функции Klipper `G0_BASE` или `G1_BASE`.


Как использовать и настраивать

1. Добавление макросов в `printer.cfg`

Скопируйте все три приведенных выше блока кода макросов (`[gcode_macro SCALE_AXES]`, `[gcode_macro G0]` и `[gcode_macro G1]`) в ваш конфигурационный файл `printer.cfg`. Обычно макросы добавляют в конец файла или в отдельный файл, который подключается через директиву `[include my_macros.cfg]`.

2. Перезапуск Klipper

После сохранения изменений в `printer.cfg` необходимо перезапустить службу Klipper (обычно командой "RESTART" или "FIRMWARE_RESTART" в консоли Mainsail/Fluidd, или перезагрузкой хоста Klipper), чтобы изменения вступили в силу.

3. Установка коэффициентов масштабирования

Коэффициенты масштабирования можно установить через консоль Klipper с помощью макроса `SCALE_AXES`:

  • Чтобы установить коэффициент масштабирования по X на 0.999 (уменьшение на 0.1%):
    SCALE_AXES X=0.999
  • Чтобы установить коэффициент масштабирования по Y на 0.995 (уменьшение на 0.5%):
    SCALE_AXES Y=0.995
  • Чтобы установить оба коэффициента одновременно:
    SCALE_AXES X=0.999 Y=0.995
  • Чтобы сбросить масштабирование к значениям по умолчанию (1.0 для обеих осей):
    SCALE_AXES X=1.0 Y=1.0
  • Чтобы узнать текущие коэффициенты масштабирования:
    SCALE_AXES

Эти команды можно добавлять в стартовый G-код вашего слайсера, если вы хотите применять определенное масштабирование для каждой печати, или выполнять их вручную перед печатью.


Сравнительный анализ подходов к масштабированию

Существуют различные способы добиться масштабирования при 3D-печати. Представленный метод с макросами Klipper предлагает высокий уровень автоматизации и гибкости. Давайте сравним его с другими подходами с помощью диаграммы:

Эта диаграмма иллюстрирует, что макросы Klipper обеспечивают превосходный баланс между автоматизацией, гибкостью настройки в реальном времени и сохранением исходного G-кода без изменений, хотя первоначальная настройка может потребовать некоторых усилий. Масштабирование в слайсере проще, но менее гибко после генерации G-кода, а ручное редактирование G-кода неэффективно и подвержено ошибкам.


Краткий обзор команд и переменных

В таблице ниже приведены основные команды и переменные, используемые в данном решении:

Функция Синтаксис команды / переменной Описание
Установка коэффициентов масштабирования SCALE_AXES X=<значение> Y=<значение> Устанавливает коэффициенты масштабирования для осей X и Y. Пример: SCALE_AXES X=0.999 Y=0.998
Сброс масштаба по X SCALE_AXES X=1.0 Сбрасывает масштабирование по оси X до 100% (без масштабирования).
Сброс масштаба по Y SCALE_AXES Y=1.0 Сбрасывает масштабирование по оси Y до 100% (без масштабирования).
Просмотр текущих коэффициентов SCALE_AXES Выводит текущие коэффициенты масштабирования для X и Y в консоль.
Внутренняя переменная масштаба X printer["gcode_macro SCALE_AXES"].scale_x Доступ к текущему коэффициенту масштабирования X (используется макросами G0/G1).
Внутренняя переменная масштаба Y printer["gcode_macro SCALE_AXES"].scale_y Доступ к текущему коэффициенту масштабирования Y (используется макросами G0/G1).
Переопределенная команда G0 G0 X<знач> Y<знач> ... (из файла G-кода) Автоматически обрабатывается пользовательским макросом G0.
Переопределенная команда G1 G1 X<знач> Y<знач> ... (из файла G-кода) Автоматически обрабатывается пользовательским макросом G1.

Видеоурок по основам макросов Klipper

Если вы новичок в макросах Klipper, следующее видео может помочь вам лучше понять их основы и принципы работы. Хотя оно не описывает конкретно этот макрос масштабирования, оно дает хорошее представление о возможностях макросов в Klipper.

Видео "Klipper macros! The basics" – отличное введение в мир макросов Klipper.


Важные замечания и рекомендации

  • Тестирование: Всегда тщательно тестируйте новые макросы на небольших и простых моделях, прежде чем использовать их для важных или длительных печатных заданий. Убедитесь, что масштабирование работает корректно и не приводит к выходу за пределы области печати.
  • Влияние на G90/G91: Эти макросы масштабируют значения координат, переданные в командах G0/G1. Если используется абсолютное позиционирование (G90, что является стандартом для большинства слайсеров), то масштабируются целевые абсолютные координаты. Например, если текущая позиция X0 и дана команда G1 X10 с коэффициентом 0.999, принтер переместится в X9.99. Это эффективно масштабирует длину сегмента.
  • Команды, не затрагиваемые макросом: Команды, такие как G28 (парковка/homing), не будут затронуты этими макросами, так как мы переопределили только G0 и G1. Парковка должна выполняться с использованием оригинальных, немасштабированных координат.
  • Точность: Хотя Jinja2 и Klipper работают с числами с плавающей точкой, очень малые коэффициенты масштабирования или очень большие координаты могут теоретически привести к ошибкам округления. Однако для типичных значений (например, 0.990-1.010) это не должно быть проблемой. Округление до 5 знаков после запятой в макросах (`|round(5)`) помогает поддерживать разумную точность G-кода.
  • Документация Klipper: Официальная документация Klipper по G-кодам, шаблонам команд и конфигурации макросов является бесценным ресурсом для дальнейшего изучения и настройки.

Часто задаваемые вопросы (FAQ)

Как проверить, что макрос работает правильно?

Самый простой способ – напечатать тестовый объект с известными размерами (например, куб 20x20 мм). Установите коэффициент масштабирования, отличный от 1.0 (например, SCALE_AXES X=0.9 Y=0.9), напечатайте объект и измерьте его. Если куб получился размером примерно 18x18 мм, макрос работает. Также следите за сообщениями в консоли Klipper при выполнении команды SCALE_AXES и при движении осей – там не должно быть ошибок.

Повлияет ли этот макрос на команду парковки (G28)?

Нет, эти макросы переопределяют только команды G0 и G1. Команда G28 (и другие команды, такие как G29 для калибровки стола) будут работать как обычно, без применения масштабирования, если вы не создадите для них отдельные макросы-обертки.

Что произойдет, если я забуду указать X или Y в команде SCALE_AXES?

Если вы вызовете SCALE_AXES без параметров X или Y (например, просто SCALE_AXES), макрос выведет в консоль текущие установленные значения коэффициентов для X и Y. Если вы укажете только один параметр (например, SCALE_AXES X=0.999), то будет изменен только коэффициент для оси X, а коэффициент для оси Y останется прежним.

Можно ли масштабировать ось Z или экструдер (E)?

Представленные макросы G0 и G1 масштабируют только координаты X и Y. Параметры Z и E передаются без изменений. Если вам необходимо масштабировать ось Z или поток экструзии (E), вам потребуется модифицировать макросы G0/G1, добавив аналогичную логику для параметров Z и E, и, возможно, создать отдельные переменные для их коэффициентов в макросе `SCALE_AXES`.

Нужно ли изменять G-код файлы из слайсера?

Нет, прелесть этого решения в том, что вам не нужно изменять G-код файлы, генерируемые вашим слайсером. Макросы автоматически "перехватывают" и модифицируют команды G0 и G1 "на лету", когда Klipper их обрабатывает. Ваши файлы G-кода остаются стандартными.


Рекомендуемые запросы для дальнейшего изучения


Источники и полезные ссылки

klipperscreen.readthedocs.io
Macros - KlipperScreen - Read the Docs

Last updated May 7, 2025

AI-assisted research. Sources, methodology and corrections · Source-checked guides and tools · Explore published answers

Ask Ithy AI
Download Article
Delete Article