Klipper на Ender 3, SKR mini E3 и Orange Pi Zero

Освободилась у меня апельсинка одна из первых Orange Pi Zero 512 MB v1.1, а старенький Ender 3 v1 купленный в 2018-ом и всего год назад получивший новые мозги SKR mini E3 v3.0 от bigtreetech неожиданно перестал нормально печать ABS после обновления на Marlin 2.0.9. Новые принтеры от Creality выходят на Klipper, так что пора, тем более что маленький опыт уже был.

Armbian

Образ Armbian 23.8 Bookworm CLI скачал с офф. странички. По опыту не все версии заводятся корректно. Конкретно эта версия (прямая ссылка) встала без проблем. Как рекомендуется использовал usbimager для записи образа. Не забываем распаковать архив. Заливал файл Armbian_23.8.3_Orangepizero_bookworm_current_6.1.53.img на чистую флешку с одним разделом. Достаточно 8 GB и в идеале класс A1. После прошивки подключем Ethernet к роутеру с DHCP и включаем питание. Лезем в web-морду роутера и ищем выданный адрес orangepizero. Далее через PuTTY подключаемся. Далее по инструкции root:12345, создаем нового пользователя, желательно с именем pi. Делаем apt update без upgrade. Настраиваем wi-fi: nmtui-connect. Снова смотрим в роутере IP адрес. Теперь можно перезагрузиться restart и отключить Ethernet. Логинемся по новому IP пользователем pi.

OctoPrint

Если раньше klipper поставлялся со скриптом, который предлагал на выбор несколько web-интерфейсов, то сейчас стандартом де факто стал OctoPrint. Есть неплохой мануал для ручной настройки. Более короткая версия есть на офф. сайте, но в обоих случаях возникает проблема с зависимостями python3.11. Чтобы не мучиться, лучше воспользоваться скриптом octoprint_deploy, он по крайней мере правильно установит все зависимости. До конца он правда не сработал. А именно при команде Add Instance не определял подключенный принтер. Возможно, стоило его подключать после запуска команды, что было проблематично в моем случае, т.к. принтер стоит очень далеко от ПК. Однако после работы этого скрипта и скачивани всех записимостей установить OctoPrint стандартным способом не составило труда. Останется лишь добавить автозапуск одним из способов.

Klipper + SKR mini E3

Просто скачиваем с офф. станички файлик firmware-USB.bin, переименовываем в firmware.bin, закидываем на флешку fat32 до 32GB, вставляем в слот принтера и включаем его. После прошивки экран принтера станет пустым, не пугаемся.

Забегая вперед скажу, что в логах при подключении этой прошивки:

Loaded MCU 'mcu' 91 commands (v0.10.0-291-g4ce2d379 / gcc: (15:9-2019-q4-0ubuntu1) 9.2.1 20191025 (release) [ARM/arm-9-branch revision 277599] binutils: (2.34-4ubuntu1+13ubuntu1) 2.34)

Однако в последних версиях klipper доступно уже более 110 команд. Для их поддержки придется скомпилировать новую прошивку как указано для SKR по ссылке выше. Делается это не сложно и не долго. Итоговую прошивку из ~/klipper/out/klipper.bin копируем на флешку, переименовываем в firmware.bin, вставляем в SKR mini E3 и включаем плату. Теперь в логах:

Loaded MCU 'mcu' 112 commands (v0.11.0-304-gf7567a0d-dirty-20231105_183351-orangepizero...

Klipper + Orange Pi

Действуем по манулау, но запускать нужно install-ubuntu-22.04.sh несмотря на то что armbian — это debian и предварительно убедившись что у файла есть права на исполнение. Если нет, то chmod +x install-ubuntu-22.04.sh С другими версиями инсталятора возможно будут проблемы с python3.

После успешной установки рекомендую взять за основу файл SKR-mini-E3-V3.0-klipper.cfg как наиболее полный. Сохраняем его как printer.cfg в домашний каталог пользователя pi. Далее добавляем к нему секцию 128x64 Full Graphic Creality CR10 / ENDER 3 stockdisplay из sample-lcd.cfg

Соединяем апельсинку с SKR по USB кабелю и ищем имя ls /dev/serial/by-id/* Вписываем найденное имя в раздел [mcu] serial: /dev/serial/by-id/usb-Klipper...

Klipper + Octoprint

Действуем строго по мануалу. В конечном итоге должны получить доступ к терминалу. Дальнейшая настройка будет часто его использовать. Если подключиться не удается, в том числе после команд RESTART, то лезем в /tmp/klippy.log и ищем ошибку.

Бекап

После того как настроено подключение рекомендую выключить апельсинку halt и снять образ флешки при помощи usbimager. Лишь после этого выполнить apt upgrade и еще раз пепрезагрузить.

Настройка

Калибровка шагов экструдера

Добавил position_min: -2 в [stepper_z] чтобы в дальнейшем калибровать z_offset. У меня заменен подающий механизм боуден-экструдера, поэтому сразу пересчитал rotation_distance по инструкции из Marlin 200*16/139 = 23. В дальнейшем, под разные пластики вместо перекалибровки этого параметра лучше править Поток в слайсере. Так для PLA у меня отлично работает поток 100%, а для ABS поток 92%.

PID

Прямо из LCD меню принтера можно запустить калиброку PID для экструдера и кровати — будет чуть точнее. Можно командами PID_CALIBRATE HEATER=extruder TARGET=170 и PID_CALIBRATE HEATER=heater_bed TARGET=60 после чего SAVE_CONFIG. Вообще не лишним будет пройти весь чек лист.

Точность концевика Z

На Z оси использую концевик хоть и имею bltouch. Для повышения точности концевика очень рекомендую команду ENDSTOP_PHASE_CALIBRATE. Настройка по описанию не сложная. В конфиг добавил:

[endstop_phase]

[safe_z_home]
#home_xy_position: 153,113   	# Nozzle coordinates using BLtouch
home_xy_position: 0,0   	# using switch
speed: 200
z_hop: 10
z_hop_speed: 5

После калибровки в конце конфигурационного файла получаем что-то вроде:

#*# [endstop_phase stepper_z]
#*# trigger_phase = 63/64

Уровень кровати вручную

Дальше можно калибровать уровень кровати. Есть много способов. Самый доступный — добавить в конфиг секцию:

# https://www.klipper3d.org/Manual_Level.html#adjusting-bed-leveling-screws
# use BED_SCREWS_ADJUST + ACCEPT / ADJUSTED
[bed_screws]
screw1: 30.5, 37
screw2: 30.5, 207
screw3: 204.5, 207
screw4: 204.5, 37

Тут по команде BED_SCREWS_ADJUST голова поочередно позиционируется над винтами с высотой Z=0. Выполяем бумажный тест по кругу пока для каждой точки не скомандуем ACCEPT.

Уровень кровати BLtouch

Более сложный но точный способ требует настройки BLTouch. Подробнее о вариантах настройки подключения здесь, а моя настройка в конфиге такова:

[bltouch]
sensor_pin: PC14
control_pin: PA1
x_offset: -36
y_offset: -4
z_offset: 0.83
speed: 1.0
lift_speed: 5.0
samples: 3

Точность клонов не идеальна, а главное не стабильна, да и крепление к голове у меня не достаточно жесткое, поэтому занижена скорость опускания и увеличенно до 2 — 3 количество попыток для каждой точки. У меня не очень точный клон. Об этом я узнал выполнив тесты из этого раздела. Каждый раз меняя параметры датчика проверял точность пока не добился ниже 0,05 мм. Не советую калибровать зонд пока не откалибруете уровень стола по методу ниже.

Теперь мы готовы откалибровать стол с использованием bltouch. Добавим секцию:

# https://www.klipper3d.org/Manual_Level.html#adjusting-bed-leveling-screws-using-the-bed-probe
# use G28 + SCREWS_TILT_CALCULATE
# Это собъет калибровку Probe, поэтому после сделать PROBE_CALIBRATE
[screws_tilt_adjust]
screw1: 70,45
screw1_name: Front_Left
screw2: 70,215
screw2_name: Back_Left
screw3: 235,215
screw3_name: Back_Right
screw4: 235,45
screw4_name: Front_Right
speed: 90
horizontal_move_z: 3 # mm
screw_thread: CW-M4

Значения получаются путем прибавления x_offset, y_offset к значениям из секции [bed_screws]. Это важно, т.к. если щуп не попадет на стол, мотор Z не остановится. После запуска SCREWS_TILT_CALCULATE щуп пробежится по углам и вычислит для каждого направление вращения и величину в виде циферблата, например, CW 01:20 значит повернуть винт на 1 полный оборот и еще на 20 минут по часовой стрелке (вид сверху стола). Расчет довольно точный. Выводится в консоль. За три команды удается добиться точности в 1-2 минуты.

Теперь, когда стол параллелен кинематике можно вычислить расстояние между пробником bltouch и соплом командой PROBE_CALIBRATE . Следуем инструкции. После сохранения в конце конфига получим что-то похожее:

#*# [bltouch]
#*# z_offset = 0.542

И наконец, можно вычислить расстояние между срабатыванием концевика Z и уровнем сопла с использованием bltouch командой Z_ENDSTOP_CALIBRATE. Следуем инструкции. После сохранения в конце конфига получим что-то похожее:

#*# [stepper_z]
#*# position_endstop = 0.075

После всего этого бумажный тест будет проходить по углам стола при перемещении сопла в позицию Z=0, т.е. зазор будет примерно 100 микрон. При нагревании стола и экструдера этот зазор исчезнет.

BLTouch в качестве концевика Z

Если у вас как у меня точность концевика Z отстойная даже с использованием [endstop_phase], то можно попробовать заменить его на bltouch. Прелесть klipper тут в том, что не нужно отсоединять концевик и физически перетыкать в него черно-белый шлейф от bltouch. Klipper делает это виртуально. Вот необходимые изменения в конфигурации:

[stepper_z]
#endstop_pin: ^PC2
endstop_pin: probe:z_virtual_endstop
#position_endstop: 0.0
[safe_z_home]
home_xy_position: 70,45  	# Nozzle coordinates using BLtouch
#home_xy_position: 0,0   	# using switch

Не забудьте удалить #*# position_endstop = 0.075 в самом конце файла если использовали Z_ENDSTOP_CALIBRATE.

Обращаю внимание, что позиция Home соответствует левому переднему регулировочному винту кровати для удобства SCREWS_TILT_CALCULATE.

Кривизна кровати

Несмотря на то, что я использую стекло на кровати у меня всё же есть изгиб вдоль оси Х. Поэтому я добавил секцию:

# https://www.klipper3d.org/Bed_Mesh.html
# use BED_MESH_CALIBRATE
[bed_mesh]
speed: 90
horizontal_move_z: 2
mesh_min: 37, 15
mesh_max: 198, 220
probe_count: 4,3
zero_reference_position: 37, 36 # screw1 position

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

#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 	  0.062500, 0.065000, 0.062500, 0.026250
#*# 	  0.017500, -0.001250, 0.022500, 0.038750
#*# 	  -0.038750, -0.036250, -0.030000, 0.035000
#*# x_count = 4
#*# y_count = 3
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 37.0
#*# max_x = 197.97
#*# min_y = 15.0
#*# max_y = 220.0

Обычно не использую калибровку перед каждой печатью из-за низкой точности и вероятности попадания пыли/остатков пластика под щуп. Вместо этого делаю BED_MESH_CALIBRATE срузу после выравнивания кровати и вызываю BED_MESH_PROFILE LOAD=default в стартовом скрипте, что кстати теперь обязательно для использования сохраненной карты.

Периодическая перекалибровка и выравнивание стола

В дальнейшем, при необходимости выранивания, например, при съеме стекла, выполняем:

  1. SCREWS_TILT_CALCULATE предварительно G28
  2. Z_ENDSTOP_CALIBRATE (только для концевика Z) предварительно G28 X Y + G1 X72 Y46 Z5
  3. BED_MESH_CALIBRATE

Если используется BLTouch вместо концевика Z, то второй пункт пропускаем. Эти команды я вывел в экранное меню и написал макросы, подключил к основному файлу конфигурации через include.

Исправление углов

Теперь мы готовы что-нибудь напечать. Предлагаю тестовый кубик для настройки pressure advance. Используем инструкцию. Т.к. у нас боуден, то значения гарантированно будут близки к 1, поэтому рекомендую перед печатью следующую команду:

TUNING_TOWER COMMAND=SET_PRESSURE_ADVANCE PARAMETER=ADVANCE START=0.5 FACTOR=.010

У меня получилось вставить pressure_advance: 0.96 в секцию [extruder].

Испраление звона

Следом можно заняться резонансами. Нужно распечатать модельку с модификатором по высоте и измерить резонансную частоту. Интересно, кинематика старичка Ender3 выдержала ускорение до 7000. Ожидаемо ось Y гораздо массивнее — звон меньше.

Частота звона по оси Х = 100 * 6 / 10 = 60 Гц, по Y = 100 * 4 / 3.92 = 102 Гц. В конец конфига дописал:

[input_shaper]
shaper_freq_x: 60.6  # frequency for the X mark of the test model
shaper_freq_y: 102  # frequency for the Y mark of the test model
shaper_type: mzv

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

Проблемы и решения

Зависание в процессе печати

На стоковой прошивке при печати модели на 5 часов на середине второго слоя поймал ошибку — печать встала. Из лога /tmp/klippy.log вырезал дамп, который любезно записала апельсинка. Вот самое важное:

Dumping receive queue 100 messages
Receive: 0 16584.420507 16584.419921 11: seq: 16, clock clock=477805164
...
Receive: 99 16590.859432 16590.751581 12: seq: 1e, shutdown clock=889831859 static_string_id=Rescheduled timer in the past
Transition to shutdown state: MCU 'mcu' shutdown: Rescheduled timer in the past
This generally occurs when the micro-controller has been
requested to step at a rate higher than it is capable of
obtaining.
Dumping gcode input 50 blocks
Read 16573.581163: 'N15184 G1 F1500 X117.815 Y102.802 E0.69349*10\n'
...
Read 16590.579130: 'N15232 G0 F8400 X107.966 Y99.639*118\n'
Read 16590.595921: 'N15233 G1 F1500 X96.417 Y111.189 E0.49979*48\n'
gcode state: absolute_coord=True absolute_extrude=False base_position=[0.0, 0.0, -0.03, 45.70455179999988] last_position=[96.417, 111.189, 0.29000000000000004, 779.3908517999985] homing_position=[0.0, 0.0, -0.03, 0.0] speed_factor=0.016666666666666666 extrude_factor=1.0 speed=25.0
Reactor garbage collection: (16583.059051032, 16103.854178761, 16492.051460405)
Dumping stepper 'stepper_x' (mcu) 1 queue_step:
queue_step 0: t=207034237108 p=-7600 i=45253 c=-630 a=0
Dumping stepper 'stepper_y' (mcu) 1 queue_step:
queue_step 0: t=207034393707 p=693 i=45259 c=626 a=0
Dumping stepper 'stepper_z' (mcu) 1 queue_step:
queue_step 0: t=207044884413 p=50 i=5633926 c=-3 a=0
Dumping stepper 'extruder' (mcu) 1 queue_step:
queue_step 0: t=207036042242 p=108108 i=601875 c=44 a=0
Dumping trapq 'toolhead' 1 moves:
move 0: pt=3234.903129 mt=0.605905 sv=25.000000 a=0.000000 sp=(108.802057,101.066937,0.141668) ar=(-0.707139,0.707074,-0.001136)
Dumping trapq 'extruder' 1 moves:
move 0: pt=3234.903129 mt=0.605905 sv=0.764976 a=0.000000 sp=(776.978132,0.003070,0.000000) ar=(1.000000,1.000000,0.000000)
Requested toolhead position at shutdown time 3235.129095: (104.80733335239933, 105.06129196631346, 0.1352511988213789)
MCU 'mcu' shutdown: Rescheduled timer in the past
This generally occurs when the micro-controller has been
requested to step at a rate higher than it is capable of
obtaining.
Once the underlying issue is corrected, use the
"FIRMWARE_RESTART" command to reset the firmware, reload the
config, and restart the host software.
Printer is shutdown
...

Оставлю здесь для последующего изучения ибо сейчас мало чего тут понимаю. Но что было сделано. 1. Стоковая прошивка с сайта заменена на актуальную версию. 2. Для двигателей X,Y,Z прописал run_current: 0.630, для экструдера run_current: 0.750 как 75% от номинального тока. До этого стояли 0.58 и 0.65 соответственно. На ощупь двигатели после этого лишь немного теплые, а печать стала чуть шумнее. Пятичасовая печать той же модели прошла успешно.

Рекомендации

  1. В слайсере в настройках принтера использовать тип генерируемого кода Marlin и абсолютные координаты.
  2. В стартовом коде не использовать команды с экструзией и изменением координат таких как G91, M82, M83, G1. Достаточно G90, G0.
  3. Чтобы пластик не вытекал при нагреве, в стартовом коде добавить обдув модели и использовать температуру ожидания пока греется стол. Я запускаю нагрев экструдера до рабочей температуры за 2 градуса до рабочей температуры стола. Вытекший пластик вытираю об край стола перед началом печати. Пример в макросах.
  4. Если как указано выше в стартовом коде нет экструзии, то в слайсере обязательно добавляем юбку либо кайму если площадь прилипания небольшая. Ограничить минимальную длину 10 см если не даете пластику вытекать. Ширину по необходимой адгезии для каймы или по минимуму для юбки (1 линия).
  5. Бывает что при нагреве стола и экструдера высота зазора не уменьшается на высоту бумажного теста и печать начинается выше. В этом случае бумажный тест нужно повторить так чтобы лист бумаги имел более сильное сопротивление, чем то что вы допускали ранее.
  6. Желательно избегать сочетания низкого потока (90%) и низкой скорости (20мм) характерной для первого слоя. Это может привести к очень маленьким значениям экструдера (E0.005). В итоге пластик почти не выдаливается на боудене.
  7. На стандартной кинематике Ender3 при печати ABS минимальные настройки скорости:

Последнее обновление 06.11.2023 в 19:58