見出し画像

klipperのStart/End G-codeマクロについて

一般的に3D Printer用のslicerは一つのG-codeファイルに下記の3つのG-code
をまとめて出力します。
 ・開始G-code
 ・印刷データ本体のG-code
 ・終了G-code
今回は、この開始・終了部分のG-codeをKlipperの中にマクロ化して、それをSlicerが埋めこむG-codeから呼び出す設定について書きたいと思います。
かなりニッチなテーマだなぁ。。。
おかしいところがあれば、ご連絡ください。修正したいと思います。

Start/End G-codeとは

開始時と終了時に下記のような機能をするG-codeを機種専用に用意され、印刷データの最初と最後に埋め込まれるG-codeとなります。
・開始G-Codeの例
  ベッドの加熱
  ノズルの加熱
  単位の設定
  レベリング調整
  原点復帰動作
  ノズル掃除のためのライン印刷  。。。等
・終了G-Codeの例
  ベッドの加熱オフ
  ノズルの加熱オフ
  ヘッドの待避位置への移動
  モーターオフ
  ブザー等を鳴らす 。。。等

Curaは、Printerの設定のMachine Settingsで設定されています。

CURAでの設定

PrusaSlicerは、プリンタ設定→カスタムGコードで設定されています。

PrusaSlicerでの設定


KlipperのStart G-code / End G-code マクロ

Klipperでは、この開始・終了のG-codeをマクロ化し、Slicerからはそのマクロを呼び出すことで、同様の動作をするように設定することができます。
複数種類のSlicerを使用している場合、どちらのSlicerからも同じマクロを呼び出すようにすれば、マクロの修正をすればどちらにも反映するメリットがあります。
また、klipperは単独でマクロを実行できるので、単体でマクロの実行し動作確認することができるので、修正後のトライ&エラーはやりやすいです。
このマクロは、通常、klipperのprinter.cfgに記載されており、mainsail等の画面から、直接修正可能です。

サンプルのStart/End G-codeマクロは、公式では下記に記載されています。
このサンプルの[gcode_macro START_PRINT]と、[gcode_macro END_PRINT]の"gcode:"の後に実際に追加されるG-Codeの記載があります。

######################################################################
# Start Print and End Print
######################################################################

# Replace the slicer's custom start and end g-code scripts with
# START_PRINT and END_PRINT.

[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}
    # Use absolute coordinates
    G90
    # Reset the G-Code Z offset (adjust Z offset if needed)
    SET_GCODE_OFFSET Z=0.0
    # Home the printer
    G28
    # Move the nozzle near the bed
    G1 Z5 F3000
    # Move the nozzle very close to the bed
    G1 Z0.15 F300
    # Wait for bed to reach temperature
    M190 S{BED_TEMP}
    # Set and wait for nozzle to reach temperature
    M109 S{EXTRUDER_TEMP}

[gcode_macro END_PRINT]
gcode:
    # Turn off bed, extruder, and fan
    M140 S0
    M104 S0
    M106 S0
    # Move nozzle away from print while retracting
    G91
    G1 X-2 Y-2 E-3 F300
    # Raise nozzle by 10mm
    G1 Z10 F3000
    G90
    # Disable steppers
    M84

SlicerからStart/End G-codeマクロを呼び出す設定について

注意点としては、Slicerから渡されるベッド温度と、エクストルーダのノズル温度の情報についての記載が、Slicerによってfirst Layerの温度設定の変数名が異なっています。
参考までに私が使用しているSlicerからマクロを呼び出すときは下記の記載となります
CURAでの記載例:

;--- Start G-code ---
M140 S{material_bed_temperature_layer_0} ; Start bed heating
M104 S{material_print_temperature_layer_0} ; Start extruder heating
print_start EXTRUDER_TEMP={material_print_temperature_layer_0} BED_TEMP={material_bed_temperature_layer_0}

;--- End G-code ---
print_end    ;end script from macro

PursaSlicerでの記載例:

;--- Start G-code  ---
M140 S[first_layer_bed_temperature] ; Start bed heating
M104 S[first_layer_temperature] ; Start extruder heating
print_start EXTRUDER_TEMP=[first_layer_temperature[initial_tool]] BED_TEMP=[first_layer_bed_temperature]

;--- End G-code ---
print_end    ;end script from macro

※Start G-codeマクロを呼び出す前にM140,104で温度設定の記載をしているのは、この記載が無いとSlicerによっては自動的に温度設定のG-codeを追記してしまうものがある為です。

KlipperのStart/End G-codeマクロのカスタマイズ

公式のサンプルのままでも、ある程度汎用的に動作しますが、機種固有の設定等を自分の環境に合わせてカスタマイズをする必要があります。
一番簡単なのは、現在使用している、Slicerの設定をそのまま持ち込むことです。

Start G-code

CURAのEnder3を例に記載します(あくまでも例です。実際に動作テストまではしていません。。。)
CURA5.0でのStart G-codeは、下記のようになっていると思います。
(G-code自体の説明は省きます。英語ですが一応コメントで記載があるので大体わかると思います)

; Ender 3 Custom Start G-code
G92 E0 ; Reset Extruder
G28 ; Home all axes
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

これを、sampleに習って下記のように書き換えれば良いと思います。
CURAでは、温度設定のG-codeは省略するとSlicer側で自動的に埋め込まれる仕様なので記載がありません。なので温度設定に公式のKlipperのサンプルの記載を残しました(前半部分です)残りの部分はCURAのコードをそのまま持ってきています。

[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}
    # Wait for bed to reach temperature
    M190 S{BED_TEMP}
    # Set and wait for nozzle to reach temperature
    M109 S{EXTRUDER_TEMP}

    G92 E0 ; Reset Extruder
    G28 ; Home all axes
    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

少し細く説明すると、冒頭の下記の部分はSlicerからこのマクロが呼び出された際、パラメータがBED_TEMPと、EXTRUDER_TEMPの2つあるということを宣言するとともに、初期値がそれぞれ60度と190度という意味です。

{% set BED_TEMP = params.BED_TEMP|default(60)|float %}
{% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}

下記の記載は、{}で、括られている部分がパラメータとしてSlicerから渡された上記2つの変数となります。
M140はベッドの加熱開始で、待たずに処理を進めます。
M190はベッドの加熱、M109はNozzleの加熱で、この温度になるまで待ちます。

# Start bed heating
M140 S{BED_TEMP}
# Wait for bed to reach temperature
M190 S{BED_TEMP}
# Set and wait for nozzle to reach temperature
M109 S{EXTRUDER_TEMP}

少し時間短縮を目的に改善した例を下記に記載します。
(ここは好き嫌いがあると思いますので、あくまでもサンプルです)
下記の行を追加し、ベッドの加熱と同時にnozzleの加熱を開始するようにします
 # Start nozzle heating
 M104 S{EXTRUDER_TEMP}
さらに、下記2行を前に持ってきました。これは、加熱中にホーミングまでの動作を並行して完了させて時間短縮を図るというものです。
 G92 E0 ; Reset Extruder
 G28 ; Home all axes

[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
    M104 S{EXTRUDER_TEMP}

    G92 E0 ; Reset Extruder
    G28 ; Home all axes

    # Wait for bed to reach temperature
    M190 S{BED_TEMP}
    # Set and wait for nozzle to reach temperature
    M109 S{EXTRUDER_TEMP}

    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

End G-code

CURA5.0でのEnd G-codeは、下記のようになっていると思います。

G91 ;Relative positioning
G1 E-2 F2700 ;Retract a bit
G1 E-2 Z0.2 F2400 ;Retract and raise Z
G1 X5 Y5 F3000 ;Wipe out
G1 Z10 ;Raise Z more
G90 ;Absolute positioning

G1 X0 Y{machine_depth} ;Present print
M106 S0 ;Turn-off fan
M104 S0 ;Turn-off hotend
M140 S0 ;Turn-off bed

M84 X Y E ;Disable all steppers but Z

これを、sampleに習って下記のように書き換えれば良いと思います。
ここで注意が必要なのは、{machine_depth}というCURA固有のベッドサイズを表す変数名が使われているというところです。これをマクロに変数で渡すようにしても良いのですが、機種固有のPrinter.cfgファイルへの記載となるので、ここは固定値の220にして良いと考えます。

[gcode_macro END_PRINT]
gcode:
    G91 ;Relative positioning
    G1 E-2 F2700 ;Retract a bit
    G1 E-2 Z0.2 F2400 ;Retract and raise Z
    G1 X5 Y5 F3000 ;Wipe out
    G1 Z10 ;Raise Z more
    G90 ;Absolute positioning

    G1 X0 Y220 ;Present print
    M106 S0 ;Turn-off fan
    M104 S0 ;Turn-off hotend
    M140 S0 ;Turn-off bed

    M84 X Y E ;Disable all steppers but Z

Mainsailからのマクロの実行

Macrosというグループに記載されているマクロが表示されていると思うので、そこから実行ができます。
マクロの横に▼があるマクロはパラメータが指定できます。クリックするとパラメータの初期値が表示されるので必要に応じて変更して実行(SEND)することが出来ます。

Mainsailでのマクロ実行

最後に

かなりG-codeの知識が要求されるので難易度は高いかと思いますが、この辺りをチューニングできるようになると、かなり活用の幅が広がると思います。
是非チャレンジしてみてください。
※自己責任でお願いします。

ここから先は

0字

¥ 100

よろしければ、サポートお願いします。今後の活動費に使わせていただきたいと思います!