Перейти к содержанию

Порядок калибровки Klipper: семь шагов, которые нельзя переставлять

Опубликовано
  • Админы
Klipper: порядок калибровки, семь шагов
Klipper: порядок калибровки, семь шагов

Типичная история: человек покупает ADXL345, лепит его на хотэнд, гоняет SHAPER_CALIBRATE, получает красивый график — и печать не становится лучше. Через неделю он протягивает ремень, и весь расчёт можно выбрасывать: частота уехала.

Klipper даёт десяток инструментов калибровки, и почти все они дают правдоподобный результат независимо от того, готова ли машина. Именно в этом ловушка: цифра появляется всегда, но смысл она имеет только если то, что под ней, уже зафиксировано. Ниже — последовательность из семи шагов и объяснение, почему у каждого шага именно такое место.

❗ Главное

Правило одно: калибровка измеряет следствие. Если причина ещё гуляет, измерение придётся повторять. Поэтому порядок идёт снизу вверх — от железа к софтверным компенсациям, а не наоборот.

Зависимости между шагами калибровки Klipper
Зависимости между шагами калибровки Klipper

Схема на основе документации klipper3d.org

Шаг 0. То, что делается до любой калибровки

Официальная документация Klipper начинает не с настроек качества, а со списка проверок безопасности — и правильно делает. Ни одна из них не про печать, но каждая может стоить принтера.

✅ Как правильно

  1. Температуры. Графики сопла и стола показывают комнатную температуру и не растут сами по себе.
  2. M112. Аварийная остановка должна переводить прошивку в состояние shutdown; FIRMWARE_RESTART возвращает её в норму, температуры продолжают обновляться.
  3. Нагреватели. Задайте соплу 50 °C — температура должна расти в течение ~30 секунд. Выключите — за несколько минут вернуться к комнатной.
  4. Enable-пины. После M84 все оси должны двигаться руками. Если моторы заблокированы — в конфиге нужен инвертированный пин: enable_pin: !PA1.
  5. Концевики. QUERY_ENDSTOPS при отведённых осях — open, при нажатом вручную — TRIGGERED. Инверсия — тем же !.
  6. Направление моторов. STEPPER_BUZZ STEPPER=stepper_x дёргает ось на 1 мм десять раз. Проверяем направление, возврат в исходную точку и саму дистанцию.
  7. Экструдер. Прогреть до рабочей температуры, нажать «Extrude», убедиться, что мотор крутит в правильную сторону.

⛔ Так делать нельзя

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

Шаг 1. Механика: то, что нельзя починить конфигом

Здесь нет команд Klipper, и именно поэтому шаг чаще всего пропускают. Между тем всё, что будет измеряться дальше, — производная от жёсткости конструкции.

Что проверяется: натяжение ремней X и Y (одинаковое, без «струны» и без провисания), затяжка шкивов на валах — винт должен стоять на лыске, а не на круглой части, люфт кареток и эксцентриков, затяжка рамы, отсутствие качания стола.

Почему это первым: собственная частота колебаний рамы и каретки — то, что вы будете измерять на шаге 6. Она напрямую зависит от натяжения ремня и массы каретки. Протянули ремень после калибровки шейпера — получили другую частоту и старые коэффициенты.

📌 Заметка

Есть удобный побочный инструмент: TEST_RESONANCES AXIS=1,1 OUTPUT=raw_data и TEST_RESONANCES AXIS=1,-1 OUTPUT=raw_data (на CoreXY это соответствует движению по одному и по другому ремню). Сравнение двух графиков показывает разницу в натяжении ремней. Но это диагностика механики, а не калибровка шейпера — не путайте эти два применения одной команды.

Шаг 2. rotation_distance: геометрия и подача

rotation_distance — это расстояние, которое проходит ось за один полный оборот шагового двигателя. Для ременных осей оно считается, а не подбирается:

rotation_distance = шаг ремня × число зубьев шкива

Для типового сочетания GT2 (шаг 2 мм) и шкива на 20 зубьев получается ровно 40 мм. Если у вас 16 зубьев — 32 мм, и никакой «калибровки по печати куба» здесь не нужно: значение известно точно.

Если ось всё же ходит не туда, куда просили, коррекция считается по формуле:

rotation_distance = старое_значение × фактическое_расстояние / запрошенное_расстояние

С экструдером иначе — там метод «измерить и подрезать» как раз уместен, потому что проскальзывание и деформация филамента не выводятся из геометрии:

G91
G1 E50 F60

Порядок действий: пометить филамент примерно в 70 мм от входа в экструдер, выдавить 50 мм на медленной подаче (F60 — это 1 мм/с, чтобы не считать давление в сопле), замерить штангенциркулем новое положение метки. Фактическое расстояние — разница между исходным и конечным замером; дальше та же формула, результат округляется до трёх знаков.

ℹ️ Справка

Если в экструдере стоит редуктор, не пересчитывайте передаточное число руками — для этого есть gear_ratio. Тогда rotation_distance описывает движение выходной шестерни, а не вала мотора, и конфиг остаётся читаемым.

Метод «измерить и подрезать» документация прямо не рекомендует для X, Y и Z: точности измерения там не хватает, а формула из геометрии даёт точный ответ.

Шаг 3. PID: стабильная температура — стабильная вязкость

Два вызова и сохранение:

PID_CALIBRATE HEATER=extruder TARGET=170
PID_CALIBRATE HEATER=heater_bed TARGET=60
SAVE_CONFIG

Почему до калибровки потока и pressure advance, а не после: вязкость расплава сильно зависит от температуры. Если сопло гуляет на ±5 °C, ширина экструдированной линии тоже гуляет — и вы будете «калибровать поток», измеряя на самом деле разболтанный нагреватель.

SAVE_CONFIG перезапишет секцию [extruder] в конце printer.cfg и перезагрузит прошивку. Калибруйте на температуре, близкой к рабочей для вашего основного филамента, — коэффициенты не универсальны.

Шаг 4. Первый слой и геометрия стола

Z-offset и bed_mesh — единственный шаг, который придётся делать частями и возвращаться к нему при смене поверхности стола или сопла. Здесь важна не столько «правильная цифра», сколько повторяемость: если после прогрева стола зазор уезжает, дальше калибровать нечего.

Практический критерий готовности: одинаковая толщина и одинаковая ширина первого слоя в центре и во всех четырёх углах, без «прозрачных» участков и без выдавленных валиков.

⚠️ Осторожно

Мешь стола компенсирует кривизну, но не компенсирует термическое поведение. Снимайте её на прогретом столе, при той температуре, на которой печатаете, — иначе вы записываете форму холодного стола и применяете её к горячему.

Шаг 5. Pressure advance: ширина стенки на разгонах

Pressure advance компенсирует давление в расплаве: при разгоне сопла нужно подать чуть больше пластика, при торможении — чуть меньше. Без него углы получаются раздутыми, а начала линий — тонкими.

Подготовка — снять с движения всё, что может исказить результат:

SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500

Дальше запускается башня. Для директ-драйва и для боудена разный шаг:

# direct drive
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005

# bowden
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.020

Печатается square_tower.stl из комплекта документации: скорость 100 мм/с, заполнение 0 %, высота слоя примерно 75 % диаметра сопла, динамическое управление ускорением и настройки шва — выключить.

Затем находим высоту, на которой стенка выглядит ровнее всего, и считаем:

pressure_advance = <START> + <высота в мм> × <FACTOR>

Пример из документации: 0 + 12.90 × 0.020 = 0.258. Типичные значения лежат в диапазоне 0,050–1,000, причём верхняя часть диапазона — это обычно боуден.

📌 Заметка

Значение зависит от филамента и в меньшей степени от температуры. Разумная практика — держать pressure advance не в printer.cfg, а в профилях слайсера через SET_PRESSURE_ADVANCE в стартовом G-коде: у PETG и PLA он отличается заметно.

Шаг 6. Резонансы: два пути к одной цифре

Ringing (он же ghosting) — это следы затухающих колебаний рамы на стенке детали после резкой смены направления. Input shaper не глушит колебания механически: он разбивает команду на несколько импульсов так, чтобы вторая волна пришла в противофазе к первой и погасила её.

Как input shaper гасит ringing: два импульса в противофазе
Как input shaper гасит ringing: два импульса в противофазе

Схема на основе описания резонансной компенсации в документации Klipper

Тестовая башня с видимым ringing
Тестовая башня с видимым ringing

Тестовая печать с ringing. Иллюстрация из документации Klipper

Путь А. Без акселерометра — башня с ускорениями

Печатается ringing_tower.stl: слой 0,2–0,25 мм, 1–2 периметра или ваза, внешние периметры на 80–100 мм/с, минимальное время слоя не больше 3 секунд, динамическое ускорение выключено. Команда:

TUNING_TOWER COMMAND=SET_VELOCITY_LIMIT PARAMETER=ACCEL START=1500 STEP_DELTA=500 STEP_HEIGHT=5

Дальше — линейка или штангенциркуль: измеряем расстояние D (мм) между несколькими колебаниями и считаем их количество N на этом отрезке. Частота:

частота (Гц) = V × N / D

где V — скорость внешнего периметра в мм/с. Считается отдельно для X и Y по меткам на модели.

Измерение расстояния между колебаниями штангенциркулем
Измерение расстояния между колебаниями штангенциркулем

Замер расстояния D между колебаниями. Иллюстрация из документации Klipper

Путь Б. С акселерометром

Klipper работает с ADXL345, MPU-9250, LIS2DW и LIS3DH-совместимыми датчиками. ADXL345 — только SPI, MPU и LIS умеют и SPI, и I²C.

Пример подключения ADXL345 напрямую к Raspberry Pi:

[mcu rpi]
serial: /tmp/klipper_host_mcu

[adxl345]
cs_pin: rpi:None

[resonance_tester]
accel_chip: adxl345
probe_points:
    100, 100, 20

Тот же датчик через RP2040:

[mcu adxl]
serial: /dev/serial/by-id/usb-Klipper_rp2040_<серийник>

[adxl345]
cs_pin: adxl:gpio1
spi_bus: spi0a
axes_map: x,z,y

[resonance_tester]
accel_chip: adxl345
probe_points:
    147, 154, 20

Проводку документация советует делать экранированной витой парой (cat5e и лучше), проверять сопротивление подтяжек I²C (ориентир — от 900 Ом до 1,8 кОм) и подключать экран к земле MCU. Перед подачей питания проверьте распиновку дважды: ошибка убивает датчик.

Проверка связи и шума:

ACCELEROMETER_QUERY
MEASURE_AXES_NOISE

ACCELEROMETER_QUERY должен вернуть три числа, где по вертикальной оси видно ускорение свободного падения — примерно так:

// adxl345 values (x, y, z): 470.719200, 941.438400, 9728.196800

MEASURE_AXES_NOISE в норме даёт значения примерно от 1 до 100.

⚠️ Осторожно

Значения выше 1000 в MEASURE_AXES_NOISE — это не «шумный датчик, сойдёт». Это либо проблема с питанием и проводкой, либо разбалансированный вентилятор, который трясёт всю раму. Мерить резонансы в таком состоянии бессмысленно: вы снимете спектр вентилятора.

Сам замер (input shaper на время теста должен быть выключен):

TEST_RESONANCES AXIS=X
TEST_RESONANCES AXIS=Y

CSV попадут в /tmp/resonances_x_*.csv и /tmp/resonances_y_*.csv. Обработка:

~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_*.csv -o /tmp/shaper_calibrate_x.png
~/klipper/scripts/calibrate_shaper.py /tmp/resonances_y_*.csv -o /tmp/shaper_calibrate_y.png

Вывод выглядит так:

Fitted shaper 'mzv' frequency = 34.6 Hz (vibrations = 0.0%, smoothing ~= 0.170)
To avoid too much smoothing with 'mzv', suggested max_accel <= 3500 mm/sec^2
Recommended shaper is mzv @ 34.6 Hz

Автоматический вариант — SHAPER_CALIBRATE (на «качельке» имеет смысл гонять по одной оси: SHAPER_CALIBRATE AXIS=Y), затем SAVE_CONFIG. Результат в конфиге:

[input_shaper]
shaper_freq_x: 57.8
shaper_type_x: zv
shaper_freq_y: 34.6
shaper_type_y: mzv

[printer]
max_accel: 3000

Если тряска при тесте кажется чрезмерной, снизьте accel_per_hz (по умолчанию 75):

[resonance_tester]
accel_chip: adxl345
accel_per_hz: 50
probe_points: ...

Какой шейпер выбирать

Шейпер Длительность Полоса подавления (порог 5 %) Сглаживание
ZV 0,5 / freq минимальное
MZV 0,75 / freq ±4 % от частоты низкое
ZVD 1 / freq ±15 % среднее
EI 1 / freq ±20 % среднее
2HUMP_EI 1,5 / freq −40…+45 % высокое
3HUMP_EI 2 / freq −50…+60 % очень высокое

Логика простая: чем длиннее шейпер, тем шире полоса частот, которую он гасит, и тем сильнее размывает мелкие детали. Скрипт calibrate_shaper.py уже взвешивает этот компромисс, но если сглаживание не устраивает, его можно ограничить явно:

~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_*.csv -o /tmp/shaper_calibrate_x.png --max_smoothing=0.2

📌 Заметка

Документация отдельно предупреждает: гонять автокалибровку шейпера часто — например, перед каждой печатью или ежедневно — не стоит. Тестовые прогоны сильно трясут машину, ускоряя износ и ослабляя крепёж. После калибровки имеет смысл пройтись по винтам.

Шаг 7. max_accel: минимум из двух пределов

Последний шаг — и единственный, где SAVE_CONFIG вам не поможет: значение подбирается глазами по тестовой печати.

Пределов два, и брать надо меньший:

  1. Предел по ringing — максимальное ускорение, при котором следы колебаний ещё приемлемы.
  2. Предел по сглаживанию — максимальное ускорение, при котором не теряются детали. Индикатор в тестовой модели — зазор 0,15 мм в стенке: чем сильнее сглаживание, тем шире он выглядит.
Зазор 0,15 мм в тестовой модели
Зазор 0,15 мм в тестовой модели

Тот самый зазор 0,15 мм, по которому оценивают сглаживание. Иллюстрация из документации Klipper

Расширение зазора при росте ускорения
Расширение зазора при росте ускорения

Чем выше ускорение, тем шире выглядит зазор. Иллюстрация из документации Klipper

square_corner_velocity при этом трогать не надо: документация советует оставить значение по умолчанию 5 мм/с, потому что его увеличение добавляет сглаживания ровно там, где мы его только что убирали.

Шпаргалка: полный проход

✅ Как правильно

# 0. проверки
M112 / FIRMWARE_RESTART
QUERY_ENDSTOPS
STEPPER_BUZZ STEPPER=stepper_x

# 2. подача
G91
G1 E50 F60

# 3. нагреватели
PID_CALIBRATE HEATER=extruder TARGET=170
PID_CALIBRATE HEATER=heater_bed TARGET=60
SAVE_CONFIG

# 5. pressure advance
SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY=1 ACCEL=500
TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0 FACTOR=.005

# 6. резонансы
MEASURE_AXES_NOISE
SHAPER_CALIBRATE
SAVE_CONFIG

# 7. потолок ускорения — руками, по тестовой печати

Возвращаться к началу придётся при любом вмешательстве в механику: замена хотэнда меняет массу каретки и частоту, замена ремня — натяжение, новая поверхность стола — Z-offset. Это не повод калибровать всё заново каждую неделю, но повод помнить, какой шаг вы только что обнулили.

💬 Вопрос к сообществу

Интересно сравнить реальные цифры: какая у вас shaper_freq по X и Y, на какой кинематике и с каким max_accel в итоге печатаете? И был ли случай, когда после протяжки ремней частота уезжала настолько, что старый шейпер начинал мешать?

Источники

  • Klipper, Config checks — https://www.klipper3d.org/Config_checks.html
  • Klipper, Rotation distance — https://www.klipper3d.org/Rotation_Distance.html
  • Klipper, Pressure advance — https://www.klipper3d.org/Pressure_Advance.html
  • Klipper, Resonance compensation — https://www.klipper3d.org/Resonance_Compensation.html
  • Klipper, Measuring resonances — https://www.klipper3d.org/Measuring_Resonances.html
  • Klipper, Config reference — https://www.klipper3d.org/Config_Reference.html

Featured Replies

No posts to show

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу
Яндекс.Метрика

Account

Navigation

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.