Mainsail から rotation_distance を確認・変更する方法
追記事項(2022年9月30日)
この記事を公開した時に、
そこで
rotation_distance
の設定値を引数として渡すとprinter.cfg
の設定値を変更するシェルスクリプトは作成したのですが、これを Mainsail の CONSOLE から実行する方法が分からないため、この点は現在保留中です。正確に言うと、Mainsail の CONSOLE で複数の引数を渡す方法が分からない(できない?)ため、保留にしています。
と書いていましたが、このたび、Mainsail の Console から rotation_distance
の設定値を変更することに成功しましたので、その方法を末尾にまとめました。
前置き
Klipper の設定項目の1つである rotation_distance
は、ステッピングモーターが1回転した時の移動量を指定するものですが、フィラメント毎に調整しないと印刷物の大きさが微妙に変わってしまうため、新しいフィラメントを使う度に調整が必要になります。しかし、G-Code で設定できる pressure_advance
とは異なり、 rotation_distance
を調整するには毎回次の作業が必要になります。
printer.cfg
ファイルの現在の設定値を確認- 印刷物のサイズを測る
- 実測値と現在の設定値を基に新しい設定値を計算
- 新しい設定値を
printer.cfg
ファイルに追加 - Klipper 再起動という
このうち、新しい設定値の計算については、印刷物の実測値と現在の設定値から自動的に計算できるツールを作成しているので特に面倒な作業ではないのですが、現在の設定値を確認するには、Mainsail の MACHINE タブで printer.cfg
ファイルを開いてスクロールしながら目視で確認するか、SSH で Raspberry Pi にアクセスして cat klipper_config/printer.cfg | grep ^rotation_distance
コマンドを実行する必要があり、正直言って面倒な作業でした。
そこで、現在の設定値を簡単に確認できる方法を探していたところ、Mainsail で任意のシェルコマンドを実行できる方法が見つかったため、早速試したところ上手くいきましたので、その方法をまとめました。
大まかな処理の流れ
- KIAUH のプラグインである G-Code Shell Command Extension をインストール
rotaton_distance
を確認するためのシェルスクリプト (~/get_rotation_distance.sh
) を作成して実行権限を追加printer.cfg
に上記のシェルスクリプトを実行する GCode を追加- Klipper を再起動
- Mainsail の Console で
RUN_SHELL_COMMAND CMD=get_rotation_distance
を実行 - Console に
rotation_distance
の設定が表示される
1# eSun Silk PLA
2rotation_distance: 32.14
3--
4# eSun Silk PLA
5rotation_distance: 32.07
6--
7# eSun Silk PLA
8rotation_distance: 8.09
9--
10enable_pin: !PA4
11rotation_distance: 21.77
各手順の説明(rotation_distance
の確認)
G-Code Shell Command Extension のインストール
G-Code Shell Command Extension は、Mainsail の Console からシェルコマンドを実行できるようにする KIAUH のプラグインです。
インストール方法は次のとおりです。なお、KIAUH が既にインストールされていることを前提にしています。KIAUH をインストールしていない場合、th33xitus/kiauh: Klipper Installation And Update Helper を参照してインストールしてください。
- SSH で Raspberry Pi にアクセスします
kiauh/kiauh.sh
コマンドで KIAUH を起動します- Main Menu で
4) [Advanced]
を選択します - Advanced Menu で
8) [G-Code Shell Command]
を選択します - いくつかの質問に
Y
を回答するとインストールされます
シェルスクリプトの作成
G-Code Shell Command をインストールしたら、次は rotation_distance
を確認するためのシェルスクリプトを作成します。
シェルスクリプトの保存場所はどこでもOKなので、以下のコードのスクリプトを ~/get_rotation_distance.sh
で作成しています。スクリプトを作成したら chmod 777 ~/get_rotation_distance.sh
で実行権限を追加します。
1#!/bin/bash
2cat ~/klipper/printer.cfg | grep --before-context=1 ^rotation_distance
なお、直前の1行を出力しているのは、私の printer.cfg
では rotation_distance
をフィラメント毎に設定しており、設定値の1行前にフィラメント名を記載しているためです。
1# printer.cfg
2
3# Tinmorry MATT PLA
4rotation_distance: 40.153
5# Polymaker ABS
6#rotation_distance: 40.252
7...
printer.cfg の設定
上記のシェルスクリプトを Mainsail の Console から実行できるようにするため、printer.cfg
に次の設定を追加します。設定は公式ページの設定例を参考にしています。
1[gcode_shell_command GET_rotation_distance]
2 command: sh /home/pi/get_rotation_distance.sh
3 timeout: 30.
4 verbose: True
printer.cfg
を編集したら次のいずれかの方法で Klipper を再起動します。
- Mainsail の DASHBOARD の右上の電源ボタンから Klipper の再起動を選択する
- SSH でアクセスしている Raspberry Pi で
sudo systemctl restart klipper.service
を実行する
こうすると Console で RUN_SHELL_COMMAND CMD=get_rotation_distance
と入力すると rotation_distance
の設定値を確認できるようになります。
1# eSun Silk PLA
2rotation_distance: 32.14
3--
4# eSun Silk PLA
5rotation_distance: 32.07
6--
7# eSun Silk PLA
8rotation_distance: 8.09
9--
10enable_pin: !PA4
11rotation_distance: 21.77
rotation_distance の修正
2022年9月30日加筆修正
上記の方法で rotation_distance
の設定値を確認することはできますが、もう一歩進めて設定値の修正までできるようになるとさらに楽になります。
そこで rotation_distance
の設定値を引数として渡すと printer.cfg
の設定値を変更するシェルスクリプトは作成したのですが、これを Mainsail の CONSOLE から実行する方法が分からないため、この点は現在保留中です。正確に言うと、Mainsail の CONSOLE で複数の引数を渡す方法が分からない(できない?)ため、保留にしています。
とりあえず KIAUH の Issues で複数パラメーターを渡せる機能を追加して欲しいと要望していますので、機能が実装されるのを待つか、現時点でも可能であればその方法も追記しようと思います。
なお、シェルスクリプトのコードは次のとおりです。前提として、 rotation_distance
を設定している行に、コメントで XYZ 軸の区別ができるようにするためのコメントを挿入しています。
そのため、まず rotation_distance
の設定値を引数として渡したら printer.cfg
の内容を書き換えるシェルスクリプト(~/ change_rotation_distance.sh
)を作成しました。ある程度のエラーには対応できるように作成していますが、もし不具合がありましたらコメント欄で教えてください。
1#!/usr/bin/bash
2
3Message() {
4 cat <<- EOF
5This script is change rotation_distance value.
6Usage: sh change_rotation_distance -x 40 -y 39.5 -z 8.4
7 sh change_rotation_distance -y 40 -z 8
8 sh change_rotation_distance -h
9 NG -> sh change_rotation_distance -x -y -z 8.9
10 sh change_rotation_distance -x -40 -y -40 -z 8.9
11EOF
12}
13
14isNumeric() {
15 if expr "$1" : "[0-9]*$" > /dev/null 2>&1 || ( expr "$1" : "[0-9]*\.[0-9]*$" > /dev/null 2>&1 && [ "$1" != "." ] );then
16 return_value=0
17 else
18 return_value=1
19 fi
20 return "$return_value"
21}
22
23if [ $# -eq 0 ]
24then
25 Message
26 exit 0
27fi
28
29while getopts x:y:z:h OPT
30do
31 isNumeric "$OPTARG"
32 return_value=$?
33 if [ "$return_value" -eq 1 ]
34 then
35 if [ "$OPT" = 'h' ]
36 then
37 Message
38 exit 0
39 elif [ "$OPT" != '?' ]
40 then
41 echo "-${OPT} argument is not a positive number."
42 Message
43 exit 1
44 fi
45 fi
46 case $OPT in
47 x) x_axis="$OPTARG" ;;
48 y) y_axis="$OPTARG" ;;
49 z) z_axis="$OPTARG" ;;
50 ?) Message
51 exit 1 ;;
52 esac
53done
54
55if [ "${x_axis}" ]
56then
57 sed -E "s/^(rotation_distance:)\s?[0-9]+\.?[0-9]+(.+#\s?[xX])/\1 ${x_axis}\2/" -i $HOME/klipper_config/printer.cfg
58fi
59
60if [ "${y_axis}" ]
61then
62 sed -E "s/^(rotation_distance:)\s?[0-9]+\.?[0-9]+(.+#\s?[yY])/\1 ${y_axis}\2/" -i $HOME/klipper_config/printer.cfg
63fi
64
65if [ "${z_axis}" ]
66then
67 sed -E "s/^(rotation_distance:)\s?[0-9]+\.?[0-9]+(.+#\s?[zZ])/\1 ${z_axis}\2/" -i $HOME/klipper_config/printer.cfg
68fi
あわせて、printer.cfg
に4つある rotation_distance
について、どれが XYZ 軸の値なのかを示すコメントを追加して、sed
コマンドの検索パターンで指定できるようにしました。
1# printer.cfg
2
3[stepper_x]
4rotation_distance: 32.14 # x_axis
5[stepper_y]
6rotation_distance: 32.07 # y_axis
7[stepper_z]
8rotation_distance: 8.09 # z_axis
sh change_rotation_distance.sh -x 32.14 -y 32.07 -z 8.09
の形で rotation_distance
の設定を引数として渡します。
それから、このシェルスクリプトを Mainsail の Console から実行するためのマクロを作成します。このマクロのコードは、KIAUH の Issues で私が「複数パラメーターを渡せる機能を追加して欲しい」と要望したのに対し、「この方法を試してほしい」と回答していただいたものをほぼコピーしています。
1# printer.cfg
2
3[gcode_shell_command change_rotation_distance]
4command: sh /home/pi/change_rotation_distance.sh
5timeout: 30.
6verbose: True
7
8[gcode_macro change_rotation_distance]
9gcode:
10 # Set the X, Y, Z variables up here. Assuming that the default is None
11 {% set param_data = [] %}
12
13 # If variable is None, ignore and don't add it to param_data list
14 {% if X is not none %}
15 {% set param_data = param_data + ['-x ' + X] %}
16 {% endif %}
17 {% if Y is not none %}
18 {% set param_data = param_data + ['-y ' + Y] %}
19 {% endif %}
20 {% if Z is not none %}
21 {% set param_data = param_data + ['-z ' + Z] %}
22 {% endif %}
23
24 # Join param_data with a space
25 {% set param_data = ' '.join(param_data) %}
26
27 RUN_SHELL_COMMAND CMD=change_rotation_distance PARAMS="{pass_data}"
28 # Note the quotation marks around the pass_data. Without them, Klipper will attempt (and fail) to interpret each word in the params
マクロを作成したら Klipper を再起動して読み込ませます。そして、Mainsail の Console に次のコマンドを入力して実行します。このとき、シェルスクリプトに渡す引数をシングルクォーテーション('
)で囲む必要があります。
RUN_SHELL_COMMAND CMD=change_rotation_distance PARAMS='-x 31.644 -y 31.574 -z 8.042'
このコマンドを実行すると Running Command {change_rotation_distance}...:
と表示されてシェルスクリプトが実行され、少し待つと Command {change_rotation_distance} finished
と実行完了の通知が表示されます。
実際に rotation_distance
の設定値が変更されたか確認するため、Mainsail の Console に RUN_SHELL_COMMAND CMD=get_rotation_distance
と入力して実行すると、rotation_distance
の設定値が変更されていることが確認できます。