コモノポリタン

コモノ、デジモノが好きなKomonopolitan住民 (はてなダイアリーからの引っ越しです)

3Dプリンターを遠隔操作せよ!

3DプリンターのWebインターフェースOctoPrint/OctoPiを導入する

 かわいい3Dプリンター(8cm角の立体しか造形できないカワイイやつです)が我が家に来てからはや3カ月が経ちました。
 比較的(って他を知りませんが)静かとは言え出来る限り遠くに置いてありますので、印刷するたびにmicroSDにデータを格納して、さらにトップディレクトリに1個しかgcodeファイルが無いようにファイルを移動(これはLABISTS X1の作法)させた上で、てくてく3Dプリンタの所にまでmicroSDを持って歩いて行き差し込んで印刷する、ということを繰り返していました。しかも何を印刷するかもプリンタの所ではわかりません(LABISTS X1にはディスプレイありませんから)。結構面倒になってきました*1

 少なくともLABISTS X1にディスプレイでも付けられないかと調べてみると、下記の記事を発見! www.reddit.com

 ここに出てくるのが「OctoPrint」です。おお!?
 USB接続で印刷できる3Dプリンタを遠隔操作・監視出来るようにする仕組みみたいですね。これはいい。しかもRaspberry Piが標準の導入先のようです。Hass.ioをRaspberry Pi 4にアップグレードした時に余ったRaspberry Pi 3B+を活用できますし。さあ、使えるように導入していきましょう。

この記事の前提条件
Home Assistant 2020.12.2※
HassOS 5.9
Server Raspberry Pi 4(2GB)

※ 知らないうちにバージョニングポリシーが変更になり、「年.月.追番」という形式になりました。ぜったいにver.1になどしてやるか!という強い意志を感じます…

 最後にちょろっとしかHome Assistantは出てきませんが、上記バージョンを前提とした手順です。 (最新版では動かないこともあるかもしれませんが、私が使っている限り、備忘録を兼ねて最新化してゆきたいとは思っています)

1. OctoPrint/OctoPi下調べ

 OctoPrintは下記のサイトですね。3Dプリンターを制御・監視するアプリケーションで、2012年頃から開発が始まっているようです。まったく知りませんでした。 octoprint.org

 OctoPrintのトップページで高らかに謳われているのは下記の3つです。

  • "Full remote control & monitoring" 「完全に遠隔での制御と監視」
  • "Compatible and extendable" 「互換性があって拡張性もある」
  • "100% Open Source"「100%オープンソース

 典型的なOSSな感じですね。まずちょっとイケてないロゴ(というかマスコットというか、みどりのタコ?ありなのか?)。次にコミュニティの力はありそうですが、まとまりは枠組みのみ、という感じな所とか。例えば、始めるにあたってちょっと困惑したのが、どの3Dプリンターが対応しているのか、です。一覧とかは見当たりませんでした。まあ、"Out of the box OctoPrint is compatible with most of the available consumer 3D printers. "(そのままでOctoPrintは市販の3Dプリンタのほとんどと互換性があります)って言っていますからね。
 ForumやFAQなどのナレッジベースには「うまくいっていない3Dプリンタ」については議論されているので、自分の3Dプリンターが出てこなければ「うまくいくんじゃないかな」という希望的観測を持つことができます。

 OctoPiは、OctoPrintとそれに関連するモジュールとMJPG-Streamer (USBカメラやRaspiカメラを使えるようにするやつ)をセットにして、SDカードのイメージにしたものを指します。推奨機種は「Raspberry Pi 3B, 3B+ or 4B」だそうです。動画を扱うので、それなりのマシンパワーを要求するようです。

2. OctoPi導入

2.1. 準備するもの

f:id:maky_Ba:20201122223824j:plain:w200:left OctoPrint / OctoPi
3Dプリンタを制御・監視するオープンソースソフトウェア。Linux、Window、Macにもインストールできますが、RaspberryPiならSDイメージで提供されてるので、インストール・設定の手間が省けます。

f:id:maky_Ba:20190713222847j:plain:w200:left Raspberry Pi 3B+
3B, 3B+, 4が推奨機種です。Zero Wは非力なので印刷品質に影響したりするので推奨されないとのこと。SDカードは4GBもあれば入りますが、タイムラプスの映像とか3Dモデルとか格納するので、もちっと多い方が良いとのこと。
f:id:maky_Ba:20201130013606j:plain:w200:left ケースとUSB電源
当初hass.ioを走らせていたヤツ。USB電源は3B+対応で3.0Aのもの。(ちなみに2.4Aのアダプタを使うと、カメラを繋いでいるせいか、3Dプリンターを繋いでいるせいか、起動の途中かどこかで電力不足になっている様子。警告出ます)
f:id:maky_Ba:20201123132123j:plain:w200:left BUFFALO 120万画素Webカメラ
BUFFALOのUSBカメラ(BSWHD06MBK)で、Raspberry Piに繋いで使えるUVC(USB Video Class)準拠らしい。しょぼいカメラだがコロナ禍でも1000円ぐらいで手に入りました。

 あと必要なものは、LANケーブルぐらいかな。

2.2 OctoPiインストール

1. OctoPiダウンロード
 OctPrintのサイトからOctoPiのイメージファイルの含まれたzipファイルをダウンロードします。私が入れたときは「0.17.0」でした。 octoprint.org

2. microSDに書き込む
 DownloadのページにはUnzipしてimgファイルをEtcherで書き込め、とありますがUnzipは不要です。Etcherを起動して.zipファイルを指定して、書き込み先にmicroSDカード(よーく確認してくださいね。外付けHDDとかに書き込まないように!)を指定して書き込みます。Downloadページにも書いてありますが、昨今のRapspberryPiのOS導入プロセスは起動後にファイルシステムをSDカードの空き領域一杯に拡大するので、手動で拡張するとかはする必要ありません。らくちん。

3. Raspberry Pi初期設定
 microSDRaspberry Pi 3B/3B+/4に挿して、LANケーブルをルーターに挿し、3Dプリンタとはプリンタ付属の青いUSBケーブルで接続しておきます。初回だけ設定用にHDMIケーブルをディスプレイに挿し、USBキーボードも挿して電源投入/起動します。Username=pi/Password=raspberryでログインして、下記のコマンドを入力していつもの通りRaspberry Piの初期設定を行います。

$ sudo raspi-config

 設定は次の通り。

1. Change User Password:
新しいパスワードを入力
4. Localization Option:
"I1 Change Locale"で、en_US.UTF-8 と ja_JP.UTF-8 を選択(en_GB.UTF-8は外しておきましょう)。選択はスペースバーで。Default localeには、jp_JP.UTF-8を指定
4 Localization Option:
"I2 Change Timezone"で Asia/Tokyoを選択。
4 Localization Option:
"I4 Change WLAN Country"で"JP Japan"を選択。無線LANを使わないなら不要ですが。
5 Interfacing Options:
“P2 SSH” でonにする

4. OctoPrintの初期設定
http://<OctoPiのIPアドレス>/にアクセスすると初期設定の画面が表示されます。 f:id:maky_Ba:20201129003038j:plain:w400
 あとは言われるがまま進めてゆきます。まずは「アクセス制御(Access Control)」です。いろいろ書いてありますが、最後の方に管理者(Admin)のユーザ名(Username)とパスワード(Password)の設定を求められますので設定してKeep Access Control Enabledボタンをクリックしてください。実際のアクセスには(Home Assistantでのアクセスを含め)別ユーザを作った方が良いと思うのですがそれは初期セットアップが終わってから。
f:id:maky_Ba:20201129003252j:plain:w240 f:id:maky_Ba:20201129003305j:plain:w240
 次に、「匿名での使用状況の収集の設定(Configure Anonymous Usage Tracking)」の許可を求められますが、これは好き好きで対応してください。その次の「接続確認の設定(Configure the connectivity check)」も、まあ状況次第でよしなに。その次の「プラグインブラックリスト処理の設定(Configure plugin blacklist processing)」は、私は心配だったので有効にしておきました。
 ここまでくればOctoPrintの初期設定は一応終了。 f:id:maky_Ba:20201129004815j:plain:w400
 

2.3. OctoLapseプラグイン導入

 標準でもタイムラプス機能はついていますが、「印刷物が同じ場所での撮影」はうまくいきませんでした(LABISTS X1は造形物が小さい&ヘッドはそれなりの大きさなので、ライムラプスで撮影する画面のほどんどがプリントヘッドになってしまいそうですが)。一定時間間隔でなら撮影できますが、それだとプラットフォームがぐりぐり動いてタイムラプスっぽくありません。
 そんな悩みを解決するOcto Printのpluginがあります。それがOctolapseです。 plugins.octoprint.org
 スライサーで生成したGCodeの途中に制御を差し込んで、プリントヘッドを脇によけて撮影するという素敵な機能も設定可能です*2

f:id:maky_Ba:20201123152048g:plain:w200
mp4をYoutubeとかに貼るのが面倒だったのでアニメーションgifにした(上でさらに50%サイズ変更した)ので解像度とかアレですが、こんな感じのタイムラプス撮れます(mp4とかは綺麗ですよ。120万画素のWebカメラなりに)。

1. OctoLapseプラグインのインストール
 プラグインの制作者がココに(英語ですが画像付きで)丁寧にインストールの仕方を書いてあります。
github.com

2. OctoLapseプラグインの設定
 プラグインインストールの時にプリンタの設定をせよ的なメッセージが出たかもしれませんが、私は実際に印刷しようとしたら「プリンタの設定がねーよ、タイムラプス始められないけど、どう?」みたいなメッセージが出ました。これは標準のタイムラプス機能と違って、印刷中にヘッドを動かして印刷したりするので、プリンタがどんなものか知らないと困るということだと思います。
 OctoLapseのタブからPrinterの所の鉛筆マークをクリックして設定画面に入ります。
f:id:maky_Ba:20201130012549j:plain:w400
 私はLABISTS X1用に下記の設定をしました。合っているかはイマイチ自信ありませんが、とりあえず動いています。
f:id:maky_Ba:20201130012110j:plain:w200 f:id:maky_Ba:20201130013038j:plain:w200
f:id:maky_Ba:20201130013115j:plain:w200 f:id:maky_Ba:20201130013133j:plain:w200
f:id:maky_Ba:20201130013156j:plain:w200

3. つかってみる

3.1. 3Dプリンタの接続

 私の3Dプリンタ(LABISTS X1)の場合は下記の設定でConnect(接続)出来ました。

  • Serial Port: /dev/ttyUSB0
  • Baudrate: 115200

「Connect」ボタンを押してしばらくしてうまくいくと、ボタンの下の「State」欄のStateが操作可能Operational(操作可能)になります。

3.2. 印刷

 まずは印刷するファイルをOctoPiにアップロードします。下の画面の赤枠の所にファイルをドラッグアンドドロップするとアップロードされます(ここではMy_LABISTS_X1_Stand_B v5.gcodeをアップロードしました)。ファイル名の右上にあるアイコンの一番右端のプリンタアイコンをクリックすると印刷が始まります。 f:id:maky_Ba:20210103184334j:plain:w400

 印刷・造形中の画面は下記のような感じです。
 下の左の画面は「Control」タブで、印刷していない時はヘッドを動かしたりするボタンがあるので制御(Control)なのだと面ます。右は「GCode Viewer」タブで、GCodeで実際にヘッドがどのように動くかを可視化してくれます。印刷中は今どのあたりを実行しているか「ほぼリアルタイム」でエミュレートして見せてくれます。ヘッドが大きくてカメラに印刷物が映らないX1では結構役に立ちますよ。
f:id:maky_Ba:20210103190545j:plain:w240 f:id:maky_Ba:20210103185958j:plain:w240
 下の左の画面は、「Terminal」タブで実際にプリンタに送られている指示を見ることができます。まあ通常は「ちゃんとプリンタとの間でやり取りが続いているなぁ」ぐらいしか役に立ちませんが。右は「Octolapse」タブでpluginのoctolapseで撮影されているタイムラプスを見ることができます。
f:id:maky_Ba:20210103185928j:plain:w240 f:id:maky_Ba:20210103184622j:plain:w240

4. おまけ(Home AssistantとOctoPrintの連携!)

 OctoPrint/OctoPiとHomeAssistantとのやんわりとした連携は下記にあります。 www.home-assistant.io  まずはOctoPrint側でAPIアクセスできるようにApplication Keyを発行します。OctoPrintの上の方にあるバーのスパナアイコン(設定アイコン)をクリックして出てきた「OctoPrint Settings」子画面の中のApplication KeysでKeyを生成します。User, Application Idはてきとうに。

  • User: HomeAssistant
  • Application Identifier: HomeAssistantOctoPrint

f:id:maky_Ba:20210103213758j:plain:w400

 つぎにHome Assistant側でconfiguration.yamlにOctoPrintの設定を記載します。

# OctoPrint / OctoPi
octoprint:
  host: !secret octoprint_host
  api_key: !secret octoprint_api_key
  name: OctoPi_1
  number_of_tools: 1
  sensors:
    monitored_conditions:
      - 'Current State'
      - 'Temperatures'
      - 'Job Percentage'
      - 'Time Elapsed'
      - 'Time Remaining'
  binary_sensors:
    monitored_conditions:
      - Printing
      - Printing Error

# OctoPi/ OctoPrint USB Camera
camera:
  - platform: mjpeg
    name: OctoPrint_1
    still_image_url: http://192.168.XX.XX/webcam/?action=snapshot
    mjpeg_url: http://192.168.XX.XX/webcam/?action=stream

 これで状態やカメラの画像をHome Assistantから確認できるようになります。 f:id:maky_Ba:20210103214056j:plain:w400
 なお「やんわり」と書いたのは、Home Assistantから3Dプリンティングの状況はわかりますが、こっちからは何もできない、という点で「やんわり」と表現しました。

5. おわりに

 せっかく3DプリンターIPカメラで監視できるようにしたのに結局それは退役となりました。まあ元々はフィラメントが絡まったりするのを監視するのが第一だったので、フィラメントボックスを作ってその辺りは大分改善されていましたし、3Dプリンティングの途中で造形物が転倒したりしてスパゲッティを生成し始めたりするのは、OctoPrintのUSBカメラで十分確認できる。

maky-ba.hatenablog.com

*1:在宅勤務で歩かないときに万歩計を回すためには良いのですが。

*2:注意:印刷中に抜け出して隅にヘッドを退避させるので、そこの部分に筋が出来ます。印刷品質を重要視するならタイムラプス(OctoLapse)はオフにすべきでしょう。