いんくら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にするべく配線を替えた。
f:id:yoch:20210210164310j:plain
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 =が再定義される

BTT SKR1.3 のサーミスタをPT100にする

特に意味は無いのだが、興味があってプリンタ1号機のサーミスタを熱電対に替えてみた。
f:id:yoch:20210206122736j:plain
アンプはE3D互換のTriangleLab製の基板を使用しており、配線は図の通りである。

最近のサーミスタなどのセンサーは金属チューブで覆われているので、ホットエンドへ熱電対を取り付ける際も3.3mmのドリルで穴を拡大して取り付けた。
BTT SKR1.3でPT100を利用する場合、Marlinで下記を変更する。
■Configuration.h

//#define TEMP_SENSOR_0 1
#define TEMP_SENSOR_0 20

[注記]20は5v供給時に設定し、3.3vは21となっているが、21に設定すると温度は1度となり正常に動作しない。
ファームを焼き直して確認したところ、これまでホットエンドとベッドは同じ温度を表示していたが、PT100ではホットエンドが45度、ベッドが19度と表示され、ホットエンドが高めに表示される状態となった。
BTTGitHubでThermal Runawayエラー問題の中にPT100でのサーミスタテーブルが上がっていたので書き直してみたが、こちらも28度と高めに表示される状態だった。
これはセンサーやアンプの特性による差と考え、別の熱電対温度計をホットエンドに付けて設定との温度差を測り、テーミスタテーブルを書き直すことにした。
f:id:yoch:20210206122805j:plain:w1024

測った結果から、テーブルの設定と3〜4度の差があるためエクセルを使ってテーブル文字列を作成し、src¥module¥thermistor¥thermistor_20.hを書き直したところ、温度差は解消した。

RAMPS-FD再び

プリンタ3号機の製作を進めているが、コントローラは2号機のMKS GEN-Lを転用しようとしていた。
しかし、お蔵入りしていたRAMPS-FDがあったのでまともに使えるようにしてみた。
f:id:yoch:20210202194635j:plain
RAMPS-FDはGeeetechのv1基板となるが、v1基板はベースになっているDUEが故障するとホットエンドやベッドが勝手にオンになる致命的な欠陥を持っている。これを改善するMODがあるので適用するとよい。
当方はDUEからの5vが来ないとFETがオンにならないよう改造してみた。
f:id:yoch:20210202223858p:plain
また、起動時はホットエンドとベッドのピンが反転論理なため、Marlinのソースに手を加えた。
■pins_RAMPS_FD_V1.h

//#define INVERTED_HEATER_PINS
#define HEATER_0_INVERTING                     1

//#define INVERTED_BED_PINS
#define HEATER_BED_INVERTING                   1

INVERTED_xxx_PINSは、このヘッダファイル以外で使われていないので、Conditionals_post.hの定義を上書きしている。