Flashforge Adventurer3 のノズル詰まりの直し方

Flashforge Adventurer3 でプリントを開始してもフィラメントがまったく出てこなくなってしまったので、ノズルにフィラメントが詰まっていると考えて除去したら直りました。

マニュアルに詰まりの解消方法が書いてありますが読んだだけでは細かいところがよく分からなかったので、また必要になった時のために実際にやった手順を書こうと思います。

マニュアルの確認

マニュアルの3章Q&AのQ1にノズルが詰まった時の解決方法が載っています。

f:id:LocaQ:20180825203526p:plain:w500

また、方法1の「エアーチューブジョイント」は、マニュアルの「1.1 部品紹介」の「2. フィラメントガイドチューブジョイント」の事だと思われます。

f:id:LocaQ:20180825203650p:plain:w600

ノズル詰まり解消の手順

マニュアルの方法1と2を行います。

フィラメントをアンロードする

手順ではアンロードしていないのでこれはやらなくてもいいと思いますが、自分はやってしまったので一応書いておきます。

アンロードは本来のメニューの「樹脂交換」を選択して行います。フィラメントがアンロードされたら「確認」を押さずに、「←」を押してメニューのトップに戻ります。

ヘッドを移動する

フィラメントの除去ではヘッドの上部からピンツールを押し込むので、ヘッドの場所によっては作業ができません。なのでヘッドを作業しやすい場所へ移動します。ヘッドの移動はメニューの「ツール」→「設定」→「移動」でできます。

移動先は最下部から少し上のあたりにしました。ヘッドの上部に拳を入れるので下の方、ただし下過ぎるとノズルから出たフィラメントを取りにくくなるので最下部より少し上、という感じです。

f:id:LocaQ:20180825210528j:plain:w800

エクストルーダーを加熱する

メニューの「ツール」→「加熱準備」を選択してエクストルーダーの温度を200℃まで加熱します。プラットフォームは加熱しなくていいのでOFFにします。

f:id:LocaQ:20180825211029j:plain:w800

ヘッドからガイドチューブを取る

「フィラメントガイドチューブジョイント」を押してチューブを取ります。チューブジョイントは画像の黒い部品で、これを下に押し込むと体感で1mmくらい下がります。その状態のままガイドチューブ(ジョイントに繋がっている白いやつ)を引っ張って抜きます。ちゃんとジョイントを押し込めていればそんなに力はいらなかったです。

※エクストルーダーが熱いので触らないように気を付けます。

f:id:LocaQ:20180825211844j:plain:w400

ガイドチューブを取れました。

f:id:LocaQ:20180825212344j:plain:w800

フィラメントを除去する

詰まり除去用ピンツールを使ってノズルの中のフィラメントを押し出して除去します。

詰まり除去用ピンツールは付属品のこんなやつです。

f:id:LocaQ:20180825212317j:plain:w400

ピンツールをチューブジョイントの部分に差し込みます。フィラメントが中に残っていると柔らかい感触がするので押し込みます。押し込むとノズルからフィラメントが出てきます。これを繰り返してフィラメントを全て押し出します

f:id:LocaQ:20180825212618j:plain:w800

なんとなくコツを書くと、

  • ゆっくり押し込む
  • 中の空洞の側面にあるフィラメントを下に押し込む感じでやる
  • ノズルからフィラメントが出てこなくなっても念を押して何度も繰り返す

という感じでやりました。

念を押して何度も繰り返すのは、もう出ないと思っても意外と出てくるためです。1回1回では変化がなくても何度もやると変化があったりします。そしてちゃんと除去できていないとおそらく次のフィラメントのロードでまた詰まってしまいます。私は2回やりました。

元に戻す

フィラメントを除去し終わったら、チューブジョイントを押し込みながらガイドチューブを差し込んで元の状態に戻します。

フィラメントをロードする

除去が終わったらメニューの「樹脂交換」→「押出」を選択してフィラメントをロードします。もしここでフィラメントが出てこず、フィラメント吸入口から「ガッガッ」といった感じの音がしたら、まだフィラメントが詰まっていると思いますので上の手順を再度やります。

フィラメントがノズルから出てくるようになったら成功です。

仕上げ

最後にメニューの「ツール」→「設定」→「校正」を選択して校正します。

Flashforge Adventurer3のビルドシートを交換する

Adventurer3のプラットフォームからラフトを剥がせなくなってしまったので、ビルドシートを交換してみることにしました。

ビルドシートの注文

ビルドシートは公式サイトから注文することができます。

flashforge.shop-pro.jp

flashforge.shop-pro.jp

プラットフォームの掃除

シートを剥がしたら糊がプラットフォームにかなり残ってしまいました。結構強力で、ググって出てきた消しゴムをかけたり食器用洗剤を使ったりする方法では取れませんでした。

f:id:LocaQ:20180811133345j:plain:w800

ツイッターでつぶやいたところ、FLASHFORGE JAPAN の方から無水エタノールかシンナーで取れると教えていただいたので、無水エタノールを注文して試してみました。

準備

以下のものを用意します。

f:id:LocaQ:20180811133415j:plain:h300

また、掃除に入る前に以下のことをやっておくとよいと思います。(やらずに掃除をした後で気付きました。)

  • プラットフォームのつまみのネジにノリが付くので事前に取っておく
  • シートを正確に張れるように上下左右の間隔を測っておく

掃除

まず無水エタノールが床にかからないように段ボールを敷きます。そしてプラットフォームに無水エタノールをかけて数十秒待ってから雑巾でこする、を繰り返します。

最初は雑巾に無水エタノールを染み込ませてこすってみたんですが、何もなしでこするよりもだいぶ楽そうでしたが糊を取るのにかなりこする必要がありました。その後直接かける方法でやってみたらずいぶん楽に取れるようになりました。

f:id:LocaQ:20180811140926j:plain:w800

掃除が終わって綺麗になりました。上の方に少しノリが残っているように見えますが、触ってもベタベタしなかったので問題ないと思います。

f:id:LocaQ:20180811133500j:plain:w800

シートの貼り付け

綺麗になったプラットフォームに新しいビルドシートを張ります。ビルドシートは固めなので、皺ができることもなく簡単に張れました。

f:id:LocaQ:20180811133520j:plain

Flashforge Adventurer3 でABSフィラメントを使った

ABSフィラメントを使ってサイコロを出力

前回は本体に付いてきたPLAフィラメントを使いました。

locaq.hatenablog.com

今度はABSフィラメントを購入して使ってみました。出力したのは前回のサイコロで設定は標準です。

f:id:LocaQ:20180807214533j:plain:w600

PLAのサイコロと品質面の違いは特に見当たりらず、サイズも同じでした。

印刷時間は出力が始まってからの時間はPLAと変わりませんでしたが、出力が始まる前にヘッドとプラットフォームを温める時間が結構長くかかりました。このサイコロの時は6分50秒ほど経ってからオブジェクトの出力が始まりました。PLAの時は測ってなかったんですが、こんなに長くはなかった気がします。

その他

他にもオブジェクトを出力してみていていくつか分かったことがあります。

ラフト

ABSで最初に出力したのはギアだったんですが、ラフトを無効にして出力したら失敗しました。

この後ラフトを有効にしたらうまく出力できたので、これ以降は必ずラフトを有効にして出力するようにしています。

ヘッドの温度

[2018/08/11 追記] ヘッドの温度を230℃にすると、プラットフォームとラフトの食いつきが非常に強固になり、ヘラを使っても剥がれなくなってしまうようになりました。デフォルトの225℃の戻したところまたうまく剥がれるようになったので、温度設定はデフォルトのままにする方がよいです。

Adventurer3のABSのデフォルトだと、ヘッドの温度が225℃になっています。ところがこの温度だとオブジェクトを出力すると糸が引いたり、変な所にも樹脂が出てしまうことが結構ありました。

調べてみると、ABSでは230℃以上に設定するらしいので、設定で230℃にして出力するようにしたらうまく出力されることが多くなりました。(それでもたまに起きます。)

プラットフォームの温度

ABSの場合はプラットフォームの温度が100℃くらいになるので、出力が終わった後に触るときはやけどしないように注意する必要がありました。

作ったもの

サイコロ以外にABSフィラメントを使って作ったものです。モデルは全てFusion360で作りました。

ギア

モジュール0.5という規格のギアで歯数は36と12です。タミヤの工作キットのギアと同等のものが作れるか確認したくて作ってみたものです。

同じものはPLAでも出力していました。

ただ課題があって、真ん中の穴の直径がデータより小さくなってしまいます。

乾電池ホルダー

乾電池を収納ボックスにそのまま入れて保管していたんですが、ショートしたら危ないなぁと思っていたのでホルダーを作りました。(これを作るときに金属のノギスでサイズを測っていたら、電池が発熱して火傷しかけました...)

ユニバーサルジョイント

3Dプリンターで作ってみたかったものの1つがユニバーサルジョイントでした。

Flashforge Adventurer3を購入

新しくFlashforge Adventurer3という3Dプリンターを買いました。

f:id:LocaQ:20180728193817p:plain:w600

今までは1年半前くらいに買ったダヴィンチMini wという機種を使っていました。

locaq.hatenablog.com

それが2,3ヶ月前に壊れて印刷途中にエラーで中断するようになってしまいました。修理を考えましたが1万数千円する(人件費を考えると高くはありませんが)のが分かったのと、フィラメントにPLAだけではなくABSを使いたいと思うようになっていたので新しいプリンターを買うことにしました。その時にちょうどFlashforgeが近々新しくプリンターを発表する情報を得たので、それを待って購入しました。

この記事ではセットアップから実際にモデルを印刷してみたところまで、マニュアルだけでは分からなかった所や実際の手順、印刷した感想なんかを書こうと思います。本体の操作方法はマニュアルに書かれているのでこの記事では詳細な操作方法は省きます。

セットアップ

まずは公式サイトから3つのドキュメントをダウンロードします。

adventurer3 | 3Dプリンター | フラッシュフォージ

  • ユーザーガイド
  • 開封する際の注意事項
  • クイックスタートガイド(任意)

クリックスタートガイドはプリンターに同梱されていますが、あとの2つはダウンロードする必要があります。特に 開封する際の注意事項」 は重要で、電源を入れる前にそこに書かれている緑の部品を取り外す必要があります。

次はクリックスタートガイドの通りに電源ケーブルを接続して電源を入れ、以下のような手順でセットアップしました。

  1. プリンター本体の言語設定の変更
  2. フィラメントのロード
  3. Wifiの設定
  4. 校正
  5. FlashPrintのインストール

プリンター本体の言語設定の変更

まずは本体のタッチスクリーンで言語設定を日本語にします。ただ、「フィラメント」も「樹脂」と訳されていて逆に分かりにくかったり、日本語が不自然だったりするので英語が分かるならそのままでもよいかもしれません。

フィラメントのロード

これはクリックスタートガイドの通りにやります。フィラメント吸入口にフィラメントを入れた状態でロードを開始した後はゆっくりフィラメントがロードされるので数分かかります。数分すると検査の時に使ったであろう白い樹脂と、今回付属していた赤い樹脂が出てきます。

(ただ、今思うともっと奥まで押し込んでいたらすぐにフィラメントが出てきたのかもしれません。)

Wifiの設定

タッチスクリーンで操作してWifiの設定をします。これはクイックスタートガイドではなくマニュアルに書かれています。WifiをONにする(スクリーンの右上でONにできる)と、アクセスポイント一覧が表示されます。そしたら接続するアクセスポイントを選んでキーを入力します。

ただし、アクセスポイント一覧に5GHz帯のアクセスポイントが出てこなかったので、対応しているのは2.4GHz帯の規格だけのようです。

あと私は使っていませんが、有線ケーブルにも対応しているようです。

校正

お試しでモデルを印刷して失敗するのも嫌なので先に校正をします。タッチスクリーンで校正を選んだら、ノズルとプラットフォームの間の距離を調整します。私はノズルとプラットフォームの間に普通紙を通してみてギリギリ通らなくなった距離にしました。これでよいのか分かりませんが、ちゃんと印刷できたのでたぶんいいと思います。

FlashPrintのインストール

モデルを印刷するためにはデータを用意する必要がありますが、そのためにFlashPrintというソフトウェアを使うようなのでインストールします。FlashPrintはFlashforgeのサイトからダウンロードできます。

サポート | 3Dプリンター | フラッシュフォージ

ダウンロードしたらZIPファイルを展開してインストールします。

記事を書いている時点でダウンロードできるのは3.21.0が一番新しいですが、既に3.23.1が公開されているらしく、それをもう一度インストールする必要がありました。

ちなみに、私はVivaldiというブラウザを使っているのですが、ディスプレイの右半分にブラウザを表示していたらダウンロードリンクの表が表示されず、最大化したらリンクが表示されました。もしVivaldiを使っていてリンクが表示されなければ、最大化するか他のブラウザを使ってダウンロードするとよいと思います。

FlashPrintの使い方

f:id:LocaQ:20180729001800p:plain:w600

プリンターに接続する

FlashPrintを起動したらまずはプリンターに接続します。接続はメニューから「スライス」→「プリンターに接続する」をクリックします。クリックするとプリンターのIPアドレスとポート番号を入れるダイアログが表示されます。

f:id:LocaQ:20180729001927p:plain

プリンターのIPアドレスとポートは、プリンターのタッチスクリーンから、「ツール」→「その他」を選択するとIPアドレスが表示されます。「192.168.0.2:8899」と表示されているので、':'の前がIPアドレス、後がポート番号です。

モデルデータを読み込む

印刷するモデルーデータを用意します。私は前に使っていたプリンターのギャラリーからサイコロのモデルをダウンロードしました。

他にはThingiverseというサイトでダウンロードがあります。ここから単純であまり大きくないモデルを探してダウンロードするとよいと思います。FlashPrintは".stl, .obj, .fpp, .3mf, .png, .jpg, .jpeg, .slc, .bmp"というフォーマットのファイルに対応しているようです。Thingiverseでも大抵".stl"ファイルだと思います。

モデルデータが用意できたらFlashPrintで読み込みます。画面上部の「ロード」という青いボタンをクリックしてモデルデータを選択します。

f:id:LocaQ:20180729003259p:plain:w600

印刷用データに変換(スライス)する

モデルデータを読み込んだら画面上部の「スライス」と書かれている青いボタンをクリックして3Dプリンターで印刷できる形式に変換します。まずは標準設定にしました。

  1. 「樹脂の種類」をPLAにする
  2. サポート材を無効にする
  3. 解像度は「標準」

f:id:LocaQ:20180729003012p:plain:w800

サポート材はモデルによっては必要なので、その場合は有効にします。

印刷

FlashPrintから印刷するとプリンターで印刷が始まります。約46分かかると推定されました。

f:id:LocaQ:20180728193958p:plain:w600

プリンターのタッチスクリーンに印刷中のデータが表示されていました。モデルのファイル名や残り時間が表示されてます。下にボタンがあるので一時停止したりできるようです。

f:id:LocaQ:20180728194101p:plain:w600

印刷しているところです。

f:id:LocaQ:20180728194041p:plain:w600

印刷が終わりました。

f:id:LocaQ:20180728194132p:plain:w600

f:id:LocaQ:20180728194324p:plain:w600

前にダヴィンチMini wで印刷したサイコロとAdventurer3で印刷したサイコロを比べてみます。ただし、ダヴィンチのものはどんな印刷設定だったか分からない(壊れているので再度印刷することもできない)ので公平な比較はできないです。

見比べるとどちらも同じ大きさですし積層にも違いはないです。

f:id:LocaQ:20180728194202p:plain:w600

f:id:LocaQ:20180728194224p:plain:w600

裏面(プラットフォームに接する面)は少し違いがありました。というのも、ダヴィンチの場合はプラットフォームにシートを張っていてそれがモデルに模様として写ってしまっています。でもAdventurer3はプラットフォームの模様が写っていないので、ここは良いなと思います。

f:id:LocaQ:20180728194248p:plain:w600

印刷時間は推定は46分でしたが、実際は約53分でした。

印刷(高精度)

次は同じモデルを高精度設定でレイヤー高さを0.05mmにして印刷してみます。

f:id:LocaQ:20180729003639p:plain:w800

写真でうまく撮れなかったんですが、標準設定(左)と高精度設定(右)を比べると目で見て分かるくらいの違いがあります。高精度ではレイヤーの凹凸が目視できないレベルでした。また、指で触ると標準設定は凹凸を感じますが、高精度設定はツルツルした感触です。

f:id:LocaQ:20180729001111p:plain:w600

上から見比べると、穴の中のレイヤーの粗さに違いがあるのが分かります。高精度設定はすごく細かいです。

f:id:LocaQ:20180729001134p:plain:w600

最後に印刷時間ですが、推定は3時間51分でしたが、実際は4時間7分でした。レイヤーの高さは3.6倍薄くなりましたが、印刷時間は約4.4倍になった計算です。

感想

印刷を始めてまず思ったのが動作音が静かなことでした。ダヴィンチとの比較になりますが、印刷スペースを覆っていて音が漏れにくいのもあって、ファンの音はそれなりに発生していますが同じ部屋で別の作業もできるレベルの静かさだと思います。

また、PCで使うソフトウェアが使いやすいと思いました。ダヴィンチの場合はXYZwareというソフトウェアを使うのですが、処理待ちになるとソフトが数秒間固まるので使っていて快適ではなかったです。FlashPrintは固まるような動作をしませんし、UIも自分は分かりやすいと感じました。

印刷については、高精度設定なら印刷したものによっては表面の仕上げをしなくてもそのまま使えそうなくらいでした。また、標準設定でも歪みもなさそうですしバリもでませんでしたので印刷品質も良いと思います。

後は本命のABSでも印刷も試してみたいですが、まだフィラメントがないので後日になります。今回の結果を見ると結構期待できそうです。

.NETアプリでマルチコアCPUを活かす

F#でレイトレーサーを作っていてArray.Parallelモジュールを使って処理を並列化したら、CPU使用率が40~50%くらいまでしか上がらない現象が発生しました。原因を調べたら.NETランタイムのGCの設定を変更することで解消できたので記事にまとめます。

現象

以下が並列化している個所のコードで、640 x 480の解像度の画像を生成する場合、あるピクセルの色を計算するrenderPixel関数が640 x 480 = 307,200回呼び出されます。また、renderPixel関数では最大1万回シーンオブジェクト(球など)との衝突判定と色の計算が行われ、そのときにベクトルの計算(和や内積など)を大量に行います。

let render scene (width : int) (height : int) =
    let coords =
        seq {
            for y in 0..(height - 1) do
                for x in 0..(width - 1) do
                    yield { X = x; Y = y }
        }
        |> Seq.toArray
    let data =
        coords
        |> Array.Parallel.map (fun coord -> renderPixel scene width height coord)
    { Width = width; Height = height; Data = data }

f:id:LocaQ:20180624013300p:plain

この状態だと私のPCでは1枚の画像を生成するのに約550秒(9分10秒)かかりました。

CPUを100%まで使い切れればより速く画像を生成できるので原因を調べることにしました。あと、せっかくマルチコアのCPUを使っているのに活かし切れていないのはもったいないと思うので。(正直こっちの理由の方が大きいです。)

また、F#のArray.Paralle.mapは内部でSystem.Threading.Tasks.Parallel.Forを使っています。なのでこの現象はF#固有の現象ではないです。(調べたら.NETのランタイムが原因でした。)

Parallel.map<'T,'U> Function (F#)

解決策

解決方法を先に書くと、.NETのGCのモードをサーバーGCというものに変更すると解決しました。

ガベージ コレクションの基礎 | Microsoft Docs

.NET Frameworkの場合

App.configgcServerという要素を追加してenabled属性の値をtrueにします。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

<gcServer>要素 | Microsoft Docs

gcServerはデフォルトでfalseワークステーションGC)です。

.NET Coreの場合

プロジェクトファイルにServerGarbageCollectionを追加して値をtrueにします。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <ServerGarbageCollection>true</ServerGarbageCollection>
  </PropertyGroup>

  ...

</Project>

project.json と csproj の比較 - .NET Core | Microsoft Docs

この設定をするとCPU使用率が100%まで上がるようになり、約202秒(3分22秒)、変更前より約2.7倍速く画像を生成できるようになりました。

f:id:LocaQ:20180624013320p:plain

改善した理由

ガベージ コレクションの基礎 | Microsoft Docs

このページの「ワークステーションとサーバーのガベージ コレクションの比較」に、

ワークステーションのガベージ コレクションにおける、スレッド処理とパフォーマンスについての注意点を次に示します。

・コレクションは、ガベージ コレクションをトリガーしたユーザー スレッドで、それと同じ優先順位で実行されます。 ユーザー スレッドは一般に通常の優先順位で実行されるため、その場合 (通常の優先順位のスレッドで実行された場合)、ガベージ コレクターの CPU 時間が他のスレッドと競合します。

...

サーバーのガベージ コレクションにおける、スレッド処理とパフォーマンスについての注意点を次に示します。

・コレクションは、 THREAD_PRIORITY_HIGHEST の優先順位で実行される複数の専用スレッドで実行されます。

・ヒープおよびガベージ コレクションを実行するための専用スレッドは CPU ごとに 1 つずつ用意され、複数のヒープのコレクションが同時に行われます。 各ヒープには小さなオブジェクト ヒープと大きなオブジェクト ヒープがあり、どのヒープもユーザー コードからアクセスできます。 異なるヒープのオブジェクトを相互に参照できます。

・複数のガベージ コレクション スレッドが連携して処理を行うため、同じサイズのヒープを処理した場合、サーバーのガベージ コレクションの方がワークステーションのガベージ コレクションよりも高速です。

...

と書かれていました。

レイトレーサーではベクトルの計算を大量に行うため、有効期間が短い(ジェネレーション0)ベクトルクラスのオブジェクトが大量に生成されます。(これはVisual Studioのプロファイラを使って確認しました。)

そのためgcServerを有効にする前はGCを1スレッドで行っていたためボトルネックになりCPU使用率が上がらず、gcServerを有効にした後は論理CPUの数(私のPCの場合は12)だけGCのスレッドが用意されてボトルネックが解消されてCPU使用率が上がったのだと思います。

その他

今回の現象について調べてる最中に知ったことが他にもあるので、せっかくなので書いておきます。

CPUグループ

CPUグループは64個の論理CPUをまとめたもので、1つのシステムで64個より多い論理CPUがある場合は複数のCPUグループが存在するみたいです。

Processor Groups (Windows)

また、How to Get Started with Multi-Core: Parallel Processing You Can Use – US ISV Evangelismに、

CLR only uses processor group 0 and doesn’t call any of the new Windows NUMA APIs. If you are a C# or VB developer, you’ll be able to use up to 64 processors. This provides plenty of processing power for the foreseeable future on commodity hardware. But rather than embed NUMA into your code, .NET Framework 4 provides some a new namespace that lets you take advantage of parallel processing power in your PC.

と書かれていました。CLR(共通言語ランタイム)はデフォルトで1つのCPUグループしか使わないようです。

なので、もし64個より多い論理CPUを持つシステムで.NETアプリを動かす場合、CLRで全てのCPUグループを使うようにする設定が必要みたいです。

.NET Framework の場合

c# - Unable to use all processors in .NET on AWS c5.18xlarge 72 vpu - Stack Overflow の回答によると、App.configThread_UseAllCpuGroups, GCCpuGroup, gcServerを有効にする設定をするらしいです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <runtime>
    <Thread_UseAllCpuGroups enabled="true"/>
    <GCCpuGroup enabled="true"/>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

<Thread_UseAllCpuGroups>要素 | Microsoft Docs

<GCCpuGroup>要素 | Microsoft Docs

.NET Core の場合

.NET CoreではServerGarbageCollectiontrueにして、さらに以下の2つの環境変数を追加すると同等の設定ができるようです。

coreclr/clr-configuration-knobs.md at master · dotnet/coreclr