某掲示板の3Dプリンターのスレッドで、少し前にスライサーの外周がどこを通っているかの話題が上がっていました。実際のところ本当はどこを通っているのか理解していなかったので確認して、実際にプリントしたものと違いを比較してみました。
Gコードのパスはどこを通ってるの?
某掲示板にある個人向け3Dプリンターのスレッド。そこであるものをプリントしてみたら少しだけ大きいという投稿があって、スライサーで出力したGコードは、実際どこを通っているの?という話題が上がっていました。
CNCなどではGコードが描くパスをミルの中心が通るので、ミルの太さの半分だけ内側にオフセットしなければいけないといったことを聞いたことがあります。じゃあ、3Dプリンター用のスライスソフトではどうなっているんだろうか?実際のところ自分でもそのへんを理解していなかったので、これを機会に調べてみることにしました。
Gコードとは
Gコードは、もともとNC機械で座標系を使って軸の移動を処理するコードです。軸の移動以外にも処理出来るコードがあります。3Dプリンターで使用するGコードには、このもともとの標準のGコードコマンド以外にRepRapが定義したMから始まるコードもあり、使えるコードも使用するファームウェアによって弱冠の違いがあるようです。
基本のGコードは「G1」から始まるノズル移動の為のコードで下の様になっています。
G1 X102.000 Y94.500 E3.24518
「G1」はノズルの移動のコマンド。[X,Y]=[102.000 , 94.500]の点に移動して、その間にエクストルーダーはフィラメントを[E]=[ 3.24518 ]の長さに押し出しなさいというコマンドです。単位はミリメートルです。このコマンドに従って3Dプリンターは前の点から移動し、同時にフィラメントを前の長さから押し出します。
3DプリンターのGコードに付いてはRepRapの「G-code/ja」に詳しく載っています。
・RepRap G-code/ja
またばーちゃわーるどさんの「38 3Dプリントの為のG-CODE」に大変分かりやすくまとめられています。僕も以前に参考にさせていただいました。ありがとうございます。
・ばーちゃわーるど
スライスソフト「Slic3r」のGコードを調べてみる
僕はスライスソフトをSlic3rしか使ったことが無いので、今回調べたのはSlic3rです。まずOpenSCADで横20mm×奥20mm×高さ5mmの直方体の中心に直径10mmの穴をあけたモデルを作りました。
そしてSlic3rでスライスしてGコードを出力します。それをフリーソフトのNCVC(NC Viewer and Converter)でGコードを確認します。(出力されたGコードは拡張子を.txtに変更すればテキストエディタで開くことが出来ます。)またNCVCはGコードのデータをdxfファイルで書き出せるので、CADで開いてそれぞれの寸法も確認してみました。
上のモデルをスライスしたGコードを[G-code]のページで見ることが出来ます。Slic3rの設定は(A)(後述)です。(3千行近くあります。)
Slic3rの設定
スライスソフトSlic3rの主な設定は以下の通りです。ノズル径は0.4mmです。
■Print Settings
- Layers and perimeters
- Layer height
- : 0.2mm
- First layer height
- : 0.2mm
- Perimeters
- : 3
- solid layers
- : top:3 bottom:3
- Infill
- Fill density
- : 20%
- Fill pattern
- : rectilinear
- Speed
- Perimeters
- : 50mm/s
- External perimeters
- : 70%
- Infill
- : 50mm/s
- Solid infill
- : 50mm/s
■Filament Settings
- Diameter
- : 1.75mm
- Extrusion multiplier
- : 1
- Extruder
- : 195℃
■Printer Settings
- Gcode flaver
- : RepRap
- Nozzle diameter
- : 0.4mm
Gコードが指定する座標
スライスソフトSlic3rが出力した座標を確認してみます。直方体の外周部、中心にあけた穴の外周部、infill部分に分けて見てみます。確認したのは下から2層目のレイヤーで、Solid Infill(100%のinfill)の部分です。また分かりやすくする為に、ヒートベッドの中心(=立方体の中心)を[X100 Y100]としています。
直方体の外周部
直方体の外周部のうち、一番外側の角4点の座標は下の通りです。
モデルの直方体は20mm×20mmだから設計上の外周のラインは
[X110.000 Y 90.000]
[X110.000 Y110.000]
[X 90.000 Y110.000]
[X 90.000 Y 90.000]
の4点。なので、ノズル径の半分だけオフセットされています。すなわち「プリントしたモデルの大きさ」=「設計したモデルの大きさ」となるように計算されていますね。
外周部のパスの間隔は0.4mm。こちらはノズル径の太さだけずらして並んでいます。
中心にあけた穴の外周部
中心にあけた穴の外周のうち、一番外側(穴の中心に近い部分)の座標は下の通りです。
ピッタリの数字では無いけれど、穴の直径は10mm(半径5mm)なので、こちらもほぼノズル径の半分だけオフセットされています。ただ円は直線で分割されているので、穴の最小部分は設計したモデルよりも少しだけ小さくなります。
穴の外周部も直方体の外周部と同じようにパスの間隔はノズル径の太さだけずれています。
infill部分
infill部分はパスの間隔だけ見てみます。
2層目のソリッドレイヤー(Solid layer)を見ているので100%の充填をしていますが、パスの間隔は、0.64mmとノズル径の約1.5倍になっています。逆に外周部とinfillが接する部分の間隔は0.315~0.321mmとなっていて、こちらはノズル径よりも小さくなっています。なるほど。
プリントしたものの大きさを測定してみる
Gコードが出力する座標とパスがわかったので、今度は実際に3Dプリントしたものの大きさを見てみます。フィラメントを押し出す部分の順番を変えて、いくつかプリントしてみました。
(A)外周部→infill
まずは一番ノーマルな設定。「外周部」→「infill」の順番でのプリントです。外周部は内側(infillに近い方)からプリントしています。
立方体の幅を測ってみると20.09mmでした。設計したモデルよりも0.09mm大きいけど、思っていたよりも誤差は小さかったです。
中心の穴の直径は9.59mm。スケールを当てるのが難しくて、測る部分によって数値が違ってくるからあまり正確では無けれど、穴は少し小さめですね。
(B)infill→外周部(infill before perimeters)
次は「infill」→「外周部」と逆にしてみます。Slic3rの設定で「Print Settings」→「Infill」→「Infill before perimeters」にチェックを入れます。外周部は前回と同じく内側(infillに近い方)からプリントしています。
立方体の幅は20.14mmでした。穴の大きさは9.63mm。Gコードのパスを見てみて分かったようにinfillと外周部が接する部分のパスの間隔が狭くなっているので、infillを先にプリントするとその分だけ外側に押し出されているのでしょうか。立方体の幅は大きくなっています。穴は少し大きくなっているけど(A)とほぼ同じでした。
(C)外周部の一番外側を最初にプリント(External perimeters first)
こんどは(A)と同じく「外周部」→「infill」の順だけど、外周部の一番外側をまずプリントするようにしています。Slic3rの設定で「Print Settings」→「External perimeters first」にチェックをいれます。
立方体の幅は20.03mm。穴の大きさは9.73mm。幅に関してはもう誤差の範囲ですね。ほぼ設計通りの幅になっています。外周部の一番外側を始めにプリントしているので、他のパスの影響を受けていないですからね。穴に関しては改善はしているけれど、やっぱり小さくなってしまいました。
(D)押出量90%(Extrudion multiplier 0.9)
もう(C)でほぼ誤差の範囲になっているので良いのだけど、こんどはフィラメントの押出量を90%に減らしてプリントしてみました。Slic3rの設定で「Filament Settings」→「Extrusion Multiplier」を「0.9」にします。他の設定は(A)と同じで、「外周部」→「infill」の順番でプリントしました。
立方体の幅は20.05mm。穴の大きさは9.75mm。(A)よりも少し良い結果ですが、押出量を減らしても大きさには余り影響していないですね。ノズル径の大きさでしかフィラメントが押し出されないから、少なくしても幅は変わらない。その代わり密実な充填では無くなってしまっているんじゃないかなと思います。憶測ではあるけれど。
でも中心の穴に関してはやっぱり少し小さくなってしまいます。Gコードはきちんとオフセットされた位置のパスになっているけど、(A)~(D)まで全て小さくなっています。これはノズルが円を描く時に曲がる方向、すなわち円の中心の方に押し出したフィラメントが引っ張られていて、その影響で円が小さくなっているんじゃないかな。
(E)中心の円を四角にする
それじゃあ次は、押し出されたフィラメントが曲がる方向に押し出されないように、中心の穴を四角形にしてみます。四角形の穴の大きさは10mm×10mm。設定は(A)と同じです。
測る位置が難しすぎてこれこそ正確では無いと思うけれど、四角形の穴の幅は9.98mmでした。円よりも誤差は小さくなっていますね。やっぱり円の場合は穴が小さくなる傾向にあるみたいです。
(A)~(E)までの結果
(A)~(E)までの立方体の幅と穴の大きさ、誤差を表にまとめました。
全体の幅(mm) | 穴の大きさ(mm) | |||
---|---|---|---|---|
A 外周部→infill |
20.09 | Δ0.09 | 9.59 | Δ0.41 |
B infill→外周部 |
20.14 | Δ0.14 | 9.63 | Δ0.37 |
C External perimeters first |
20.03 | Δ0.03 | 9.73 | Δ0.27 |
D 押出量90% |
20.05 | Δ0.05 | 9.75 | Δ0.25 |
E 中心の円を四角 |
ー | ー | 9.98 | Δ0.02 |
スライサーが出力するGコードと実際のプリントのまとめ
スライスソフトSlic3rが出力するGコードは、ノズル径を考慮してオフセットされたパスが出力されます。ただ円形(曲線も)に関しては、その曲線の分割数や分割場所によっては大きさが異なる部分も出てくる部分もあります。
OpenSCADは円の分割数を設定することが出来るので、より正確な円にしたい場合はその分割数を多くすれば良いと思いますが、その他のCADとかモデリングソフトはどうなっているのでしょうか。
Slic3rだけしか見ていないけど、100%のinfillは、実は密に並んだパスを描いていない。infillと外周部は少し重なっている。ということも分かりました。
そのオフセットして出力されたGコードでプリントすると、ほぼ設計通りの大きさでプリントされますが、円などは小さくなってしまいます。
ただ、外周部よりも先にinfillをプリントすると、infillの影響で外周部が少し大きくなる。ということですね。
正確な大きさや穴があいたものをプリントしたい時の為に、事前に幾つか大きさの異なるモデルを作っておいて、実際にどのくらいの大きさになるか把握して置くのが良いですね。そうすれば例えばM3のボルトを通す穴を開けたい時に、きつい穴、ちょうどの穴、すこし遊びのある穴など、適宜使い分けられます。ベアリング用の穴とかも、きつく固定出来る穴とすぐに取り外せる穴とかも出来ます。
ただ今回はXY平面の場合でしか見ていないので、横向きとか斜めの場合はまた違ってくるだろうと思います。
今回もこのブログを書くのに時間がかかってしまい、もう掲示板ではこの話題はすっかい無くなっていました。でもSlic3rが出力するGコードを確認することが出来たし、プリントの精度も分かったので良かったです。
ばーちゃわーるど says
2015年3月2日 at 3:10 PMなるほど~
勉強になります♪
AKIRA says
2015年3月4日 at 12:35 AMばーちゃわーるどさん。
コメントありがとうございます。
ばーちゃわーるどさんのGコードのページをリンクさせて頂きました。
yama4ta says
2015年3月3日 at 3:55 PMまたまた、参考になります。
ありがとうございます。
よくスペーサーのカラーを作りますが、内径はやはり小さめに出来上がります。
S-CADの場合、出来上がりを見て数値をいじってます。
(蛇足ですが、円は$fん=100で滑らかな円にしてます。)
AKIRA says
2015年3月4日 at 12:41 AMyama4taさん。
コメントありがとうございます。
僕はいつも$Fn=32にしていますよ。
ぐ~と says
2016年2月10日 at 11:11 AM大変参考になりました。
CNCの誤差は知っていたのですが、3DプリンタのG-codeはどうなっているのか気になっていました。
AKIRA says
2016年2月12日 at 12:51 AMぐ~とさん、コメントありがとうございます。
スライサー(Slic3r、CURA、kisslicerなど)によって同じモデルを同じような設定でスライスしても出力するGコードが少しずつ違ってくるみたいですので、いろいろと試してみてください。
羽等 says
2016年11月6日 at 1:45 PM内円は・・・分割頂点の対角距離が設計距離になり、各分割頂点をつなぐ直線は必然的に設計距離より内側を通ります。
なので内径は分割数を上げて限りなく真円に近くするか、頂点間直線部分の2等分線で作った対角線が設計距離になるように円を拡大しなければなりません。