見出し画像

Klipperで使っているマクロの備忘録

・2022年10月14日 PA_CALIBRATE更新

現在KP3SのKlipperで使っているマクロをバックアップの意味合いもかねて記入しています。
主にGitHubから他の方が使っているマクロの寄せ集めを改変しています。
お使いになる場合はご自身のプリンターに合わせて数値を変更してください。

変だからこうした方が良いよとか、なんでこの数値なの?とかあったらコメントで教えてください。
よろしくお願いします。

出典

すばらしいマクロを公開していただき、大変感謝しております!!

# 手軽にMainsailの操作パネルからワンボタンでADXL345による共振測定を行います。
# 別途ADXL345の設置が必要になります。
[gcode_macro RESONANCES_X]
gcode:
     G28
     TEST_RESONANCES AXIS=X

[gcode_macro RESONANCES_Y]
gcode:
     G28
     TEST_RESONANCES AXIS=Y

# ホーミング位置にてZのプローブとのオフセットを設定開始します。
[gcode_macro CALIBRATE]
gcode:
   G28
   PROBE_CALIBRATE

# Zのプローブとのオフセット設定時にノズルがベッドへ1mm近づき、値を1mm小さくします。
[gcode_macro PROBE_M1]
gcode:
   TESTZ Z=-1

[gcode_macro PROBE_M01]
gcode:
   TESTZ Z=-0.1

[gcode_macro PROBE_M005]
gcode:
   TESTZ Z=-0.05

[gcode_macro PROBE_M002]
gcode:
   TESTZ Z=-0.02

[gcode_macro PROBE_M001]
gcode:
   TESTZ Z=-0.01

[gcode_macro PROBE_P002]
gcode:
   TESTZ Z=0.02

# Zのプローブとのオフセット設定時にノズルがベッドから0.01mm遠くなり、値を0.01mm大きくします。
[gcode_macro PROBE_P001]
gcode:
   TESTZ Z=0.01

# Zのプローブとのオフセットを設定終了して値を保存します。必ず実行してください。  
[gcode_macro END_CALIBRATE]
gcode:
   ACCEPT
   SAVE_CONFIG

# ノズルを交換するためにホットエンドを250℃に加熱して、
# 温度上昇を待たずにヘッドをX軸-5mm、Y軸ホーム位置、Z軸180mmの座標に移動します。
[gcode_macro NOZZLE_CHANGE]
gcode:
   M104 S250
   G90
   G28
   G1 X-5.0 F3000
   G1 Z180 F1000

# スライサーが出したM600を受けてポーズするためのマクロ
# M600はスライサーでフィラメントの色変更等でフィラメントチェンジを指定する時にこのGcodeを出します
 [gcode_macro M600]
gcode:
PAUSE

# 別Gcodeで加温後にエクストルーダーからノズルへフィラメントを挿入するマクロ
# M600時などのフィラメントチェンジ時に便利です。
# エクストルーダーからノズルまでの長さによって値は変更する必要があります。
# load filament. Slow feed filament into the gear, fast load to cold zone then slow load to nozzle.    
[gcode_macro M701]
gcode:
   SAVE_GCODE_STATE NAME=loading_filament
   M83
   G92 E0.0
   G1 E{params.FEED_LENGTH|default(10)|int} F200    ; slow feed filament
   G1 E{params.FAST_LOAD_LENGTH|default(50)|int} F2000    ; Fast load to cold zone
   G1 E{params.SLOW_LOAD_LENGTH|default(50)|int} F100     ; Slow load to nozzle
   G92 E0.0
   RESTORE_GCODE_STATE NAME=loading_filament

# 別Gcodeで加温後にホットエンド、エクストルーダーからフィラメントを除去するマクロ
# M600時などのフィラメントチェンジ時に便利です。
# エクストルーダーからノズルまでの長さによって値は変更する必要があります。
# 値は慎重に変更しないとヒートブレイクやエクストルーダーで詰まってしまうので注意
# 下記の値は加温で少し太ってしまっている部分のフィラメントを30mm溶かして太りを解消してから、
# 70mm高速で抜き、その後にスピードを少し緩めて追加で40mm抜いています。
# Unload filament. Extrude a small amount, quick pull then slow pull
[gcode_macro M702]
gcode:
   SAVE_GCODE_STATE NAME=unloading_filament
   G91 ; set relative
   G1 E{params.FEED_LENGTH|default(30)|int} F200 
   G92 E0.0
   G1 E-{params.FAST_UNLOAD_LENGTH|default(70)|int} F2000  ; fast unload
   G92 E0.0
   G1 E-{params.SLOW_UNLOAD_LENGTH|default(40)|int} F1000  ; slow unload
   G92 E0.0
   RESTORE_GCODE_STATE NAME=unloading_filament

# Mainsailでボタンとしてわかりやすいようにリネームしてます
[gcode_macro FILAMENT_IN]
gcode:
     M701

[gcode_macro FILAMENT_OUT]
gcode:
     M702
 
# フィラメント交換後、ノズルに残っている古いフィラメントを押し出します
[gcode_macro FILAMENT_PURGE]
gcode:
 G91
 G1 E20.0 F180
 G90

# PAUSE時のヘッドのパーキング位置決め。X-2,Y160
[gcode_macro M125]
gcode:
   SAVE_GCODE_STATE NAME=parking
   G91
   G1 Z{params.ZLIFT|default(10)|int} F3000
   G90
   G1 X{params.XPOS|default(-2)|int} Y{params.YPOS|default(160)|int} F3000
   RESTORE_GCODE_STATE NAME=parking

[gcode_macro RESUME]
rename_existing: RESUME_OLD
gcode:
   G91
   G92 E0 ;Reset Extruder
   G1 E0.5 F300
   G90
   ;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=1
   RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
   RESUME_OLD

[gcode_macro PAUSE]
rename_existing: PAUSE_OLD
gcode:
   SAVE_GCODE_STATE NAME=PAUSE_state
   PAUSE_OLD
   G91
   G92 E0 ;Reset Extruder
   G1 E-2 F300
   M125 ; parking
   ;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=0


[gcode_macro CANCEL_PRINT]
rename_existing: CANCEL_PRINT_OLD
gcode:
   M300
   G91 ; relative
   G1 E-2 F300 ; retract
   {% if printer.toolhead.position.z <= 60 %}
       G90
       G0 Z70 F3000
       G91
   {% else %}
       G0 Z5 F3000
   {% endif %}

   G90
   G0 X30 Y30 F3000 ; park toolhead

   CLEAR_PAUSE
   TURN_OFF_HEATERS
   M84 ; disable steppers
   M107 ; fan off
   BED_MESH_CLEAR
   ;SET_FILAMENT_SENSOR SENSOR=bear_ir ENABLE=1
   CANCEL_PRINT_OLD
   SDCARD_RESET_FILE

# SnakeOil XYのGitHubにて公開されているプリント領域のみの最小限でプローブするマクロ
# スライサーから得られる領域の数値が必要なので、このマクロだけでは使えません。補足1を参照してください。
[gcode_macro BED_MESH_CALIBRATE]
rename_existing: BED_MESH_CALIBRATE_BASE
; gcode parameters
variable_parameter_AREA_START : 0,0
variable_parameter_AREA_END : 0,0
; the clearance between print area and probe area 
variable_mesh_area_offset : 5.0
; number of sample per probe point
variable_probe_samples : 3
; minimum and maximum probe count
variable_min_probe_count : 3
; scale up the probe count, the value should be 1.0 ~ < max/min probe count
variable_probe_count_scale_factor : 1.0
gcode:
   {% if params.AREA_START and params.AREA_END %}
       {% set bedMeshConfig = printer["configfile"].config["bed_mesh"] %}
       {% set safe_min_x = bedMeshConfig.mesh_min.split(",")[0]|float %}
       {% set safe_min_y = bedMeshConfig.mesh_min.split(",")[1]|float %}
       {% set safe_max_x = bedMeshConfig.mesh_max.split(",")[0]|float %}
       {% set safe_max_y = bedMeshConfig.mesh_max.split(",")[1]|float %}

       {% set area_min_x = params.AREA_START.split(",")[0]|float %}
		{% set area_min_y = params.AREA_START.split(",")[1]|float %}
		{% set area_max_x = params.AREA_END.split(",")[0]|float %}
		{% set area_max_y = params.AREA_END.split(",")[1]|float %}

       {% set meshPointX = bedMeshConfig.probe_count.split(",")[0]|int %}
       {% set meshPointY = bedMeshConfig.probe_count.split(",")[1]|int %}

       {% set meshMaxPointX = meshPointX %}
	    {% set meshMaxPointY = meshPointY %}


       {% if (area_min_x < area_max_x) and (area_min_y < area_max_y) %}
           {% if area_min_x - mesh_area_offset >=  safe_min_x %}
               {% set area_min_x = area_min_x - mesh_area_offset %}
           {% else %}
               {% set area_min_x = safe_min_x %}
           {% endif %}

           {% if area_min_y - mesh_area_offset >=  safe_min_y %}
               {% set area_min_y = area_min_y - mesh_area_offset %}
           {% else %}
               {% set area_min_y = safe_min_y %}
           {% endif %}

           {% if area_max_x + mesh_area_offset <=  safe_max_x %}
               {% set area_max_x = area_max_x + mesh_area_offset %}
           {% else %}
               {% set area_max_x = safe_max_x %}
           {% endif %}

           {% if area_max_y + mesh_area_offset <=  safe_max_y %}
               {% set area_max_y = area_max_y + mesh_area_offset %}
           {% else %}
               {% set area_max_y = safe_max_y %}
           {% endif %}

           {% set meshPointX = (meshPointX * (area_max_x - area_min_x) / (safe_max_x - safe_min_x)  * probe_count_scale_factor|float)|round(0)|int %}
           {% if meshPointX < min_probe_count %}
               {% set meshPointX = min_probe_count %}
           {% endif %}
           {% if meshPointX > meshMaxPointX %}
               {% set meshPointX = meshMaxPointX %}
           {% endif %}

           {% set meshPointY = (meshPointY * (area_max_y -area_min_y ) / (safe_max_y - safe_min_y) * probe_count_scale_factor|float)|round(0)|int %}
           {% if meshPointY < min_probe_count %}
               {% set meshPointY = min_probe_count %}
           {% endif %}
           {% if meshPointY > meshMaxPointY %}
               {% set meshPointY = meshMaxPointY %}
           {% endif %}

           BED_MESH_CALIBRATE_BASE mesh_min={area_min_x},{area_min_y} mesh_max={area_max_x},{area_max_y} probe_count={meshPointX},{meshPointY} samples={probe_samples|int}
       {% else %}
           BED_MESH_CALIBRATE_BASE
       {% endif %}
   {% else %}
       BED_MESH_CALIBRATE_BASE
   {% endif %}

[gcode_macro G29]
gcode:
 BED_MESH_CALIBRATE

[gcode_macro END_PRINT]
gcode:
   G91 ; relative
   G1 E-2 F300
   {% if printer.toolhead.position.z <= 30 %}
       G90
       G0 Z70 F3000
       G91
   {% else %}
       G0 Z5 F3000
   {% endif %}
   G90 ; absolute pos
   G1 X30 Y170 F3000
   TURN_OFF_HEATERS ; heaters off
   M84 ; disable steppers
   M107 ; fan off
   BED_MESH_CLEAR

# このマクロは PA_CALIBRATEのマクロのスタート時にのみ使用しています。
[gcode_macro PRINT_START]
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
   # Home the printer
   G28
   G0 X-2 Y0 Z50 F3000 
   # 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}
   G28
   BED_MESH_CALIBRATE

# プレッシャーアドバンスを測定するマクロです。
# ノズル径や温度、スピード等の値をMainsailのマクロ操作パネルから変更できます。
# ベッドサイズやリトラクトの長さやスピード等はご自身のプリンターに合わせて変更してください。
[gcode_macro PA_CALIBRATE]
gcode:

    {% set nozzle_diameter = params.NOZZLE_DIAMETER|default(0.4)|float %}
    {% set bed_size_x = 180|float %}
    {% set bed_size_y = 180|float %}
    {% set retract = 0.9 | float %}
    {% set retract_speed = 60 * 60|float %}
    {% set filament_diameter = 1.75|float %}
    {% set layer_height = params.LAYER_HEIGHT|default(0.2)|float %}
    {% set nozzle_line_ratio = params.NOZZLE_LINE_RATIO|default(1.13)|float %}
    {% set extrusion_multiplier = 1.0|float %}
    {% set bed_temp = params.BED_TEMP|default(60) %}
    {% set extruder_temp = params.EXTRUDER_TEMP|default(210) %}
    {% set slow_speed = params.SLOW_SPEED|default(25)|float %}
    {% set slow_length = 20 | float %}
    {% set fast_speed = params.FAST_SPEED|default(80)| float %}
    {% set fast_length = 40| float %}
    {% set travel_speed = 105 | float %}
    {% set pa_start = params.PA_START|default(0.005) | float %}
    {% set pa_end = params.PA_END|default(0.1) | float %}
    {% set pa_step = params.PA_STEP|default(0.005) | float %}
    {% set accel = params.MAX_ACCEL|default(3000) | float %}
    {% set deaccel = params.MAX_ACCEL_TO_DECEL|default(3000) | float %}
    {% set line_spacing = 5  | float %}
    ######################################################################################
    ####                           !!! DO NOT EDIT BELOW !!!                           ###
    ######################################################################################
    {% set spacing = line_spacing                                                       %}
    {% set fd      = filament_diameter                                                  %}
    {% set nd      = nozzle_diameter                                                    %}
    {% set ew      = nozzle_diameter * nozzle_line_ratio                                %}
    {% set em      = extrusion_multiplier                                               %}
    {% set lh      = layer_height                                                       %}
    {% set pa      = pa_start                                                           %}
    ##################################[ calculations ]####################################
    {% set slow_speed           = slow_speed * 60                               | float %}
    {% set fast_speed           = fast_speed * 60                               | float %}
    {% set travel_speed         = travel_speed * 60                             | float %}
    {% set lines    = (((pa_end - pa_start) / pa_step) + 1) | round(0, 'ceil')  | int   %}
    {% set p_width  = ((2 * slow_length + fast_length))                                 %}
    {% set p_height = (lines * (spacing + (nd * ew)))                                   %}
    {% set p_width_total  = p_width + 20                                                %}
    {% set p_height_total = p_height + 40                                               %}
    {% set start_x_pos    = (bed_size_x - p_width) / 2                                  %}
    {% set end_x_pos      = (bed_size_x + p_width) / 2                                  %}
    {% set start_y_pos    = (bed_size_y - p_height) / 2                                 %}
    {% set end_y_pos      = (bed_size_y + p_height) / 2                                 %}
    {% set x_pos          = start_x_pos                                                 %}
    {% set y_pos          = start_y_pos                                                 %}
    ########################[ check if test patter fits on bed ]##########################
    {% if p_height_total > bed_size_y or p_width_total > bed_size_x %}
      {% set exceeds_bed_area = true  %}
    {% else %}
      {% set exceeds_bed_area = false %}
    {% endif %}
    ######################################################################################
    ### Using Slic3r flow math to calculate extrusion amounts:                         ###
    ######################################################################################
    ### V_in  = (pi * fd ** 2) / 4 * E                                                 ###
    ### V_out = A * L * em                                                             ###
    ### V_in  = V_out                                                                  ###
    ### A     = (ew - lh) * lh + pi * (lh / 2) ** 2                                    ###
    ### E     = ((A * L * 4) / (pi * fd ** 2)) * em                                    ###
    ######################################################################################
    {% set pi      = 3.141592654                                     | float            %}
    {% set A       = (ew - lh) * lh + pi * (lh / 2) ** 2             | float            %}
    {% set E_prime = (((A * p_height * 4) / (pi * fd ** 2)) * 1.6)   | round(6, 'ceil') %}
    {% set E_frame = (((A * ( p_height+ 2 ) * 4) / (pi * fd ** 2)) * 1.6)   | round(6, 'ceil') %}
    {% set E_slow  = (((A * slow_length * 4) / (pi * fd ** 2)) * em) | round(6, 'ceil') %}
    {% set E_fast  = (((A * fast_length * 4) / (pi * fd ** 2)) * em) | round(6, 'ceil') %}
    {% set E_mark  = (((A * 20 * 4) / (pi * fd ** 2)) * em)          | round(6, 'ceil') %}
    ######################################################################################
    ### START CALIBRATION ###
    PRINT_START BED_TEMP={bed_temp} EXTRUDER_TEMP={extruder_temp}
    SET_VELOCITY_LIMIT ACCEL={accel} ACCEL_TO_DECEL={deaccel}
    ### PRIME NOZZLE ###
    M83 ; set relative extrusion mode
    G1 X{ x_pos - 10 } Y{ y_pos } F{ travel_speed } ; move to prime line start
    G1 Z{ layer_height } ; move Z down
    G1 Y{ y_pos + p_height } E{ E_prime } F { slow_speed } ; print first prime line
    G1 X{ x_pos - 5 } F{ travel_speed } ; move to second prime line start
    G1 Y{ y_pos } E{ E_prime } F { slow_speed } ; print second prime line
    G1 Z{ layer_height + 0.3 } ; move Z up
    ### FRAME ###
    G1 X{ x_pos } Y{ y_pos - 1 } F{ travel_speed }
    G1 Z{ layer_height } ; move Z down
    G1 Y{ y_pos + p_height + 1 } E{ E_frame } F { slow_speed } ; print first prime line
    G1 X{ end_x_pos } Y{ y_pos - 1 } F{ travel_speed }
    G1 Z{ layer_height } ; move Z down
    G1 Y{ y_pos + p_height + 1 } E{ E_frame } F { slow_speed } ; print first prime line
    G1 E-{ retract } F{ retract_speed } ; retract
    G1 Z{ layer_height + 0.3 } ; move Z up
    G92 E0
    ### START TEST PATTERN ###
    SET_PRESSURE_ADVANCE EXTRUDER=extruder ADVANCE={ pa }
    {% for i in range(lines) %}
        {% if not loop.first %}
            {% set y_pos = y_pos + (i * (spacing + ew)) %}
            {% set pa = pa + (i * pa_step) %}
            SET_PRESSURE_ADVANCE EXTRUDER=extruder ADVANCE={ pa }
        {% endif %}
        M117 PA={ pa }
        ### move to line starting postion
        G1 X{ x_pos } Y{ y_pos } F{ travel_speed }
        G1 E{ retract } F{ retract_speed } ; un-retract
        G1 Z{ layer_height } ; move Z down
        ### print first slow part
        {% set x_pos = x_pos + slow_length %}
        G1 X{ x_pos } Y{ y_pos } E{ E_slow } F{ slow_speed }
        ### print fast part
        {% set x_pos = x_pos + fast_length %}
        G1 X{ x_pos } Y{ y_pos } E{ E_fast } F{ fast_speed }
        ### print second slow part
        {% set x_pos = x_pos + slow_length %}
        G1 X{ x_pos } Y{ y_pos } E{ E_slow } F{ slow_speed }
        G1 E-{ retract } F{ retract_speed } ; retract
        G1 Z{ layer_height + 0.3 } ; move Z up
        ### reset x position
        {% set x_pos = start_x_pos %}
    {% endfor %}

    END_PRINT

# 気軽にPID CALIBRATEができるマクロです。
# 設定したい温度にMainsailのマクロ操作パネルから変更できます
[gcode_macro PID_TUNE]
gcode:
   {% set TARGET_TEMP = params.TARGET_TEMP|default(210)|float %}
 PID_CALIBRATE HEATER=extruder TARGET={TARGET_TEMP}
 SAVE_CONFIG

2022年10月14日追記
Twitterにてトローチさんに両端にラインを引くとPA_CALIBRATE後の掃除が楽になることを教えていただいたのでPA_CALIBRATEに横のフレームとZホップを追加しました。
Eitokuさんのnoteを参考に加速度の設定を追加。デフォルトは3000

Mainsailでボタンにして使っています

補足1

PrusaSlicerにてプリント箇所のみ最小限のプローブをするマクロを使うには
PrusaSlicer「Gコードの最初」(マクロの開始Gcodeに記入しても動きません)に

BED_MESH_CALIBRATE AREA_START={first_layer_print_min[0]},{first_layer_print_min[1]} AREA_END={first_layer_print_max[0]},{first_layer_print_max[1]} 

をBED_MESH_CALIBRATEの代わりに入れておくと良いです。

補足2

[gcode_macro PA_CALIBRATE]

を太いノズルで使用時にフローのエラーが出てしまう場合はprinter.cfgにある設定の

[extruder]
nozzle_diameter: 1

に変更しておくと口径の太いノズルも動くかもしれません。
(この設定のまま0.1mmや0.4mmのノズルでもプリントできます)
ただし、リミットを外してしまうような設定になっていますので自己責任にてお願いします。

補足3

printer.cfgに

# macroやpa_calibrateは任意のファイル名でOKです
[include macro.cfg]
[include pa_calibrate.cfg]

の様な記述を追加しておくと任意のファイル名でprinter.cfgの内容を分割して管理できるので編集しやすくなり便利です。

補足4

KP3Sはマザーボードに余っているセンサーの端子が多いので、
printer.cfgに下記を追加して物理的なボタンでマクロを使用しています。
フィラメント・ノズルを交換する時やM600時に便利です。

キーボードのスイッチを利用しています
[gcode_button BUTTON1]
pin: ^!PB2
press_gcode:
	M701

[gcode_button BUTTON2]
pin: ^!PA4
press_gcode:
	M702

[gcode_button BUTTON3]
pin: ^!PE6
press_gcode:
	FILAMENT_PURGE

[gcode_button BUTTON4]
pin: ^!PA2
press_gcode:
	RESUME


この記事が気に入ったらサポートをしてみませんか?