こんばんは。
以前、自作した3Dプリンター(Prusa i3 rework)ですが、いろいろと改造をしていて、ほとんどPrusa i3 MK2のクローンぽくなってきたのですが、コントロールボードは、RAMPSのままです。
そんな、3DプリンターのZ軸エンドスイッチを近接センサーにして、近代3Dプリンターっぽくオートレベリングに対応したいと思っていました。
わからない事だらけですが、調べながら近接センサーの取り付け動作と、オートレベリングまでできるように挑戦していきます。
・Z軸エンドストップの近接センサー化
まずは、近接センサーを用意します。
購入したのは、自作3Dプリンター業界ではメジャー?な、「LJ12A3-4-Z/BX」にしました。「LJ12A3-4-Z/BY」でもOKです。
金属に近づけるとスイッチが入ります。
値段も安くて良いのですが、金属にしか反応しないため、金属が埋め込まれたヒートベッドにしか使用できません。
代わりに、TRONXY TR SENSORであれば、不透明な素材であれば反応するのでヒートベッドの種類によっては、こちらもおススメです。使い勝手は、「LJ12A3-4-Z/BX」と同じです。
で、実際の近接センサーになります。
ケーブルのアサインは、茶色が+、青色が-、黒がスイッチになり、入力電圧は6~36Vになります。
そのまま接続しても、RAMPSのエンドストップは、出力電圧が5Vのため正しく動きません。。。
ですので、ボード上から12Vを引っ張てきて、スイッチ側を5Vにする必要があるみたいです。(もう難しい。。。)
ってことでインターネットで調べていきます。
まず12Vを引っ張ってくるのは、直接電源から取ってくるか、RAMPSボード上のD2ダイオード近くにあるピンからも12Vが取れるようです。下記画像の赤丸の部分。
ただ、残念なことに現在使用しているRAMPSボードは、上記ピンヘッダが無く(はんだ付けすればよいのですが。。)取り付けるのもメンドクサイので、直接電源から取ろうと思います。
次に、スイッチの出力電圧を5Vにするのは、抵抗を使って分圧する方法と、レギュレーターを使って電圧を下げる?方法があるようです。
I had a little mishap with my extruder head. In my absence the Proximity sensor had broken off and got tangled near the hot-end. Suffice it to say, that was the end of it. The destroyed sensor was … Proximity-Sensor-Detection LJ12A3-4-Z-BX vs LJ12A3-4-Z/BY wiring - Core3D Custom Printers |
こちらのサイトで紹介されているので、これを参考にしようと思います。
(ちょっとだけ電気回路をかじっただけの知識ですので、全然わかっていないです。。)。
分圧する場合は、10kΩと15kΩの抵抗を使うと紹介されていたので、確かに計算をすると、4.8V(≒5V)にできそうです。
いやー世の中便利になりましたね。ってことで、分圧方式で進めようと思います。
ってことで、ブレッドボードを使って配線をしてみます。
おぉぉ。12Vの入力に対してちゃんと5Vが出力されました!
あとは、同じ回路をせっせとはんだ付けをして作成をします。
って完成してから15kΩと10kΩの抵抗を逆につけてしまっていて、本来5Vになるところが、3.4Vしか出力されません。。
まー多少の誤差は大丈夫だと思うので上記をRAMPSボードに接続して確認をします。
赤い部分にそれぞれ接続をします。
接続が完了したら、MarlinファームウェアのZ_MIN_ENDSTOP_INVERTING設定をtrueに変更します。(今回使用したのが、「LJ12A3-4-Z/BX」でNPN型なので以下の設定になりますが、「LJ12A3-4-Z/BY」のPNP型であれば、falseの設定になるかと思います。)
#define Z_MIN_ENDSTOP_INVERTING true // Set to true to invert the logic of the endstop.
次に近接センサーは、ヒートベッドから離れた状態にします。(センサー上部のランプが消灯している状態)
この状態で、ちゃんとセンサーが反応しているかを確認するために、Repetier-Hostなどのソフトを使って3Dプリンターと接続をしてG-CodeのM119を送信します。
23:50:44.414 : N15 M119*30
23:50:44.418 : Reporting endstop status
23:50:44.422 : x_min: open
23:50:44.422 : y_min: open
23:50:44.422 : z_min: open
そうすると、リミットスイッチの状態が返ってきます。
まだ、センサーが反応していない状態なので、「z_min: open」が正しい結果になります。
次に、Z軸を少しずつ降ろしていき、センサー上部のランプが点灯して検知をしている状態にします。(この時にノズルとヒートベッドがぶつからない様に気を付けてください。)
上記の状態で、再度、G-CodeのM119を送信します。
00:17:48.074 : N29 M119*17
00:17:48.079 : Reporting endstop status
00:17:48.079 : x_min: open
00:17:48.083 : y_min: open
00:17:48.083 : z_min: TRIGGERED
おぉぉぉ!。ちゃんとZ軸が「z_min: TRIGGERED」になり、問題なく検知できています。
あと、Z軸のエンドストップですが手動でZ軸を下げた時には反応せず、Z軸をホームへ戻すときにエンドストップとして反応するようです。これはMarlin?の仕様っぽいです。
・オートベッドレベリング対応
Z軸エンドストップの近接センサー化とファームウェアの更新が完了して、きちんと動作することが確認できたので、次はこの近接センサーを使ってオートベッドレベリングするためのファームウェア設定になります。
こちらもいろいろと調べながらやっていきます。今回使用するMarlinのバージョンは、「2.0.9.5」になります。
MarlinのConfiguration.hを以下の内容で変更します。
#define Z_MIN_PROBE_ENDSTOP_INVERTING true // Set to true to invert the logic of the probe.
こちらもエンドストップの種類(NPN型)に従って「true」を設定します。
#define Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN
ここは、デフォルトから変更なしですが、オートレベリングのプローブをZ軸のエンドストップで行うって内容かと思います。(多分。。)
#define FIX_MOUNTED_PROBE
FIX_MOUNTED_PROBEをコメントアウトしています。内容はわかっていません。。。
#define NOZZLE_TO_PROBE_OFFSET { 40, 0, 0 }
NOZZLE_TO_PROBE_OFFSETは、ノズルからみた近接センサーの相対位置になります。今回の3Dプリンターは、ノズルからX軸に40mmの位置にあるので、上記の内容になります。
3Dプリンターを手前に見て、右手側が+X、奥が+Yになり、Z軸は上側が+Xになります。
#define PROBING_MARGIN 10
PROBING_MARGINはデフォルト設定のままですが、この値を変更するとオートレベリング時のX,Y軸のマージンになります。
実際に写真を見てもらえれば分かりやすいかと思います。
//#define AUTO_BED_LEVELING_3POINT
#define AUTO_BED_LEVELING_LINEAR
//#define AUTO_BED_LEVELING_BILINEAR
//#define AUTO_BED_LEVELING_UBL
//#define MESH_BED_LEVELING
オートレベリングの方式を指定します。まずは、AUTO_BED_LEVELING_LINEARでやってみるので、「#define AUTO_BED_LEVELING_LINEAR」部分をコメントアウトしました。
#define Z_SAFE_HOMING
最後のZ_SAFE_HOMINGについては、コメントのままだとコンパイル時に「Z_SAFE_HOMING is recommended when homing with a probe. Enable Z_SAFE_HOMING or comment out this line to continue.」エラーが出てしまうため、コメントアウトしました。
あとは、ファームウェアを書き込みRepetier-HostなどでG-CodeのM29を送信すると、オートレベリングが実行されるかと思います。