見出し画像

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をプログラムを組みたいが、かなり手間なので、別の方法を含めて、模索する

  • 夢としては、機器の正確な寸法を測り、造形物が接触するかどうかを判定する、シミュレーターがほしい

    • 労力とバリューのバランスが悪いので、余程な用件がない限り、やらないと思う


この記事が気に入ったらサポートをしてみませんか?