3D Touchで自動ベッドレベリング

KINGROON KP3Sは、超低価格プリンターには珍しく3D Touchによる自動ベッドレベリング(オートレベリング)に対応している。

image alt

マザーボードであるKingRoon KP3 V1.2(MKS Robin Nanoベース)には3D Touch用の端子が付いている。

3D Touch対応のファームウェアが提供されており、また、3D Touch用のブラケットのSTLデータが3D Touch対応のファームウェアに同梱されている。

image alt

3D Touchの、マザーボードへの接続方法を解説するドキュメントも、この3D Touch対応のファームウェアに同梱されている。

KINGROON KP3Sのヒートシンクを囲むフレームには、3D Touchブラケット取り付け用のネジ穴が開いている。(Titanエクストルーダー仕様を除く)

image alt

3D Touchによる自動ベッドレベリング(オートレベリング)の意義と仕組み

手動によるベッドレベリングについては以下のページで書いた。

3D Touchという別売りの周辺機器を取り付けると、これを自動化できるのだ。

スライサーのスタートコードに自動ベッドレベリング(オートレベリング)の実行行を挿入しておくと、プリント直前に毎回レベリングを実施することも可能となり、プリントが安定する。

3D Touchの導入は、単にレベリングを自動化するにとどまらず、メッシュレベリングができるようになることも意味する。

メッシュレベリングは、ヒートベッドの平坦度があまりよろしくないKINGROON KP3Sの欠点を補う効果をもたらす。

ダイソー、セリアの鏡をガラスプレートとして使う場合も同様。

以下の動画を見ると分かるが、9回(※)プローブをベッド面に接触させてレベリングを行なっている。

(※: 設定で増やすことも可能)

これにより、地点毎の測量を行ない、いわばベッドの立体地図を作成するというのがメッシュレベリングの意味だ。

この立体地図に基づき、プリント時にヘッドの位置をリアルタイムに上下させることでノズルとベッドとの間隔を一定に保ち、定着を改善させることが可能となる。

この様子は、プリント時のZ軸のリードスクリューの動きを見ていると分かる。

層間移動時以外も、常にリードスクリューが動くようになる。

3D Touch選びの注意点

大変便利な3D Touchによる自動ベッドレベリング(オートレベリング)だが、注意したいのは正常に動かない3D Touchがあることだ。

3D TouchはAliExpress、日本のAmazonで買うことができるが、AliExpressのKINGROON Official Storeで販売されている3D Touch以外の場合、動かない可能性がある。

従って、3D TouchはAliExpressのKINGROON Official Storeで販売されているものを買うことが大事だ。

▼KINGROON純正3D Touch

image alt
image alt

動かない3D Touchの例

筆者はAliExpressのTrianglelabで販売されている3D TouchをKINGROON KP3Sに接続したが、正常に動かなかった。

M280 P0 S120のセルフテストは動くが、M280 P0 S10のピンダウンが動かないといった動作状況だ。

1
2
3
M280 P0 S10 ; pushes the pin down
M280 P0 S90 ; pulls the pin up
M280 P0 S120 ; Self test – keeps going until you do pin up/down or release alarm

この問題をオシロスコープで調査した井上藍莉氏によると、ピンダウンは本来信号幅が650usのところ、KP3Sから発される信号幅が700usになってしまっているために動かないようだ。

KINGROON純正の3D Touchは、その状況でも動作する。

既にレポートから4カ月経過して音沙汰なしなので、公式の対応はないものと考えた方がいいだろう。

筆者もファームウェアのソースコードを請求したが、整理したら公開するという返答後、音沙汰なしだ(個人的には必要がなくなったので催促もしていない)。

これ以外で動かなかった3D Touchがあったら、あるいはKINGROON以外から買ったものですんなり動いたものがあったら情報をお寄せいただきたい。

動かない3D Touchを掴んでしまった場合の対処

この問題は、純正ファームウェアを使う限り対処不可能。

オープンソースの3Dプリンター用ファームウェアMarlinをインストールすると、社外の3D Touchでも正常に動作するようになる。

筆者はそのようにして問題を回避した。

純正ファームウェアもMarlinベースだが、このような差異が出るのが不思議だ。

Marlinの導入については以下に書いた。

Marlinにおける3D Touch(BLTouch)の有効化については以下に書いた。

ファームウェアの入れ替え

前置きが長くなったが、3D Touch対応のために必要な準備について解説する。

KINGROON KP3Sを3D Touchにするには、まずファームウェアを3D Touch対応のものに入れ替える必要がある。

3D Touch対応の公式ファームウェア付属のrobin_nano_cfg.txtには一点誤りがあってそのままでは正常に動かない。次項を参照のこと。

3D Touch対応の公式ファームウェア付属のrobin_nano_cfg.txtの修正

3D Touch対応の公式ファームウェア付属のrobin_nano_cfg.txtには以下のような部分があるが、これを……。

1
>INVERT_E0_DIR           	0

このように直す。さもないと、エクストルーダーの回転が逆になってしまう。なぜこうなっているのかは謎だ。

1
>INVERT_E0_DIR           	1

3D Touchの固定

続いて、3D Touchの物理的な取り付け方法を解説する。

3D Touchの配線を短い方から長い方に付け替える。

image alt
image alt

ホットエンドを取り囲む鉄板にあるネジ穴に3D Touch取り付け用のブラケットを取り付ける。

image alt

先述の通り、3D Touch取り付け用のブラケットのSTLデータは、3D Touch対応の公式ファームウェアに同梱されている。

image alt

これをプリントして取り付けるわけだ。写真は社外製の3D Touchで、高さ調整用のスプリングが付いているが、KINGROON純正の3D Touchにはスプリングが付属していないので、ブラケットの天面にカッチリ固定することになる。

image alt

その代わり、ブラケットの垂直面が長穴になっているので、これを使って高さ調整をする。

高さ調整については後述する。

配線処理

3D Touchの取り付けが済んだら、3D Touchの配線をケーブルカバーの中に収めながら本体ベース部まで這わせていく。

配線のケーブルカバー内への収容は、3D Touch側から開始する。

3D Touchからケーブルカバーまでの配線は、あまり短くならないよう適当な長さを残しておく。

以下の写真は筆者のカスタム済みのものでちょっと様子が違うが、こんな感じで少し余裕を持たせる。

image alt

ケーブルカバーへの配線の収め方の一例を示す。

image alt
  1. ケーブルカバーのつなぎ目の、下になっている方を細いラジオペンチのようなもので掘り出し、上に出す
  2. 上に出した方を指で開いている間に、3D Touchの配線を潜り込ませる
  3. 元々上だった方を細いラジオペンチのようなものでまた掘り出して上に戻す

これをどんどん本体の方までやっていく。これをやるに当たり結束バンドが邪魔になるが、そもそも結束バンドをそのままにしているとケーブルが切断される可能性が高いので養生をする。

筆者は上記の記事でやっている通り平面ファスナーでケーブルを固定しているので、ベリベリやるだけで作業ができた。

image alt

本体の方までケーブルカバーへの配線の収容を終えたら、本体底面のパネルを外す。

本体側の根元にあるプラスチックのケーブル保護パーツをいったん外す。

image alt

ラジオペンチのようなもので内側にある出っ張りを押し込みつつ外に追い出す感じだ。

これを外すと3D Touchの配線が通るようになる。

配線の黒いコネクタを、ケーブル保護パーツを外してできた隙間から本体内に入れる。

image alt

3D Touchの配線を本体内に入れたら、ヒートベッドのケーブルの後ろを回してからマザーボード上にある3D Touch用のコネクタの方に持っていく。

image alt

本体外側の穴付近の配線のケーブルカバーへの収容が終わったら、穴をまたいで本体内側もやる。本体内側はかなり作業がしづらいので、穴付近だけやればいいかと思う。

image alt

穴付近の収容まで終わったら、プラスチックのケーブル保護パーツを元に戻す。

image alt

マザーボードとの接続

3D Touchコネクタ

3D Touch用のコネクタに、3ピンのコネクタを以下の向きで接続する。

image alt
image alt
S(Signal)5VG(GND)
KINGROON
純正
黄色
社外品
(Trianglelabなど)
オレンジ茶色

Z+(Z-Max)コネクタ

Z+(Z-Max)の方には2ピンのコネクタを以下のように接続する。

image alt
image alt
S(Signal)G(GND)5V
KINGROON
純正
-
社外品
(Trianglelabなど)
-

マザーボードとの接続後の全体の俯瞰。

image alt

配線の長さが余るので、ほかのケーブルと結束バンドでまとめるなどで整理する。特に、ステッピングモータードライバのヒートシンク周辺にかからないように注意する。

3D Touchの高さ調整

3D Touchは「M280 P0 S10」というG-codeに反応して、プローブが伸びる。

伸びたときのプローブの長さ: 約11mm

image alt

「M280 P0 S90」というG-codeに反応して、プローブが縮む。

縮んだときのプローブの長さ: 約5.4mm

image alt

その間にプローブの反応ポイントがある。

プローブの反応ポイント: 約8.5mm

image alt

プローブが縮んでいるときと、伸びているときの長さの差は約5.6mm。

伸びた状態から約2.5mm押し込んだところでプローブが反応。

5.6mm - 2.5mmで3.1mmの猶予がある。

従って、プローブが縮んだ状態でプローブ先端がノズル先端から3.1mm ÷ 2 = 1.5mm程度引っ込んだ辺りになるように取り付けるのがいい。

プローブが縮んだ状態ではノズルよりプローブ先端の位置が高くなってプリントの邪魔にならないように。

プローブが伸びた状態ではノズルよりプローブ先端の位置が低くなり、なおかつプローブの反応ポイントもノズルの先端より低い位置になるようにするわけだ。

結論的には、3D Touchの取り付け位置は、ブラケットの長穴の調整代(しろ)下限ぐらいでいいだろう。

image alt

自動ベッドレベリング(オートレベリング)の準備

自動ベッドレベリング(オートレベリング)の運用に入る前にやるべき準備がある。

具体的には、ノズルの先端と、3D Touchのプローブの反応ポイントとの位置関係がどうなっているかを調べることだ。

純正の3D Touch取り付けブラケットを使う限りXYのオフセットは自明だ。

Xは27.5、Yは0。つまり、ノズルの27.5mm右に3D Touchのプローブ中心が来ている。これは3D Touch対応公式ファームウェアの既定値として設定されているので気にする必要はない。

下図は3Dプリンターを上から見下ろしたときのノズルと3D Touchのプローブとの位置と座標の関係を示したものだ。

図の上がベッド奥、図の下がベッド手前だ。

純正の3D Touch取り付け位置はノズルの右真横27.5mmのところにあるので図中の「+X 0Y」に相当し、X27.5、Y0ということになる。

image alt

Zの位置関係(オフセット)は取り付け方次第なので、調べないと分からない。

image alt

ノズル先端とプローブの反応ポイントとの位置関係がどうなっているかを調べ、KINGROON KP3Sに教えてあげないといけないわけだ。

これらのことはKINGROON KP3S本体の液晶モニタからではできない。例えば、USB接続経由でのArduino IDEのシリアルモニタやOctoPrintを使ってやる。

image alt

ちなみに、Arduino IDEのシリアルモニタもOctoPrintのTerminalも、過去に送信したものをカーソルキーの上で呼び出すことができる。

具体的な手順は以下のようになる。

  1. Home All
    • G28
  2. ノズルを1cmの高さに上げる
    • G90
    • G1 Z10
  3. ベッドの中央に移動
    • G1 X90 Y90 F4000
    • M211 S0
  4. 3D Touchのプローブを伸長
    • M280 P0 S10
    • G91
  5. 0.1mmずつ下げていく(1cm分0.1mm刻みではまどろっこしいので、目視で○○mm猶予があると見れば、その分一気に下げてもいい)
    • G1 Z-0.1
  6. 3D Touchのプローブが反応した?(Yes/No)しなければ5に戻る↑
  7. プローブが反応したら現在のZ軸の高さを調べる(これをA値とする
    • M114
  8. プローブをリセットして引っ込める
    • M280 P0 S160
    • M211 S1
  9. ノズルが3D Touchのプローブと同じ位置を指すように移動。ノズルは3D Touchの左にあるためX軸の座標は「90 + 27.5 = 117.5」となるが、ノズルが3D Touchの右にある場合は「90 - (3D Touchとノズルの間隔)」となる点に注意。例えば、ノズルが3D Touchの32mm右にある場合は「90 - 32 = 58」となる。
    • G90
    • G1 X117.5 Y90 F4000
    • G91
  10. ベッドにコピー用紙を敷く
  11. 0.1mmずつ下げていく
    • G1 Z-0.1
  12. コピー用紙がベッドとノズルに接触して、動かせないほどではないが抵抗を感じるぐらいになった?(Yes/No)なっていなければ11に戻る↑
  13. コピー用紙がベッドとノズルに接触して、動かせないほどではないが抵抗を感じるぐらいになったら現在のZ軸の高さを調べる(これをB値とする
    • M114
  14. B値からA値を引いたC値を求める(マイナス値になる)

これで、ノズル先端からC値分下げるとプローブの反応位置になることが分かった。

ここでは、C値を仮に-1.2(-1.2mm)とする。

これをKINGROON KP3Sに教える。

  1. ノズル先端とプローブの反応位置の差を教える
    • M851 Z-1.2
  2. EEPROMに保存する
    • M500

利用パターン1「レベリングしてすぐ使う」

自動ベッドレベリング(オートレベリング)は、本体メニューの「自動レベリング」ボタンで開始できる。これは、Arduino IDEなどで「G28」「G29」を連続して実行したのと同じことだ。

robin_nano_cfg.txtの「>cfg_auto_leveling_cmd:G28;G29;」に定義がある。

その後で印刷を開始すれば、得たメッシュデータを元に自動ベッドレベリング(オートレベリング)を効かせてプリントができる。

微調整

実際にプリントしてみると、ノズルとベッドの間隔が全体的に遠すぎたり近すぎたりということが起きるだろう。

その場合は、Z軸根元の調節ネジを使う。

症状対策
ノズルとベッドの間隔が広すぎるZ軸根元の調節ネジを右に回す
ノズルとベッドの間隔が狭すぎるZ軸根元の調節ネジを左に回す
image alt

一度「M503」で設定一覧をダンプし、現状の「M851」の状態を確認し、「M851」のZの値を増減させることで調節する方法もあるがまどろっこしいか。

症状対策
ノズルとベッドの間隔が広すぎるM851のZの値を小さくする
(0以下も指定可能)
ノズルとベッドの間隔が狭すぎるM851のZの値を大きくする
(0以下も指定可能)

ちなみに、Marlinをインストールし、Z Safe Homingを設定した場合は「M851」でしか調節できなくなる。

利用パターン2「メッシュデータを保存して使う」

自動レベリングで得たメッシュデータはそのままでは電源を切ったりしたら消えてしまうが、「M500」を実行すれば、メッシュデータをEEPROMに保存できる。

G-code
自動ベッドレベリングG28
G29
自動ベッドレベリングして
メッシュデータをEEPROMに保存
G28
G29
M500
保存したメッシュデータの
呼び出しと使用宣言
M501
M420 S1
保存したメッシュデータの表示(ダンプ)M420 V

自動ベッドレベリング(オートレベリング)は時間がかかるのでプリント時毎回の実行を望まない人もいるだろう。

換言すると、任意のタイミングで自動ベッドレベリング(オートレベリング)を実行して得たメッシュデータをEEPROMに保存し、普段はそのメッシュデータを呼び出して使うだけにしたいということになるだろうか。

その場合は、以下のG-codeをダウンロードしてMicro SDカードに保存し、それを「印刷」すると自動ベッドレベリング(オートレベリング)、EEPROMへの保存までできる。

ダウンロード: LVELING_AND_SAVE.zip

LVELING_AND_SAVE.gcodeの中身は、以下の3行のテキストファイルだ。

1
2
3
G28
G29
M500

robin_nano_cfg.txtの「>cfg_auto_leveling_cmd:G28;G29;」を「>cfg_auto_leveling_cmd:G28;G29;M500;」に書き換えてファームウェアを入れ替え、本体メニューの「自動レベリング」のボタンでメッシュデータのEEPROMへの保存までやってしまうように設定する方法もある。

そして、Ultimaker Cura等のスライサーのスタートコードに「M501」「M420 S1」を追記して、プリント時にはそれを使うようにするやり方が想定できるだろう。

1
2
M501
M420 S1

Ultimaker Curaなら、「Settings>Printer>Manage Printer…>Machine Settings>Start G-code」で設定が可能だ。

「M501」を実行すると、EEPROMに保存されているすべての設定値も読み出されてしまうので、他の設定が影響を受ける可能性もある点に注意が必要だ。

利用パターン3「プリント時に毎回実行する」

プリント毎に毎回自動ベッドレベリング(オートレベリング)を実行する方法がある。

KINGROON KP3Sのメニュー「自動レベリング」を押しての自動ベッドレベリング(オートレベリング)だと、毎回操作する必要があって面倒。

Ultimaker Curaなどのスライサーのスタートコードに「G28」「G29」を追記して、プリント前に毎回自動的に実行させることができる。

1
2
G28
G29

ヒートベッドを昇温してから自動ベッドレベリング(オートレベリング)をした方がいいだろう。

1
2
3
4
M140 S{material_bed_temperature}
M190 S{material_bed_temperature}
G28
G29

Ultimaker Curaなら、「Settings>Printer>Manage Printer…>Machine Settings>Start G-code」で設定が可能だ。

スタートコード内でM501を実行している場合は、その後に書く。

Ultimaker Curaから書き出したG-codeファイルにはこれが漏れなく書き込まれ、プリント毎に自動ベッドレベリング(オートレベリング)が行なわれ、その終了後にプリントが行なわれるようになる。

自動ベッドレベリング(オートレベリング)の注意点

KINGROON KP3S公式ファームウェアの自動レベリングはZホーミング(Z軸の原点出し)時にベッドの高さの影響を受けるので、ベッドの高さ(厚さ)を変更した場合には注意が必要だ。

自動ベッドレベリング(オートレベリング)動作のカスタマイズ

自動ベッドレベリング(オートレベリング)の動作は、robin_nano_cfg.txtを書き換えることでカスタマイズ可能だ。

GRID_MAX_POINTS_X、GRID_MAX_POINTS_Y:

メッシュの密度を変更できる。

3から4に変更すると、以下のように変化する。

image alt

Z_CLEARANCE_DEPLOY_PROBE:

自動ベッドレベリング(オートレベリング)終了後のノズルのZ軸の高さ。

Z_CLEARANCE_BETWEEN_PROBES:

レベリングのポイント間の移動でノズルをどれぐらい上げるか、という設定だ。

デフォルトでは20で、都度2cm上がるように設定されている。これを5に減らすと5mmしか上がらなくなって、自動ベッドレベリング(オートレベリング)が早く終わるようになる。

XY_PROBE_SPEED

レベリングのポイント間の移動でノズルをどれぐらいのスピードを出すか、という設定だ。

デフォルトは4000だが、筆者は6000に上げた。

XX_PROBE_BED_POSITION:

3D Touchのプローブが動き回れる範囲を指定する。

image alt
1
2
3
4
>LEFT_PROBE_BED_POSITION 	30
>RIGHT_PROBE_BED_POSITION 	170
>FRONT_PROBE_BED_POSITION 	30
>BACK_PROBE_BED_POSITION 	170

Xが-35.0という位置に3D Touchを取り付けた場合は、X_PROBE_OFFSET_FROM_EXTRUDERを設定するだけではだめで、XX_PROBE_BED_POSITIONがデフォルトのままでは動かなかった。整合性を取る必要がある。

整合性を取って以下のようになった。

1
2
3
4
>LEFT_PROBE_BED_POSITION 	5
>RIGHT_PROBE_BED_POSITION 	140
>FRONT_PROBE_BED_POSITION 	5
>BACK_PROBE_BED_POSITION 	170

X_MAX_POS(180)によって、0〜180でX軸の稼働域の最大値が180だということをKP3Sは理解している。

1
2
>X_MAX_POS 180
>Y_MAX_POS 180

プローブのXを-35.0としたことで、180 - 35 = 145がプローブの最大の稼働域。

1
>X_PROBE_OFFSET_FROM_EXTRUDER	-35.0

それ以上にすると異常を検知して動かなくなる感じなのだろう。

その他の項目:

robin_nano_cfg.txtから、自動ベッドレベリング(オートレベリング)関連項目を抜粋した。

全部は試していないが、昇降速度を上げたりも可能だろう。

自分の気に入るようにカスタムしてはどうだろうか。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#========================== 自動レベリング時実行G-code ===================================

#各命令はセミコロン「;」で区切らなければなりません
>cfg_auto_leveling_cmd:G28;G29;

#============================= Z軸プローブの設定 =============================

#プローブインターフェイス Z-Min または Z-Max
>Z_MIN_PROBE_PIN_MODE		2	# (0:未使用; 1:Z_MINに接続; 2:ZMAXに接続)

>Z_PROBE_OFFSET_FROM_EXTRUDER	-0.8	# Z オフセット: -below +above  [the nozzle]
>X_PROBE_OFFSET_FROM_EXTRUDER	27.5	# X オフセット: -left  +right  [of the nozzle]
>Y_PROBE_OFFSET_FROM_EXTRUDER	0	# Y オフセット: -front +behind [the nozzle]
>XY_PROBE_SPEED 		4000	# プローブXY軸移動速度 (単位:mm/m) 
>Z_PROBE_SPEED_FAST 		600	# ダブルプロービング時の最初のアプローチの速度 (PROBE_DOUBLE_TOUCH設定時)
>Z_PROBE_SPEED_SLOW 		300	# 各ポイントの「正確な」プローブの速度

#=============================== ヒートベッドのレベリング設定 ==============================

>BED_LEVELING_METHOD 		3	# (0:不使用; 3:多点自動レベリング; 5:手動メッシュレベリング)

>GRID_MAX_POINTS_X 		3	# X軸グリッド数 (<= 15)
>GRID_MAX_POINTS_Y 		3	# Y軸グリッド数 (<= 15)
>Z_CLEARANCE_DEPLOY_PROBE	20	# Z軸リフト量/ローディスタンス (> 0)
>Z_CLEARANCE_BETWEEN_PROBES	20	# 2つのレベリングポイント間を移動中のZ軸の高さ (> 0)

#プローブがヒートベッドに到達できる境界距離の設定
>LEFT_PROBE_BED_POSITION 	30
>RIGHT_PROBE_BED_POSITION 	170
>FRONT_PROBE_BED_POSITION 	30
>BACK_PROBE_BED_POSITION 	170