【pythonで動くG-codeビルダー】シンプルなシリンダー形状のサンプルでG-coordinatorの使い方を学習する


※ 当ページには【広告/PR】を含む場合があります。
2023/09/26
【pythonで動くG-codeビルダー】G-coordinator/gcoordinatorをLinuxにインストール&動作確認してみる
【pythonで動くG-codeビルダー】G-coordinatorユーザーのための3Dプリンターで前処理・後処理をG-codeで考察する
蛸壺の中の工作室|シンプルなシリンダー形状のサンプルでG-coordinatorの使い方を学習する

前回の内容で「G-coordinator」をLinuxへインストールして使ってみるだけの記事をポストしていました。

今回から何回かに分けて、G-coordinatorの学習も兼ねてハウツーを小出しに紹介していくコーナーになります。


Ender-3

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

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

シリンダーサンプルを印刷してみる

まずsampleフォルダに収録してある例をじっくり噛み砕くことが何よりの勉強になるでしょう。

収録してあるサンプルのうち、
default_cylinder.pyを開いてみましょう。

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

このサンプルではpythonコードを実行すると、シンプルな円筒を描くだけの形状が出力されます。

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

改めてpythonコードを眺めてみましょう。

            import math
import numpy as np
import print_settings
from path_generator import *
from infill_generator import *
from console import *

LAYER = 100

#👇解説ポイント①
def object_modeling():
    #👇Pathオブジェクトの配列
    full_object=[]

    #👇解説ポイント②
    for height in range(LAYER):
        #👇解説ポイント③
        arg = np.linspace(0, 2*np.pi, 100)
        #👇解説ポイント④
        x = 10 * np.cos(arg)
        y = 10 * np.sin(arg)
        #👇解説ポイント⑤
        z = np.full_like(arg, (height+1) * print_settings.layer_height)
        #👇解説ポイント⑥
        wall = Path(x, y, z)
        full_object.append(wall)
        print(f'layer at {height=}')

    return full_object
        
解説ポイント①をみてみましょう。

G-coordinatorの仕様で
object_modeling関数がメイン処理の基点になります。

つまり、以下はテンプレート扱いです。

            def object_modeling():
    #👇Pathオブジェクトの配列
    full_object=[]

    ###...full_objectに詰物(計算結果)を入れる処理をユーザーが定義

    return full_object
        
ということで、ユーザーはどのようなPathオブジェクトの配列を生成するか、の作業に集中すればよいのです。

次に解説ポイント②に目を移します。

            #...中略
LAYER = 100

#...中略
for height in range(LAYER):
    #...一層ごとの処理を記述
        
こちらもどちらかといえばテンプレートになります。

Python標準の
range関数は、指定した整数個の配列を返します。

なので、
range(100)は、[0, 1, ..., 99]の配列と等価です。

配列の中身は0から始まる整数であることにも注意しましょう。

for height in range(LAYER):で変数heightに配列の値が渡されてループ処理されていることがわかります。

ここからはループ処理の中身の内容です。

まず解説ポイント③では

            arg = np.linspace(0, 2*np.pi, 100)
        
となっています。

G-coordinatorでは高度数値計算ライブラリ
numpyが標準で利用可能です。

np.linspaceはある数値区間を(線形)等分割した配列を返す関数です。

np.linspace(0, 2*np.pi, 100)なら、0と2πを100等分にする配列を取得することが出来ます。

解説ポイント④もnumpyの関数・
cossinを使っています。

            x = 10 * np.cos(arg)
y = 10 * np.sin(arg)
        
このcossinは、引数に数値の配列を入れると、それぞれ入力配列の値にcosとsinで計算した値に換算してくれた配列を返します。

前からかかっている係数の10は半径が10mmという意味です。

解説ポイント⑤は、
np.full_like関数です。

            z = np.full_like(arg, (height+1) * print_settings.layer_height)
        
このnp.full_like関数は既存の配列と同じシェイプで、かつ、全ての要素の値が同一な配列を返します。

簡単な例を挙げると、

            a = np.array([1, 2, 3, 4, 5])
b = np.full_like(a, 6)

print(b)

#実行結果 --> [6, 6, 6, 6, 6]
        
つまりは、一層のz座標の値で埋めたx,yの座標配列に対応した配列が出力できます。

また、
print_settings.layer_heightというパラメータに関してですが、G-coordinatorの左側のパネルにある3Dプリンターの印刷設定が、print_settingsオブジェクトから取得できるような仕様になっています。

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

ここでいうと、
print_settings.layer_height = 0.2になります。

ちなみにz軸の高さの計算値は
(height+1) * print_settings.layer_heightに設定されています。

これは印刷しはじめの第1層目(
height = 0)はheight+1から始めないとベッドとの間にギャップがなくなってしまうのを防止するための+1になっています。

最後に解説ポイント⑥では、各x,y,zの座標配列で初期化した
Pathコンストラクタ関数を使って、一層ごとのノズルの軌跡情報を含んだPathオブジェクトを生成し、full_object配列に追加しています。

            wall = Path(x, y, z)
full_object.append(wall)
        
ということでどれほどモデルが複雑化しようと、

            1. レイヤー数の設定
2. レイヤーごとのx,y座標の配列を計算
3. z座標の計算
4. Pathオブジェクトの生成とfull_object配列への追加
        
という工程の流れはG-coordinatorでは共通したルーチンといえます。

何も考えず印刷開始

はい、コードがある程度把握できたら、3Dプリンターのデフォルト設定のままgcodeファイルを吐き出してみます。

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

出力されたgcodeはそのまま3Dプリンターで出力できますので、シリンダーを何も考えずに3Dプリントしてみましょう。

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

痛恨の失敗...

そういえばフィラメントを換えた直後だったので、一層目がうまくベースプレートに定着できずに、モジャモジャができてしまいました。

G-coordinatorでの1つ目の注意点は、当然ながら高機能スライサーで出力したgcodeとは勝手が違い、スライサーが裏で上手くやってくれてきた、出力前の予備動作(ブリム・ラフト等)や出力中のサポート(支持)、出力終了後のノズルの位置・温度などは自動で面倒をみてもらえません。

いつものスライサー感覚で、G-coordinatorで作成したgcodeをそのまま印刷すると、最小限の印刷動作しかできないことを念頭においておきましょう。

ということで、2回目の印刷では、一層目とベッドの定着具合も安定して押し出されているのを確認してから、

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

きれいな円筒が印刷されました。


Ender-3

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

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

スパイラルモードを使ってZシームは消えるのか?

ZシームとはZ軸方向に継ぎ目のように出来てしまう筋のことで、各層の印刷地点の最初の位置に出来てしまうアレのことです。

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

Zシームが起こる原因は、各層の印刷が切り替わる前後で、z軸座標がワンステップ下駄を履くからです。

例えば、印刷の層方向の高さ間隔を1mmとすると、
NN番目のレイヤーの印刷が終わった時点で高さNNmmの位置にいるノズルは、次の(N+1)(N+1)番目のレイヤーの印刷が始まる前に高さ(N+1)(N+1)mmの位置に移動しないといけません。

この層をまたぐときに起こる余計な動きの痕跡が、「Zシーム」となって見えています。

つまり、Zシームを消すには、
NN番目のレイヤーの印刷の始まりから終わりにかけてじっくり層方向の高さ間隔分移動させるようにします。

結果、Z軸方向へノズルを螺旋状に動かすようにみえることから
「スパイラルモード」と呼ばれるようです。

では、
default_cylinder.pyobject_modeling関数の中のz座標の計算部分を以下のように編集してみます。

            #...
def object_modeling():
    #...
    for height in range(LAYER):
        #...
        #👇コメントアウト
        #z = np.full_like(arg, (height+1) * print_settings.layer_height)
        #👇以下の式に変更
        z = np.linspace(height * print_settings.layer_height,
                        (height+1) * print_settings.layer_height,
                        100)
        #...
        
これで各レイヤーの印刷の開始位置の高さから、徐々にノズル位置が上がっていって、レイヤーの最後の印刷位置が、次のレイヤーの印刷の開始位置の高さと一致します。

実際に印刷をしてみると、

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

結果はなんということでしょう...ほとんど効果がなさそうです。

むしろ、印刷中にノズルの動きが時折カタカタゆらぎはじてめてしまい、その時の影響で印刷物の表面が荒れてしまいました。

Zシームがほとんど消えないのに、印刷中の挙動が不安定になった原因を勝手に考察しますが、
プリンターのz軸方向の移動分解能の限界を考慮に入れていなかった、ということでは無いかと推測します。

今回テストで用いたのは、
Ender-3
ですが、この機体のZ軸方向の分解能は0.04mm程度とされています。

ちなみにz軸方向の移動分解能を決めているのは、ステッピングモーターの回転角度分解能ですので、正確な分解能を計算したい場合はそちらのスペックをみながら考えないといけませんが、だいたい
0.04 ~ 0.05mmといった値の刻みでしかz軸方向には動かせないことになります。

ここで考えなくてはならないのは、1層分の高さ
0.2mmと比較して、分解能ベースでいうと、これはステッピングモーターでいうところの4 ~ 5ステップ程度しかありません。

理想的なスパイラルモードを実現するため、

            z = np.linspace(height * print_settings.layer_height,
                (height+1) * print_settings.layer_height,
                100)
        
とはしましたが、0.2mmを100等分したところで、そんなに細かい分解能に取れるはずがありません。

おそらくは印刷中に3Dプリンターが頑張って、"もっとも近しいz座標"に合わせるために頻繁にz軸を動かそうとしてしまうことで、そのときの印刷ヘッドのブレや振動が伝わり、安定した印刷を阻害してしまったのではないかと...。

なので、スパイラルモード自体は悪いことではありませんが、あまり小さな印刷物...つまりスパイラルモードで指定できるz軸間隔が、印刷物の1層当たりの厚みに比べほとんど変わらない場合、スパイラルモードはほとんど意味が無い、ということでしょう。

スパイラルモードを使いたい場合には、印刷物の一層当たりの厚みを大きくとるか、もしくは高分解能の精密3Dプリンターを使うか、を検討すると良いでしょう。

個人的には、
印刷後の表面処理にてZシームを削って磨くほうが、高度な座標補正計算など何も考えないでいいので良いのでは、と感じました。


Ender-3

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

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

まとめ

今回は、G-coordinatorに収録してあるサンプルのうち、シンプルなシリンダー形状のものを使って、基本的な使い方を紹介してみました。

サンプルにはさらに興味をそそられる形状のものが多数用意されているようです。今後時間があれば他のサンプル形状もチェックしてみたいと思います。

記事を書いた人

記事の担当:taconocat

ナンデモ系エンジニア

電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。