いんくらyochさんの日記

興味あることの忘備録

Klipperを試す

Teaching Techのプリンタ動画をみていたらKlipperと呼ぶファームウェアの紹介をしていたので、興味が湧き試してみた。
www.klipper3d.org
このファームウェアはOctoprintと連携して動き、従来のMarlinなどはコントローラ側でGコードの解釈をして印刷実行していたが、KlipperはコントローラのホストとなるラズパイやLinuxマシンでGコードを解釈し、シリアルポート経由でコントローラに指示を行うのでパフォーマンスが良いと説明されている。
これにより8bitボードのデルタ型やcoreXY型を32bitボードに入れ替えることなく、パフォーマンスを向上させることができる。
今回は3号機と置き換える予定の2号機を使い、コントローラのホストはUbuntuを入れたMacBookAirと組み合わせて試験した。
Klipperを入れる前に2号機のコントローラであるMKS Gen-Lに乗っているTMC2208をスタンドアロンからUARTにするべく配線を替えた。

Klipperの導入そのものはドキュメント通り行うことで簡単にできた。
printer.cfgの設定は以下の通りである。

# This file is an example config file for linear delta style printers.
# One may copy and edit this file to configure a new delta printer.

# DO NOT COPY THIS FILE WITHOUT CAREFULLY READING AND UPDATING IT
# FIRST. Incorrectly configured parameters may cause damage.

# See docs/Config_Reference.md for a description of parameters.

# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
    # Common EXP1 header found on many "all-in-one" ramps clones
    EXP1_1=ar37, EXP1_3=ar17, EXP1_5=ar23, EXP1_7=ar27, EXP1_9=<GND>,
    EXP1_2=ar35, EXP1_4=ar16, EXP1_6=ar25, EXP1_8=ar29, EXP1_10=<5V>,
    # EXP2 header
    EXP2_1=ar50, EXP2_3=ar31, EXP2_5=ar33, EXP2_7=ar49, EXP2_9=<GND>,
    EXP2_2=ar52, EXP2_4=ar53, EXP2_6=ar51, EXP2_8=ar41, EXP2_10=<RST>
    # Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
    # Note, some boards wire: EXP2_8=<RST>, EXP2_10=ar41

[stepper_a]
step_pin: ar54
dir_pin: ar55
enable_pin: !ar38
microsteps: 16
rotation_distance: 32
endstop_pin: ^ar2

homing_speed: 60
homing_retract_dist: 8.0
position_endstop: 245.74
arm_length: 210.0

[tmc2208 stepper_a]
uart_pin: ar63
tx_pin: ar40
interpolate: True
run_current:0.760
sense_resistor: 0.110
stealthchop_threshold: 0

[stepper_b]
step_pin: ar60
dir_pin: ar61
enable_pin: !ar56
microsteps: 16
rotation_distance: 32
endstop_pin: ^ar15

[tmc2208 stepper_b]
uart_pin: ar64
tx_pin: ar59
interpolate: True
run_current: 0.760
sense_resistor: 0.110
stealthchop_threshold: 0

[stepper_c]
step_pin: ar46
dir_pin: ar48
enable_pin: !ar62
microsteps: 16
rotation_distance: 32
endstop_pin: ^ar19

[tmc2208 stepper_c]
uart_pin: ar65
tx_pin: ar42
interpolate: True
run_current: 0.760
sense_resistor: 0.110
stealthchop_threshold: 0

[extruder]
step_pin: ar26
dir_pin: !ar28
enable_pin: !ar24
microsteps: 16
rotation_distance: 20.64
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: ar10
sensor_type: EPCOS 100K B57560G104F
sensor_pin: analog13
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 250

[heater_bed]
heater_pin: ar8
sensor_type: EPCOS 100K B57560G104F
sensor_pin: analog14
control: watermark
min_temp: 0
max_temp: 130

[mcu]
serial: /dev/serial/by-id/usb-1a86_USB2.0-Serial-if00-port0
pin_map: arduino

[printer]
kinematics: delta
max_velocity: 300
max_accel: 3000
max_z_velocity: 300
delta_radius: 103.98
print_radius: 160.0

[delta_calibrate]
radius: 80

[display]
lcd_type: hd44780
hd44780_protocol_init: True
rs_pin: EXP1_4
e_pin: EXP1_3
d4_pin: EXP1_5
d5_pin: EXP1_6
d6_pin: EXP1_7
d7_pin: EXP1_8
line_length: 20
encoder_pins: ^EXP2_3, ^EXP2_5
click_pin: ^!EXP1_2
menu_root: __main

[output_pin beeper]
pin: EXP1_1

[probe]
pin: ^!ar18
x_offset: -15.0
y_offset: -5.0
#z_offset: -3.3
samples_result: average

[bed_mesh]
speed: 120
horizontal_move_z: 5
mesh_radius: 70
mesh_origin: 0,0
round_probe_count: 5

[fan]
pin: ar9
max_power: 1.0
shutdown_speed: 0
cycle_time: 0.010
hardware_pwm: False
kick_start_time: 0.100
off_below: 0.0

[heater_fan my_nozzle_fan]
pin: ar7
max_power: 1.0
shutdown_speed: 0
heater: extruder
heater_temp: 50.0
fan_speed: 1.0

[endstop_phase]

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [probe]
#*# z_offset = 3.400
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 	0.200160, 0.200160, 0.200160, 0.200160, 0.200160
#*# 	0.231761, 0.231761, 0.086932, -0.009307, -0.009307
#*# 	0.220453, 0.159828, 0.038766, -0.031987, 0.934881
#*# 	0.056839, 0.056839, 0.008054, 0.025855, 0.025855
#*# 	0.201225, 0.201225, 0.201225, 0.201225, 0.201225
#*# tension = 0.2
#*# min_x = -70.0
#*# algo = lagrange
#*# y_count = 5
#*# mesh_y_pps = 2
#*# min_y = -70.0
#*# x_count = 5
#*# max_y = 70.0
#*# mesh_x_pps = 2
#*# max_x = 70.0
#*#
#*# [endstop_phase stepper_a]
#*# trigger_phase = 44/64
#*#
#*# [endstop_phase stepper_b]
#*# trigger_phase = 62/64
#*#
#*# [endstop_phase stepper_c]
#*# trigger_phase = 3/64

一通り設定を終えてフィラメント無しで動作試験したが、問題無く3D Bencyを印刷した。
設定で分かりにくいのが、probeなどの設定を行うとendstop_phaseなど先に保存していた設定が消えてしまうことである。
どうも実行する順番があるようで以下の順までは確認済みである。

  1. probe_calibrate
  2. bed_mesh_calibrate
  3. endstop_phase

probe_calibrateの手順は以下の通りである。

  1. probe_calibrate実行
  2. probeが接地するとノズルがプローブオフセット位置まで移動して止まる
  3. testz z=-<ノズルの相対位置>でノズルを下げる
  4. ベッドとノズルが0.1mm程度のスキマになったらaccept実行
  5. printer.cfg内のz_offset =が再定義される