Creality Ender-3にWifiモジュールを導入してOctoPrintから無線で操作できるようにする

Wifi経由でプリントを行うことはおすすめしません。

同じ経験をする人が少なくなることを願っています。

はじめに

私はOctoPrintをRaspberry Pi Zero W(以下PiZero)で運用していたのですが、OctoPrintのprogress取得に5秒以上かかることなどざらでWebcamの映像がプチフリするのはいつものことでした。 そこでWifiモジュールを導入して、PiZeroではなく別のサーバー上でOctoPrintを稼働させる案を思いついたので実践してみた。

全体構成

まず通常の構成は以下のようになっていると思います。

f:id:syuchan1005:20210113181553j:plain
RaspberryPiを用いた、通常のOctoPrint構築の様子

この構成ではPiZeroに大きな負荷がかかることが懸念されるため、以下のように構成を変更します。

f:id:syuchan1005:20210113181828j:plain
Wifiモジュールを用いて無線化を行う例

この構成を用いるとOctoPrintを実行しているサーバーとプリンタ, Webcamを分離することができます。

ESP3Dの導入

ESP3DとはUSB経由で行っていたシリアル通信をTCPに変換するブリッジです。そのほかにもWebUIを用いて3Dプリンタの操作を行えます。

導入には github.com

よりReleaseのzipをダウンロードし、 https://github.com/luc-github/ESP3D/tree/v2.1.1#installation を参考にセットアップを行います。

私の利用しているSKR v1.4 Turboには専用のソケットが存在するため、ESP8266との接続は以下の図のように行いました。

f:id:syuchan1005:20210113183412j:plain
接続の例

また、プリンタ側のシリアルポートは3なので、Marlin Firmwareの場合、Configuration.hのSERIAL_PORTかSERIAL_PORT_2を3にする必要があります。

RaspberryPiからWebcamの映像を配信する

映像の配信にはOctoPrintでも利用しているmjpg_streamerを利用します。 mjpg_streamerの導入は多数の記事があるので省略します。

ESP3D経由でOctoPrintからプリンタを操作する

全体構成で示している図の通りOctoPrintは別のサーバ上で実行します。また構築の簡略化のため以下のdockerイメージを利用しています。

https://hub.docker.com/r/octoprint/octoprint

3Dプリンタとの通信にはESP3Dから提供されているData port(デフォルト: 8888)を利用します。しかしOctoPrintはtcpを喋れないため、socatを利用しOctoPrintから利用できるようにします。 socatを利用したパイプの作成には以下のコマンドを利用しました。

$ socat -d -d pty,raw,link=/dev/virtualcom0,user=<User> tcp:<ESP3D IP>:8888,forever,interval=10,reuseaddr

OctoPrintから/dev/virtualcom0が見えない場合、以下のようにAdditional serial ports/dev/virtualcom*を追加すると選択できるようになります。

f:id:syuchan1005:20210113185537p:plain
OctoPrintのserial設定の例

またWebcamの設定は以下のようにすると映像を見ることができます。

  • Stream URL: http://<raspberry pi ip>/?action=stream
  • Snapshot URL: http://<raspberry pi ip>/?action=snapshot

おわりに

初めにも言いましたがWifi経由でプリントを行うことはおすすめしません。

ですが便利なことは確かです。この構成のためにローカル用のWifiルーターを購入しようかと考えましたが、Raspberry Pi 4Bを導入したほうが安定するためそちらを選択しました。 時間があればBLE経由での操作等も試してみたいと思っています。