コメを噛め

コメを噛め

rerofumi の電子工作メモ

hatena bookmark


前回の記事にて、Makerbot replicator の2色出力を応用して PVA によるサポート付きの立体出力ができたことをリポートした。
これは原理実験であり、できることがわかったというお話。
じゃあ実用とするのに、どうやってサポート出力をしようかという問題が残っている。


毎回毎回この様にサポート形状を作成するのは正直面倒である。
面倒なだけならまだ良いが、メッシュ系のポリゴンモデラーだとブーリアンで型を抜くのがあまりうまくいかないのよね。修正なしの一発でとはいかない。

なのでどうやってサポートを出力させようかというのは考えどころとなる。


Skeinforge でパスを生成する際に、サポートの出力オプションがあるというのを CupcakeCNC の時に書いている
このときは 1ノズルだったので、サポートもモデルと同じ出力となり、出力モデルにくっついてしまっていた。なのでカッターなどで切り落とさねばならずなかなか大変な作業だったのだが、サポートが無いよりマシなのでこれはこれで大いに役立った。
さて、そのサポート部分だけ別ノズルの PVA で出力ができたら最高なのだが、うまいこと 2ノズル化できないものか。

そう考えながら検索ぐるぐるしていたら、Skeinforge のサポート部分出力の前後に Gコードのテンプレートを指しこんでカスタマイズできるらしいことがわかった。
これだ。サポート部分に突入する時にツール(ノズル)をチェンジして PVA に切り替え、サポート部分が終わったらまた ABS のツールに戻す。そういった Gコードを挟み込ませればいけそうである。


ReplicatorG の Edit Profile で普段使っている Skeinforge の設定をコピー。ここでは “PVA-Support-raft” という名前にしてみた。
するとプロファイルがホームディレクトリに作られる。Win7 だと C:\Users\(アカウント名)\.replicatorg\sf_47_profiles あたり。
その中に alterations というディレクトリがあるけれども、ここに support_start.gcode, support_end.gcode というファイルを作って置くと、サポート製作に入る前と終わった後にそれぞれのファイルが差し込まれる。

ちなみに、右ノズルが ABS、左ノズルがサポート材という設定。

support_start.gcode

(—– support_start —–)
G55
HeadLeft
M18 A B

support_end.gcode

(—– support_end —–)
G54
HeadRight
M18 A B

HeadLeft, HeadRight のところは M108 が書きたいのだけれども、ReplicatorG が Dual ノズル対応で勝手に書き換えてしまって具合が悪いため、仮文字列にしておき replace.csv で変換してもらう。

replace.csv(タブ区切り)

M113 ;M113
M108 S ;M108 R
HeadRight M108 T0
HeadLeft M108 T1
SetLeftTemp M104 S220 T1

SetLeftTemp はサポート材として使う素材に適した温度を設定する。
いま PVA が湿気って使えないので、今回の確認は白ABSで行った。なので 220度設定になっている。

そしてもう一つ、start.gcode を Dualノズル設定に書き換える。

start.gcode

(**** beginning of start.gcode ****)
(This is start code for The Replicator running with support material print)
M73 P0 (enable build progress)
G21 (set units to mm)
G90 (set positioning to absolute)
G10 P1 X-16.5 Y0 Z0 (Designate T0 Offset)
G10 P2 X16.5 Y0 Z0 (Designate T1 Offset)
G54 (Recall offset cooridinate system for T0)
(**** begin homing ****)
G162 X Y F2500 (home XY axes maximum
G161 Z F1100 (home Z axis minimum)
G92 Z-5 (set Z to -5)
G1 Z0.0 (move Z to “0”)
G161 Z F100 (home Z axis minimum)
M132 X Y Z A B (Recall stored home offsets for XYZAB axis)
(**** end homing ****)
G1 X105 Y-70 Z10 F3300.0 (move to waiting position)
G130 X0 Y0 A0 B0 (Set Stepper motor Vref to lower value while heating)
M109 S100 T0 (set HBP temperature)
M6 T0 (wait for toolhead, and HBP to reach temperature)
M104 S220 T0 (set right extruder temperature)
SetLeftTemp
M6 T0 (wait for toolhead, and HBP to reach temperature)
M6 T1 (wait for toolhead, and HBP to reach temperature)
G130 X127 Y127 A127 B127 (Set Stepper motor Vref to defaults)
M6 T0
M108 R3.0 T0
G0 X105 Y-70 (Position Nozzle)
G0 Z0.6 (Position Height)
M108 R4.0 (Set Extruder Speed)
M101 (Start Extruder)
G4 P1500 (Create Anchor)
(**** end of start.gcode ****)

これらと end.gcode を先の alterations ディレクトリに置けば良い。


ReplicartorG の Generate GCODE では、alterations ディレクトリを細工したプロファイルを選び、サポート出力指定をしつつ「デフォルト start/end.gcode を使用[しない]」設定で変換を行えば良い。

これでノズルの動きは期待通りのものとなった。
ここまでは ReplicatorG そのまま使えていたので良かったが、ここからは単体の設定ではどうにもできなかった。

フィラメントの送り出し情報が G1 の Eエレメントで指定されているのだけれども、この値が最初から数えでの到達距離を示している。だんだん増えていく感じね。ちなみに数値が戻るとリバース扱い。
なので、途中でノズルを切り替えたら Eエレメントの距離は切り替わったノズルのものにならないといけない。初めてサポート側のノズルに切り替わったとしたら E は 0 から始まるし、サポートが終わってノズルを戻したら E はサポートに入る以前の値に戻してやらないといけない。
こればっかりは、生成後の GCODE を全部パースして再計算する必要がある。

とりあえず ReplicatorG や Skeinforge にくっつけることはあきらめて、生成した後フィルタスクリプトで変換することにしてみた。
ざっくり殴り書きの ruby スクリプト

dual_path.rb

#!/usr/bin/ruby

# ---------- global value
run_original = 0.0
run_t0 = 0.0
run_t1 = 0.0
select_tool = 0
nozzle_flash = 0.0

# ---------- arg check

if ARGV.size != 2 then
  print "USAGE: dual_path.rb infile.gcode outfile.gcode\n"
  exit
end

# ---------- main

open(ARGV[0], "r") do |infile|
  open(ARGV[1], "w") do |outfile|
    infile.each do |inline|
      chunk = inline.split(' ')
      # tool change
      if chunk[0] =~ /^M108/ then
        if inline =~ /T0/ then
          select_tool = 0
          nozzle_flash = 0.8
        end
        if inline =~ /T1/ then
          select_tool = 1
          nozzle_flash = 0.8
        end
      end
      # path split in E value
      if chunk[0] =~ /^G1/ then
        output = []
        chunk.each do |code|
          if code =~ /^E(.+)/ then
            position = $1.to_f
            diff = position - run_original
            run_original = position
            if select_tool == 0 then
              run_t0 += (diff + nozzle_flash)
              position = run_t0
              nozzle_flash = 0.0
            else
              run_t1 += (diff + nozzle_flash)
              position = run_t1
              nozzle_flash = 0.0
            end
            output < < sprintf("E%.3f", position)
          else
            output << code
          end
        end
        outfile << output.join(' ')
        outfile << "\n"
      else
        outfile << inline
      end
    end
  end
end


Skeinforge で出力した後 gcode をフィルタにかけるというワンクッション手間が必要だけれども、取り急ぎ Skeinforge が出力するサポート部分を別樹脂に差し替える設定はできるようになった。

本日の研究はここまで。
後は PVA が復活したら実際に出力を繰り返して調整しながら検討していく。

Leave a Reply