2021年5月19日水曜日

石定盤 自作3Dプリンタ、オートレベリング0.3mm誤差→Marlinソース変更

3Dプリンタを作ろう!  最近こればっかし.

今回は、オートベッドレベリングの不具合についてです.かなり重箱の隅です.

問題: auto bed levelingしても、ステージが水平から0.3mmずれている.

たかが0.3mmの何が問題なのか?

3DPが加工物を打つには0.3mmのステージ倒れは全く問題になりません.しかし、本筋からちょい離れた面で0.3mmが重大な問題に発展するんです.それは、、、
第1層目のステージへの接着性が損なわれる
これは大きな加工物を打つ時に深刻さが顕在化します.大きな加工物はステージから剥がれてしまう恐れがあるからです.ステージへの接着強度を保つために、ステージを50℃ぐらいに加熱したりするくらいです.

なので、第1層目だけは、樹脂をステージに擦り付けるようにして接着強度を高めます.そのために、ステージとノズルのクリアランスをたぶん0.1~0.2mmぐらいに狭くするのが好ましい.ちなみに標準的なノズル穴径は0.4mmです.

というわけで、ステージの水平度は全面に渡って0.2±0.1mmぐらいにしたいわけです.これはなかなか難しい目標です.陳腐な安物自作3DPでこんな精度を実現できるわけがないというくらい難しい.

そこで、オートベッドレベリングという水平自動調整機能がMarlinには実装されています.この機能を使えば打つ前に自動でステージを水平調整してくれるので助かります.
↓ステージをわざと2mmぐらい傾けてオートレベリングをやらせると、ステージの動きに同期してZ軸が動くので「オートレベリングしてる」と目視でわかります.つまり、ステージをアクチュエータで傾けるのではなくて、Z軸で傾きから逃げる仕組みなんです.

↓ところが、オートレベリングをさせても、第1層目が不均一に印刷されてしまいます.上の1/3ほどがかすれています.調べたところ、オートレベルしてもなぜか、写真の上下で0.3mmだけ高さがズレているんです.0.3mmは剥がした樹脂の厚みで割り出しました.これでは大きな部品を打てません.
↓正しくはこのように均一に印刷されて欲しいのです.黄色いPLAの外形寸法は180x180mmぐらいです.

↓昨日と今日と、0.3mmの原因を調べましたが、残った仮説がこの2つの写真です.Z高さセンサとして静電型近接スイッチを使っています.静電型近接スイッチが感知しているのは数pFの静電容量変動だと推測します.静電容量は、理想的にはステージと近接スイッチの相互作用でのみ決まると考えますが、実際には周辺物体がたくさん在り、それらの影響を受けます.例えばステージとX軸ロッドとの位置が2つの写真で異なります.それでステージの奥と手前で静電容量に食い違いが生じているのではないか?との仮説です.
奥を測定
手前を測定
ステージ~近接センサの距離を測れれば証明できるのですが、ノギスを入れるのすら難しく仮説の域を出ません.

追記: ヒーターとファンの配線をセンサーからなるべく離すと良好なようです.Z高さ測定の時にはヒーターとファンをOFFするoptionがMarlinにはあるのですが、今はそれを使っていません.

ーーーー
そこで証明は諦めて、Marlin source codeで0.3mmを補正するという暴挙をやりました.以下はその説明です.

なお、オートレベリングには数種類の計算方法がありますが、わたしが採用したのは「3point」です.ガラスステージの平面度は信用するというポリシーです.よく使われる「BILINEAR」はステージに凹凸がある場合に利用されます.

Marlin sourceを読むのは初めてでしたが、Linux sourceなどに比較すると全然簡単です.わたしのような素人ソフト屋でも2時間ぐらいで目星をつけることが出来ました.

3点Z高さ測定のキモの部分はここです.
ファイル:G29.cpp         行:688
    #elif ENABLED(AUTO_BED_LEVELING_3POINT)
      LOOP_L_N(i, 3) {
        probePos = points[i];
        measured_z = probe.probe_at_point(probePos, raise_after, verbose_level);
        points[i].z = measured_z;
      }
probe_at_point()がキモの関数です.probe.cppに記述されています.XY座標を渡すと、近接センサが反応したZ高さを返してくる関数です.

Z測定は3ヵ所で行います.座標はprobe.hに記述があります.
            points[0].set(min_x(), min_y());
            points[1].set(max_x(), min_y());
            points[2].set((min_x() + max_x()) / 2, max_y());
[0][1][2]のステージ上の配置はこうです.オートレベリングの結果で②が0.3mm高いのに困っているので、[2]を0.3だけ補正してやれば治るのではないか?
source codeに、これを追加しました.
        if(i==2) measured_z += 0.6;
カット&トライで0.6mm補正が最適でした.理由は知りません.

かくの如く大きな加工物を打つには一苦労です.

追記: 170x170x9mmを打ち終えました.
ステージの台座を大きくするための部品です.190gもありました.


かしこ



【おしらせ】
当ブログで書き散らかした3DPの投稿をまとめたノウハウ集を作りました.ダウンロード販売しています.¥660です.
pdfをダウンロードしていただけます.全36ページ.

3DP印刷部品のstlファイルを無料ダウンロードできます.
Marlinのvscode project folder詰め合わせも無料ダウンロードできます.

まずは無料立ち読み版をご覧になってはいかがでしょうか.(pdf)

よろしくでーす.

6 件のコメント:

  1. 素晴らしい解決能力ですー。
    これ会社で開発していたら、メカ屋と回路屋とソフト屋で責任の押し付け合いして最適解以外のところに落とし込まれるやつですね。

    返信削除
    返信
    1. >メカ屋と回路屋とソフト屋で責任の押し付け合い

      あーあるある.なぜかフィールドサービスに押し付けられるという謎現象か垣間見られたりするアレですね.たじたじー

      それにしても静電型近接センサーって、直径10mmぐらいの電極が6mm離れた対向電極との容量変化を捉える仕組みなので、どんだけ微妙なんだよとおもっちゃう

      削除
    2. ミクロンオーダーならともかく、mm単位はなれた電極の静電容量変化って・・。
      たしか距離の2乗に反比例していたような。恐るべし。
      センサーの設計者にはなれないなー。

      削除
    3. よくやるもんですわ

      削除
  2. >メカ屋と回路屋とソフト屋で責任の押し付け合い
    ありがち過ぎて、思わず笑ってしまいました

    >わたしのような素人ソフト屋
    いや、もうここまで来れば、
    「無能な、プロのソフト屋」
    なんか、目の敵じゃないくらいですw

    ※というか、日本でそれなりに社会人やってればわかりますが、仕事なんて
    「99.9%」は「政治的」に成否が決まる(やる前から、答えは出てる)ことばかりで、
    「技術の出る幕」は、ほとんどないですね。(↑の「責任の押し付け合い」だって、最後は「政治決着」だしw)
    まぁ、技術的な問題なんて「0.1%(あるいは、それよりも)」以下です。
    (まぁ、ゼロとは言いませんが)

    返信削除
    返信
    1. 現役ソフト屋さんにお褒めの言葉をいただき光栄至極.

      >「技術の出る幕」は、ほとんどない

      そうなんですなぁ.
      ゼロ戦を持っていても負けましたみたいな.
      1990年代以降の日本の電機産業は政治的理由で後退戦だったので、何をやっても負けっぱなしでした.

      削除