Масштабирование осей X и Y в Klipper: Автоматизируйте точность ваших G0/G1 команд!
Узнайте, как создать мощные макросы для динамической коррекции перемещений вашего 3D-принтера.
Управление точностью размеров печатаемых деталей – ключевой аспект 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.
Основная идея заключается в следующем:
- Создать макрос для хранения и установки коэффициентов масштабирования (например,
SCALE_AXES). - Переопределить стандартные команды G0 и G1. Новые макросы G0 и G1 будут выполнять роль "оберток": они будут получать оригинальные параметры команды, применять к координатам X и Y масштабирование, используя коэффициенты из макроса
SCALE_AXES, а затем вызывать оригинальные (переименованные) команды Klipper с уже измененными параметрами.
Для этого активно используется язык шаблонов Jinja2, который позволяет Klipper динамически генерировать G-код внутри макросов.
Пример интерфейса 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-кода:
Эта диаграмма показывает, что команда 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-кода остаются стандартными.
Рекомендуемые запросы для дальнейшего изучения
- Как настроить компенсацию усадки пластика в Klipper для разных материалов?
- Создание сложных цепочек макросов в Klipper для автоматизации задач печати.
- Продвинутое использование Jinja2 в макросах Klipper для условной логики.
- Интеграция Klipper с Mainsail или Fluidd: лучшие практики и пользовательские интерфейсы.
Источники и полезные ссылки
Last updated May 7, 2025