Klipperの活用による速度と品質改善

KlipperというKINGROON KP3Sでも利用可能なオープンソースの3Dプリンター用ファームウェアがある。

Klipperは、ステッピングモーターの高度な制御で3Dプリンターのヘッドを移動させるときの加減速を柔らかに行ない、速度耐性を高めハイスピードなプリントを実現するほか、ヘッドを高速に動かしたときに生じるリンギング(ゴースト)をキャンセルする高度な制御機能も持っており、スピードの追求と造形物の品質維持を同時にこなすことができる。

image alt
▲Klipperの持つinput shaperによるリンギング消し: 加速度7000、100mm/sというリンギングが目立ちやすい条件でリンギング消しのありなしの差を確かめた

これまでの常識を知っていれば知っているほど俄かには信じがたいかもしれないが、現実に顕著な実績を残している。

例えば、KINGROON KP3Sで100mm/sが実用域に入る。

3Dプリンターの性能のボトルネックは、ファームウェアにもあったと気づかされる。

従って、KINGROON KP3Sの造形速度の向上や造形品質の向上を願うなら使わない手はない。

動いているのを感じさせないほどの高度な加速度制御をする高層ビルのエレベーターや、上手な運転手のスムーズな運転に感心した経験はないだろうか? それを3DプリンターでやろうというのがKlipperだ。

アニメーションの知識があれば、Ease-In、Ease-Outを引き合いに出すとピンとくるかもしれない。

ただし、それには高度な計算能力が必要なため、3Dプリンターの外に、計算を担当するコンピューターを必要とする。

3Dプリンター自体にインストールするファームウェアKlipperに加え、それをコントロールするRaspberry Piなどにインストールするソフトウェア、Mainsailを組み合わせて一つのソリューションを構成する。

KINGROON KP3SにはKlipperのファームウェアをインストール。

Raspberry PiにはMainsailをインストールし、Raspberry PiとKINGROON KP3SをUSBケーブルで接続して動かすというのが典型的なパターン。

MainsailはWeb UIを持ち、パソコンからWebブラウザを使って操作をすることができる。

image alt

KlipperはKP3Sの液晶に対応していないため、KP3Sの液晶には何も映らない。Raspberry Pi側に液晶をつながない限り、操作はWeb UI頼みとなる。

しかし、普段からOctoPrint経由でしか操作をしない筆者的にはあまり困っていない。

image alt

ちょうど、KINGROON KP3Sに接続するRaspberry PiにOctoPrintをインストールして動かしたときと物理的な接続は同じで、中身のソフトウェアが異なるだけだ。

image alt

WiFi機能を搭載したRaspberry Piにインストールすることになるので、OctoPrint同様、KINGROON KP3SをWiFi経由で動かすこともできるようになる。

Klipper環境にOctoPrintを共存させて、つまりRaspberryPi側にMainsailとOctoPrintをいっしょにインストールして動かすこともできる。

もっとも、Web経由で操作できるMainsailはOctoPrint同様の基本機能を備えるので、特定の目的がなければOctoPrintをインストールする必要性を感じないかもしれないが。

必要なもの

balenaEtcher

ディスクイメージをMicro SDに書き込むソフトウェア。macOS版、Windows版がある。

Raspberry Pi

言わずと知れた小さなコンピューターRaspberry Pi。

筆者はRaspberry Pi 3 Model A+とRaspberry Pi Zero WHを使っている。

Raspberry Pi Zero WHはスペックが低く、Web UIが沈黙するなど非推奨。最低Raspberry Pi 3 Model A+はあった方がいい。Raspberry Pi 4なら間違いない。

Micro SDカード

Raspberry Piで使うMicro SDカード。ここにMainsailOSをインストールする。

KINGROON KP3Sの扱うデータはそれほど大きくないので、8GBもあれば十分。

s

Micro USB OTGケーブル

Raspberry Pi Zero WHを使う場合、Micro USB端子しか付いていないので、KINGROON KP3Sをつなぐ際に必要になる。

Raspberry Pi 3 Model A+、Raspberry Pi 4の場合は不要。

HDMI-HDMI mini変換アダプタ

IPアドレスを調べるのに手っ取り早いので、モニターに画面を出した方がいい。

Raspberry Pi Zero WHをセットアップする際にはHDMIアダプタがあった方がいい。

Raspberry Pi 3 Model A+の場合は標準サイズのHDMI端子が付いているので不要。

HDMI-マイクロHDMI変換アダプタ

Raspberry Pi 4はMicro HDMI端子なので、モニターを接続する場合はHDMI-マイクロHDMI変換アダプタが必要。

加速度センサーADXL345(SPIインターフェース対応)

input shaperによるリンギング除去のための共振周波数を割り出すのに加速度センサーを使う場合は必要。加速度センサーなら何でもいいわけではなく、SPI接続できるADXL345だけがKlipper/Mainsailにサポートされている。

ADXL345なしでもinput shaperの共振周波数を調べることはできるが、効果の絶大さを知ると精度を求めて買わずにはおれなくなるはずだ。

ADXL345モジュールをRaspberry PiのGPIOに接続するのに必要。必要なのは、input shaperの共振周波数を割り出すまでで、終わればADXL345モジュールは取り外すことができるために仮設で構わない。

KlipperのKINGROON KP3Sでの利用方法

KINGROON KP3SでのKlipperの利用方法は、基本的には、以下の二つの記事を読めば分かる。

本記事はそれをいち早くセットアップするために意図的に省略しつつ解説しているところがある。

Mainsailは、Raspberry Piで使えるディスクイメージであるMainsailOSを利用すると簡単に導入できる。

記事執筆時点では、MainsailOSは0.3.0が最新版。

ダウンロードしたzipを解凍して得たディスクイメージファイルmainsailos-raspios-lite-latest.imgを、balenaEtcherなどでMicro SDカードに書き込む。

image alt

書き込みが終了したら、いったんMicro SDカードを抜いた後、またパソコンに挿入すると「boot」というボリュームがマウントされる。

image alt

この中にある「mainsailos-wpa-supplicant.txt」をテキストエディタで編集して、Raspberry PiがWiFiアクセスポイントにつながるように設定する。

image alt

「mainsailos-wpa-supplicant.txt」の中に以下のような部分がある。

1
2
3
4
5
## WPA/WPA2 secured
#network={
#  ssid="put SSID here"
#  psk="put password here"
#}

「network={」以降3行の行頭の「#」を消し、WiFiアクセスポイントのSSIDとパスフレーズを記入する。

1
2
3
4
5
## WPA/WPA2 secured
network={
  ssid="XXXXXXXXXXXX"
  psk="XXXXXXXXXXX"
}

これは要するに家のWiFiルータに接続するための設定だ。

「ssid=“XXXXXXXXXXXX”」のところに「XXXXXXXXXXXX」を置き換える形で自宅の2.4GHz帯のWiFiルータのSSIDを。

「psk=“XXXXXXXXXXX”」のところに「XXXXXXXXXXXX」を置き換える形で自宅のWiFiルータのパスフレーズ(パスワード)を。

多くのRaspberry Pi内蔵WiFiモジュールは5GHz帯には対応していないので注意だ。

ここまで終わったら「mainsailos-wpa-supplicant.txt」の編集内容を保存。

Raspberry PiにHDMIケーブルでモニターを接続。MainsailOSを書き込んだMicro SDカードを挿入して、起動する。

モニターにIPアドレスが表示されるので、WiFiルータのDHCPリース情報からIPアドレスを参照し、IPアドレスを手動割当に変更、つまりRaspberry PiのIPアドレスを固定にする。

image alt

ターミナルからRaspberry Piにsshでログインする場合、ユーザー名とパスワードはRaspbianと同じだ。

ユーザー名pi
パスワードraspberry
1
$ ssh pi@IPアドレス

Update Managerでアップデートできるものはアップデート

固定したIPアドレスにWebブラウザでアクセス。

Web UIにアクセスしたら、左上のハンバーガーメニューをクリック。

image alt

「SETTINGS」をクリック。

image alt

「Update Manager」でアップデートできるものはすべてアップデート。

image alt

KINGROON KP3Sのファームウェアを書き換え

KINGROON KP3S用のファームウェアKlipperをインストール。

Micro SDカードのルートディレクトリに上記zipを解凍して得たRobin_nano.binをコピーして、KINGROON KP3SのMicro SDカードスロットに挿入。

しかる後にKINGROON KP3Sの電源をオン。

アップデート処理の後に自動的に再起動しKlipperが動き始めるが、液晶には何も映らない。何も映らないのが正常だ。

image alt

公式ファームウェア、Marlinなどへはいつでも戻せる。 通常通り、書き換えの手順を踏むだけだ。

MainsailにKINGROON KP3S用のprinter.cfgを登録

MainsailのWeb UIにWebブラウザでアクセスし、メニュー「ハンバーガーメニュー>SETTINGS」を選択。

「Config Files」にあるアップロードボタンをクリック。

image alt

以下からダウンロードし、解凍して得たprinter.cfgをアップロードする。

これは筆者が使っているprinter.cfgそのものだ。

マニュアルベッドレベリング版は追って用意するつもりだ。筆者のKlipperをインストールしたKP3Sの現況は以下の通り。

  • MK8エクストルーダー版
  • 3D Touch装備
  • 3D Touchのノズルとの相対位置: X-31 Y0
  • Safe Homing有効

ホットエンドは改造済みで以下のようになっている。

3D Touchの取り付け位置が違う場合は、printer.cfgの以下の部分を変更する。

1
2
3
4
5
6
7
[bltouch]
sensor_pin: ^PC4
control_pin: PA8
# probe_with_touch_mode: True # for original BLTouch v 3.0
x_offset: -31 
y_offset: 0
#z_offset: 3.5

Mainsailのメニュー「ハンバーガーメニュー>SETTINGS」のConfig Filesのリスト上アップロードしたprinter.cfgが見える。

これをクリックすると、その場で編集できる。

編集を終了させたら、右上にある「SAVE & RESTART」を押すとprinter.cfgの変更が保存され、ファームウェアがリスタートし、変更が反映される。

なお、z_offsetはMarlin、公式ファームウェアでは通常マイナスの値を設定するが、Klipperではプラスの数値になるので注意が必要だ。

mesh_min、mesh_maxも3D Touch取り付け位置に依存している。

純正の3D Touchブラケットを使った場合のX27.5の場合は「mesh_min: 27.5,5」「mesh_max: 170,170」となるか?未確認。

1
2
3
4
5
6
7
8
9
[bed_mesh]
speed: 150
horizontal_move_z: 6
mesh_min: 5,5
mesh_max: 145,170
algorithm: bicubic
probe_count: 4,4
fade_start: 1
fade_end: 10

3D Touchの取り付け位置はsafe_z_homeのhome_xy_positionにも影響する。

ベッドの中央は90,90だが筆者の3D Touch取り付け位置はX-31なので90+31でXを121にした。

純正の3D Touchブラケットを使った場合は、90-27.5で62.5,90になるはずだ。

1
2
3
4
5
[safe_z_home]
home_xy_position: 121,90
speed: 50
z_hop: 10
z_hop_speed: 15

リンギング消しのためのinput_shaperはキャリブレーションしないといけないので、行頭に「#」を置いてコメントアウトしておいた方がいい。

1
2
3
4
[input_shaper]
shaper_freq_x: 41.4
shaper_freq_y: 29.2
shaper_type: mzv


1
2
3
4
[input_shaper]
#shaper_freq_x: 41.4
#shaper_freq_y: 29.2
#shaper_type: mzv

input_shaperのキャリブレーションについては後半に書いた。

KP3SとRaspberry Piの接続

KP3SのファームウェアをKlipperに書き換え、Mainsailの方にprinter.cfgを登録したらKP3SとRaspberry PiをUSBケーブルで接続。

image alt

Mainsailの、「FIRMWARE RESTART」ボタンをクリックすると、両者の接続が完了するはずだ。

接続がうまくいかなければ、「RESTART」の方も押してみる。

3D Touchとマザーボードとの接続

筆者のprinter.cfgの3D Touch(BLTouch)の設定は、マザーボードのZ+(Z-Max)に3D Touchを接続することを前提としている。

1
sensor_pin: ^PC4
image alt

これは、KINGROON公式の3D Touch対応ファームウェア同梱のインストラクションの記述に準拠したものだ。

ちなみに、Z-(Z-Min)に接続してある場合は恐らく下記のような設定になるはずだ。

1
sensor_pin: ^PA11

3D Touchによる自動ベッドレベリング(オートレベリング)

ノズルの温度を現在セットしているフィラメントの使用温度までMainsailのWeb UIを使って上げる。

MainsailのConsoleから、まず以下のように実行してノズルの先端と3D Touchのプローブの反応位置との高さの差を調べる。ベッドの上にコピー用紙を敷いて、ノズルの先端とベッドの間隔が、擦る感覚はあるが、コピー用紙が動かせないほどではないところまでノズルを下げていく。

「TESTZ Z=-1」というコマンドをSENDするとノズルが1mm下がる。「TESTZ Z=-0.1」とすれば-0.1mmだ。つまり、3.のコマンドをノズルの先端とベッドの間隔が適切になるまで繰り返し実行していくことになる。

過去に実行したコマンドはカーソルの上で呼び出せるので、いちいち打ち直す必要はない。

  1. G28
  2. PROBE_CALIBRATE
  3. TESTZ Z=-1
  4. ACCEPT
  5. SAVE_CONFIG

間隔が適切になったと感じたら、4.を実行すると、「bltouch: z_offset: 3.000」といった感じのオフセットの設定が表示され、5.を実行するか?と聞かれるので実行。

すると、その設定がprinter.cfgの最後のSAVE_CONFIGセクションに保存される。

公式ファームウェアやMarlinのように3DプリンターのEEPROMは使わず、printer.cfgで一元管理するようになっているので分かりやすい。

オートレベリングはMainsailのConsoleから以下を実行したり、スライサーのスタートコードに以下のように追記すると開始できる。

1
2
G28
G29

自動ベッドレベリングの結果できるメッシュデータもまた、「SAVE_CONFIG」を実行するとprinter.cfgのSAVE_CONFIGセクションに保存される。MarlinでいうM500のようなものだ。

プリントテストをしてみて、ベッドとノズルの間隔が適切でなければ、printer.cfgのSAVE_CONFIGセクションにある「bltouch: z_offset: 3.000」を調節する。

前述の通り、公式ファームウェア、Marlinとは補正値のプラス、マイナスが逆な点に注意。

現象対処
現在の状態bltouch: z_offset: 3.000
ノズルとベッドの間隔が広すぎるbltouch: z_offset: 3.100
(数字を増やす)
ノズルとベッドの間隔が狭すぎるbltouch: z_offset: 2.900
(数字を減らす)
image alt

なお、KlipperにはG29がなく、printer.cfgで定義したマクロによって実装している。

1
2
3
[gcode_macro G29]
gcode:
    BED_MESH_CALIBRATE

リンギング緩和のためのinput shaperの共振周波数の割り出しと設定

3Dプリンターで高速プリントを実行すると、ヘッドの振動が造形物に影響を与え、リンギング(ゴースト)という造形不良を起こしてしまう。

これは超高速域に限らず、ヘッドが急激に角度を変えて動く場所では常識的なプリント速度でも起きる。

通常はリンギングを緩和する場合はプリント速度を落とすが、Klipperではあらかじめリンギングが起きることを予想して、それを打ち消すようステッピングモーターを制御するという凄いことをやってしまう。

ノイズキャンセリングヘッドホンの原理と似たところがある。

ヘッドの構造やベルトのテンションが同じなら共振周波数は変わらないので、わざとリンギングを起こし、できたリンギングの様子から共振周波数を割り出してprinter.cfgのinput_shaperに設定するということをやる。

加速度センサーを使ってやる方法もあるが、ここでは加速度センサーを使わずに原始的な方法で共振周波数を割り出す方法を紹介する。

公式サイトの解説ページは以下だ。

Google翻訳経由:

リンギングを故意に発生させるテストプリント

以下からringing_tower.stlをダウンロードする。

ダウンロード: ringing_tower.stl

これをUltimaker Curaでスライスする。

ダウンロードしたringing_tower.stlをUltimaker Curaに読み込み、花瓶モードに設定する。

具体的には、設定の最後の方にある「Special Modes」の中にある以下の2項目を設定変更する。

  • 「Spiralize Outer Contour」の✔︎をオン
  • 「Surface Mode」を「Surface」に
image alt

読み込んだモデルは回転させない。そのままプリントする。

そのほか、設定するパラメーターは以下のような感じだ。

  • レイヤーは0.2mmもしくは0.25 mm
  • Speedは100mm/s
  • Wall Speedも100mm/sにして減速しない
  • Initial Layer Speedは20mm/s程度に下げて定着はきちんとやる
  • Brimを付けて定着を促進する
image alt

これでG-codeを書き出す。

Mainsailに読み込むとすぐプリントが始まってしまうので、Mainsailに持っていくのは後だ。

Mainsail側で、まずprinter.cfgを編集する。

  • max_accel と max_accel_to_decel を7000に変更
  • square_corner_velocity が5.0であることを確認

「SAVE & RESTART」ボタンを押してファームウェアの再起動をかける。

MainsailのConsoleから次のように実行する。

1
2
3
SET_PRESSURE_ADVANCE ADVANCE=0
SET_INPUT_SHAPER SHAPER_FREQ_X=0 SHAPER_FREQ_Y=0
TUNING_TOWER COMMAND=SET_VELOCITY_LIMIT PARAMETER=ACCEL START=1250 FACTOR=100 BAND=5

ringing_tower.stlから書き出したG-codeを「UPLOAD & PRINT」ボタンからMainsailに読み込んでプリントを開始する。

結果の計測

プリントしたモデルのリンギングの部分を観察する。

ピッチの安定した周期的な波になっている、しかも視認しやすい範囲を見つけ、その両端の波の出っ張りの頂上にマークを付ける。

そのマークからマークへの長さを測る。

image alt

筆者の場合はX軸が12.08mm、Y軸が10.28mmだった。

また、マークをした範囲に存在する波の谷間の数を数える。この画像の場合、Xが5つ。

image alt

Yが3つとなった。

image alt

共振周波数の算出

この結果から、input_shaperに設定する共振周波数を算出する。

プリントスピード × 波の谷間の数 ÷ 波の頂上から頂上の距離
  • X軸: 100 × 5 ÷ 12.08 = 41.39072848 ≒ 41.4
  • Y軸: 100 × 3 ÷ 10.28 = 29.18287938 ≒ 29.2

さきほど「#」でコメントアウトしたところをまた書き換える。

1
2
3
4
[input_shaper]
shaper_freq_x: 41.4
shaper_freq_y: 29.2
shaper_type: mzv

shaper_typeはいくつかのタイプから選択できるが、とりあえずmzvを適用して様子を見る。

編集を終えたら「SAVE & RESTART」で変更を反映させる。

input_shaper適用結果の確認

input_shaperの適用のほかはそのままの条件で、もう一度ringing_tower.stlをプリントして効果を測定する。

MainsailのConsoleから今度は以下を実行し、しかる後にプリントを開始する。

1
2
SET_PRESSURE_ADVANCE ADVANCE=0
TUNING_TOWER COMMAND=SET_VELOCITY_LIMIT PARAMETER=ACCEL START=1250 FACTOR=100 BAND=5

printer.cfgで設定したinput_shaperの効果を打ち消さないように、以下は実行しない違いがある点に注意だ。

1
SET_INPUT_SHAPER SHAPER_FREQ_X=0 SHAPER_FREQ_Y=0

input_shaperのありなしの比較が以下となる。複数の周波数で振動しているため、input_shaperでターゲットとした振動しか消えていないが、効果は顕著だ。

image alt

実用スピードの模索

実用スピードをどこに持っていくかに関しては、ringing_tower.stlが参考になる。

テストプリントではmax_accel、max_accel_to_decelを1250から始めて徐々に増やしていっているが、あるところから0.1mmの間隔を保つべきところが、加速に耐えられず隙間が大きくなってしまっている。こうならないギリギリのところを狙っていくわけだ。

image alt

筆者は100mm/sをターゲットにmax_accel、max_accel_to_decelが1250なら問題ないだろうということで、安易にその辺りに決めてしまった。

1
2
3
4
5
6
7
8
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 1250
max_accel_to_decel: 1250
max_z_velocity: 25
max_z_accel: 100
square_corner_velocity: 5.0

これを150mm/sにすると、max_accel、max_accel_to_decelが1250だと隙間が大きくなってしまうので、下げる必要があった。

いろいろ試行錯誤してみてほしい。

より良い結果を出したければ公式サイトを参照しながら試行錯誤をする。

Google翻訳経由:

KP3S本体側の改良

ベルトテンショナーでベルトのテンションを上げると、高速プリントへの耐性が上がる。

テンションを上げるだけでinput_shaperで消えない造形物表面の縞が消えることもある。

ただし、やり過ぎるとステッピングモーターの軸が曲がるので注意。

テンションを変えると共振周波数が変わるので、共振周波数の測定がやり直しになる点に注意が必要だ。

ヘッドの軽量化も当然ながら効果がある。パンケーキステッパーとコンビのTitanエクストルーダーは期待値が高い。

X軸用ベルトテンショナー

Y軸用ベルトテンショナー

加速度センサーADXL345を使った共振周波数の測定

ADXL345を使った共振周波数の測定については、以下に解説がある。

Google翻訳経由:

OctoPrint互換APIの有効化

printer.cfgと同じ方法でmoonraker.cfgというWebAPIの設定ファイルを編集する。

末尾に以下を追記して「SAVE & RESTART」ボタンを押すと、OctoPrint互換APIが有効化される。

1
[octoprint_compat]

セクションの宣言だけのように見えるが、これでいい。

Ultimaker Curaとの連携

Ultimaker Curaとの連携は以下の記事が参考になるはずだ。

ただし、本家と異なりBonjourによるオートディスカバリーは効かないので、手動で「Add」する。

「Instance Name」は自分で決める。

また、でたらめでいいのでAPI Keyを何でもいいので入力すること。

image alt

Simplify3Dとの連携

macOSの場合、Simplify3Dの「スクリプト」に以下のように設定すると、G-codeの書き出しと同時にMainsailにアップロードが開始され、WebブラウザでMainsailが表示される。

Windowsの場合は、「open」を「explorer」ないしブラウザの実行ファイルにする。

IPアドレスは筆者環境の192.168.1.50としているが、各自で実態に合わせて設定すべき部分だ。

1
2
curl -k -F "select=true" -F "print=false" -F "file=@[output_filepath]" "http://192.168.1.50/api/files/local" {STRIP "; postProcessing"}
open http://192.168.1.50/

なお、“print=false” というフラグを付けているのでプリントは開始されない。

アップロード=プリント開始という使い方をしたいなら"print=true"とすればいい。

スマートプラグによる電源管理

Klipper環境のWeb APIを司るMoonrakerは、TP-Linkのスマートプラグによる電源管理に対応している。[power]の項を参照。

HS105はN極が長いので普通のコンセントに刺さらない。これも必要。

参考情報

https://www.klipper3d.org/Features.html
https://www.klipper3d.org/Bed_Level.html
https://www.klipper3d.org/Resonance_Compensation.html
https://github.com/nehilo/klipper_KP3S
https://github.com/eriroh/KP3S-Klipper
https://github.com/asosnoviy/klipper_KP3S
https://www.kevink.org/calibrate-z-offset-with-klipper/
https://3dprintbeginner.com/how-to-install-klipper-on-kingroon-kp3s/
https://3dprintbeginner.com/how-to-install-mainsailos-on-raspberry-pi/

Web API

https://moonraker.readthedocs.io/en/latest/web_api/#file-uploads
https://github.com/Arksine/moonraker/blob/master/docs/web_api.md
https://github.com/Arksine/moonraker/blob/master/docs/configuration.md