3Dプリンター G-codeの調査
背景
以下のアニメーションにあるような3Dプリンターの無駄な動きを減らしたいと思った
4本ある柱において、柱Aが完成したら、柱Bを作る、柱Bが完成したら、柱Cを作る、という流れを組みたいと思った
以下の例だと、4本の柱を並行して作るため、各柱に移動するのに、時間を要する
機器が、造形物に接触しないと保証できるならば、実現できると考えた
最悪、3Dプリンターを壊す可能性があるので注意が必要
筆者が知る限り、通常のスライサーでは、そのような動きを作ることができない
機器の大きさが不明なので、どの位置にきたら、機器が造形物に接触するかがわからない
Z軸を下方向に移動することがなければ、機器が造形物に接触することは、基本的には考えられないから、そのようなG-code(プログラム)が出力される
G-Codeを自作すれば、Z方向を下に移動すること(御法度の動き)が実現できるのではないかと考えた
G-codeとは
CNC(Computer Numerical Control)や3Dプリンターで使われるプログラミング言語
Gは、geometryの略、コマンドがG***で始まるからではなさそう
Gから始まるコマンドは「Address for preparatory commands」、準備用のコマンド(?)
Mから始まるコマンドは「Miscellaneous function」、その他のコマンド
多くのVariant(変異)が存在
UltiMaker CuraでG-codeを出力する
0.4mm × 0.4mmの立方体を作ってスライス
以下のような、80行程度のコードが出力された
(コメントを追加など編集を施している)
重要な命令を見ていく
;FLAVOR:Marlin
;TIME:4
;Filament used: 0.00016497m
;Layer height: 0.5
;MINX:109.8
;MINY:109.8
;MINZ:0.12
;MAXX:110.2
;MAXY:110.2
;MAXZ:0.62
;Generated with Cura_SteamEngine 5.2.2
M82 ;absolute extrusion mode
G92 E0 ; Reset Extruder
G28 ; Home all axes
G1 Z10.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
G1 X0 Y0
M104 S200 ; Set Hotend Temperature
M190 S60 ; Wait for Bed Temperature
M109 S200 ;Wait for Hotend Temperature
G1 X0.1 Y20 Z0.3 F5000.0 ; Move to start position
G1 X0.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line
G1 X0.4 Y200.0 Z0.3 F5000.0 ; Move to side a little
G1 X0.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line
G92 E0 ; Reset Extruder
G1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed
G1 X5 Y20 Z0.3 F5000.0 ; Move over to prevent blob squish
G92 E0 ; set offset
G92 E0 ; set offset
G1 F2400 E-0.8
;LAYER_COUNT:2
;LAYER:0
M107 ; Turn fan off.
M204 S2000 ;Set Starting Acceleration
;MESH:cube.stl
G0 F7500 X109.8 Y110.2 Z0.12
M104 S200 ;Set Hotend Temperature
M204 S500 ;Set Starting Acceleration
;TYPE:WALL-OUTER
G1 F2400 E0
G1 F600 X110.2 Y110.2 E0.00798
G1 X110.2 Y110 E0.01197
G1 X110.2 Y109.8 E0.01596
G1 X109.8 Y109.8 E0.02395
G1 X109.8 Y110.2 E0.03193
;TIME_ELAPSED:4.480351
;LAYER:1
M106 S85 ;Set Fan Speed
M204 S2000 ;Set Starting Acceleration
;MESH:cube.stl
G0 F8250 X109.8 Y110.2 Z0.62
M204 S500 ;Set Starting Acceleration
;TYPE:WALL-OUTER
G1 F600 X110.2 Y110.2 E0.06519
G1 X110.2 Y110 E0.08182
G1 X110.2 Y109.8 E0.09845
G1 X109.8 Y109.8 E0.13171
G1 X109.8 Y110.2 E0.16497
;TIME_ELAPSED:4.800177
G1 F2400 E-0.63503
M107 ; Turn fan off.
G91 ;Relative positioning
G1 E-2 F2700 ;Retract a bit
G1 E-2 Z0.2 F2400 ;Retract and raise Z
G1 X5 Y5 F3000 ;Wipe out
G1 Z10 ;Raise Z more
G90 ;Absolute positioning
G1 X0 Y220 ;Present print
M106 S0 ;Turn-off fan
M104 S0 ;Turn-off hotend
M140 S0 ;Turn-off bed
M84 X Y E ;Disable all steppers but Z
M82 ;absolute extrusion mode
M104 S0 ; Set Hotend Temperature
;End of Gcode
全体を俯瞰して読む
セミコロンの後方はコメントになる
UltiMaker Curaの場合、「;LAYER:n」というコメントを追えば、どのレイヤーの命令かを把握できる
「前処理」「レイヤー毎の処理」「後処理」と見ていけば、読みやすい
よく使いそうなコマンド
G1
線形(等加速度)な移動
X、Y、Zで座標指定
Zを省略して、XとYだけ動かすこともできる
Eでフィラメントの押し出し量の指定
Fで速度を分速(mm/min)で指定
省略した場合、その前に設定した値が使われる
G0 F7500 X109.8 Y110.2 Z0.12
G1 F600 X110.2 Y110.2 E0.00798
G1 X110.2 Y110 E0.01197
M82
絶対座標モードに設定
M82 ;absolute extrusion mode
G92
フィラメントの押し出す量を命令毎に指定できるようにする
G92 E0 ; Reset Extruder
絶対的な指定のイメージ
G1 X10 Y10 E0.1
G1 X11 Y10 E0.2 ; 0.2 = 0.1 + 0.1
G1 X11 Y12 E0.4 ; 0.4 = 0.1 + 0.1 + 0.2
相対的な指定のイメージ
G1 X10 Y10 E0.1
G1 X11 Y10 E0.1
G1 X11 Y12 E0.2
M104、M190、M109
M104 S200:ホットエンドの温度を200℃に指定
M190 S60:ベッドの温度が60℃になるのを待つ
M109 S200:ホットエンドの温度が200℃になるのを待つ
M104 S200 ; Set Hotend Temperature
M190 S60 ; Wait for Bed Temperature
M109 S200 ;Wait for Hotend Temperature
M106
ファンのスピード指定
M106 S85 ;Set Fan Speed
M107
ファンをオフ
M107 ; Turn fan off.
レイヤーの流れ
「;LAYER:0」というコメントを手掛かりに1番目のレイヤーをみつける
「M204 S2000」で加速度を指定
Legacy parameter for move acceleration. Set both printing and travel acceleration.
レガシーパラメーターで、プリントとトラベルの両方の加速度のを指定するようだ(要調査)
ホットエンドとベッドの温度を指定
線形移動で立方体の第1層部分をプリントしている
;LAYER:0
M107 ; Turn fan off.
M204 S2000 ;Set Starting Acceleration
;MESH:cube.stl
G0 F7500 X109.8 Y110.2 Z0.12
M104 S200 ;Set Hotend Temperature
M204 S500 ;Set Starting Acceleration
;TYPE:WALL-OUTER
G1 F2400 E0
G1 F600 X110.2 Y110.2 E0.00798
G1 X110.2 Y110 E0.01197
G1 X110.2 Y109.8 E0.01596
G1 X109.8 Y109.8 E0.02395
G1 X109.8 Y110.2 E0.03193
;TIME_ELAPSED:4.480351
E値の計算方法
G1コマンドを使いこなせれば、自分でG-codeによるプログラミングができそうだが、
E値の計算方法を把握する必要がある
CuraのGitHubのリポジトリで質問されている方がいるが、
G-codeのFlavorに依存する、一般的には「width of the line * height of line (layer height) * length of the line」とのこと
ソースコードを見れば把握できるかもしれないが、条件によって計算方法が異なると思われる
Slic3rのページには、解説があるが、まだ読めていない
「ふぁぶテラスいわて」様のページでは、
(4 × ノズル径 × 積層ピッチ × 印刷部分長さ) ÷ (π × フィラメント径 × フィラメント径)
で算出している
効率的にプリントする別のアプローチ
以前、無駄な動きを減らすために、パーツを分割する方法も試した
感想
G-codeをだいたい理解できたが、フィラメントの押し出し量の計算は課題が残る
効率的な動きをするG-codeをプログラムを組みたいが、かなり手間なので、別の方法を含めて、模索する
夢としては、機器の正確な寸法を測り、造形物が接触するかどうかを判定する、シミュレーターがほしい
労力とバリューのバランスが悪いので、余程な用件がない限り、やらないと思う
この記事が気に入ったらサポートをしてみませんか?