Настройка датчика автоуровня BLTouch в Klipper

16 декабря 2024

При печати на PEI столе вы столкнетесь со сложностью получения идеального первого слоя. Для решения данной проблемы придумали датчики автоуровня. Эти устройства предлагаются разными производителями под именами BLTouch и 3D Touch. Было решено обзавестись таким датчиком и понять, действительно ли он помогает.

Напомню, что я использую Flying Bear Ghost 6, переведенный на Klipper. Все написанное далее будет в контексте данного 3D-принтера и данной прошивки.

Датчики автоуровня крепятся к голове 3D-принтера. На голове FBG6 его удобно расположить с задней стороны:

Крепление BLTouch для головы Flying Bear Ghost 6

Конечно, сначала были опробованы готовые модели креплений (первая, вторая). Мне они не понравились хрупкими защелками и идеей врезать винты в пластик. В результате было спроектировано собственное крепление.

Исходники для OpenSCAD и файл STL доступны здесь. Модель параметрическая. Если в будущем захочется сменить хотенд на какой-нибудь Volcano, понадобится лишь подогнать значение vert_y. В крышке головы необходимо просверлить отверстия под два винта M3 с потайной головкой, а также укоротить внутренние ребра при помощи надфиля.

Заметьте, что ни датчик, ни винты нигде не выходят за периметр головы. Поэтому они не могут биться о корпус 3D-принтера, и площадь печати остается прежней.

Показанный на фотографии датчик обошелся мне в ~10$. Это самый дешевый датчик, какой я только смог найти. Было интересно, насколько он окажется хорош или плох. Забегая вперед, скажу, что датчик нормальный.

К датчику прилагаются провода с разъемами. Их распиновка такая (источник):

Распиновка разъемов на датчиках BLTouch

Цвета проводов могут отличаться. У меня все как на фото, но вместо коричневого провода зеленый. Если цвета не совпадают, можно прозвонить два GND провода и отсчитывать от них.

Прежде, чем устанавливать BLTouch на голову 3D-принтера, следует убедиться, что датчик рабочий. Подключение к плате MKS Nano4 v3.1 осуществляется так:

Кабель с тремя проводами    Разъем "3D_TOUCH"
    Servo signal in     --->    PA8 (верхний)
    Power +5V           --->    +5V (средний)
    Power GND           --->    GND (нижний)

Кабель с двумя проводами    Разъем "Z+"
    Prob signal out     --->    PC4 (верхний)
    GND                 --->    GND (средний)

Разъем «3D_TOUCH» вы найдете в левом нижнем углу платы. Его плохо видно за изгибом корпуса. Разъем «Z+» находится правее, и он уже занят. В него воткнут кабель, подписанный, как «H». Это кабель неиспользуемого датчика возгорания. Кабель оставляем в разъеме, он пригодится для удлинения кабеля BLTouch. А вот датчик снимаем. Он находится над концевиком оси Z. Выглядит, как маленькая плата с потенциометром, компаратором LM393 и каким-то «черным светодиодом» (очевидно, излучающим тьму!).

Открываем printer.cfg во Fluidd и дописываем:

[bltouch]
sensor_pin: ^PC4
control_pin: PA8
x_offset: 0
y_offset: 41
z_offset: 2.0
samples: 3

Нажимаем Save & Restart. Подробное описание всех доступных параметров вы найдете в документации Klipper.

Видим, как BLTouch проводит самотестирование. Щуп поднимается и опускается несколько раз. По окончании теста щуп втянут, горит красный светодиод (есть еще синий светодиод, он горит постоянно). Если результат отличается, то либо BLTouch неисправен, либо подключен неверно.

Во Fluidd открываем консоль и выполняем следующие команды:

BLTOUCH_DEBUG COMMAND=pin_down

Щуп опускается, красный светодиод гаснет.

BLTOUCH_DEBUG COMMAND=pin_up

Щуп поднимается, красный светодиод светится.

BLTOUCH_DEBUG COMMAND=pin_down
QUERY_PROBE

Должны увидеть:

// probe: open

Слегка нажимаем на кончик щупа. Он втягивается, красный светодиод мигает.

Выполняем:

QUERY_PROBE

Должны увидеть:

// probe: TRIGGERED

На данном этапе мы установили, что соединение правильное. Прошивка может управлять BLTouch и считывать его состояние.

Следующий тест — на поддержку touch_mode:

BLTOUCH_DEBUG COMMAND=reset
BLTOUCH_DEBUG COMMAND=pin_down
BLTOUCH_DEBUG COMMAND=touch_mode
QUERY_PROBE

В консоли должны увидеть:

// probe: open

Если теперь слегка нажать на кончик щупа и повторить:

QUERY_PROBE

… то должны увидеть:

// probe: TRIGGERED

Мой датчик провалил данный тест, потому что я использую не оригинальный BLTouch, а совместимый клон. Klipper умеет работать и с клонами. Для этого в printer.cfg в секцию [bltouch] нужно дописать:

pin_up_touch_mode_reports_triggered: False

Далее устанавливаем BLTouch на голову, соединяем проводами по-нормальному. Перепроверяем соединения, как было описано выше.

Правим секцию [stepper_z] в printer.cfg:

# endstop_pin: !PC8
# position_endstop: 0.5
endstop_pin: probe:z_virtual_endstop
position_min: -10 # нужно для калибровки Z offset

Этим мы говорим использовать BLTouch вместо концевика оси Z.

Также добавляем секцию:

# если секция уже есть в конфиге, перезаписываем!
[safe_z_home]
home_xy_position: 130,65 # (130,106) - xy_offset
z_hop: 10
z_hop_speed: 5
move_to_previous: True

Она говорит использовать конкретные координаты (X,Y) головы при парковке стола. Без этого во время парковки щуп BLTouch может оказаться не над столом.

Для удобства добавим следующий макрос, он пригодится нам далее:

[gcode_macro CENTER_XY]
gcode:
    G1 X130 Y65 F7800

Save & Restart. Паркуем стол. Видим, как голова перемещается в центр стола, стол паркуется при помощи BLTouch, после чего голова возвращается в ближний левый угол.

Проверяем точность датчика. Сначала на холодном столе:

CENTER_XY
PROBE_ACCURACY

Согласно документации, разброс значений должен быть меньше 0.025 мм, иначе датчик можно выбросить. Повторяем на столе, разогретым до 70°C. Здесь и далее после нагрева стола нужно подождать несколько минут. Дело в том, что датчик температуры стола стоит не на его поверхности. Когда прошивка думает, что стол уже нагрет, в действительности стол может еще прогреваться. Разброс значений на горячем столе должен быть таким же, каким он был на холодном. Делаем вывод, что хотя щуп и сделан из пластика, который потенциально может липнуть к PEI столу, это не влияет на точность BLTouch.

Также предсказуемым образом видим разницу высоты ~0.2 мм между горячим столом и холодным. Отсюда делаем вывод, что стол нужно парковать перед началом печати, когда он горячий. Это можно сделать либо на стороне Klipper через макрос START_PRINT, либо в слайсере. По историческим причинам стартовый G-code у меня указан в OrcaSlicer. Открываем свойства принтера, Machine G-code → Machine start G-code. Находим место, где код ждет нагрева стола и сопла (команды M190 и M109), и после них добавляем парковку:

G28 ; паркуем стол во второй раз, когда стол уже горячий

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

Теперь нам предстоит настроить Z offset. Это расстояние между соплом и столом в момент срабатывания датчика.

Стол разогреваем до 70°C, в консоли выполняем:

CENTER_XY
PROBE_CALIBRATE

Во Fluidd открывается симпатичный диалог с регулировкой координаты по оси Z. Задача состоит в том, чтобы подобрать положение сопла по трению бумажки, т.е. как при ручной калибровке уровня стола, но в одной точке. После нажатия Accept в консоли видим найденный Z offset. Открываем конфиг и обновляем z_offset.

Оптимальным является Z offset где-то от 1 до 2 мм. Если получилось меньше, то нужно перепечатать крепление датчика с большим vert_y. Если получилось больше, то нужно либо уменьшить vert_y, либо укоротить щуп при помощи надфиля. Учтите, что найденный Z offset является примерным. Окончательное значение определяется экспериментально, чем мы займемся далее по тексту.

Технически, на данном этапе принтер уже рабочий. Можно напечатать что-нибудь небольшое. Теперь нам предстоит построить карту высот.

В конфиг дописываем:

[bed_mesh]
mesh_min: 10,51   # (10,10) + xy_offset
mesh_max: 240,201 # (240,160) + xy_offset
probe_count: 6,4
fade_start: 0
fade_end: 10

Save & Restart. Стол разогреваем до 70°C. Выполняем:

BED_MESH_CALIBRATE

Наблюдаем, как голова прощупывает стол. По завершении процесса смотрим карту высот во Fluidd, во вкладке Tune:

Просмотр карты высот во Fluidd

Как ни странно, кривизна в 0.4 мм — это неплохой результат. Не так уж редки случаи, когда кривизна стола составляет 1 мм. В обычных 3D-принтерах алюминиевая пластина в столе не подвергается прецизионной фрезерной обработке, поэтому это лотерея. И к этому добавляется кривизна PEI стола.

Сохраняем карту высот:

SAVE_CONFIG

В Klipper можно сохранять несколько карт высот с присвоением им уникальных имен. Например, можно построить разные карты для разных температур стола. Раньше карта высот с именем default загружалась автоматически. Но в новых версиях Klipper для этого нужно явно дописать в конфиг:

[delayed_gcode load_default_mesh_at_startup]
initial_duration: 0.1
gcode:
    BED_MESH_PROFILE LOAD=default

Конечно, можно просто постоянно заходить во кладку Tune и вручную выбирать нужную карту высот, но это неудобно.

Финальная настройка. Печатаем монослой, смотрим на результат, подгоняем Z offset. Если сопло слишком высоко от стола, увеличиваем Z offset на ~0.1 мм, иначе уменьшаем. Повторяем до получения приемлемого результата.

Когда процесс сошелся, печатаем калибровочный кубик. Убеждаемся, что кубик надежно держится на столе и не имеет «слоновьей ноги». Можно еще напечатать башню откатов из OrcaSlicer. Если все сделано правильно, то тонкое основание модели будет легко отлипать, не оставляя ошметков на PEI столе.

Метки: .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.