G-codeをテキストで見てみる(G-codeなんて怖くない)
今回はFDM型3Dプリンターを動かすデータである、G-codeをテキストエディター系ソフトで読み込んでみます。
▽G-codeとは?▽
G-codeとはFDM型3DプリンターやCNCを動かすためのデータの俗称です。
▽今回の題材▽
まず、適当なファイルをスライサーソフトにかけて、G-codeをつくります。
これはかの有名なスタンフォードバニーですが、今回はあえてサポート材をつけています。右下のSave to Fileでデスクトップとかに保存しておきます。
▽G-codeはどんな風に書かれている?▽
では、G-codeの中身をみていきましょう。テキストエディター系のソフトならだいたい開けます。(Windowsの人ならメモ帳、Macの人ならテキストエディットなど)すると、このような画面が出てきたはずです。
さて、スクロールしてみると、とてつもなく長いテキストデータであることがわかります。
見やすいように拡大しました。このように左側にあるM(番号)やG(番号)などコマンド(プリンターに動作指示を送るテキスト)の集合が、いわゆるG-codeの正体です。
そして、こちら実は全体で3部構成となっているんです。
▽3部構成について▽
・第1部 スタートコード
スタートコードでは、ノズルやベッドの温度、ステップモーターの送り量などを決定しています。
・第2部 プリントコード
プリントコードは、データのほとんどを占めるプリントコードの部分です。こちらでは、どの位置に材料を吐出していくかを決定しています。
・第3部 エンドコード
エンドコードは、クールダウンやプリント終わり位置へ移動するなどを決定しています。
データのほとんどを占めるのは第2部のプリントコード部分です。ちなみに、第1部と第3部は定型文みたいなもので、どういったモデルをプリントするとかに関係なく生成されるコマンドもあります。では、第1部から見ていきましょう。
▽第1部 スタートコード▽
第1部のスタートコードを引用すると以下のようになりました。
;FLAVOR:Marlin
;TIME:17229
;Filament used: 15.2415m
;Layer height: 0.28
;MINX:64.383
;MINY:74.61
;MINZ:0.28
;MAXX:169.594
;MAXY:160.533
;MAXZ:85.4
;Generated with Cura_SteamEngine 4.6.1
M140 S65
M105
M190 S65
M104 S200
M105
M109 S200
M82 ;absolute extrusion mode
M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration
M203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate
M204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration
M205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk
M220 S100 ;Reset Feedrate
M221 S100 ;Reset Flowrate
G28 ;Home
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
G1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position
G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line
G1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little
G1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
G92 E0
G92 E0
;LAYER_COUNT:305
;LAYER:0
M107
G0 F6000 X129.148 Y75.559 Z0.28
※機種やスライサーソフトが違うと、生成されるコードが若干異なります。なので、本記事に掲載されているコードはあくまで参考資料です。
さて、引用部分を観察していきましょう。各種コマンドはこちらで参照できます。
では、さきほど引用した部分の序盤だけコピペしました。
;FLAVOR:Marlin
;TIME:17229
;Filament used: 15.2415m
;Layer height: 0.28
;MINX:64.383
;MINY:74.61
;MINZ:0.28
;MAXX:169.594
;MAXY:160.533
;MAXZ:85.4
;Generated with Cura_SteamEngine 4.6.1
";FLAVOR:Marlin"や";TIME:17229"などありますが、これはコメントアウト(注釈)です。.gcodeの形式で、マシンを動かす文字はG(番号)とかM(番号)のコマンド部分なので、それ以外の文字はコメントアウトしないとマシンがコマンドをうまく実行してくれません。
見ればわかるように、Marlinはファームウェアですし、TIME(プリント時間)やFilament used(フィラメント使用量)など、基礎的な情報が載っていますね。では続きの部分を見ていきます。
M140 S65
M105
M190 S65
M104 S200
M105
M109 S200
M82 ;absolute extrusion mode
M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration
M203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate
M204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration
M205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk
M220 S100 ;Reset Feedrate
M221 S100 ;Reset Flowrate
G28 ;Home
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
G1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position
G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line
G1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little
G1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line
G92 E0 ;Reset Extruder
G1 Z2.0 F3000 ;Move Z Axis up
G92 E0
G92 E0
;LAYER_COUNT:305
;LAYER:0
M107
G0 F6000 X129.148 Y75.559 Z0.28
M140: Set Bed Temperature (Fast)…ベッドの目標温度が設定されますM105: Get Extruder Temperature…エクストルーダーのヒーター温度(いわゆるノズル温度)の情報が取得されます
M190: Wait for bed temperature to reach target temp…ベッドが、目標温度になるのを待ちます
M104: Set Extruder Temperature…ノズルの目標温度が設定されます
M105: Get Extruder Temperature…エクストルーダーのヒーター温度(いわゆるノズル温度)の情報が取得されます
M109: Set Extruder Temperature and Wait…Marlinにおいては、エクストルーダーのヒーター温度を摂氏で設定し、この温度になるのを待ちます
M82…絶対座標系の設定。これは、原点を基準に座標を決定します。(E値の計算などに影響するかも?)
M201…acceleration(加速度)の最大値を決める
M203 最大のモーター送り値を決める
M204 プリント/リトラクション/トラベルの最大加速度を決める
M205 ジャークを決める
M220 モーター送り値を決める
M221 フローレートを決める
G28 原点(リミットスイッチのあるところ)に戻る
G92 エクストルーダーのリセット
G0:座標から座標へ移動するだけ
G1:座標から座標へ移動し、吐出もする
M107 冷却ファンをオフ
G1 Z2.0 F3000 ;Move Z Axis up
G1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position
G1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line
G1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little
G1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line
このコマンド群は何かというとノズルワイプといって、プリントする前に事前に一回吐出することで、肝心のモデルをプリントするまでにノズルからプリント材料が安定して出るようにするための作業です。これをデフォルトで備えているマシンとそうじゃないものがあるので、一応補足しておきます。
アクセラレーションやジャークなどの最大値は、私もなぜこの数字なのかわかっていません。各コマンドの詳細は、コメントアウトの部分とReprap G-codeレファレンスを見てください。これで第1部は終わりです。
では第2部に入っていきましょう。
▽第2部 プリントコード▽
;TYPE:SKIRT
G1 F1200 X130.03 Y75.753 E0.04636
G1 X130.595 Y75.921 E0.07662
・
・
・
・
第2部は全てG0,G1コマンドです。この第2部で印刷したいモデルの造形をやっています。
G0:座標から座標へ移動するだけ
G1:座標から座標へ移動し、吐出もする
ちなみに、プリント中のモニターにもXYZの座標情報(X:135.6 Y:157.6 Z:+001.6みたいなやつ)が載っていますね。
ここで、引用部分より先のテキストをみていきましょう。command+f(またはctrl +f)でコメントアウト部分(";")を検索すると、
;TYPE:SKIRT
G1 F1200 X130.03 Y75.753 E0.04636
G1 X130.595 Y75.921 E0.07662
・
・
・
;TYPE:SUPPORT
G1 F1200 X117.258 Y122.196 E220.41103
G1 X116.974 Y122.245 E220.42512
・
・
・
;TYPE:SUPPORT-INTERFACE
G1 F1200 X145.757 Y111.368 E236.35692
G1 X145.702 Y111.481 E236.36338
・
・
・
;MESH:bunny.stl
G0 F6000 X94.139 Y108.376
G0 X94.477 Y108.638
・
・
・
;TYPE:WALL-OUTER
G1 F1200 X97.01 Y106.803 E359.58983
G1 X96.952 Y106.645 E359.59806
・
・
・
;MESH:NONMESH
G0 F300 X97.039 Y107.053 Z0.56
G0 F6000 X97.059 Y106.789
・
・
・
;TIME_ELAPSED:392.543669
;LAYER:1
M140 S65
M106 S85
・
・
・
;TYPE:SUPPORT
G1 F1377 X81.941 Y88.276 E359.70045
G1 X82.402 Y88.119 E359.72313
・
・
・
;TYPE:SKIRT…Build Plate Adhesionのスカート
;TYPE:SUPPORT…サポート材
;TYPE:SUPPORT-INTERFACE…サポートインターフェース
;MESH:bunny.stl…正直これに関してよくわかってなくて、なんか吐出しないけど移動しているコマンド群
;TYPE:WALL-OUTER…シェルの最外周
;MESH:NONMESH…これもよくわかってなくて、なんか吐出しないけど移動しているコマンド群
;TIME_ELAPSED:392.543669…ここまでかかった時間
;LAYER:1…1層目
;TYPE:SUPPORT…サポート材
M140 ベッド温度を更新
M106 ファンオン
こんな感じでコメントアウトしたところで、どの部分をプリントしていくのか明示されています。
上記以外でも、
;TYPE:WALL-INNER
;TYPE:SKIN
などがあります。
これで第2部の解説終わりです。第3部をみていきましょう。
▽第3部 エンドコード▽
さて、いよいよ最後の部です。エンドコードではモデルからホットエンドを離したり、温度をオフにするコマンドが書かれています。
M140: ベッド温度の設定
M107: ファンオフ
G91: 相対座標系にする
G1: 座標移動と若干のリトラクション
G90: 絶対座標系に戻す
G1: 座標移動
M106: ファン止める
M104: ホットエンドの温度を0に設定
M140: ベッドの温度を0に設定
M84: Z軸以外をホールド状態から開放する
M82: 再び絶対座標系に設定
M104: 再びホットエンドの温度を0に設定
残りはコメントアウト(\\nは、たぶん改行記号)
G91で相対座標系に戻しているのは、プリント終わった後にモデル周辺からホットエンドが移動するというお決まりの動作を実行するためですね。
▽感想▽
こうやって見てみると、何度か同じコードを繰り返していることがわかりました。もし、コマンドがうまく実行されなかった場合の保険をかけているんだと思います。SDカードに保存されているファイル数が多すぎるとコマンドがうまく実行されない時もありますからね。
これでお持ちのマシンとは仲良くなれそうでしょうか?この記事が「良かった!」「ためになった!」という人はスキを押していってね!(ついでにサポートm…)あと、「ここの書き方がわかりづらい」とかもあれば書いてください。参考にさせていただきます。では、良きプリント生活を!
サポートしていただけると、モチベ上がるので、よろしくお願いします!