【pythonで動くG-codeビルダー】G-coordinatorユーザーのための3Dプリンターで前処理・後処理をG-codeで考察する


※ 当ページには【広告/PR】を含む場合があります。
2023/10/20
【pythonで動くG-codeビルダー】シンプルなシリンダー形状のサンプルでG-coordinatorの使い方を学習する
【pythonで動くG-codeビルダー】gcoordinatorから円筒曲面上にパンチングホールパターンを形成してみる
蛸壺の中の工作室|G-coordinatorユーザーのための3Dプリンターで前処理・後処理をG-codeで考察する

前回まで内容では「G-coordinator」の基本的な使い方を簡単な例で解説していきました。

合同会社タコスキングダム|タコツボの中の工作室
【pythonで動くG-codeビルダー】シンプルなシリンダー形状のサンプルでG-coordinatorの使い方を学習する

G-coordinatorで最初に学ぶ学ぶ「シリンダー(円筒)」のpythonコードを解説

今回は、G-coordinatorからエクスポートするgcodeファイルに、3Dプリンティングする前後で追加したい工程をG-codeで自作する方法に着目したいと思います。


Ender-3

【Creality】プラットフォームシート 235*235mm

【TINMORRY】PLA フィラメント ブラック 1.75mm 1Kg

3Dプリンターで使うG-codeの書式

本来の「G-code」は、NC工作機械でツールの動作などを処理するためのコードで利用されています。

これに対して、3Dプリンターで使われるG-codeとは、NC工作機械の流れを組み入れながら、フィラメント吐出ノズルや、ベッドなどの設定などを定義できるようにした派生G-codeになっています。

派生G-codeといってしまうと、3Dプリンター用のG-code規約はいくつもあるように聞こえますが、3Dプリンター製品ではデファクト標準となっている『Marlin』で利用されている3Dプリンタードライバー用のG-code規則を見ておけば十分と思います。

詳しい全G-codeの指令一覧は以下のサイト(ただし英語版のみ)が詳しいです。

参考|G-code Index - marlin

見ていただくと分かる通り、非常に多くの指令が存在しています。

ここでは、良く使う・利用頻度の高いコマンドをピックアップして解説していきましょう。

コメント行を付ける

「;(セミコロン)」文字から始まる行はコメントとしてスキップされます。

            ;はコメント行だよ
        

ベッドの目標温度設定〜M140とM190

指令M140はベッドの温度設定指令です。

            M140 S50
        
この場合、S<数値>でセルシウス温度(℃)を設定します。

昇温中の他の動きを止め、設定温度になるまで待機させる指令はM190で、

            M190 S50
        
とすることで、ベッドが特定の温度になるのを待つことができます。

引数の
S<数値>でセルシウス温度(℃)を設定します。

エクストルーダー部のノズル温度の設定・取得〜M104/M105/M109

ノズルの温度もベッド同様のやり方で温度設定できます。

            M104 S200
        
S<数値>でセルシウス温度(℃)を設定します。

昇温中の他の動きを止め、設定温度になるまで待機させる指令はM109で、

            M109 S200
        
とすることで、ノズルが特定の温度になるのを待つことができます。

引数のS<数値>でセルシウス温度(℃)を設定します。

温度をコントローラー側から読み取りたい場合、指令M105でノズルの温度を読み出すことができます。

            M105
        

動作の諸元設定〜M200番台

プリンターを動かす前段階として、動作時の基本設定を与えておく必要があります。

まずは軸の移動時の加速度上限(単位は
mm/s^2)を設定する指令M201を

            M201 X500.00 Y500.00 Z100.00 E5000.00
        
と与えます。

次に各軸での最大フィード(送り)量を指令M203で

            M203 X500.00 Y500.00 Z10.00 E50.00
        
と与えます。

指令M204はプリント時/リトラクション時/トラベル時の加速度上限を設定します。

            M204 P500.00 R1000.00 T500.00
        

また指令M205で各軸のジャク量を設定します。

            M205 X8.00 Y8.00 Z0.40 E5.00
        
指令M220でモーターのフィード量を設定します。

            M220 S100
        
指令M221でフローレートを設定します。

            M221 S100
        

冷却ファンの設定〜M106とM107

指令M106で冷却ファンをオンにします。

            M106
        
指令M107で冷却ファンをオフにします。

            M107
        

座標系の設定〜G90とG91

3DプリンターのG-codeにおいては、X/Y/Z/E軸それぞれの座標系を、「絶対座標」ととるか、「相対座標」ととるかは非常に重要な設定になります。

「絶対座標」を基準としたい場合、指令G90を使って宣言しておきます。

対して、「相対座標」を基準としたい場合には、指令G91を使います。

            G90 ; X/Y/Z/E軸は絶対座標系と設定

G91 ; X/Y/Z/E軸は相対座標系と設定
        
どちらがデフォルトになっているかは、3Dプリンターに異なるため、ユーザーはできる限り明示に、プリント出力を始める際に3Dプリンターの座標モードを設定する必要があります。

また、3Dプリンター製品によっては、X/Y/Z軸は絶対座標で動作するものの、E軸は相対座標とするような「混合座標」を採用しているものがあります。

この混合座標に対応する方法は、設定のオーバーライドで行います。

例えば、指令G91によって全ての軸が「相対座標系」になったあとで、指令M82によってE軸だけを「絶対座標系」に設定することができます。

            G91
M82
        
または、指令G90のあとで指令M83から上書きすると、XYZは「絶対座標系」で、Eは「相対座標系」に分けて定義することができます。

            G90
M83
        

プリンターは仕様に沿った座標モードを選択する必要があることは覚えておいたほうがよいでしょう。

原点出し〜G28

プリンターのホームポジションへの移動は指令G28で行います。

            G28
        
ホームポジションは通常、各軸でリミットスイッチにあたる位置です。

エクストルーダーの累積フィード量のリセット〜G92

通常、プリント開始時のフィラメントの送り量をゼロとし、それ以降はエクストルーダーの送り量を累積値としてE<数値>の書式で操作しています。

なので、適切なタイミングで指令G92によってエクストルーダーの累積値をゼロにリセットしなければ上手くプリントできない場合もあります。

            G92 E0
        

プリント動作〜G0とG1

実際の3Dプリンターの出力動作で主に使うのが、指令G0とG1です。

またG0はG1からエクストルーダーの押出量の設定を省いた指令なので、G1だけで記述されたコードもあります。

指令G0は、「現在の座標から次の座標へ移動する」ためのコマンドです。

            G0 F6000 X129.148 Y75.559 Z0.28
        
G0ノズルヘッドを移動するので、印刷はせずにトラベル移動だけに使います。

引数はX値、Y値、Z値とも単位は
[mm]で指定します。

F値は移動速度(フィードレート)で、単位は
[mm/min]になることにも留意しましょう。

他方、G1は「フィラメントを吐出しながら現在の座標から次の座標へ移動もする」コマンドです。

通常のプリンタ時には、フィラメントを押し出しながら移動する指令G1を以下のように利用します。

            G1 X10.1 Y200.0 Z0.28 F1500.0 E15
        
このG1ではE値が引数として存在し、単位は[mm]を使います。

この押出量(距離)
EEは計算値であり、

E=4ϕnhDπϕf2\displaystyle { E = \frac{4 \phi_n h D }{\pi {\phi_f}^2} }Eq. (押出量の算出式)

で決まる量です。

なお
DDがノズルの移動距離、ϕf\phi_fがフィラメント断面径、ϕn\phi_nが押出幅、hhが積層厚(=1層の高さ)、という値です。

E<数値>が移動中の押出量を決めていますが、Eを設定しない場合はG0と同じになります。

            G1 Z2.0 F3000
;👇と同じ
G0 Z2.0 F3000
        

待機時間の設定〜G4

特定の時間だけ動作を止めておきたい場合、指令G4で時間指定して停止させることが可能です。

            G4 P5000 ; 5000ms(5秒)停止
; もしくは
G4 S5 ; 5s(5秒)停止
        
という感じで利用します。

また引数のPは[ms]を、Sは[s]を単位で指定しますが、両方指定された場合、S値が優先されます。

長さ単位の設定〜G20とG21

日本では長さの単位は「mm」を設定しますが、アメリカを中心とした国では「inch」が今も根強く利用されています。

日本向けの3Dプリンター製品ではほとんどがデフォルトの単位を「mm」で設定してあるため、ほどんど意識することはないのですが、海外のサイト等でプリンタードライバ製品を購入したりすると稀に「inch」設定が標準になっている可能性もあります。

この長さ標準は、指令G20で「inch」、指令G21で「mm」に切り替わるようになっています。

            G20 ; [inch]に長さ単位を統一
G21 ; [mm]に長さ単位を統一
        
ことわりがなければ、国内で使う3DプリンターのG-codeには指令G21を入れておくと間違いは無いでしょう。

ステッピングモータのホールドの有効・無効〜M18/M84

ステッピングモータは通常通電させるとすぐにホールド状態に入り、外力で回らないようにロックされた状態になります。

印刷時にはホールドを有効(Enable)にしておく必要がありますが、印刷が終了して成果物を手で取り出す際に、モーターが動かないとベッドがロックして取り出しにくい場合があります。

そんな場合には、指令M18か指令M84で、指定したモータをホールド状態を無効(Disable)にすることができます。

            ;👇すべての軸のモータを即時Disableする
M18
;M18 X Y Z E としても同じ

;👇Z/E軸を即時Disableする(⇔X/YはEnableのまま)
M18 Z E

;👇X/Y軸を60s(1分間)だけDisable
M18 S60 X Y
        
引数に使うモータのフラグは(X/Y/Z/E)です。

またS<数値>でDisableする時間[s]を指定することも可能です。


Ender-3

【Creality】プラットフォームシート 235*235mm

【TINMORRY】PLA フィラメント ブラック 1.75mm 1Kg

G-coordinatorで前処理・後処理を設定する

大抵のスライサーソフトでは自動でコードの生成をやってくれるので、普段は気にしないのですが、G-coordinatorでダイレクトにgcodeを出力する場合には、前処理・後処理の自作は避けては通れない作業です。

あくまでも参考としてですが、以降でコーディングの手法を考えてみましょう。

G-coordinatorの出力するgcodeについて

default-cylinder.pyから一旦gcodeを生成させてみましょう。

            M140 S50
M190 S50
M104 S200
M109 S200
M106 S0
M83
G0 F5000 X115.00000 Y105.00000 Z0.00000
G1 F1000.0 X114.97987 Y105.63424 Z0.00200 E0.01884
G1 F1000.0 X114.91955 Y106.26592 Z0.00400 E0.01884
G1 F1000.0 X114.81929 Y106.89251 Z0.00600 E0.01884
;...以下G1で同じようなコマンドが続く
        
なお、ちょっと前のG-coordinatorだと、指令M83が挿入されなかったようですので、エクストルーダーの引出量がデフォルトで累積量になっている一部の3Dプリンター製品で、M83の挿入かE値の修正が必要になります。

古いバージョンのG-coordinatorを使っている場合には、最新のバージョンに更新しておきましょう。

前処理部分

まずG-coordinatorが前処理として最低限度の設定を挟んでくれている部分を眺めて見ましょう

            M140 S50 ; ベッド温度を昇温する
M190 S50 ; ベッドが目標温度に達するまで待機
M104 S200 ; ノズル温度を昇温する
M109 S200 ; ノズルが目標温度に達するまで待機
M106 S0 ; 冷却ファンを動作ON
M83 ; エクストルーダーの座標が相対座標に変更
        
これだと、ベッドとノズルが目標温度に達したら、予備動作なしに即時プリンター出力が開始されてしまいます。

そこで、スライサーソフトで簡単なモデルを作成し、G-codeファイルがどのように前処理しているかを観察してみましょう。

ここでは「Prusa Slicer」の前処理を参考にしてみます。

合同会社タコスキングダム|タコツボの中の工作室
【3Dプリンター X Debian Linux】古いグラフィックボードだとCuraが動かなくなったのでPrusa Slicer(プルサスライサー)に引っ越しする

Debian LinuxにPrusaSlicerをインストールする手順をまとめます。

なお、ターゲットした3Dプリンターは
Ender-3
です。

            ; 👇プリンター製品の諸元(スライサー内部のデータでおまかせ)
M201 X500 Y500 Z100 E5000
M203 X500 Y500 Z10 E60
M204 S500 T1000
M205 X8.00 Y8.00 Z0.40 E5.00
M205 S0 T0
G90 ; 👈 X/Y/Z/E軸をすべて絶対座標で扱う
M83 ; 👈 E軸は相対座標で扱うように書き換え
M104 S150 ; 👈 ホームに戻る際のフィラメントのタレを防ぐための一時昇温
M140 S60 ; 👈 ベッドの温度を昇温開始(☆)
G4 S30 ; 👈 ノズルが温まるまで30秒待つ
G28 ; 👈 ホームに移動
; 👇準備運動
G1 Z50 F240 ; 👈 ノズルを一旦低速でZ軸で50mmまで持ち上げる
G1 X2.0 Y10 F3000 ; 👈 フィラメントの試し書きの初期位置(X,Y)=(2mm,10mm)に移動する
M104 S205 ; 👈 ノズルを本番温度まで昇温開始(☆)
M190 S60 ; 👈 ベッド温度が本番温度になるまで待つ(☆)
M109 S205 ; 👈 ノズル温度が本番温度になるまで待つ(☆)
G1 Z0.28 F240 ; 👈 ノズルをZ軸で0.28mm(フィラメント1層分)の位置に下ろす
G92 E0 ; 👈 エクストルーダーの引出量をリセット
G1 X2.0 Y140 E10 F1500 ; 👈 試し書き1回目 --> 終了位置(X,Y)=(2mm,140mm)までの直線
G1 X2.3 Y140 F5000 ; 👈 試し書きの初期位置(X,Y)=(2.3mm,140mm)に移動
G92 E0 ; 👈 エクストルーダーの引出量をリセット
G1 X2.3 Y10 E10 F1200 ; 👈 試し書き2回目 --> 終了位置(X,Y)=(2.3mm,10mm)までの直線
G92 E0 ; 👈 エクストルーダーの引出量をリセット
; 👇プリント前の設定再確認
G21 ; 👈 長さ単位を[mm]で統一
G90 ; 👈 X/Y/Z/E軸をすべて絶対座標で扱う
M83 ; 👈 E軸は相対座標で扱うように書き換え
M107 ; 👈 冷却ファンをOFF
G92 E0 ; 👈 エクストルーダーの引出量をリセット(念押し)
        
とういうことで、Prusa Slicerでいうと、プリント前の準備運動として邪魔にならない位置に直線を描いて、最初にノズルから垂れたフィラメントを除去しているような挙動を追加してくれています。

印刷物の大きさに問題がなければ、このコードの
☆印で示した部分の温度を適宜書き換えて前処理としてG-coordinatorの前処理として使うこともできます。

を書き換えるのも面倒ならば、後の処理でも温度調整指令が送られるので、ここでは特に変えなくても前処理文として使えると思います。

コードの内容を良く確認したら、G-coordinatorのGUIから
[Machine settings] > [Start Gcode Editor]のテキストエリアに前処理コードをコピペしましょう。

合同会社タコスキングダム|蛸壺の中の工作室

[Save]ボタンを押すと、前処理コードはそのまま永続化できます。

これで、gcodeのエクスポート時に前処理としてそのまま生成することができて便利です。

後処理部分

次にプリント後の後処理過程について考えてみます。

こちらも参考にスライサーソフトで異なりますが、Prusa Slicerではおおよそ以下のような後処理が自動で生成されるようになっています。

            ; 👇後処理を開始
M107 ; 👈 冷却ファンをOFF
; 👇終了動作
G1 Z2.6 F600 ; 👈 プリント生成物の最終高さからZ軸に1mm程度ノズルを上げる(☆)
G1 X5 Y193.8 F9000 ; 👈 プリント生成物がよく見えるように邪魔にならない位置(X,Y)=(5mm,193.8mm)に移動(☆)
G1 Z70.6 F600 ; 👈 さらにZ軸に70mm程度ノズルを上げる(☆)
G1 Z150 F600 ; 👈 さらにZ軸に150mmの位置までノズルを上げる(☆)
M140 S0 ; 👈 ベッド温度のヒーターをOFF
M104 S0 ; 👈 ノズル温度のヒーターをOFF
M107 ; 👈 冷却ファンをOFF
M84 X Y E ; X/Y/E軸のモータ制御をOFF(Z軸は動かないようにホールド)
        
さて、こちらはで示した部分のX/Y/Z座標の値を良く検討する必要があります。

今回テストで用いた3Dモデルは全体の高さ2mmでしたので、それを考慮した上でスライサーソフト側がZ2.6mm(2 ~ 3層分?)の位置まで一旦ノズルを持ち上げ、そこから邪魔にならないXYの位置にサッと移動しています。その後、Z軸を150mmの位置に更に上げています。

ここらへんの設計発想はPrusa Slicerのオリジナルなので、詳しく知る由もないのですが、

            1. 造形終了後に少しだけZ軸を引き上げてノズルを持ち上げる
2. 造形物を取り出すのに邪魔にならないような水平位置にノズルを退避
3. さらに垂直方向(Z軸)へノズルを退避
4. ベッドヒーター・ノズルヒーター・冷却ファンを止める
5. Z軸以外のステッピングモータのホールドを無効化
        
のように考えておけば良いでしょう。

後処理のコードは、前処理よりも注意深く確認した上で、G-coordinatorのGUIから
[Machine settings] > [End Gcode Editor]のテキストエリアにコピペしましょう。

合同会社タコスキングダム|蛸壺の中の工作室

これでこの後処理コードは、gcodeファイルのエクスポート時に生成されるようになります。


Ender-3

【Creality】プラットフォームシート 235*235mm

【TINMORRY】PLA フィラメント ブラック 1.75mm 1Kg

まとめ

以上、G-coordinatorでパラメトリック造形をやりたい人向けの拡張G-codeの作成方法を長々と説明していきました。

G-codeを手作業でやるのは、思った以上に大変でして、これだけでもスライサーソフトの偉大さ・ありがたみを感じることができました。

また、さすがにG-coordinator単体では、ブリムやスカートなどのサポート構造を付けるのは至難の業ですので、そうなったら大人しくメジャーなスライサーソフトを利用しましょう。

参考サイト

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