【3Dプリンタ】3Dプリンタを印刷するときに出てくる「G-code」って何?

みなさんこんにちは。
ファブテラスいわてスタッフの稲垣です。

突然ですが皆さんは「G-code」というものを知っているでしょうか。
3Dプリンターを使っている人であれば1度は目にしたこともあるかと思います。

Gcodeとは、機械工作の制御に用いられるプログラミングコードです。

今回で言うところの「3Dプリンタを動かすために座標やフィラメントの出す量を制御するためのコード」ということになります。

大体の3Dデータは「STL」と呼ばれるファイルでデータが保存されますが、3Dプリンタで印刷する際はG-codeに変換をして印刷できる状態のデータにします。

ただ、このG-code、実際の中身まで見たことある人は3Dプリンタを使う人の中でも半数はいないのではないでしょうか。
今回は、サンプルデータを使いながらG-codeについて学んでみましょう!
G-codeの中身を見ることで、どのように3Dプリンターが動いているかを知ることができるので、詳しくなれば1からG-codeを書いて3Dプリンターを使うことができますよ!
(メリットはあまりないですが笑)

代表的なG-code

ではまずはじめに、基本的なGcodeの記述を2つ紹介します。
この2つのコマンドを知っているだけで大体のGcodeは読めちゃいます!

;Fは長さ(mm)/分(m), XYZは座標, Eはフィラメントの押し出し距離(mm)
G0 F6000 X80 Y90 Z0.3                ;分速6000mmでX80,Y90,Z0.3の座標に移動する
G1 F1200 X80 Y100 E1                 ;分速1200mmでX80,Y100に移動しながら、フィラメントを1mm押し出す。
;Ender3の場合、ほとんどはこの二つで制御される

まずはG0、こちらはフィラメントを出さずに指定した場所に移動するコマンドです。
G0 F分速 X座標 Y座標 Z座標 のように記述をします。

次にG01、こちらは反対に、フィラメントを出しながら指定した座標まで直線移動するコマンドになります。
G1 F分速 X座標 Y座標 Z座標 E押し出し距離 のように記述します。

先ほどのG0と異なり、G1では最後にフィラメントの押し出し距離を記述します。
上の例ではY座標が10移動する際に1mmフィラメントを押し出しています。

この押し出し距離は計算で求めることができるのですが、少し複雑なので詳しい説明はこちらの記事にまとめました!

ここでは計算の式だけ記しておきます。

E(入力側:エクストルーダの押し出し距離)
D(出力側:ノズルを動かす距離)
Φf(フィラメント断面の直径)
Φn(押出幅)
h(1層の高さ)とすると、

$$E=\frac{4\phi{n}\cdot{h}\cdot{D}}{\pi\phi{f}^2}$$

このような式でEの値を求めます!

今回はG-codeの学習がメインですので、押し出し距離の計算は省きますが、これから見せるサンプルデータのコードを見てもわかるように、手計算では限界があります……
スライスソフトの偉大さを感じました……

サンプルデータとG-code

こちらは今回のサンプルデータと、このデータを印刷するためのG-codeになります。データ自体はシンプルな直方体です。
一見すると、何が書いてあるのかよく分かりませんが、一つ一つを見る分にはそこまで難しくありません。

今回は「Ultimaker Cura」というソフトを使ってSTLファイルをEnder3用のG-codeにスライスしました。
Curaは3DデータをEnder3を制御するのに最適であろう記述に変換してくれる優れものです(`・ω・´)

さて、もう少し詳しく見ていきます。

;FLAVOR:Marlin
;TIME:1277
;Filament used: 2.65499m
;Layer height: 0.32
;MINX:75.5
;MINY:95.5
;MINZ:0.32
;MAXX:159.5
;MAXY:139.5
;MAXZ:5.12
;Generated with Cura_SteamEngine 4.12.1
M140 S50          ;テーブル温度の設定(テーブル温度を50度にする)
M105              ;温度の報告(モニターに現在の温度を表示させる)
M190 S50          ;指定した温度まで待機(テーブル温度が50度になるまで次の行の動作を行わない)
M104 S200         ;ノズル温度の設定(ノズル音頭を200度にする)
M105              ;温度の報告(モニターに現在の温度を表示させる)
M109 S200         ;指定した温度まで待機(ノズル温度が50度になるまで次の行の動作を行わない)
M82 ;absolute extrusion mode   入力値を絶対座標で指定する。
; Ender 3 Custom Start G-code
G92 E0 ; エクストルーダのリセット
G28 ; 座標をホームポジションに戻す

さて、こちらはG-code最初の部分です。
11行目まではコメントで時間やサイズ、Curaのバージョンが書かれています。

本題は12行目からですね。まずはそれぞれの行の説明をしていきます。

12行目M140,15行目M104は温度の設定です。
後ろにS〇〇(〇は数値)を入れることで、その数値の温度までテーブルの温度を上げます。

14行目M190,17行目M109は待機コマンド。
同じくS〇〇と入力することで、指定した温度になるまで待機するコマンドになります。

13行目と16行目M105は温度を報告するコマンドです。
こちらは現在の温度を表示させるために必要なものになります。

18行目M82は絶対座標を取り扱うことを示しています。
20行目G92,21行目G28はそれぞれエクストルーダのリセット、ノズルをホームポジションへ戻す事を表しています。

さて、ここまではフィラメントが出てくる前段階の準備を行っていました。
続いて本題の印刷部分を見ていきましょう!
(実は印刷開始の前にテーブル左側に一度フィラメントを出す記述がありますが、ここでは省略します)

;LAYER:0
M107                                 ;ファンの電源を切るコマンド
;MESH:test.stl
G0 F6000 X146.3 Y126.3 Z0.32
;TYPE:WALL-INNER
G1 F2700 E0                          ;エクストルーダのリセット
G1 F1200 X88.7 Y126.3 E6.13051       ;ここから印刷開始
G1 X88.7 Y108.7 E8.00372
G1 X146.3 Y108.7 E14.13423
G1 X146.3 Y126.3 E16.00744
G0 F6000 X146.63 Y126.63
G0 X147.1 Y127.1
;TYPE:WALL-OUTER
G1 F1200 X87.9 Y127.1 E22.3082
;以下省略

さて、ここから直方体の印刷に入ります。

ここからの記述を見るにあたって少し注意点があります。
エクストルーダの押し出し量の値は、リセットしない限り累積されていきます。

7行目と8行目を見てください。
7行目では6.13051mmフィラメントを押し出していますが、8行目では
8.00372mm-6.13051mm
=1.87321mm

だけフィラメントを押し出しています。
ちなみに、リセットせずにEの値を1.87321と設定すると、
エクストルーダが逆向きに作動し、フィラメントが引っ込みます笑。

ここからは印刷順調に印刷がされていきます。
最後に、印刷終了時の記述を見てみましょう!

M140 S0                                     ;テーブル温度を0度に設定
M107                                        ;ファンの電源を切るコマンド
G91 ;Relative positioning                   ;座標を相対値指定に変更する
G1 E-2 F2700 ;Retract a bit                 ;分速2700mmでフィラメントを-2mm引き戻す
G1 E-2 Z0.2 F2400 ;Retract and raise Z      ;フィラメントを引っ込めてZを今の位置から0.2mm上げる
G1 X5 Y5 F3000 ;Wipe out                    ;分速3000mmで今の位置からX5mm, Y5mm進める
G1 Z10 ;Raise Z more                        ;Zを今の位置から10mm上げる
G90 ;Absolute positioning                   ;座標を絶対値指定に変更する

G1 X0 Y235 ;Present print
M106 S0 ;Turn-off fan                       ;ファンの電源を入れるコマンド
M104 S0 ;Turn-off hotend                    ;ノズルの温度を0度にする
M140 S0 ;Turn-off bed                       ;テーブル温度を0度にする

M84 X Y E ;Disable all steppers but Z       ;X軸, Y軸, エクストルーダのモーターをオフにするコマンド

M82 ;absolute extrusion mode                ;入力値を絶対座標で指定するコマンド
M104 S0                                     ;ノズルの温度を再度0度にする
;End of Gcode

印刷が終わった後は後処理に入ります。

3行目G91は相対値指定にするコマンドです。
相対値指定にすると、この後入力する値はすべて現在の位置からの移動距離を表すようになります。
この後G90で絶対値指定にしています。

11行目M106はファンの電源を入れるコマンドです。
テーブルやノズルを冷やすため、ONにします。
なお、先ほど説明を省きましたが、M107はファンの電源を切るコマンドになります。
特に冷却を必要としない場合などはM107でファンの電源を落とします。

15行目M82はモーターをOFFにするコマンドです。
モーターをOFFにすることで軸のロックが解除され、手で触って動かせるようになります。

まとめ

いかがだったでしょうか。

今回はサンプルデータを用いながらG-codeの中身を紐解いていきました。
紹介した内容だけで3Dプリンタで用いられるG-codeはおおよそ紹介できたはずです。

中身を知ることで、G-codeの書き換えや動作の追加なんかも行えます。
実際にG-codeを一から書いて3Dプリンタで面白いことをしている方々もいるので、
そういった人たちのコードを見るときも、仕組みが分かって楽しいですよ(*’▽’)

また、今回紹介しきれなかったG-codeの指令も存在します。
この記事を書くにあたって参考にしたサイトのリンクも載せておきますので、興味のある方はぜひ見てみてください!

↓参考にしたサイト↓
038 3Dプリントの為のG-CODE – -世界遺産模型の
http://www.tokyovirtualworld.com/03-column/03-38_gcode

それではまた今度お会いしましょう!