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 を調整するには毎回次の作業が必要になります。

  1. printer.cfg ファイルの現在の設定値を確認
  2. 印刷物のサイズを測る
  3. 実測値と現在の設定値を基に新しい設定値を計算
  4. 新しい設定値を printer.cfg ファイルに追加
  5. Klipper 再起動という

このうち、新しい設定値の計算については、印刷物の実測値と現在の設定値から自動的に計算できるツールを作成しているので特に面倒な作業ではないのですが、現在の設定値を確認するには、Mainsail の MACHINE タブで printer.cfg ファイルを開いてスクロールしながら目視で確認するか、SSH で Raspberry Pi にアクセスして cat klipper_config/printer.cfg | grep ^rotation_distance コマンドを実行する必要があり、正直言って面倒な作業でした。

そこで、現在の設定値を簡単に確認できる方法を探していたところ、Mainsail で任意のシェルコマンドを実行できる方法が見つかったため、早速試したところ上手くいきましたので、その方法をまとめました。

大まかな処理の流れ

  1. KIAUH のプラグインである G-Code Shell Command Extension をインストール
  2. rotaton_distance を確認するためのシェルスクリプト ( ~/get_rotation_distance.sh ) を作成して実行権限を追加
  3. printer.cfg に上記のシェルスクリプトを実行する GCode を追加
  4. Klipper を再起動
  5. Mainsail の Console で RUN_SHELL_COMMAND CMD=get_rotation_distance を実行
  6. 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 を参照してインストールしてください。

  1. SSH で Raspberry Pi にアクセスします
  2. kiauh/kiauh.sh コマンドで KIAUH を起動します
  3. Main Menu で 4) [Advanced] を選択します
  4. Advanced Menu で 8) [G-Code Shell Command] を選択します
  5. いくつかの質問に 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 を再起動します。

  1. Mainsail の DASHBOARD の右上の電源ボタンから Klipper の再起動を選択する
  2. 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 の設定値が変更されていることが確認できます。

実行結果