はじめに
ベビーモニターが必要となった。怪しいスマホアプリや既製品のカメラを使うのを避けるため、(これはいい口実ができたと)Raspberry Pi で自作することにした。
以下の記事をベースに作成したので、この記事からの変更点や、苦労したポイントなどを備忘録として残しておく。
完成イメージ
ベビーモニター本体
撮影された映像
購入品
購入品は以下の通り。物価高のせいか元記事と比べても高くなっており、既製品を買うのと比べて安いかはわからない。
Raspberry Pi 本体
元記事に合わせてRaspberry Pi 3B+ をAmazonで7200円で購入した。結果としては必要なスペックを満たしていて特に問題はないと思われる。
ちょっと高いので、中古などで5000円程度で入手できるならそちらでもいいかもしれない。あるいは他に流用するつもりなら4や5を買った方がスペックに困らないかもしれない。
Raspberry Pi 電源
家に転がっていたiPad用の5V/2A(10W)のAC-USBアダプタとmicroUSBケーブルを流用した。
ちなみにRaspberry Pi 3B+は5V/2.5A以上が推奨されているが、この用途では2Aでも動作した。通常の1AのAC-USBアダプタだと電力不足で起動できなかった。市販品だと5V/3Aのアダプターが1000円程度でAmazonで売られている。
Raspberry Pi ケース
Amazonで安そうなケースを2つ購入した。
最初に買ったケースは「GeeekPi Raspberry Pi 3 B+ ケース」(1249円)だったが、これはかなり微妙だった。
- 添付写真のとおり、プラスチックを縦に9枚並べているので、ねじ止めしていないとバラバラになってとても扱いにくい。また、購入した製品は工作精度が悪く一部はまらないところがあったので、ハサミで一部切断した。
- CPU冷却用のファンが付属しているが、マイクにファンの音がノイズとして乗るため、結局ファンは使用していない。そのため動作時のCPU温度は65℃程度とやや高い。
- 組み立て説明書は付属しないので、Amazonの商品ページの写真を見つつ組み立てる必要がある。
これを踏まえて、ファンレス冷却ケース「Geekworm Raspberry Pi 3 B+/ 3Bケース」(1899円)をAmazonで購入した。
https://www.amazon.co.jp/dp/B094QDFSLV
こちらは動作時のCPU温度が45℃程度と十分冷却できており、比較的不満は少なかった。注意点としては、以下の2点。
- カメラスロットはあるが位置が少しずれているので、若干リボンケーブルを曲げないと外に出せない
- 組み立て説明書はないので、CPUに貼るサーマルパッドはケースにちょうど接着する厚さのものを試行錯誤で選ぶ必要がある
カメラ
最初に「RasTech Raspberry Pi カメラモジュール」をAmazonで1480円で購入した。このカメラは暗所では使えなかったため、私は結局使用しなかった。予備のリボンケーブルが複数ついてくる点は嬉しい。
暗所でも使えるカメラとして、公式の「Raspberry Pi カメラモジュール3 NoIR」を4620円で秋月で購入した。
このカメラモジュール3には、可視光のみ or NoIR(赤外カットフィルタがなく近赤外に感度あり)と、画角が標準 or 広角で4種類存在する。NoIRを選択したのと元々のカメラ自体の性能が良いためか、薄暗い部屋でもかなり見えるようになった。画角は標準を選択しており、部屋の一角を写す分には十分であった。
問題があるとすれば、たまにピントが合わなくなって映像がボケてしまうことがある。原因は不明だが、ラズパイ自体を再起動することで解決した。
近赤外のライトを用意すれば完全な暗所でも撮影できると思われるが、まだ試していない。
カメラの固定台
ダイソーで折りたたみ式スマホスタンドを110円で購入した。カメラはセロハンテープで固定した。設置方法に合わせて、色々なやり方があると思う。
マイク
元記事と同じく、サンワサプライのUSBマイク(MM-MCU02BK)を2945円でAmazonで購入した。
USBマイク自体はこれより安いものはあるが、直挿し型で取り回しが楽そうなのでこちらを選択。
microSDカード
キオクシア製32GBをAmazonで640円で購入。16GB以上のものであればなんでも良いと思う。
作り方
microSDカードにOSを焼く
まず手元のPCにRaspberry Pi Imagerをダウンロード・インストールする。
OSはGUIは不要なので、「Raspberry Pi OS (other)」→「Raspberry Pi OS Lite (64-bit)」を選択した。
カスタム設定でWifiやユーザーの設定を先に済ませておくと良い。
Raspberry Pi の起動
電源ボタンはないため、通電するだけで起動する。
WiFiや有線で繋がっていれば、ssh <設定したユーザー名>@raspberrypi.local
でSSH接続できる。
パッケージのインストールなど
ここからはssh接続して作業する。Debian系OSなので、Ubuntuと操作性がかなり近く個人的には扱いやすかった。
カメラの設定
sudo raspi-config nonint do_camera 0
# sudo raspi-config nonint do_memory_split 256 そんな設定項目はないらしい
パッケージのインストール
sudo apt update
sudo apt install -y git npm libharfbuzz0b libfontconfig1 libepoxy-dev
# その他お好みで
sudo apt install screen lm-sensors
ホームディレクトリにmake_dirs.sh
を作成し、パーミッションを変更後、実行。
#!/bin/bash
DEST_DIR=~/picam
SHM_DIR=/run/shm
mkdir -p $SHM_DIR/rec
mkdir -p $SHM_DIR/hooks
mkdir -p $SHM_DIR/state
mkdir -p $DEST_DIR/archive
ln -sfn $DEST_DIR/archive $SHM_DIR/rec/archive
ln -sfn $SHM_DIR/rec $DEST_DIR/rec
ln -sfn $SHM_DIR/hooks $DEST_DIR/hooks
ln -sfn $SHM_DIR/state $DEST_DIR/state
chmod +x make_dirs.sh
./make_dirs.sh
カメラの設定
Picamのダウンロード
wget https://github.com/iizukanao/picam/releases/download/v2.0.12/picam-2.0.12-aarch64.tar.gz
tar xvf picam-2.0.12-aarch64.tar.gz
cp picam-2.0.12-aarch64/picam ~/picam/
rm -rf picam-2.0.12-aarch64 picam-2.0.12-aarch64.tar.gz
マイクの接続確認をする。
arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Microphone [USB Microphone], device 0: USB Audio [USB Audio]
Subdevices: 1/1
Subdevice #0: subdevice #0
ホームディレクトリにrun_picam.sh
を作成する。
#!/bin/bash
sudo bash /home/ytakano/make_dirs.sh
card=$(arecord -l | grep "card [0-9]:" | awk -F ' ' '{print $2}' | sed 's/://')
device=$(arecord -l | grep "card [0-9]:" | awk -F ' ' '{print $7}' | sed 's/://')
sudo /home/ytakano/picam/picam \
--alsadev hw:${card},${device} --rtspout -w 1920 -h 1080 -v 3000000 -f 30 \
--time --timept 40 --timehorizmargin 40 --timevertmargin 20
オプションの意味は以下の通り。
-
--alsadev hw:${card},${device}
はarecord -l
で表示されたcard
とdevice
を取得して設定している(抜き差しすると番号が変わる場合の対策) -
-w 1920 -h 1080 -v 3000000 -f 30
はFullHD 30FPSのデフォルトの設定そのまま -
--time --timept 40 --timehorizmargin 40 --timevertmargin 20
お好みで右下に時刻を表示する
パーミッションの変更を行う
chmod +x run_picam.sh
配信サーバーの設定
配信サーバー(node-rtsp-rtmp-server)のダウンロード
sudo npm install -g coffee-script
git clone https://github.com/iizukanao/node-rtsp-rtmp-server.git
cd node-rtsp-rtmp-server
npm install -d
npm audit fix --force
動作テスト
sshで2窓接続するか、screen (tmux)等を起動して行う。
まずifconfig
やip addr
でRaspberry PiのIPv4アドレスを確認しておく。
1つ目の窓で、
cd node-rtsp-rtmp-server
./start_server.sh
2つ目の窓で、
cd
./run_picam.sh
手元のPC等に入れたVLCで、先ほど確認したIPアドレス(例:192.168.151.245)を入れてrtsp://192.168.151.245:80/live/picam
をストリーミング再生する。Macの場合は「ファイル」→「ネットワークを開く」から開ける。
自動実行の設定
カメラとサーバーが自動実行するようにサービスを登録する。
/etc/systemd/system/picam_svr.service
を作成する。
[Unit]
Description=node-rtsp-rtmp-server for picam
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/bin/coffee /home/ytakano/node-rtsp-rtmp-server/server.coffee
Restart=always
Type=simple
[Install]
WantedBy = multi-user.target
/etc/systemd/system/picam.service
を作成する。
[Unit]
Description=picam
Wants=picam_svr.service
After=picam_svr.service
[Service]
ExecStart=/home/ytakano/run_picam.sh
Restart=always
RestartSec=10s
Type=simple
[Install]
WantedBy = multi-user.target
サービスを起動する。
sudo systemctl daemon-reload
sudo systemctl enable picam_svr
sudo systemctl enable picam
設定変更時は
sudo systemctl restart picam
などとすれば良い。
WifiのON/OFF
最初は無線LANで使用していたが、現在は有線LANに切り替えて使用している。
必ずしもする必要はないが、無線LANを無効化するのは以下のコマンドで行う。
sudo iwconfig wlan0 txpower off
当然、有線と無線でIPアドレスが異なるのでその点は注意すること。
再生方法
基本的に宅内LAN内のVLCが入るデバイスであれば、どこでも(同時に)再生できる。弊宅では、VLCを入れたAmazon Fire TV Stick (5000円程度) でテレビで再生するのをメインに使っているほか、各PCやスマホ等でも再生できる。
未解決問題:RTMPで固まる
今回使用した配信サーバーはRTSPの他に、RTMPというプロトコルでもrtmp://192.168.151.245:1935/live/picam
で再生できる(違いの詳細については詳しくないので割愛)。
RTMPの場合、音声が流れたままで画面が停止してしまう問題が発生する。この症状はカメラの映像が大きく変わった時などに発生しやすい傾向がある。
以下を試したが、改善されなかった。
- カメラのリボンケーブルの交換
- 送受信を無線LAN接続から有線LAN接続に変更
他に本体の処理スペックが追いついていないなどが考えられるが、原因は未調査である。参考までにCPU使用率は平均では100%には達していない。
RTSPであれば、音声がブツブツ切れることがあるものの動画が完全に止まることはないので、そちらを利用している。