加速度センサーを使ったKlipperの調整

Klipperの重要な機能の一つであるinput shaperによるリンギング(ゴースティング)消し。

Klipperの導入記事では、テストプリントに表れたリンギングを目視とノギスで観察・調査することによってinput shaperに設定する共振周波数を割り出した。

このほか、加速度センサーを使ったやり方もあるので、その方法を紹介する。

Klipper公式サイトの当該テーマの解説は以下だ。

Klipperがサポートする加速度センサーはSPI接続対応のADXL345だけ。

image alt

まずはそれを入手する。

ADXL345はとても小さなチップ。それを2.54mmピッチの基板やブレッドボードなどで使いやすくしたモジュールが販売されていて、普通はそれを使う。

モジュールは各社が販売しており、少しずつ仕様が異なる。

筆者はAmazonで販売されている以下のモジュールを使用した。

I2C経由の接続ではスピードが遅いために問題があり、SPIでの接続が指定されている。

中にはADXL345のSDO端子がGNDと接続され(短絡され)、I2Cモードに固定されているモジュールもあるそうだ。

筆者が購入した上記のモジュールは確かにSPIでの接続に対応しており、使用したRaspberry Pi ZERO WHとの接続に問題はなかった。

ADXL345モジュールの固定

ADXL345モジュールを使ってX軸、Y軸の共振周波数を調査するためにはADXL345モジュールをX軸、Y軸それぞれに固定しなければならない。

しかし、X軸、Y軸は別々に測定するので同時に取り付ける必要はなく、ADXL345モジュールは一つあれば足りる。

筆者はKINGROON KP3SのX軸、Y軸にADXL345を固定するためのマウンターを作成した。

image alt

以下からSTLファイルがダウンロード可能だ。

X軸はエクストルーダーのステッピングモーターの上に固定。

image alt

Y軸、つまりヒートベッドの場合は、X軸への固定に使ったマウンターを流用し、ベッドにクリップで止められるようにする親マウンターで固定するようにした。

image alt

X軸は既存のネジで共締めするので追加の部品は不要だが、Y軸用の親マウンターとの固定には、M3のネジとナット1〜2組が必要になる。

image alt

ADXL345モジュールとRaspberry Piとの接続

ADXL345とRaspberry Piとの接続については公式サイトに接続図がある。

Raspberry PiシリーズのGPIOのピンは基板の端に位置し、配列は全機種同じだ。1番ピン(3V3 power)側が基板の内側になる。

▼Raspberry PiとADXL345モジュールとの接続ピン対応表

ADXL345
のピン
Raspberry Pi
のピン
Raspberry Pi
のピン名
3V3
(またはVCC)
013.3V
DC電源
GND06GND
CS24GPIO08
(SPI0_CE0_N)
SDO21GPIO09
(SPI0_MISO)
SDA19GPIO10
(SPI0_MOSI)
SCL23GPIO11
(SPI0_SCLK)

▼Raspberry PiのGPIOピン配列

image alt

▲画像引用元: https://www.raspberrypi.org/documentation/usage/gpio/README.md

▼Raspberry PiとADXL345モジュールとの接続ピン接続実体図: パターン1

9ピンのADXL345モジュールの場合

image alt

▲画像引用元: https://www.klipper3d.org/Measuring_Resonances.html

▼Raspberry PiとADXL345モジュールとの接続ピン接続実体図: パターン2

8ピンのADXL345モジュールの場合

image alt

▲画像引用元: https://www.klipper3d.org/Measuring_Resonances.html

この通りに接続する。ADXL345が必要なのは共振周波数の測定までなので、測定が終われば外してしまえる。

仮設の接続なので、半田付けの不要なブレッドボードなどで使うジャンパーケーブルを使うといいだろう。

Raspberry Pi側のGPIOはオスのピン。

image alt

ADXL345モジュールもオスのピンなので、ジャンパーケーブルは「メス-メス」タイプを使うことになる。設置状況によっては少し長めがいいかもしれない。

image alt

筆者が使ったジャンパーケーブルには「メス-メス」と「オス-オス」の両方が入っていて、これを交互に接続すると延長できた。

image alt
image alt

「ADXL345モジュール」-「メス-メス」-「オス-オス」-「メス-メス」-「Raspberry Pi」

このような接続にするということだ。

image alt

ソフトウェアのインストール

MainsailOSをインストールしたRaspberry Piにログインし、まずはPython用モジュールのnumpyをインストールする。

MainsailOSをインストールしたRaspberry Piへのログインに使用するアカウント/パスワードは、Raspbian同様だ。

  • ユーザー名: pi
  • パスワード: raspberry

▼Raspberry PiにSSHでログイン(IPアドレスは各々の環境に合わせ適宜読み換える)

1
ssh pi@192.168.1.50

numpyをインストール。

▼SSH経由で実行

1
~/klippy-env/bin/pip install -v numpy

numpyモジュールのインストールの過程でメモリを大量に必要とする。

Raspberry Piの方にMainsail OSのイメージを使っている場合はデフォルトでスワップが有効化されているので、Raspberry Pi Zero WHやRaspberry Pi 3 Type A+のような512MB RAMの機種でもnumpyのビルドは通るはずだ。

numpyが依存するパッケージをインストール。

▼SSH経由で実行

1
sudo apt install python-numpy python-matplotlib

以下の手順に従い、Raspberry Piで「linuxmcu」をセットアップ。

お節介かもしれないが、Google翻訳を通して日本語化しているので、読めば分かるはずだ。

「make menuconfig」で「Linuxプロセス」用に構成されたマイクロコントローラーコードをコンパイルする際の指定方法について、上記のページでは軽く触れられているだけだが、具体的には以下のように指定する。

image

image

「Why use RPi as a secondary MCU?」での手順が済んだら、raspi-configを実行。

▼SSH経由で実行

sudo raspi-config

「Interfacing options」から「P4 SPI」を選択し、Linux SPIドライバーを有効にする。

image alt
image alt

Mainsailに戻り(Webブラウザ経由でアクセス)、printer.cfgに以下を追加する。

▼MainsailOSでprinter.cfgを編集

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[mcu rpi]
serial: /tmp/klipper_host_mcu

[adxl345]
cs_pin: rpi:None

[resonance_tester]
accel_chip: adxl345
probe_points:
    90,90,20

「SAVE & RESTART」ボタンで設定変更を反映させる。

ADXL345の動作確認

これでADXL345から値を読み出すことができるようになったので読み出しテストをする。

MainsailのCONSOLEから以下のように実行する。

1
ACCELEROMETER_QUERY

すると以下のような結果が返ってくるはずだ。

1
Recv: // adxl345 values (x, y, z): 470.719200, 941.438400, 9728.196800

もし「Invalid adxl345 id (got xx vs e5),」といったエラーが返ってきた場合は接続の確認をした方がいい。筆者も接続するピンを一つ隣に間違えてしまったときにこのエラーに遭遇した。

続いて、MainsailのCONSOLEから以下を実行する。

1
MEASURE_AXES_NOISE

すると以下のような結果を得られるはずだ。

1
Axes noise for xy-axis accelerometer: 358.500414 (x), 560.415150 (y), 114.909879 (z)

各軸おおよそ1~100の間になれば問題ないが、1000、あるいはそれ以上の数字になる場合は、電源経由のノイズや、フィンのバランスが崩れたファン由来の振動が疑われるため、心当たりがあれば対処する。

筆者は以前動作中のヒートシンクファンに爪をぶつけ、フィンの一つを破損させてしまったため、それ由来の余計な振動があるようだ。

X軸の共振周波数の測定

X軸の共振周波数の測定を開始する。

image alt

printer.cfgの「max_accel」と「max_accel_to_decel」を10000に変更して「SAVE & RESTART」。

input_shaperが設定してあっても自動的に無効化されるので気にする必要はない。

1
2
3
[printer]
max_accel: 10000
max_accel_to_decel: 10000

ADXL345をX軸に取り付ける。

CONSOLEから以下を実行する。

1
TEST_RESONANCES AXIS=X

するとX軸の左右への往復運動が始まり、時間が経過するごとに速度を増していく。

テストが終わるとパス/tmpに「resonances_x_*.csv」という名前のファイルが出来る。

これをKlipper付属の処理スクリプトで処理し、グラフを作成する。

こちらはMainsailのCONSOLEではなく、Mainsail OSをインストールしたRaspberry Piにログインしてターミナルから実行する。

1
$ ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_x_*.csv -o /tmp/shaper_calibrate_x.png

処理中に表示されるメッセージは以下のようになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Fitted shaper 'zv' frequency = 130.2 Hz (vibrations = 15.8%, smoothing ~= 0.014)
To avoid too much smoothing with 'zv', suggested max_accel <= 66100 mm/sec^2
Fitted shaper 'mzv' frequency = 90.6 Hz (vibrations = 6.4%, smoothing ~= 0.028)
To avoid too much smoothing with 'mzv', suggested max_accel <= 24200 mm/sec^2
Fitted shaper 'ei' frequency = 128.6 Hz (vibrations = 6.6%, smoothing ~= 0.022)
To avoid too much smoothing with 'ei', suggested max_accel <= 30800 mm/sec^2
Fitted shaper '2hump_ei' frequency = 44.0 Hz (vibrations = 1.1%, smoothing ~= 0.279)
To avoid too much smoothing with '2hump_ei', suggested max_accel <= 2100 mm/sec^2
Fitted shaper '3hump_ei' frequency = 105.6 Hz (vibrations = 1.6%, smoothing ~= 0.073)
To avoid too much smoothing with '3hump_ei', suggested max_accel <= 8200 mm/sec^2
Recommended shaper is ei @ 128.6 Hz

最終行の「Recommended shaper is ei @ 128.6 Hz」に注目してほしい。これがテストの結果得られたInput Shaperの推奨設定。printer.cfg上の記述に変換すると以下のようになる。

1
2
3
[input_shaper]
shaper_freq_x: 128.6
shaper_type_x: ei

これさえ得られればグラフを見る必要はないが、このときに生成されたグラフは以下のようになる。

image

なお、テストで生成されたログや、それを処理して出来た画像は/tmpに保存されるが、/tmpはRAMディスク上に確保されているから再起動するとログが消失する点に注意が必要だ。

続いてY軸。Y軸はヒートベッドの方だ。ADXL345をヒートベッドに固定する。

image alt

MainsailのCONSOLEから以下を実行する。

1
TEST_RESONANCES AXIS=Y

するとY軸の前後への往復運動が始まり、時間が経過するごとに速度を増していく。

テストが終わるとパス/tmpに「resonances_y_*.csv」という名前のファイルが出来る。

これをKlipper付属の処理スクリプトで処理し、グラフを作成する。

X軸同様MainsailのCONSOLEではなく、Mainsail OSをインストールしたRaspberry Piにログインしてターミナルから実行する。

1
$ ~/klipper/scripts/calibrate_shaper.py /tmp/resonances_y_*.csv -o /tmp/shaper_calibrate_y.png

処理中に表示されるメッセージは以下のようになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Fitted shaper 'zv' frequency = 124.8 Hz (vibrations = 25.0%, smoothing ~= 0.015)
To avoid too much smoothing with 'zv', suggested max_accel <= 60700 mm/sec^2
Fitted shaper 'mzv' frequency = 83.4 Hz (vibrations = 0.8%, smoothing ~= 0.032)
To avoid too much smoothing with 'mzv', suggested max_accel <= 20500 mm/sec^2
Fitted shaper 'ei' frequency = 109.4 Hz (vibrations = 2.4%, smoothing ~= 0.029)
To avoid too much smoothing with 'ei', suggested max_accel <= 22300 mm/sec^2
Fitted shaper '2hump_ei' frequency = 99.4 Hz (vibrations = 0.0%, smoothing ~= 0.056)
To avoid too much smoothing with '2hump_ei', suggested max_accel <= 11000 mm/sec^2
Fitted shaper '3hump_ei' frequency = 121.2 Hz (vibrations = 0.0%, smoothing ~= 0.057)
To avoid too much smoothing with '3hump_ei', suggested max_accel <= 10800 mm/sec^2
Recommended shaper is mzv @ 83.4 Hz

最終行の「Recommended shaper is mzv @ 83.4 Hz」に注目してほしい。これがテストの結果得られたInput Shaperの推奨設定。printer.cfg上の記述に変換すると以下のようになる。

1
2
3
[input_shaper]
shaper_freq_y: 83.4
shaper_type_y: mzv

これさえ得られればグラフを見る必要はないが、このときに生成されたグラフは以下のようになる。

image

まとめると、このX軸、Y軸のテストで得られた結果をprinter.cfgに反映すると以下のようになる。

1
2
3
4
5
[input_shaper]
shaper_freq_x: 128.6
shaper_type_x: ei
shaper_freq_y: 83.4
shaper_type_y: mzv

プリントテストと調整は、以下のページを参照のこと。