Ender-3 改造遍歴 (ダイレクトエクストルーダー、カスタムファンダクト、Klipper…)

改造遍歴のメモ。

完成形はこんな感じ

工具類

圧着工具、コネクタ JST XH(4ピン; マザボ側)、JST PH(6ピン; モーター側)

定番のPEIビルドプレート

元々ガラスプレートが付属していたが、定着が悪い。今のデファクトスタンダードはこれらしい。よく張り付きます。

バイメタルヒートブレイク

既存のヒートブレイクはPTFEチューブが先端部分までガイドしていて高温になる。
PTFEは210度程度から有害物質が放出され始めて地味に有害らしい。

バイメタルヒートブレイクは、PTFEチューブが先端まで入らず、上部の銅の部分の途中までしか入らないようになっている。
そのためPTFEチューブが高温にさらされない。

一方、リトラクションは2mm以内ぐらいまでに抑える必要がある。(熱せられたフィラメントが上まで引き戻され中でぐにゃってしまうため)

取り付けは、ノズルをヒートブロックに完全にねじ込んだあと”半回転ぐらい逆に回して緩めてから”、ヒートブレイクをねじ込む。
その後ノズル温度を240度ぐらいに設定した状態でノズルを本締めする。これやらないとフィラメントが漏れ出して大変なことになります(なりました)

249円(本当にチタンか?)

Klipper + SKR v1.4 (TMC2209)

余っていたノートPCに Ubuntu Server をインストール。KIAUHでKlipperを入れた。

第2世代PentiumノートPCみたいな産廃でも全然余裕で動く。Pressure Advance有効にしても大丈夫。

マザボは、モータードライバ交換可能かつ5ドライバ駆動で一番安いSKR v1.4 (TMC2209) に交換。
センサーレスホーミングが使えるので、エンドストップの配線が不要になる。(スイッチ自体は付けたままにした)

古いマザボはヤフオクで3000円で売れた。

SKR v1.4 のケースはこれにした。LCDとセットで置ける。
SKR v1.3とv1.4の物理的サイズは同じなようで、ケースは互換性あるみたい。

https://www.thingiverse.com/thing:4287422/files

組み立てる途中でぶっ壊したので側面と上部パネルは使わなかった。
本来は接着して組み立てるのかな?後からいじるときに面倒なのでこれで良い。LCD部分は刺さってるだけなのですぐ外せる。

冬場は本体を簡易エンクロージャー(ただの袋)で覆うので、電源とマザボは外に出したほうが良いだろう。

3D touch (互換BLtouch)

BLtouch互換の中ではTrianglelabの3Dtouchが一番まともそう。

PROBE_ACCURACY コマンドで精度はチェックできる。

https://www.klipper3d.org/Probe_Calibrate.html

また、 SCREWS_TILT_CALCULATE コマンドでベッドのネジを何回転すれば物理的に水平になるか教えてくれる。
ベッドの傾きをソフト側で補正するのが気持ち悪くてBLtouch使わない人もたまに見かけるが、マニュアル調整にも便利なので導入して損はない。

デュアルZ軸

ダイレクトエクストルーダー化の布石。

Z軸モーターの分岐ケーブルが付いてくるが、SKR v1.4は5ドライバあるので直接刺す。

元々のZ軸モーターにクリアランス調整用のスペーサーを噛ませていたので、追加した側のZ軸モーターにも入れた。

https://www.thingiverse.com/thing:2752080

スムーズに動かない

組み上げても全然スムーズに動かないので以下を試した

  • 偏心ナット調整
  • 追加した側のZ軸のプレート部分の位置を微妙にずらす
  • リードスクリューにグリスを塗る(カプラー固定部以外)、
  • 真鍮ナットを緩める

マシにはなったけど、プレートの車輪が途中から片方回らなくなる。
パーツが悪いか、何か間違えてるか、フレームの組み立て精度が悪いか…

左右Z軸の同期

電源を切ったら左右フリーで動くので、左右Z軸の同期がとれない。
ベルト駆動で左右を強制的に同期させて動かしたりする方法もあるらしいけど面倒。

BLtouchでベッド左右でプローブ落としてソフト的に補正するコマンドもあるけど、ベッド自体の傾きで狂うだろう。

面白い解決法があった。
Z軸の車輪を上のスペーサーに当てて脱調させることで左右をピッタリ上に合わせる。

デュアルZ軸キットに付属してきたリードスクリュー上部のガイドを本来の場所には付けずに、このスペーサーの代わりに使用してみた。

このリードスクリューにつけるガイドは付けてもあんまり意味ないどころか逆効果らしいので再利用です。

逆効果になる理由はこの動画の8:00~から。諸説あるみたいですけど。

ダイレクトエクストルーダー & カスタムファンダクト

既存のエクストルーダーモーターとギア(金属ギアには変えてるけど)が使えて、かつ印刷可能スペースが減らないモデルはこれしかなかった。

https://www.thingiverse.com/thing:3589452

ついでに、同じ作者が作ったファンダクトも導入してみた。ブロワーファンの代わりに2つの40mmファン使う面白い構造。

https://www.thingiverse.com/thing:3594440

https://www.thingiverse.com/thing:5425973 (こっちのBLtouchマウントを追加したリミックスを使用した)

こういう複雑な形はツリーサポートが良い

これも同じ作者のモデルだが、ダクトの中に吹き込むファンにスクリューみたいなやつ付けると顕著に流量が増える。

https://thingiverse.com/thing:3624012

(中央のホットエンド冷却ファンは開口部が広いからスクリューは多分不要)

ファンはヤフオクで1個500円で買った Sun Ace 40

40mm角、厚み15mm
DC24V/0.08A 駆動
回転速度 7700min
最大風量 6.4cfm

X軸につけるケーブルホルダー

https://www.thingiverse.com/thing:4800822

上部にフィラメントホルダーを付けるためのアダプター

https://www.thingiverse.com/thing:4023383

上部に取り付けるのは重心的に微妙かも…

ダンパー

底に取りつけるダンパー。床に振動が一切伝わらなくなって本当に静かになるが、本体の共振は酷いことになるので Input Shaperの設定が必須。

https://www.thingiverse.com/thing:2913473

Input Shaper

共振を打ち消すような制御をしてくれる。

設定するとリンギングが減る。(若干残ってますが…)

<– 設定前 設定後 –>

Input Shaper は RP2040 + 加速度センサADXL345 で共振周波数を測ることで設定できる。

RP2040にKlipperのファームウェアを焼いて、サブMCUとして登録して接続する。

X軸とY軸に加速度センサを置いて測定する。

X軸はBLtouchマウントの片側の穴に固定した。

Y軸はこんなのがあった。剥がさずにそのまま装着できる。頭いいな…
https://www.thingiverse.com/thing:4977191
(ベッドの中央部分で印刷すると測定時前後に動くとき干渉するので、ベッド後方に印刷した)

結果はこんな感じ

tatuiyo@tatuiyo3dprint:~/klipper$ scripts/calibrate_shaper.py /tmp/resonances_x_20250813_022434.csv -o /tmp/shaper_calibrate_x.png
Fitted shaper 'zv' frequency = 50.8 Hz (vibrations = 17.8%, smoothing ~= 0.066)
To avoid too much smoothing with 'zv', suggested max_accel <= 10100 mm/sec^2
Fitted shaper 'mzv' frequency = 47.8 Hz (vibrations = 4.7%, smoothing ~= 0.089)
To avoid too much smoothing with 'mzv', suggested max_accel <= 6700 mm/sec^2
Fitted shaper 'ei' frequency = 54.8 Hz (vibrations = 3.6%, smoothing ~= 0.107)
To avoid too much smoothing with 'ei', suggested max_accel <= 5600 mm/sec^2
Fitted shaper '2hump_ei' frequency = 53.6 Hz (vibrations = 0.6%, smoothing ~= 0.188)
To avoid too much smoothing with '2hump_ei', suggested max_accel <= 3200 mm/sec^2
Fitted shaper '3hump_ei' frequency = 80.4 Hz (vibrations = 0.0%, smoothing ~= 0.127)
To avoid too much smoothing with '3hump_ei', suggested max_accel <= 4700 mm/sec^2
Recommended shaper is 3hump_ei @ 80.4 Hz

tatuiyo@tatuiyo3dprint:~/klipper$ scripts/calibrate_shaper.py /tmp/resonances_y_20250813_033901.csv -o /tmp/shaper_calibrate_y.png
Fitted shaper 'zv' frequency = 54.8 Hz (vibrations = 10.5%, smoothing ~= 0.058)
To avoid too much smoothing with 'zv', suggested max_accel <= 11700 mm/sec^2
Fitted shaper 'mzv' frequency = 36.2 Hz (vibrations = 2.4%, smoothing ~= 0.155)
To avoid too much smoothing with 'mzv', suggested max_accel <= 3900 mm/sec^2
Fitted shaper 'ei' frequency = 50.4 Hz (vibrations = 0.2%, smoothing ~= 0.127)
To avoid too much smoothing with 'ei', suggested max_accel <= 4700 mm/sec^2
Fitted shaper '2hump_ei' frequency = 61.2 Hz (vibrations = 0.0%, smoothing ~= 0.144)
To avoid too much smoothing with '2hump_ei', suggested max_accel <= 4200 mm/sec^2
Fitted shaper '3hump_ei' frequency = 74.6 Hz (vibrations = 0.0%, smoothing ~= 0.147)
To avoid too much smoothing with '3hump_ei', suggested max_accel <= 4100 mm/sec^2
Recommended shaper is ei @ 50.4 Hz

補足

Pressure Advance

PTFEチューブ内を通るフィラメントの圧力を自動で補正していい感じにしてくれる。

ボーデン時に設定したらかなり綺麗になったが、ダイレクト化後は大差はなかった。

ボーデン時にPressure Advance = 1.0 設定で印刷した結果がこれ。(Klipper化以外まったく無改造)

あれ…?色々改造したけど結局ボーデン+Pressure Advance設定が一番綺麗じゃないですか…?

純正マザーボード(A4988) + ダイレクトドライブ化で押し出しが一定間隔で不安定になる現象

完全な一定間隔で押し出しムラが出てる。このせいで変な模様が…

これはVFAの一種で、サーモンスキンと呼ばれるらしい。オレンジフィラメントだと本当にサーモンみたい。

詳しい人に教えてもらったところ、A4988が悪いらしい。

この抵抗を短絡させてモード変更すれば直るらしい(未検証)

代わりにTL-Smootherで平滑化しても改善することが確認できた

当然、SKR v1.4に換装後にはこの症状は消えた

総括

改造費用は計1万円ぐらい。元々17250円で買ったものなので、これぐらいで抑えたほうがいいだろう。

余ってるPC使ってKlipper化 + Pressure Advance + input shaper までやるのが一番費用対効果高い。(ほぼタダ)

printer.cfg

以下、以上の改造を経て現在運用中のconfigを貼って記事の締めとします。

[include fluidd.cfg]
[mcu]
serial: /dev/serial/by-id/usb-Klipper_lpc1768_1040FF0CA70825AE43B92C52811E00F5-if00

[stepper_x]
step_pin: P2.2
dir_pin: !P2.6
enable_pin: !P2.1
microsteps: 16
rotation_distance: 40
endstop_pin: tmc2209_stepper_x:virtual_endstop
position_endstop: -6.5
homing_retract_dist: 0
position_min: -6.5
position_max: 235
homing_speed: 50

[stepper_y]
step_pin: P0.19
dir_pin: !P0.20
enable_pin: !P2.8
microsteps: 16
rotation_distance: 40
endstop_pin: tmc2209_stepper_y:virtual_endstop
position_endstop: -12.5
homing_retract_dist: 0
position_min: -12.5
position_max: 235
homing_speed: 50

[stepper_z]
step_pin: P0.22
dir_pin: P2.11
enable_pin: !P0.21
microsteps: 16
rotation_distance: 8
## disable BLTouch
#endstop_pin: !P1.27
#position_endstop: 0.0
## enable BLTouch
endstop_pin: probe:z_virtual_endstop
position_max: 250
position_min: 0

[stepper_z1]
# E1Mのコネクタ
step_pin: P1.15
dir_pin: P1.14
enable_pin: !P1.16
microsteps: 16
rotation_distance: 8

[extruder]
max_extrude_only_distance: 100.0
step_pin: P2.13
dir_pin: !P0.11
enable_pin: !P2.12
microsteps: 16
rotation_distance: 28.195 #That is 100 steps per mm = full_rotation_steps * microsteps / steps_per_mm
nozzle_diameter: 0.400
filament_diameter: 1.750
heater_pin: P2.7
sensor_type: EPCOS 100K B57560G104F
sensor_pin: P0.24
#control: pid
# tuned for stock hardware with 200 degree Celsius target
#pid_Kp: 21.527
#pid_Ki: 1.063
#pid_Kd: 108.982
min_temp: -30
max_temp: 255

[heater_fan extruder_fan]
pin: P2.3
heater: extruder
heater_temp: 50.0
fan_speed: 1.0

[heater_bed]
heater_pin: P2.5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: P0.25
#control: pid
# tuned for stock hardware with 50 degree Celsius target
#pid_Kp: 54.027
#pid_Ki: 0.770
#pid_Kd: 948.182
min_temp: 0
max_temp: 130

[fan]
pin: P2.4

[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 4700
max_z_velocity: 5
max_z_accel: 100

########################################
# TMC2209 configuration
########################################

[tmc2209 stepper_x]
uart_pin: P1.10
run_current: 0.725
stealthchop_threshold: 999999
diag_pin: P1.29
driver_SGTHRS: 100 # 255 is most sensitive value, 0 is least sensitive


[tmc2209 stepper_y]
uart_pin: P1.9
run_current: 0.725
stealthchop_threshold: 999999
diag_pin: P1.28
driver_SGTHRS: 100

[tmc2209 stepper_z]
uart_pin: P1.8
run_current: 0.4
stealthchop_threshold: 999999

[tmc2209 stepper_z1]
uart_pin: P1.1
run_current: 0.4
stealthchop_threshold: 999999

[tmc2209 extruder]
uart_pin: P1.4
run_current: 0.5
hold_current: 0.001
stealthchop_threshold: 999999

# Pin mappings for BL_T port
[bltouch]
sensor_pin: ^P0.10
control_pin: P2.0
x_offset: 30
y_offset: 7
z_offset = 2.68
speed: 10
samples: 3
samples_result: median
samples_tolerance: 0.025
samples_tolerance_retries: 5
sample_retract_dist: 2.5              # Can be set lower, example 2.5 depending on height of bltouch from bed

[safe_z_home]
home_xy_position: 87.5, 110.5 # Change coordinates to the center of your print bed
speed: 80.0
z_hop: 10.0
z_hop_speed: 10.0

[bed_mesh]
speed: 150
horizontal_move_z: 7
mesh_min: 30, 30
mesh_max: 190, 210
probe_count: 5, 5

[screws_tilt_adjust]
screw1: 2, 30
screw1_name: left_front
screw2: 172, 30
screw2_name: right_front
screw3: 172, 200
screw3_name: right_rear
screw4: 2, 200
screw4_name: left_rear
horizontal_move_z: 10.
speed: 50.
screw_thread: CW-M4

########################################
# Optional LCD configuration
########################################

[board_pins]
aliases:
    # EXP1 header
    EXP1_1=P1.30, EXP1_3=P1.18, EXP1_5=P1.20, EXP1_7=P1.22, EXP1_9=<GND>,
    EXP1_2=P0.28, EXP1_4=P1.19, EXP1_6=P1.21, EXP1_8=P1.23, EXP1_10=<5V>,
    # EXP2 header
    EXP2_1=P0.17, EXP2_3=P3.26, EXP2_5=P3.25, EXP2_7=P1.31, EXP2_9=<GND>,
    EXP2_2=P0.15, EXP2_4=P0.16, EXP2_6=P0.18, EXP2_8=<RST>, EXP2_10=<NC>
    # Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "ssp0"

# Ender 3 stock display plugs in to the EXP1 port
[display]
lcd_type: st7920
encoder_pins: ^P1.20, ^P1.18
click_pin: ^!P0.28
cs_pin: P1.22
sid_pin: P1.23
sclk_pin: P1.21

[gcode_arcs]
resolution = 1.0

[idle_timeout]
gcode:
    DISABLE_STEPPER
    TURN_OFF_HEATERS
timeout: 600

#[mcu RP2040]
#baud: 115200
#restart_method: command
#serial: /dev/serial/by-id/usb-Klipper_rp2040_E6641CB2CF5AB42C-if00

#[adxl345]
#cs_pin: RP2040:gpio1
#spi_bus: spi0a
#axes_map: x,y,z

#[resonance_tester]
#accel_chip: adxl345
#probe_points:
#    100,100,20 # an example

[input_shaper]
shaper_type_x: 3hump_ei
shaper_freq_x: 80.4
shaper_type_y: ei
shaper_freq_y: 50.4

[gcode_macro DISABLE_STEPPER]
gcode:
    M84

[gcode_macro G29]
gcode:
 G28
 #BED_MESH_CALIBRATE
 G1 X2 Y2 Z5 F4000

[gcode_macro START_PRINT]
gcode:
    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}
    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}
    # Start bed heating
    M140 S{BED_TEMP}
    # Start nozzle heating (160 celsius)
    M104 S160
    # Wait for bed to reach temperature    
    M190 S{BED_TEMP}

    G92 E0 ; Reset Extruder
    G28 ; Home all axes

    # set nozzle temp
    M104 S{EXTRUDER_TEMP}
    # wait for nozzle to reach temperature
    M109 S{EXTRUDER_TEMP}

    BED_MESH_PROFILE LOAD=default

    G1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
    G1 X0.1 Y20 Z0.3 F5000.0 ; Move to start position
    G1 X0.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line
    G1 X0.4 Y200.0 Z0.3 F5000.0 ; Move to side a little
    G1 X0.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line
    G92 E0 ; Reset Extruder
    G1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
    G1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish
 
[gcode_macro END_PRINT]
gcode:
    G91 ; Relative positioning
    G1 E-2 F2700 ; Short retract
    G1 E-2 Z0.2 F2400 ; Retract and lift Z slightly
    G1 X5 Y5 F3000 ; Wipe movement
    G1 Z10 ; Raise Z further
    G90 ; Absolute positioning

    G1 X0 Y220 ; Move bed forward to present the print
    M106 S0 ; Turn off fan

    ; --- Filament unload ---
    ; Unload filament while hotend is still hot
    ; G91
    ; G1 E-80 F2000 ; Retract filament ~80mm (adjust as needed)
    ; G90

    M104 S0 ; Turn off hotend
    M140 S0 ; Turn off heated bed

    M84 X Y E ; Disable all steppers except Z

[gcode_macro ALIGN_DUAL_Z]
description: "Align dual Z stepper using mechanical stops"
gcode:
    G28                              ; Home all axes
    G90                              ; Absolute positioning
    G1 X120 F3000                    ; Center the head for safety
    G1 Z235 F2000                    ; Quickly approach near Z max
    G1 Z240 F50                      ; Carefully go to Z max
    G91                              ; Relative positioning
    G1 Z3 F50                        ; Gently crash into mechanical stop
    G4 S1                            ; Wait a second
    G1 Z3 F50                        ; Push slightly more to ensure skip
    G1 Z-100 F2000                   ; Come back down toward bed
    G90                              ; Absolute positioning
    G28                              ; Home again

[gcode_macro SCREWS]
gcode:
    G28;
    SCREWS_TILT_CALCULATE;

[gcode_macro UNLOAD_FILAMENT]
description: "Unload filament: heat up, retract, then cool down"
gcode:
    {% set unload_temp = params.UNLOAD_TEMP|default(200)|int %}
    {% set cooldown_temp = params.COOLDOWN_TEMP|default(0)|int %}
    {% set retract_length = params.RETRACT_LENGTH|default(100)|float %}
    {% set retract_speed = params.RETRACT_SPEED|default(5)|float %}

    M117 Heating up to {unload_temp}C...
    M104 S{unload_temp}
    M109 S{unload_temp} ; Wait until nozzle reaches unload temp

    M117 Unloading filament...
    G91                     ; Set relative positioning
    G1 E-{retract_length} F{retract_speed * 60} ; Retract to unload
    G90                     ; Return to absolute positioning

    M117 Cooling down...
    M104 S{cooldown_temp}  ; Set nozzle to cool down

[menu __main  __octoprint __poweroff]
type: command
#enable: !toolhead.is_printing
name: Turn off Octopi
gcode:
    {action_respond_info('action:poweroff')}

#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bltouch]
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# 	  0.087500, 0.072500, 0.067500, 0.067500, -0.030000
#*# 	  0.060000, 0.050000, 0.060000, 0.082500, 0.130000
#*# 	  0.052500, 0.050000, 0.050000, -0.002500, 0.120000
#*# 	  0.077500, 0.042500, -0.060000, 0.010000, 0.032500
#*# 	  0.057500, 0.015000, -0.030000, -0.030000, -0.080000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 2
#*# mesh_y_pps = 2
#*# algo = lagrange
#*# tension = 0.2
#*# min_x = 30.0
#*# max_x = 190.0
#*# min_y = 30.0
#*# max_y = 210.0
#*#
#*# [heater_bed]
#*# control = pid
#*# pid_kp = 75.668
#*# pid_ki = 1.649
#*# pid_kd = 868.291
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 28.519
#*# pid_ki = 1.571
#*# pid_kd = 129.406

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index