前回までで大体上手く動作する様になり、精度も1号機より上がった感があるのですが、一層目のベッドへの貼り付きが今ひとつなのです。
これはフィラメントの違いもありそうな気がします。1号機で使っていたフィラメントを丁度使い果たしたので2号機は最初から新たなフィラメントを使っています。
1号機。
貧乏性なので最後のギリギリまで、スペーサーなんかをプリントして使い切りました。
以前のフィラメントも十分安物だったのですが、あれから何年か経っているので新しいものは性能が上がっているだろうと勝手に期待し、またもや安物を買いました(Amazonで¥2290-/1Kgの韓国製です)。
でも貼り付き性に加え収縮率も大きい気がします。
・・と言いつつ、プリンタとフィラメントを同時に変えてしまったので実はどちらが原因なのか切り分けが出来ていません(こういう事態も頭をよぎったのに、つい前のを使い切ってしまった・・・)。
・・・という事で少しでも貼り付きを良くする為、ベッドの水平度調整を厳密にすべくオートレベリングを試してみることにします。世の中から何周も遅れた感がありますが、今までは手動で調整していたのです。
オートレベリングの構想
ネットで見ると皆さんオートレベリングのプローブには色々なタイプのセンサーを使われている様です。大別するとリミットスイッチ等の接触式と、近接センサーを使った非接触式に分かれる様です。 リミットスイッチ自体はシンプルなのですがレベル検出時にはノズルよりも下に配置し、プリント時には造形物に当たらない位置まで上げておく必要があり、サーボ、ソレノイド、手動などで移動させる必要があります。この点、近接センサーだとプローブ先端よりも高い位置に固定しておけますが、手元にはリミットスイッチしかないのでこれでやってみる事にしました。またサーボを取付けるのも面倒なのでまずは手動での着脱式でやってみます。
という事で次の様にしたいと思います・・・
- 調整したくなった時だけプローブを取付けてレベル検出を行う。
- 普段のプリント時は過去に取得した検出値を使ってレベル補正を行う。
- 全体の高さ調整は今まで通りZ-MINのEND-STOPスイッチで行う。
オートレベリングを使った時の動きがよくわかっていないので調べながら進めていきました。特にEND-STOPの検出レべルとプローブの検出レベルとの関係とか。。
実際は色々と試行錯誤があったのですが以下そのあたりは省略して結果だけ書きます。
プローブ
何はともあれプローブを作成する必要があります。といっても下の写真の通り、DCプラグにリミットスイッチを取り付けただけです(DCプラグは差し込んだ状態で揺らすと若干ブレるので、3.5mmのイヤホンプラグを使った方が良かったと思います)。
着脱式プローブ
ヘッド側には図の様にDCジャックを取付けておきます。
プリントヘッド側
そしてレベル出しをする時だけプローブを差し込み、レベル出しが終わったらプローブを引っこ抜きます(抜き忘れてプリントするとベッドにぶつかるので要注意)。
プローブ取付け
リミットスイッチには電極が三つありますが、普段は導通しベッドに接触すると切断状態となる配線にしています。これはENDSTOPスイッチや非常停止スイッチで停止位置を取りこぼさない為の鉄則です。この配線をArduinoMegaの19番端子(本来はZ-Max-ENDSTOPにつながる)に接続しました。
Marinの設定
設定はMarlinのConfiguration.hを次の様に変更します。
#define Z_MIN_PROBE_ENDSTOP ←コメントだったのを外す(なんか判りにくいのですがZMINとは別の端子にプローブ信号を接続する場合にはこれを宣言する様です)。
#define Z_MIN_PROBE_PIN 19 ←19pinである事を指定するため追加。
なおスイッチの動作は’M119’コマンドで確認できます。
>>> M119
SENDING:M119
Reporting endstop status
x_min: open
y_min: open
z_min: open
z_probe: TRIGGERED ←プローブが接触した時
>>> M119
SENDING:M119
Reporting endstop status
x_min: open
y_min: open
z_min: open
z_probe: open ←プローブが空中にある時
次にプローブの取り付け方の設定です。サーボやソレノイドで出し入れする場合の設定や、よくわからない設定もありますが、今回は手動なので恐らく’FIX_MOUNTED_PROBE’を選択すればよいと思います。
#define FIX_MOUNTED_PROBE
またプローブ位置はノズルと全く同じ位置にはできないので何mmかはズレており、この差を設定します。2号機プリンタはノズルに対しプローブが右に12mm,奥に34mmの位置にあるので以下の様に設定しました。
#define X_PROBE_OFFSET_FROM_EXTRUDER 12
#define Y_PROBE_OFFSET_FROM_EXTRUDER 34
#define Z_PROBE_OFFSET_FROM_EXTRUDER 0
レベル補正の計算方法も色々とある様です。高さを3点測定して傾きを求める方法(これはベッドの歪みは無いものとして傾きだけを補正する)や、何ポイントか測定して歪みまで補正する方法、その他よくわからないのも。。。
今回は’AUTO_BED_LEVELING_BILINEAR’という方法を選んでみました。この方法は複数ポイント(デフォルトは格子状に9点)を測定し、何やら上手く計算して補正してくれます
次に9点の計測位置(の最大・最小値)を指定します。上にも書いた通り、プローブがノズルに対しX側に12mm,Y側に34mmずれた位置にあるのでこれよりも小さい値の位置では計測できません。とりあえず各1mmの余裕を見て13mm,35mmを最小値とし、最大値はそれぞれ170mmとして次の様に設定しました。
#define LEFT_PROBE_BED_POSITION 13
#define RIGHT_PROBE_BED_POSITION 170
#define FRONT_PROBE_BED_POSITION 35
#define BACK_PROBE_BED_POSITION 170
そして最後に計測したデータをEEPROMに書き込むための許可を与えておきます。
毎回レベルを計測するなら不要かもしれませんが、当面は必要な時だけ計測してその値を使い続けるつもりなので測定値をEEPROMに保存する必要があるのです。
#define EEPROM_SETTINGS
ここまでの設定でコンパイルしてArduinoMegaに書き込みました。
レベル計測
全軸をHOMINGした後、プローブを取付けて’G29’コマンドを送ると9点の計測が始まります(簡単に書きましたが本当にプローブ位置で止まるか不安だったので電源スイッチに指を掛け、いつでも止めることができる態勢で実行しました)。
実行が終わると次の様な結果が出てきます。
0 1 2
0 +5.313 +5.491 +5.679
1 +5.309 +5.427 +5.623
2 +5.456 +5.518 +5.674
これが9点のベッド高さの測定結果です。Zのホーミング調整はベッドの中央付近で行なったので、この位置に近い中央の+5.427を基準に考えます。この値はZホーミングで得た位置を0としたとき、これよりも5.427mm上の位置でプローブが接触した事を示します。プローブはノズルよりも下に出っ張っているのでノズルがまだ浮いている(高い)位置でプローブが接触する訳です。
結果の反映
ここまででノズルとプローブの差が5.427mmと分かったので、この値を次のコマンドでMarlinに設定してやります。
M851 Z-5.427
M851命令で設定した補正値はG29実行時に計算されるので、この補正値が有効な状態でもう一度’G29’コマンドを実行すると次の結果となりました。
0 1 2
0 -0.088 +0.062 +0.282
1 -0.115 +0.015 +0.225
2 +0.037 +0.109 +0.257
M851で設定した補正値が測定結果に足され中央の値が0.015mmになっています(ピッタリ0mmでないのは恐らく測定誤差のためです)。
これらの測定値は’M500’コマンドでEEPROMに格納しておきます(上で設定した「#define EEPROM_SETTINGS」が無いと’M500’実行時にエラーが出る様なので要注意)。
プリント
あとは「M420 S1」を実行するとオートレベリングが有効になります。試しにジョギングさせてみると、X/Yの動作に合わせてZ軸モーターも僅かに回転するのが確認できます。
なお、このオートレベリング有効設定はホーミングを行うと解除される様なので、Gコード先頭のホーミング命令(G28)の後に「M420 S1」を追加する様にスライサーの設定を変更しました。
以上でオートレベリングの設定完了です。プリントしてみるとZ軸のモーターが常に細かく動いています。一層目のベッドへの貼り付きも良くなった(マシになった)気がします。
その後・・・
やっぱりベッドへの貼り付きがイマイチなので試しにプリントベッドをアルコールで拭いてみたら良くなった様です。今まではガラスクリーナーで拭いていたのですが今のところアルコールの方が良い結果になっています。
そうだとするとフィラメントにはあらぬ疑いをかけていた事になります。フィラメントさんごめんなさい。