Klipperの重要な機能の一つであるinput shaperによるリンギング(ゴースティング)消し。
Klipperの導入記事では、テストプリントに表れたリンギングを目視とノギスで観察・調査することによってinput shaperに設定する共振周波数を割り出した。
このほか、加速度センサーを使ったやり方もあるので、その方法を紹介する。
Klipper公式サイトの当該テーマの解説は以下だ。
Klipperがサポートする加速度センサーはSPI接続対応のADXL345だけ。
まずはそれを入手する。
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を固定するためのマウンターを作成した。
ただし、これはKINGROON KP3S 1.0用なので、3.0用のマウンターは適宜用意してほしい。
このモジュールの場合、シルク印刷「ADXL345」が手前方向を向くとX、Y、Z軸が一致する。
以下からSTLファイルがダウンロード可能だ。
X軸はエクストルーダーのステッピングモーターの上に固定。
Y軸、つまりヒートベッドの場合は、X軸への固定に使ったマウンターを流用し、ベッドにクリップで止められるようにする親マウンターで固定するようにした。
X軸は既存のネジで共締めするので追加の部品は不要だが、Y軸用の親マウンターとの固定には、M3のネジとナット1〜2組が必要になる。
ADXL345モジュールとRaspberry Piとの接続
ADXL345とRaspberry Piとの接続については公式サイトに接続図がある。
Raspberry PiシリーズのGPIOのピンは基板の端に位置し、配列は全機種同じだ。1番ピン(3V3 power)側が基板の内側になる。
▼Raspberry PiとADXL345モジュールとの接続ピン対応表
ADXL345 のピン | Raspberry Pi のピン | Raspberry Pi のピン名 | |
---|---|---|---|
3V3 (またはVCC) | → | 01 | 3.3V DC電源 |
GND | → | 06 | GND |
CS | → | 24 | GPIO08 (SPI0_CE0_N) |
SDO | → | 21 | GPIO09 (SPI0_MISO) |
SDA | → | 19 | GPIO10 (SPI0_MOSI) |
SCL | → | 23 | GPIO11 (SPI0_SCLK) |
▼Raspberry PiのGPIOピン配列
▲画像引用元: https://www.raspberrypi.org/documentation/usage/gpio/README.md
▼Raspberry PiとADXL345モジュールとの接続ピン接続実体図: パターン1
9ピンのADXL345モジュールの場合
▲画像引用元: https://www.klipper3d.org/Measuring_Resonances.html
▼Raspberry PiとADXL345モジュールとの接続ピン接続実体図: パターン2
8ピンのADXL345モジュールの場合
▲画像引用元: https://www.klipper3d.org/Measuring_Resonances.html
この通りに接続する。ADXL345が必要なのは共振周波数の測定までなので、測定が終われば外してしまえる。
仮設の接続なので、半田付けの不要なブレッドボードなどで使うジャンパーケーブルを使うといいだろう。
Raspberry Pi側のGPIOはオスのピン。
ADXL345モジュールもオスのピンなので、ジャンパーケーブルは「メス-メス」タイプを使うことになる。設置状況によっては少し長めがいいかもしれない。
筆者が使ったジャンパーケーブルには「メス-メス」と「オス-オス」の両方が入っていて、これを交互に接続すると延長できた。
「ADXL345モジュール」-「メス-メス」-「オス-オス」-「メス-メス」-「Raspberry Pi」
このような接続にするということだ。
ソフトウェアのインストール
MainsailOSをインストールしたRaspberry Piにログインし、まずはPython用モジュールのnumpyをインストールする。
MainsailOSをインストールしたRaspberry Piへのログインに使用するアカウント/パスワードは、Raspbian同様だ。
- ユーザー名: pi
- パスワード: raspberry
▼Raspberry PiにSSHでログイン(IPアドレスは各々の環境に合わせ適宜読み換える)
|
|
スワップを拡大する。設定ファイルを編集。まずテキストエディタでファイルを開く。
「CONF_SWAPSIZE=100」という行を探し、1024に増やす。その後にCtrl+O、リターン、Ctrl+Xと続けて保存終了。
▼SSH経由で実行
|
|
次のように実行して、増やしたスワップの設定を反映させる。
▼SSH経由で実行
|
|
次のように実行して、スワップの状況を確認。Sizeが1048572になっていたらOK。
▼SSH経由で実行
|
|
numpyをインストール。(オリジナルのガイドでは「~/klippy-env/bin/pip」にあるpipを使うとあるが、サポートが切れているのでPython3用のpipを別途インストールする)
▼SSH経由で実行
|
|
numpyモジュールのインストールの過程でメモリを大量に必要とする。
Raspberry Piの方にMainsail OSのイメージを使っている場合はデフォルトでスワップが有効化されているが、100MBしか確保しておらず、Raspberry Pi Zero WHやRaspberry Pi 3 Type A+のような512MB RAMの機種ではnumpyのビルドが怪しいため、先述の手順でスワップを1024MBに増やした次第だ。
Python2の時代は100MBで足りていたが、Python3への移行で厳しくなったようだ。
numpyが依存するパッケージをインストール。
▼SSH経由で実行
|
|
以下の手順に従い、Raspberry Piで「linuxmcu」をセットアップ。
お節介かもしれないが、Google翻訳を通して日本語化しているので、読めば分かるはずだ。
「make menuconfig」で「Linuxプロセス」用に構成されたマイクロコントローラーコードをコンパイルする際の指定方法について、上記のページでは軽く触れられているだけだが、具体的には以下のように指定する。
「Enable extra low-level configuration options」のチェックを外して「Linux Process」にチェックを入れる。
「Why use RPi as a secondary MCU?」での手順が済んだら、raspi-configを実行。
▼SSH経由で実行
「Interfacing options」から「P4 SPI」を選択し、Linux SPIドライバーを有効にする。
Mainsailに戻り(Webブラウザ経由でアクセス)、printer.cfgに以下を追加する。
▼MainsailOSでprinter.cfgを編集
|
|
「SAVE & RESTART」ボタンで設定変更を反映させる。
ADXL345の動作確認
これでADXL345から値を読み出すことができるようになったので読み出しテストをする。
MainsailのCONSOLEから以下のように実行する。
|
|
すると以下のような結果が返ってくるはずだ。
|
|
もし「Invalid adxl345 id (got xx vs e5),」といったエラーが返ってきた場合は接続の確認をした方がいい。筆者も接続するピンを一つ隣に間違えてしまったときにこのエラーに遭遇した。
続いて、MainsailのCONSOLEから以下を実行する。
|
|
すると以下のような結果を得られるはずだ。
|
|
各軸おおよそ1~100の間になれば問題ないが、1000、あるいはそれ以上の数字になる場合は、電源経由のノイズや、フィンのバランスが崩れたファン由来の振動が疑われるため、心当たりがあれば対処する。
筆者は以前動作中のヒートシンクファンに爪をぶつけ、フィンの一つを破損させてしまったため、それ由来の余計な振動があるようだ。
X軸の共振周波数の測定
X軸の共振周波数の測定を開始する。
printer.cfgの「max_accel」と「max_accel_to_decel」を10000に変更して「SAVE & RESTART」。
input_shaperが設定してあっても自動的に無効化されるので気にする必要はない。
|
|
ADXL345をX軸に取り付ける。
CONSOLEから以下を実行する。
|
|
するとX軸の左右への往復運動が始まり、時間が経過するごとに速度を増していく。
テストが終わるとパス/tmpに「resonances_x_*.csv」という名前のファイルが出来る。
これをKlipper付属の処理スクリプトで処理し、グラフを作成する。
こちらはMainsailのCONSOLEではなく、Mainsail OSをインストールしたRaspberry Piにログインしてターミナルから実行する。
|
|
処理中に表示されるメッセージは以下のようになる。
|
|
最終行の「Recommended shaper is ei @ 128.6 Hz」に注目してほしい。これがテストの結果得られたInput Shaperの推奨設定。printer.cfg上の記述に変換すると以下のようになる。
|
|
これさえ得られればグラフを見る必要はないが、このときに生成されたグラフは以下のようになる。
なお、テストで生成されたログや、それを処理して出来た画像は/tmpに保存されるが、/tmpはRAMディスク上に確保されているから再起動するとログが消失する点に注意が必要だ。
続いてY軸。Y軸はヒートベッドの方だ。ADXL345をヒートベッドに固定する。
MainsailのCONSOLEから以下を実行する。
|
|
するとY軸の前後への往復運動が始まり、時間が経過するごとに速度を増していく。
テストが終わるとパス/tmpに「resonances_y_*.csv」という名前のファイルが出来る。
これをKlipper付属の処理スクリプトで処理し、グラフを作成する。
X軸同様MainsailのCONSOLEではなく、Mainsail OSをインストールしたRaspberry Piにログインしてターミナルから実行する。
|
|
処理中に表示されるメッセージは以下のようになる。
|
|
最終行の「Recommended shaper is mzv @ 83.4 Hz」に注目してほしい。これがテストの結果得られたInput Shaperの推奨設定。printer.cfg上の記述に変換すると以下のようになる。
|
|
これさえ得られればグラフを見る必要はないが、このときに生成されたグラフは以下のようになる。
まとめると、このX軸、Y軸のテストで得られた結果をprinter.cfgに反映すると以下のようになる。
|
|
プリントテストと調整は、以下のページを参照のこと。