Reprap 3Dプリンタにオートレベリング機能をつける(近接センサ使用、ファームMarlin RC-7)

3Dプリンタは無から有を作り出せる本当に最高の機材なのですが、毎回ベッドのレベル調整をするのがとてもだるいです。しかしオートレベリング機能があればレベル調整が不要になり100億倍くらい快適に使えるようになります。

ネットで検索してみるとサーボモータ&スイッチを使用したものなどもあるようですが、今回は海外では主流っぽい*1近接センサを使った方式でやってみました。
日本語でこの方式を詳しく説明しているページが見当たらなかったので、以下にシェアさせていただきます。

完成図

まず完成形を見てもらった方がイメージがつかみやすいと思うので、改造後の動画をご覧ください。

www.youtube.com

メニューからLevel Bedを選ぶと、中心→周辺4点の順に計測を行い、自動的にZ軸のゼロ位置が補正されます。

理屈

主にやるのは「Z軸エンドスイッチを近接センサに付け替える」作業と、あとはファームの設定です。

手動レベリングの場合、Z軸の終点にエンドスイッチがついており、3Dプリンタはそのスイッチが押される位置をZ=0として認識します。
この方式ではZ軸のゼロ位置は3Dプリンタ本体に対して固定されているので、それにあわせてベッドの高さを調整してやる必要があります。

オートレベリングを導入する際は、このエンドスイッチと近接センサを入れ替えます。
近接センサはセンサという名前ですが実質は非接触のスイッチと考えてよいです。対象との距離が一定以下になるとONになるスイッチ(上の動画でいうと、近接センサについているLEDがピカッと光っているタイミングでONになっています)。これをエクストルーダのノズル周辺に取り付けます。

オートレベリング時は近接センサを上からゆっくりベッドに近づけていき、近接センサがONになる位置(ベッドとの距離が適正になる位置)で停止し、そこをZ=0として認識します。
ベッドとの位置関係でZ軸のゼロ位置を決定するようになるので、ベッドの高さ調整が不要になるわけです。

しかしながらファームウェアから見ると、改造前も改造後も、「スイッチがONになる位置がZ=0」という動作は変わりません。なのでハード的な改造はスイッチの付け替えだけで済みます。

用意するもの

  • 近接センサ

Yueqing Hengwei Electronicsというメーカーのものが主流みたいです。バリエーションがかなりありますが、この用途では LJ18A3-8-Z/BX がいいと思います。
[asin:B01FLH63OI:detail]
f:id:slideglide:20170118223752j:plain
一応データシート貼っておきます。(PDF)

ちなみに使用している3Dプリンタはこれ

ですが、Reprap Prusa i3のクローンならどれでも同じ手順でいけると思います。

1.近接センサの接続

まずは近接センサをメインボードに接続します。

接続方法は下記です。抵抗を2つ挟む必要があります。
f:id:slideglide:20170219071613p:plain
R1は10kΩくらいでいいです。
R2はボードのマイコンを保護するために必要です(センサの出力が12V、ボードの入力が5Vまでなので、抵抗を入れてやらないと壊れる)。
ここの抵抗値は資料により値が違っていたため、自分で計測しました。+と-を電源につないだあと、出力の線を「センサー→テスター→抵抗→12Vの-端子」で接続します。近接スイッチを適当な金属に近づけ、ONになった状態(LEDが点灯)でテスターが5Vを指す抵抗値を探しましょう。

抵抗を接続すると
f:id:slideglide:20170118225831j:plain
こういう感じになります。熱収縮チューブか適当なテープで絶縁しましょう。
f:id:slideglide:20170118230807j:plain
黒い線の端にはボードのピンに刺すためにコネクタをつけておく必要があります。
f:id:slideglide:20170118231048j:plain

それぞれの線の接続先はこちらの図も参考にしてください。
f:id:slideglide:20170219215640j:plain
Enable Auto Leveling for Your 3D Printer With an Inductive Sensor (Marlin Firmware) : 3 Steps (with Pictures) - Instructablesより

ちなみに僕が使っている Aurora A3 はボードのレイアウトが違うため、電源と出力はそれぞれ
f:id:slideglide:20170220212633j:plain
f:id:slideglide:20170220212630j:plain
この位置に接続しました。

2.近接センサの固定

近接センサをノズル付近に固定します。固定にはマウントパーツが必要です。
Thingiverseで「inductive sensor」(キットで購入した本体の場合はキット名も)等で検索するとそれっぽいものが出てきます。合うものを探してください。
ない場合は、センサの先端をノズルと同じ高さ~数mm上に固定できるようなパーツを自作しましょう。センサの外径は16.6mmです。詳しいサイズはデータシートで。
f:id:slideglide:20170217230532j:plain
自分の場合はこれをベースに、穴の径が小さかったので広げました。
ノズルに近いので可能ならABSで出力したほうがいいかと思います。

3.ファームの書き換え

ファームウェアを書き換えて、オートレベリングを有効にします(ここではMarlin-RC7を使用しています)。
ファームウェアの書き換え方法については解説すると記事が無限に長くなるので、割愛します。検索してみてください。
初めて書き換える人は、オートレベリングなしの設定で一度書き換えて、異常がないかしばらく見ておくことをお勧めします。何かあった時に原因の切り分けができなくなるので。

オートレベリングの設定は、Configuration.hを書き換えて行います。
以下、設定箇所です。下記の設定でとりあえず動いています。

  • Endstop Settingsセクション
    • Z_MIN_PROBE_ENDSTOP_INVERTING => trueに
  • Z Probe Optionsセクション
    • #define FIX_MOUNTED_PROBE => コメントアウト解除
    • X_PROBE_OFFSET_FROM_EXTRUDER、Y_PROBE_OFFSET_FROM_EXTRUDER、Z_PROBE_OFFSET_FROM_EXTRUDER
      • ノズルから見て、近接センサがどの位置にあるか記述します。数字の正負は、Xは右、Yは奥、Zは上がそれぞれ+です。あとで微調整が必要になる箇所なので、ざっくりの指定で大丈夫です。
    • Z_PROBE_SPEED_SLOW
      • オートレベリング時に近接センサを下ろしてくるスピードです。そのままでもいいのかもしれませんが気分的にちょっと遅くしています。
      • (Z_PROBE_SPEED_FAST / 2) => (Z_PROBE_SPEED_FAST / 4)
  • Mesh Bed Levelingセクション
    • #define MESH_BED_LEVELING => コメントアウト
  • Bed Auto Levelingセクション
    • AUTO_BED_LEVELING_FEATURE => コメントアウト解除
    • LEFT_PROBE_BED_POSITION、RIGHT_PROBE_BED_POSITION、FRONT_PROBE_BED_POSITION、BACKT_PROBE_BED_POSITION
      • ベッドとの距離を測る位置の設定。デフォルトでもいいけど変えたければ修正
    • #define Z_SAFE_HOMING =>コメントアウト解除

以上、修正したらファームを書き換えます。
書き換え漏れなどで設定に不整合がある場合、ArduinoIDEでコンパイル時にコンソールにその旨が出てきます。確認して修正しましょう。

4.高さ調整

3Dプリンタを起動して、Prepare → Level bed を選ぶとオートレベリングが始まります。
GCODEでやる場合は「G90 M82 M107 G28 G29」です。

【注意】
ここで近接センサがノズルに対して上方すぎると、センサが反応しないままノズルがベッドに当たってしまいゴガガガガという轟音が鳴ります。最初はセンサをノズルにと同じくらいの高さに設置することをお勧めします。
この近接センサはデータシート上は8mm先まで感知できると書いてありますが、自分のは4mm先くらいが検出限界でした。(対象の金属の種類により変わる)
一度ゴガガガガとなるとモーターやZ軸に負担がかかりますし、左右のZ軸の位置がずれてしまうため調整し直す必要があり大変面倒です。

また近接センサが検出できるのは金属のみなので、ガラスベッド等を重ねている場合は外してからやりましょう(次項参照)。ゴガガガガの原因になります。

最初はめちゃくちゃな高さにレベリングされると思うので、下記の要領で調整していきます。

  • 近接センサのナットを回して設置位置を上下させ、ざっくり調整(上に動かすとベッドとノズルの距離が近づく)
  • 近づいてきたらファームの Z_PROBE_OFFSET_FROM_EXTRUDER を書き換えて微調整(数字を減らすとベッドとノズルの距離が近づく)

Z_PROBE_OFFSET_FROM_EXTRUDERは小数指定もできます。
いずれもゴガガガガに注意して慎重に行いましょう。

補足:ガラスベッドについて

前述のとおり近接センサが検出できるのは金属のみなので、ガラスベッド等を重ねている場合はその下のアルミベッドからの距離でオートレベリングが行われます。

最初に近接センサをプリントに影響のない範囲でできるだけ下げてオートレベリングしてみて、ノズルとアルミベッドの間にガラスベッドを入れる隙間があれば、ガラスベッドを入れた状態で調整を進めればOKです。

自分の場合はセンサーの検出距離が届かず、その隙間が確保できませんでした。やむを得ずオートレベリング時はガラスベッドを外し、レベリングが終わってからガラスベッドを挿入する運用をしています。Z_PROBE_OFFSET_FROM_EXTRUDER の数字を大きくすれば、近接センサの反応位置より高い位置にZ軸のゼロ位置を設定できるため、この運用が可能になります。

あるいはガラスベッドの端に銅箔テープを貼っておき、オートレベリング時はその位置で読み取るように設定する方法もあるようです。

おわり

以上です。あとはスライサーの設定で出力開始時に「G28 G29」を入れたりすると、勝手にレベリングされて良いようです。
自分は上記のガラスベッドの問題があるので、スライサーの設定は変えずにメニューから手運用しています。それでも手動レベリングに比べると100億倍快適です。
オートレベリングで快適な3Dプリントライフを!

参考

以下を参考にしました。リンク先はファーム書き換えの情報が古かったり、使っているセンサの型番が違ったりするのでご注意ください。

*1:国内はサンプル数が少なくて何が主流がよくわからない