Klipper для всех линейных перемещений использует настройку внутри секции [stepper]
или [extruder]
, которая называется rotation_distance
, и означет она следующее:
Rotation distance - это расстояние в миллиметрах на которое переместится ось за одно полное вращение шаговика, т.е. за одно полное вращение шаговика принимается оборот на 360 градусов.
На это расстояние может влиять редукция, которая задается через gear_ratio
, но по умолчанию она не используется и равна единице.
В случае использования редукторов - указывается коэффициент редукции, например, для BMG, 5:1
или по количеству зубов на шестернях редуктора 80:16
, которая читается как: 16 зубый шкив шагового мотора передает вращение на 80 зубчатый шкив. rotation_distance
должен быть равен пройденному растоянию после редуктора, таким образом если принять gear_ratio
равным 5:1
, rotation_distance
без учета gear_ratio равным 40
, то новый rotation_distance
c учетом gear_ratio
будет равен 8
.
Например для экструдера LGX используется двойная редукция, котороая может быть описана по количеству зубов на шестернях как 44:14, 37:17
, но при этом сам производитель не советует использовать параметр gear_ratio
, а ограничиться использованием только rotation_distance
.
Внутри конфигурационного файла настройка выглядит следующим образом:
[stepper_x]
rotation_distance: 40
или если используется gear_ratio
:
[extruder]
rotation_distance: 1.17
gear_ratio: `44:14, 37:17`
Более подробно о редукции и ее определении в конфигурационном файле можно прочесть в Config_Reference#stepper, а так же using-a-gear_ratio.
Для всех ниже приведенных формул мы будем считать что параметр
microsteps
равен 16.
А количество шагов двигателяfull_steps_per_rotation
равным 200, что соответствует шаговому двигателю с углом 1.8
В случае, если для вашей конфигурации известны параметры для прошивки Marlin, то их можно пересчитать по следующей формуле:
rotation_distance = full_steps_per_rotation * microsteps / steps_per_mm
Например, для принтера Creality Ender 3v2:
#define DEFAULT_AXIS_STEPS_PER_UNIT { 80, 80, 400, 93 }
Пересчитаем значение для оси X, при заданном количестве шагов 80:
rotation_distance = 200 * 16 / 80 = 40
В случае использования ремней, то определить rotation_distance
можно по формуле:
rotation_distance = belt_pitch * number_of_teeth_on_pulley
где:
belt_pitch
- шаг ремня
number_of_teeth_on_pulley
- количество зубов на шкиве
Например, для ремня GT2 шаг равен 2мм.
А на используемом для оси шкиве 20 зубов.
Выполним расчет:
rotation_distance = 20 * 2 = 40
В случае использования на оси трапецеидального винта (Т-винт), то определить rotation_distance
можно по формуле:
rotation_distance = screw_pitch * number_of_separate_threads
где:
screw_pitch
- шаг резьбы
number_of_separate_threads
- количество заходов резьбы
У однозаходной резьбы шаг и ход резьбы одинаковы, при этом за один оборот винта гайка перемещается на величину шага. Если перемещение гайки за один оборот должно быть большим, то ход, а следовательно, и шаг однозаходного винта должны быть большими.
При использовании винта с 4 заходами и шагом резьбы 2 миллиметра, получим следующий расчет:
rotation_distance = 4 * 2 = 8
В этой части идет самая сложная магия определения rotation_distance
.
Для этого потребуется маркер, а так же измерительный прибор! В случае с обычной линейкой точность будет хуже, чем при использовании штангенциркуля (особенно цифрового), но это FDM - тут все относительно.
На просторах интернета есть два варианта калибровки, которые имеют незначительное отличие. Оба метода замеряют длину филамента, которая зашла в экструдер (или трубку), при выполнении команды:
G1 E50 F60
где, E50 - 50 мм филамента, а F60 скорость подачи. Длина филамента в разных источниках варьируется от 50мм до 200мм, но это не принципиально.
Отличаются же методы тем, что в первом варианте рекомендуют снять сопло и нагревательный эллемент с экструдера, чтобы они не влияли на замеры.
Во втором варианте предлагают не снимая сопло и нагреватель, но использовать скорость подачи филамента около 1мм/с, тем самым снизив влияние температуры и сопла на филамент.
Какой способ выберите Вы, зависит только от Вас. Нижеописанные шаги будут идентичны для любого из способов:
G1 E50 F60
, которая выдавит 50мм филамента со скоростью 1мм/с, отмечаем запрашиваемую дистанцию (requested_extrude_distance) равной 50мм;rotation_distance
, который будет равен: rotation_distance
= предыдущее значение rotation_distance
* Фактическое значение экструзии (actual_extrude_distance)
/ Запрошенное значение(requested_extrude_distance)
Для примера:
rotation_distance = 8
Запросили (requested_extrude_distance) = 50 мм
После замеров, получили что фактическое значение (actual_extrude_distance) = 55 мм
Новый rotation_distance = 8 * 55 / 50 = 8.8
Согласно документации, рекомендуется округлять rotation_distance
до трех знаков после запятой.
Нет, это не Bed mesh
, это уверенность в том что начало стола на месте. Нужном месте. Когда мы уверены что перемещение на 20мм - это действительно перемещение на 20мм, выставим правильно точку отсчета координат.
Да, мы будет калибровать координаты, Гаррус Вакариан будет доволен!
Логика работы концевика в
Klipper
следующая: при выполнении команды G28, идет перемещение по оси, в момент срабатывания концевика - текущему положению присваивается значениеposition_endstop
конкретной оси.
Прошивка
Klipper
позвояет использовать отрицательные координаты, поэтому не следует пугаться того, что у конкретной оси могут быть отрицательные значения.
Известно что область печати это 220 на 220 мм для Ender 3, но если открыть пример его конфигурационного файла, то там увидим:
[stepper_x]
...
position_endstop: 0
position_max: 235
...
[stepper_y]
...
position_endstop: 0
position_max: 235
И при координатах X0, Y0 сопло будет не над столом, что может привести к тому, что печать начнется вне области стола/печати. Для корректной работы, необходимо добиться чтобы X0 и Y0 - это был нижний левый угол стола.
Для этого с помощью графического интерфейса, или командами G0 X* Y*
, где *
- абсолютные координаты, выставляем сопло в район желтой точки, со смещением от края стола в 5мм.
После выставления допустим мы получили следующие координаты:
Назовем текущее положение сопла x_offset
и y_offset
.
Таким образом чтобы желтая точка указанная выше стала 0,0 координат, необходимо решить следующее уравнение:
position_min_x + x_offset = 0
position_min_y + y_offset = 0
В нашем случае, x_offset
= 14, а y_offset
= 15. Следовательно получим уравнения вида:
position_min_x + 14 = 0
position_min_y + 15 = 0
В рамках данной статьи, мы не будем рассматривать как именно мы получили
position_min_x
= -14 иposition_min_y
= -15. Но смею заверить ни одни лапки при этом не пострадали.
Откорректируем printer.cfg
с учетом полученных данных:
[stepper_x]
...
position_min: -14
position_endstop: -14
position_max: 235
...
[stepper_y]
...
position_min: -15
position_endstop: -15
position_max: 235
После сохранения и применения настроек, выполняем:
G28
G0 X0 Y0 F2000
Сопло должно будет переместиться на желтую точку, все абсолютные координаты теперь будут считаться от нее.