2022年6月18日土曜日

ラズパイが手に入らないのでZYBOにOctoPrintを導入した

ラズパイが手に入らないのでUbuntuが動いてるZYBOにOctoPrintを乗っけました。
(結局ZYBOに導入後すぐにラズパイ4の在庫を見つけてしまい衝動買いしてしまった。。。) 
ZYBOで動くUbuntu 20.04向けに書いていますが、異なるデバイスでもDebian系のディストリビューションなら大体同じ手順でできると思います。
OctoPiではなく素ラズビアン(ラズパイOS)に手動でOctoPrint入れる手順も大体同じ感じになると思われます。

1. 環境

ハード:ZYBO Z7-20
OS:Ubuntu 20.04
カーネル:xlnx_rebase_v5.10
Ubuntu 20.04に標準で入っているPythonのバージョンは3.8なのでPythonを別途インストール・バージョンアップする必要はない
3Dプリンタ:Voxelab Aquila X2 (ファームウェアはalexqzd v1.3.6 for H32 Beta 2)


2. 構築手順

2.1. ZYBOでLinux環境を構築する

このあたり(https://qiita.com/walk_to_work/items/3577d02a1f622c528092)の記事やその参考文献などを見てZYBOのUbuntu環境を準備する。
なおカーネルビルド時に3Dプリンタのメインボードに載っているUART-USB変換のICに対応したデバイスドライバを組み込んでおくのを忘れずに。ICの型番やメーカーは事前にPCにつないだりして確認しておく。
>Device Drivers > USB support > USB Serial Converter supportにあるので該当ドライバをチェックしてからカーネルをビルドする。Voxelab Aquila X2ではCH341のドライバを入れておけば大丈夫だった。
USBカメラを接続してOctoPrint上で映像を確認したい場合は、
>Device Drivers > Multimedia support > Media drivers > Media USB AdaptersにあるUSB Video Class (UVC)にもチェックを入れておくこと。

2.2. pip3を使えるようにする

ubuntu20.04はそのままだとpip3が使えないのでaptでインストールする。
まずは検索対象リポジトリに、pip3を含んでいる「universe」を追加する必要があるので、aptのリポジトリを追加する(add-apt-repositoryを利用する)ために「software-properties-common」をインストールする。
sudo apt update
sudo apt upgrade
sudo apt install software-properties-common
(時刻が大きくズレたままだとupdateできないのでntpサーバの設定をするか手動で大体合わせておくこと。手動の場合はタイムゾーンの考慮も忘れずに)

その後、
sudo add-apt-repository universe
でリポジトリに「universe」を追加。

updateを忘れずにしてpip3をインストールする。
sudo apt update
sudo apt install python3-pip

余談だが、pip3インストール時プロキシを利用している場合は、aptのプロキシ設定の他に環境変数にもプロキシ設定をしておく必要があった。
またネットワークにつながらない場合、名前解決ができていない可能性があるので/etc/systemd/resolved.confに
[Resolve]
DNS=8.8.8.8 8.8.4.4
と記載し
sudo systemctl restart systemd-resolved
を実行してみると解決することがある。

2.3. OctoPrintをインストールする

あとは基本的にOctoPrintコミュニティのインストール手順に従いインストールするだけでOKだが下記にも手順を記載しておく。

必要なパッケージのインストール、
sudo apt install python3-dev python3-setuptools python3-venv git libyaml-dev build-essential

OctoPrintをインストールするディレクトリを作成し移動しておく。
cd ~
mkdir OctoPrint
cd OctoPrint

下記コマンドでインストールするディレクトリにPythion3の仮想環境を作りアクティベートする。(仮想環境下にOctoPrintをインストールしないと標準Python環境が汚れたり、既にあるパッケージのせいで不具合が起こるのを防ぐため)
python3 -m venv venv
source venv/bin/activate

pipのアップデートをしたあとOctoPrintをインストールする。
pip3 install pip --upgrade
pip3 install octoprint

下記コマンドで手動でOctoPrintを実行できる。なお実行時に仮想環境アクティベートの必要はない。
~/OctoPrint/venv/bin/octoprint serve

起動には数十秒ほどかかる。
同じネットワークにいるPCのWEBブラウザで「ZYBOのIPアドレス:5000」へアクセスするとOctoPrintのページがみられるはず。

2.4. 3Dプリンタにアクセスできるようにする

2.1.で正しいデバイスドライバを組み込めていればZYBOと3DプリンタをUSBケーブルで接続すると/dev/ttyUSB0として認識される。
しかしこのままではアクセス権の関係でこのデバイスを扱えない状態になっているので下記コマンドで自分のユーザーを「dialout」グループに追加する。
sudo gpasswd -a ユーザー名 dialout

3. 便利機能の追加

3.1. 自動起動の設定

こちらも基本的にコミュニティの手順に従えばOK。一応下記にも記載しておく。
wgetにてsystemd用のserviceファイルを入手しserviceファイルを/etc/systemd/system/に移す。
wget https://github.com/OctoPrint/OctoPrint/raw/master/scripts/octoprint.service
sudo mv octoprint.service /etc/systemd/system/octoprint.service
もしwgetで証明書関連っぽそうなエラーが出たら--no-check-certificateのオプション追加で回避できる。

viなどでoctoprint.serviceの内容を少しだけ書き換える。
sudo vi /etc/systemd/system/octoprint.service

User=piのpiをUbuntuの自分のユーザー名、
ExecStart=/home/pi/OctoPrint/venv/bin/octoprintのパスを先ほどインストールしたパス(上記手順でやってればpiをユーザー名にするだけで良いはず)に変更し保存する。

その後下記コマンドにてserviceを有効にする
sudo systemctl daemon-reload
sudo systemctl enable octoprint.service

これでZYBO起動時に自動でOctoPrintが立ち上がる。

3.2. WEBカメラの接続

WEBカメラを接続するためにはmjpg-streamerというカメラの映像をストリーミング配信するためのソフトウェアをZYBOに導入する必要がある。OctoPrintはあくまでmjpg-streamerで配信されている映像を垂れ流しているだけの仕組みのようだ。

下記コマンドでmjpg-streamerに必要なパッケージをインストールする。
sudo apt install subversion libjpeg-dev imagemagick cmake

下記コマンドでgithubからmjpg-streamerのソースをダウンロードしビルドする。
git clone https://github.com/jacksonliam/mjpg-streamer.git
cd mjpg-streamer/mjpg-streamer-experimental
make
sudo make install

mjpg-streamerをsystemdに登録して自動起動させるために、まずは起動に必要なコマンドを記したシェルスクリプトを作成する。ファイル名は何でもいいが、start.shとしmjpg-streamerが入っているディレクトリ(/home/dora/mjpg-streamer)に作成した。
#!/bin/bash
chmod 666 /dev/video0
export LD_LIBRARY_PATH="/home/dora/mjpg-streamer/mjpg-streamer-experimental"
STREAMER="$LD_LIBRARY_PATH/mjpg_streamer"
WWWDOC="$LD_LIBRARY_PATH/www"
PORT="8080"
$STREAMER -i "input_uvc.so -n -f 10 -r 1280x720 -d /dev/video0" -o "output_http.so -w $WWWDOC -p $PORT"

LD_LIBRARY_PATHは各自の環境に合わせる。
最後のコマンドの-f 10はフレームレート、-r 1280x720は解像度を指定している。あまり大きすぎると負荷がかかるのでこのくらいがちょうどよいと思う。
"input_uvc.so -y -n -f 10 -r 1280x720 -d /dev/video0"というように-yオプションを追加するとyuyv形式で映像をカメラから受信し変換してからで配信するためCPU負荷がかかる。mjpg形式に対応していないWEBカメラの場合のみ-yオプションを付けたほうがいい。

systemd用のserviceファイルを下記内容で/etc/systemd/systemに作成する。ファイル名はmjpg-streamer.serviceとした。
 [Unit]
 Description=WebIOPI
 After=syslog.target
 
 [Service]
 Type=simple
 WorkingDirectory=/home/dora/mjpg-streamer
 ExecStart=/home/dora/mjpg-streamer/start.sh
 TimeoutStopSec=5
 StandardOutput=null
 
 [Install]
 WantedBy = multi-user.target

WorkingDirectoryとExecStartは各自環境にあわせること。

その後下記コマンドでsystemd登録し再起動する。
sudo systemctl daemon-reload
sudo systemctl enable mjpg-streamer.service

同じネットワークのPCのWEBブラウザから「ZYBOのIPアドレス:8080」へアクセスするとmjpg-streamerのページが表示され、Streamをクリックすると映像が見られるはず。
Controlで明るさとかフォーカスとかいろんなパラメータが設定できる。(v4l2-ctlで調整できるパラメータと同じ)

mjpg-streamerの設定が無事済んだら、OctoPrintを開き、SettingsのWebcam&TimelapseのEnable webcam supportにチェックを入れStream URLに「http://ZYBOのIPアドレス:8080/?action=stream」を記載しsaveを押す。

OctoPrintのControlに映像が映し出されていれば成功。

4. その他

4.1. USBケーブルについて

稀に印刷中に3DプリンタとZYBOの接続が切れ、造形物の上にヘッドが乗ったままホットエンドもビルドプレートもONしたままで停止していることがあった。下手したら火事になるので危ない。停止してしまうと印刷再開をすることはできなかった。
USBハブでWEBカメラもつけていることによる帯域圧迫や電圧低下が原因だと思っていたがWEBカメラ取り外しても再発。3Dプリンタ-ZYBO間のUSBケーブルをフェライトコア付きのちょっといいやつ(以前は何かの充電用でついてきたショボいケーブル)にしたらWEBカメラありだろうとエラーになることはなくなった。
ということでUSBケーブルはフェライトコアがついてたりシールドされているちょっといいやつを使うのをお勧めする。

4.2. 電源ブチ切り対応(ROM化)

電源ブチ切り対応したかったのでOverlayFSでROM化したかったけどaptでインストールし設定してもうまく反映されなかった。現状はあきらめてSDカードのバックアップを取っておいて普通に電源ブチ切りしているが今のところ十数回ブチ切りしても問題は起きていない。

0 件のコメント:

コメントを投稿