3Dプリントをタイムラプス撮影したい!OctoPrint設定めも

3Dプリンタの印刷風景のタイムラプス撮影がやってみたい!ということで、今回は撮影できる機材と環境を整えてみます。(映像のかっこよさは後で考えましょう。)

まずは結論を

小難しいことをせずにタイムラプス撮影したかったら、Raspberry Piとカメラモジュールを買ってOctoPi入れましょう。

先人たちとOctoPiがめちゃ簡単な手順を用意してくれています。

OctoPiなら、SDカード上の設定ファイル(テキストファイル)をちょっと書き換えるだけで完成するようです。

私はケチってOctoPrintが動く高性能なRaspberry Piを買わなかったので、なかなか面倒な作業をすることになりました。

今回のめもは、Raspberry Piを購入するのをケチったがためにこんな苦労をすることになろうとは…という失敗ログです。(撮影はできる)

私のOctoPrintは通常のLinuxサーバに導入されているため、Webカメラをつないではいおしまい!とはいきませんでした。

手順とできあがりについて

今回はOctoPrintコミュニティの情報をもとに作業量を減らして構築しました。

https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian-or-raspberry-pi-os/2337

実は、微妙に手順を省略しているので以下作業を完了してもOctoPrintのプレビュー画面でカメラ映像が見えません。

タイムラプス撮影はできるし、Slackに画像つきの通知も飛ばせるのでヨシ!としました。

ソフトウェアのインストール

以下ソフトウェアが必要です。

  • OctoPrint
  • FFmpeg
  • mjpeg-streamer

OctoPrintのインストール

過去エントリを参考にしてください。

aose.hatenablog.jp

Raspberry Pi 4 を買えばこんなことしなくてもいいのに・・・

FFmpegのインストール

FFmpegがepelにも用意されていなかったのでsnap使って入れてみました。

https://snapcraft.io/install/ffmpeg/centos#install

# dnf install epel-release
# dnf install snapd
# systemctl enable --now snapd.socket
# ln -s /var/lib/snapd/snap /snap

公式には書いてないけど、再起動しないとsnap動きませんでしたね。

再起動の前に、ついでにOctoPrintを実行するユーザーをvideoグループ(Webカメラにアクセスできるグループ)に追加しておきます。

# usermod -a -G video YOUR_OCTOPRINT_USER

再起動。

# shutdown -r now
# snap install ffmpeg

mjpeg-streamerのインストール

mjpeg-streamerをビルド、Webカメラの映像を常に配信しつづけるようにします。

ビルドに必要なライブラリをインストールします。

# LANG=C dnf groupinstall 'Development Tools'
# dnf install libjpeg-turbo{,-devel}

mjpg-streamerをビルドします。

# git clone https://github.com/jacksonliam/mjpg-streamer.git
# cd mjpg-streamer
# make

ファイアウォールもあけておきましょう。今回はTCP 10080番を開けました。

# firewall-cmd --zone=public --permanent --add-port 10080/tcp
# firewall-cmd --reload

ということで、動作確認をします。

※解像度やポート番号は適宜変更してください。

# mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 1024x768" -o "output_http.so -p 10080" 

配信されているか、VLCなどで再生して確認します。

http://YOUR_SERVER_IP:10080/?action=stream

カメラの映像が配信されていることが確認できたら、systemdでサービス化します。

webcam.sh

#!/bin/bash

# see also: https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian-or-raspberry-pi-os/2337

MJPGSTREAMER_HOME=/path/to/mjpg-streamer/mjpg-streamer-experimental
MJPGSTREAMER_INPUT_USB="input_uvc.so"

# init configuration
camera="auto"
camera_usb_options="-r 1024x768 -f 10 -d /dev/video0"

# runs MJPG Streamer, using the provided input plugin + configuration
function runMjpgStreamer {
    input=$1
    pushd $MJPGSTREAMER_HOME
    echo Running mjpg_streamer -o "output_http.so -p 10080" -i "$input"
    LD_LIBRARY_PATH=. mjpg_streamer -o "output_http.so -p 10080" -i "$input"
    popd
}

# starts up the USB webcam
function startUsb {
    logger "Starting USB webcam"
    runMjpgStreamer "$MJPGSTREAMER_INPUT_USB $camera_usb_options"
}

# echo configuration
echo camera: $camera
echo usb options: $camera_usb_options

# keep mjpg streamer running if some camera is attached
while true; do
    if [ -e "/dev/video0" ] && { [ "$camera" = "auto" ] || [ "$camera" = "usb" ] ; }; then
        startUsb
    fi

    sleep 120
done

webcamd.service

[Unit]
Description=Camera streamer for OctoPrint
After=network-online.target octoprint.service
Wants=network-online.target

[Service]
Type=simple
User=YOUR_OCTOPRINT_USER
ExecStart=/path/to/octoprint/webcam.sh

[Install]
WantedBy=multi-user.target

作成した webcamd.service を登録します。

# cp webcamd.service /etc/systemd/system/
# systemctl enable --now webcamd.service

VLCなどでさきほどと同じようにカメラ映像が配信されていることを確認できたらOK!

OctoPrintの設定

OctoPrintの設定 > Webcam & Timelapse を開いて、準備したカメラ映像のURLを割り当てます。

あとは印刷する際毎回タイムラプス撮影するよう設定すれば完成です。

居間オーディオのセットアップめも(Moodeaudio + Sabreberry32)

居間に設置しているRaspberry Piオーディオのもろもろをバージョンアップしたのでセットアップの流れと設定内容をメモしておきます。

セットアップの流れ

  1. MoodeaudioをSDカードに焼く
  2. 初期設定
  3. Sabreberry32 ドライバ導入
  4. Moodeaudio 設定
  5. おまけ

MoodeaudioをSDカードに焼く

公式からダウンロードして作成します。

最新バージョンではなく後述の Sabreberry32のドライバが対応している7.3をダウンロードします。

https://github.com/moode-player/moode/releases/

初期設定

Wifi

焼いたSDカードをRaspberry Piに差し込んで電源を入れます。

LANケーブルを接続しないで起動するとAPモードとして起動するので、PCで接続、設定します。

APのSSIDやパスワードは公式のセットアップガイドを参照します。

https://github.com/moode-player/moode/blob/r730prod/www/setup.txt

SSH

Configure > System からSSHを有効にします。

Sabreberry32 ドライバ導入

作者さんWebサイトの手順でドライバを導入します。

https://nw-electric.way-nifty.com/blog/2021/08/post-ada6d6.html

Moodeaudio 設定

設定を変更した箇所だけまとめ

Library

NASマウント

  • Path
    • IPaddress/path/to/dir/
  • Option
    • ドメインとSMBのバージョンを追記
    • ro,dir_mode=0777,file_mode=0777,domain=hogehoge,vers=3.0

Audio

  • I2S Audio Device
    • Named device
      • SabreBerry32
    • Driver options
      • slave Disabled
  • MPD Options
    • Volume mixier
      • Hardware
    • SoX Resampling
      • Enabled
        • Yes
      • Bit depth
        • 32
      • Sample ratet
        • 192
      • Multithreading
        • Yes
  • Audio Renderers
  • Spotify renderer

System

  • Timezone
    • Japan
  • Kernel architecture
    • 32-bit
  • HDMI port
    • OFF
  • Wait for eth0 address
    • OFF
  • SSH term server
    • ON

おまけ(BluetoothのAptX HD対応)

先に明記しておきます。

AptXは Qualcomm のライセンスがないと利用できません。

こんな手段もあるんだなーということで紹介にとどめておきます。

https://moodeaudio.org/forum/showthread.php?tid=3683

ライブラリ作者さんの注意書きを引用しておきます。

https://github.com/Arkq/openaptx

This project is for research purposes only. Without a proper license private and commercial usage might be a case of a patent infringement. If you are looking for a library, which can be installed and used legally (commercial, private and educational usage), go to the Qualcomm® aptX™ homepage and contact Qualcomm customer service.

さいごに

SabreBerry32は、製作者さんが公開しているドライバがないとVolumioやMoodeaudioでは利用できません。

複数のディストリビューションそれぞれのバージョンアップに追従してドライバを公開いただいていることにはただただ感謝です。

ただ、Moodeaudioのバージョンアップが作者さん依存になってしまっているので、今後は積極的にMoodeaudioのバージョンをあげるより機器が不調になったら…という流れになりそうです。

3Dプリント設計めも(反省編)

前回のエントリのほか、ときどきFusion360モデリングしてPrusaで出力して組み立てる生活をしています。 aose.hatenablog.jp

ここ最近の設計で失敗した箇所などをここらへんでまとめておこうと思います。 前回のモデリングでハマった箇所をメモ。

次の設計では意識するところ

  • Undoしやすい設計を心がける

    • コンポーネントを基準としてスケッチをするべき/するべきでない箇所がある
      • 部品直径とかは参照しておくとあとから修正しやすい
      • 参照元を修正したときに参照したスケッチ以降が破綻する可能性があるので、参照後の作業量が多い場合は参照しないほうがいい
    • フィレットなどは最後にする。フィレット後の操作があると、もとに戻したり途中に変更を追加した際エラーになりがち
    • スケッチの面を増やしすぎない。あとから編集するとき、どこを触ればいいか分からなくなる
  • 筐体の厚みに注意

    • ケースのようなものを作るときは、無理に厚みを持たせなくても意外と強度がある
    • 厚み10mmでインフィル入れて…なんてやってたけど、厚み2mmでも十分だった
  • 熱圧入に頼らない

    • なんかカッコいい!ってやりがちだったけど、プリント後の人力作業なのでミスが発生しがち。長時間の出力で出来上がった部品で失敗したときの心理的なダメージがデカい
    • 通常のナットに比べて熱圧入のナットはAliExpressでも結構いい値段
    • ほとんどナット埋め込みで十分。Prusaみたいに横から入れる方式にするとさらにラクだった
    • ボルトナットじゃなくて正直タッピングビスでいい
  • 組み立て作業があることを考慮して設計する

    • パーツやボルトは入るけど、締める工具が入らない…なんて箇所があった
    • 組み立ての依存関係を意識する
      • 右のボルトを締める前に左のボルトを締めないといけないが、左のボルトは右ボルトを締めてないと締められない…とかやった
  • 複数のパーツで厚みが揃えたい場合は積層方向を揃える

    • 向きが違うと微妙な段差につながる
  • 同じ値を参照するスケッチが多い場合、変数を積極的に使う

    • 「あと1mm直したい…」というときの修正工数が削減できる。あと、作業漏れがない

今回良かったので、次も意識すること

  • 実物をさわって検証する
    • 1/10スケールでの出力や、部分的な出力で設計の検証をしておくとやり直しが少ない
    • グリップなど手の触れる部分はとくに実物大で作って、感触やにぎりごこちを確認しておく
    • インフィル5%みたいなざっくりしたもので1/1スケールつくるとデザインの答え合わせがしやすい

ラジコを再生するラジオを作った話

f:id:polaroidoon:20210918120133j:plain

作ったキッカケ

ある時、家族のためにいい音のラジオが欲しくなりました。

ラジオをいい音で聴きたいとなると用意するべきはこのあたりでしょう。

  • いい音源
  • いい再生装置

いい音源

ラジオをいい音で聴くための音源といえばradikoですね。FMとは比較にならないクリアな音声です。

いい再生装置

再生装置は安価なオーディオ用のものを用意すれば良いでしょう。

課題

さて、ここまで考えたところで課題にぶつかりました。

ラジオを贈りたい家族はPCもスマホも使ったことがありません。radiko無理じゃん。

いや、できる。ラジオのUIをもつradikoプレイヤー(物理)があればいいんです。

でも世間ではradikoが再生できる簡単なUIのデバイスは売られていません。

ということで、ラジコが再生できるラジオを作ることにしました。

作る前に

材料あつめ

まずは材料を調達します。製作が完走できるか自信がなかったので、できるだけ安価に揃えます。

材料

押し入れで熟成されていた部品たちを使用します。

筐体

3D CADで設計し3Dプリンタで出力します。

小物

AliExpressでいい感じのボタンやケーブルを調達しました。

全体像

実際に家族が使用するシーンを想像しながら検討します。

ボタンはシンプルに4つだけ。これならradikoが分からなくてもラジオとして使ってもらえるはず。

電源以外のボタンはボタンを押すとLEDが点滅するので押したことが分かるようになっています。

  • 電源ON/OFF
  • チャンネル切替
  • 音量+
  • 音量-

ディスプレイにはチャンネルと音量を表示します。

電源はモバイルバッテリー。

LiPoバッテリーと制御基板を買って…というのも試しましたが、このラジオは自分で使うものでありません。

十分な安全装置の付いたモバイルバッテリーをそのまま使用することにしました。

モバイルバッテリーの充電はマグネット式のUSBケーブル。これならUSB端子を扱ったことのない家族にも扱えるでしょう。

音の検証

今回の一番重要なポイントは "ラジオとしての音の良さ" です。

会話がよく聴こえることが大切。

用意した部品、3Dプリントしたエンクロージャーで果たしてまともな音が出せるのか?

密閉型、バスレフ、パッシブラジエーターなどいくつか実際に組み立てて検証しました。

f:id:polaroidoon:20210918115536j:plainf:id:polaroidoon:20210918115549j:plainf:id:polaroidoon:20210918115558j:plain

聴き比べた結果、3Dプリンタで造形できるサイズの兼ね合いもあり密閉型にすることに決定しました。

製作

筐体設計の前に

中のパーツをFusion360モデリングします。

raspberry Pi zeroはgrabCADにあったデータをお借りしました。

f:id:polaroidoon:20210918114744p:plainf:id:polaroidoon:20210918114731p:plainf:id:polaroidoon:20210918114719p:plainf:id:polaroidoon:20210918114636p:plainf:id:polaroidoon:20210918114632p:plain

筐体設計

さきほどモデリングした部品を組み合わせつつ、3Dプリンタの造形エリアに収まるサイズで設計します。

部品のレイアウトを見ながら設計できるって便利。

f:id:polaroidoon:20210918115734p:plain

プロトタイプを作る

3Dプリンタがあると、さっと手に取れるプロトタイプを出力して確認できます。

  • 1/10スケールの全体を出力して雰囲気を確認
  • 持ち手部分だけを数パターン出力して持ちやすい形状を確認 f:id:polaroidoon:20210918120958j:plain

出力

途中で3Dプリンタの調子が悪くなり作業が進まず、数か月製作が止まりました。

試行錯誤しましたが、最後はあきれ果てて3Dプリンタを買い替えたところ、簡単に出力できました。

先代3Dプリンタのあの苦労はなんだったんや・・・ f:id:polaroidoon:20210918174531j:plain

プログラム

raspberry Pi で以下のプログラムを実装します。

  • ボタン制御
  • ディスプレイ制御
  • radikoNHKのらじるらじる再生

f:id:polaroidoon:20210918115707j:plain

あとは電源ON/OFFからSDカードを保護するためにファイルシステムをReadOnlyにしておけば完成です。

組み立て

いい感じに組み立てます。 組み立ての順番を考慮していない設計だったので相当苦戦したのは秘密 f:id:polaroidoon:20210918115643j:plain

できた。

想像してた以上にいい音が鳴ります。

密閉型なので低音は控え目ですが、会話のよく聴こえるラジオに仕上がりました。 f:id:polaroidoon:20210918120151j:plain f:id:polaroidoon:20210918120205j:plain f:id:polaroidoon:20210918120224j:plain f:id:polaroidoon:20210918120243j:plain

反省点

組み立てを考慮できていないとか、寸法が雑だったりとか 設計するうえで改善するべき箇所がたくさんあります。

いつか反省編製作後記としてもまとめるかも。

Raspberry Piがないのでx64なLinuxサーバにOctoPrintを導入する

ようやく組みあがったPrusaですが、以前所有していたAdventurer3より不便なポイントがひとつ。

データを入れたSDカードを挿さないと印刷ができないのです。

この課題を解決するために、Prusaやほかの3Dプリンタユーザーが使っているのがOctoPrint。

Raspberry PiにOctoPrint(OctoPi)を導入している情報はいくらでも出てくるのですが、現在は高性能なRaspberry Pi 3B+や4を推奨とのこと。

我が家の引き出しをあけてもRaspberry Pi Zero Wしか在庫がありませんでした。

しかも、Raspberry Piは性能の向上に伴って価格も上がっています。SDカード運用をやめるために払う金額じゃないんですよねぇ。

結局、Pythonが動いて、シリアル通信で3Dプリンタと話ができればええんじゃろ?

ということで、どこのご家庭にもある常時稼働のLinuxサーバにOctoPrintを導入し、3Dプリンタと接続することにします。

インストールめも

インストール環境

以下、公式サイトに書いてあるまんまです。

https://community.octoprint.org/t/setting-up-octoprint-on-a-raspberry-pi-running-raspbian-or-raspberry-pi-os/2337

インストールの流れ

インストールするディレクトリを用意する。

$ mkdir ~/path/to/install
$ cd ~/path/to/install

OctoPrintをインストールする。

$ python3 -m venv OctoPrint
$ OctoPrint/bin/pip install --upgrade pip
$ OctoPrint/bin/pip install OctoPrint

実行するユーザーにシリアルコンソールの許可を与える。

# id YOUR_USERNAME
uid=1000(YOUR_USERNAME) gid=1000(YOUR_USERNAME) groups=1000(YOUR_USERNAME),986(docker)
# usermod -a -G tty YOUR_USERNAME
# usermod -a -G dialout YOUR_USERNAME
# id YOUR_USERNAME
uid=1000(YOUR_USERNAME) gid=1000(YOUR_USERNAME) groups=1000(YOUR_USERNAME),5(tty),18(dialout),986(docker)

octoprint.serviceを作成してsystemdで自動起動させる。

[Unit]
Description=The snappy web interface for your 3D printer
After=network-online.target
Wants=network-online.target

[Service]
Environment="LC_ALL=C.UTF-8"
Environment="LANG=C.UTF-8"
Type=exec
User=YOUR_USERNAME
ExecStart=/path/to/install/OctoPrint/bin/octoprint

[Install]
WantedBy=multi-user.target
# /etc/systemd/system
# systemctl daemon-reload
# systemctl start octoprint.service

ファイアウォールで5000/tcpを開ける。

# firewall-cmd --zone=public --permanent --add-port 5000/tcp
# firewall-cmd --reload

あとはプリンタとUSBで接続するだけ。

OctoPrintの設定

公式見ながら雰囲気でやった。

https://help.prusa3d.com/en/article/octoprint-configuration-and-install_2182#launching-and-configuring-octoprint

ORIGINAL PRUSA I3 MK3S+を買った

Adventurer3で苦労修行したので、次の3Dプリンタに求めるものを考えました。

  • オートレベリング
  • TPUも使えるダイレクトエクストルーダー
  • 印刷サイズは200mmx200mmは欲しい
  • 改造なしである程度精度のいい仕上がり
  • 情報が集めやすい、パーツが豊富

ということで悩んだ結果、「ORIGINAL PRUSA I3 MK3S+」を購入しました。

https://www.prusa3d.com から直接購入。

Amazon.co.jpでも購入できますが、ビルドシートがPLAに適したものしか付属しません。

本家で購入するとPETG用の表面加工のシートも追加で購入できるのです。

購入から発送まで

まず prusa3d.com での支払い。

  • プリンタ本体+シート $788.99
  • 送料 $102.30

発送はDHL、数日で届きました。

輸入関税が別途必要とのことで、届くまでの期間で支払いの案内メールが届きました。

Webからクレジットカードで支払い可能。便利。

  • 関税+手数料が6,200円

組み立て

届いた箱にも英語マニュアルが同梱されていますが、Webで日本語の組み立てマニュアルを開いて作業しました。 https://help.prusa3d.com/ja/category/original-prusa-i3-mk3s-%E3%82%AD%E3%83%83%E3%83%88%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA_1128

組み立て所要時間は10時間程度。

必要最低限の工具だけは同梱されていますが、手持ちの電動ドライバーやソケットを使用しました。

とにかく大量のネジを締めることになります。電動ドライバーがなければもっと時間を要したことでしょう…

各セクションごとにパーツも袋分けされており、マニュアルを読んで焦らず作業すれば組み立てに苦戦することもありません。白状すると、焦って1か所失敗しました

3Dプリント部品の設計をしたことがある状態で印刷部品を眺めると、考え抜かれている設計にホント関心します。すげぇ。

初回起動

セルフテストで組み立て結果を評価してくれます。

UXいいよなぁ。。。なんて関心しながらテストを眺めていました。

このあたりの手順も日本語ドキュメントが公開されています。 https://cdn.prusa3d.com/downloads/manual/prusa3d_manual_mk3s_jp.pdf

ということで

組み立てて数日使用しましたが、プリント品は評判通りのいい仕上がりです。

Adventurer3と比べてイマイチな点、これだけしかないのですよ。素晴らしい。

  • デカい
    • 想像よりも奥行が長いので場所を取る
    • 棚に収まらなくて横向きに置いた
  • PCから直接印刷できない
    • OctoPrint試す

終・3Dプリンター購入のあれこれ(売却編)

今回のエントリを3行で

  • ここ数か月、Adventurer3のベッドのレベリングに悩まされてきた
  • さすがに故障だと思ってメーカー(代理店)のサポートに送って対応してもらったが、修理ではなく調整で返ってきた
  • サポートでも問題は解決されなかったので、Adventurer3を手放した

前回

aose.hatenablog.jp

ご注意

  • FLASHFORGE JAPANさん批判がしたいわけではありません。
  • 同じAdventurer3所有の方々が同じ症状に悩んでるのを見かけないので、個体差や私の使用方法の問題で破損していた可能性もあります。

私とAdventurer3の2021年

とにかくベッドのレベリングに悩まされる日々だった。

  • 左端はノズルとベッドが近すぎる
  • 左端を調整すると右端がベッドと遠すぎる

どれだけ9点キャリブレーションで調整しても結果は変わらず、twitterで愚痴ばかりの日々…

気づいた

普通、キャリブレーションを行う際にはヘッドとベッドの隙間をコピー用紙2枚分程度に調整する。 しかし、私のAdventurer3では左端は1mm、右端は2mm隙間をあけたところでちょうどいい動作になる。

いや、9点メッシュでレベリングしてるのにそれはおかしいのでは?

ということで、メーカー(代理店)サポートに相談。修理のため発送することとなった。

返ってきたAdventurer3

想像していた故障ではなかったらしく、ベルトのテンション調整とキャリブレーション作業が行われたAdventurer3が返ってきた。

対応結果を確認したが、ベッドの隙間を左端は1mm、右端は2mmにするとよいらしい。

ようやく理解しました。このプリンタ、もうそーいう仕様なんですね。

コピー用紙2枚分とか目安があれば調整できますが、このパターンだと調整の指標がない。

隙間が1mmとか2mmというよく分からない状態を作って、印刷して初めて良し悪しが分かる。

ここまでトライ&エラーを繰り返してキャリブレーションしないと使えないのはちょっと困る。

私はキャリブレーションがしたくてAdventurer3を購入したわけではない。

手放した

売却しました。

むしゃくしゃしてやった

チェコからHARIBO買いました。