Raspberry Pi でベビーモニターを作るのに苦労したポイント

## はじめに

ベビーモニターが必要となった。怪しいスマホアプリや既製品のカメラを使うのを避けるため、（これはいい口実ができたと）Raspberry Pi で自作することにした。

以下の記事をベースに作成したので、この記事からの変更点や、苦労したポイントなどを備忘録として残しておく。

https://qiita.com/oshiemon/items/84b997076176a84d797f

## 完成イメージ
ベビーモニター本体

![IMG_0733のコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829116/dffea087-dac4-b17f-cac3-3bcced0ab882.jpeg)

撮影された映像

![スクリーンショット 2024-08-22 8.57.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829116/dd7d2c90-1035-886d-179b-123e21f839cb.png)

## 購入品

購入品は以下の通り。物価高のせいか元記事と比べても高くなっており、既製品を買うのと比べて安いかはわからない。

### 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円)だったが、これはかなり微妙だった。

https://www.amazon.co.jp/gp/product/B07NS3SYFR/

![71lqriWdyPL._AC_SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829116/1dfde6e7-4e6c-0fd9-2ab9-f9188e0d9845.jpeg)

- 添付写真のとおり、プラスチックを縦に9枚並べているので、ねじ止めしていないとバラバラになってとても扱いにくい。また、購入した製品は工作精度が悪く一部はまらないところがあったので、ハサミで一部切断した。
- CPU冷却用のファンが付属しているが、マイクにファンの音がノイズとして乗るため、結局ファンは使用していない。そのため動作時のCPU温度は65℃程度とやや高い。
- 組み立て説明書は付属しないので、Amazonの商品ページの写真を見つつ組み立てる必要がある。

これを踏まえて、ファンレス冷却ケース「Geekworm Raspberry Pi 3 B+/ 3Bケース」(1899円)をAmazonで購入した。
https://www.amazon.co.jp/dp/B094QDFSLV

![71Qlt7GJ36L._AC_SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829116/545b55f4-8608-19d2-af09-d5b823a8c178.jpeg)

こちらは動作時のCPU温度が45℃程度と十分冷却できており、比較的不満は少なかった。注意点としては、以下の2点。
- カメラスロットはあるが位置が少しずれているので、若干リボンケーブルを曲げないと外に出せない
- 組み立て説明書はないので、CPUに貼るサーマルパッドはケースにちょうど接着する厚さのものを試行錯誤で選ぶ必要がある

### カメラ

最初に「RasTech Raspberry Pi カメラモジュール」をAmazonで1480円で購入した。このカメラは暗所では使えなかったため、私は結局使用しなかった。予備のリボンケーブルが複数ついてくる点は嬉しい。

https://www.amazon.co.jp/gp/product/B086MK17K5/

暗所でも使えるカメラとして、公式の「Raspberry Pi カメラモジュール3 NoIR」を4620円で秋月で購入した。

https://akizukidenshi.com/catalog/g/g118135/

このカメラモジュール3には、可視光のみ or NoIR(赤外カットフィルタがなく近赤外に感度あり)と、画角が標準 or 広角で4種類存在する。NoIRを選択したのと元々のカメラ自体の性能が良いためか、薄暗い部屋でもかなり見えるようになった。画角は標準を選択しており、部屋の一角を写す分には十分であった。

問題があるとすれば、たまにピントが合わなくなって映像がボケてしまうことがある。原因は不明だが、ラズパイ自体を再起動することで解決した。

近赤外のライトを用意すれば完全な暗所でも撮影できると思われるが、まだ試していない。

### カメラの固定台

ダイソーで折りたたみ式スマホスタンドを110円で購入した。カメラはセロハンテープで固定した。設置方法に合わせて、色々なやり方があると思う。

https://jp.daisonet.com/products/4549131874198

### マイク
元記事と同じく、サンワサプライのUSBマイク(MM-MCU02BK)を2945円でAmazonで購入した。

https://www.amazon.co.jp/gp/product/B01M7YIYZV/

USBマイク自体はこれより安いものはあるが、直挿し型で取り回しが楽そうなのでこちらを選択。

### microSDカード

キオクシア製32GBをAmazonで640円で購入。16GB以上のものであればなんでも良いと思う。

https://www.amazon.co.jp/gp/product/B08PTNWQ6P/

## 作り方

### microSDカードにOSを焼く

まず手元のPCにRaspberry Pi Imagerをダウンロード・インストールする。

https://www.raspberrypi.com/software/

OSはGUIは不要なので、「Raspberry Pi OS (other)」→「Raspberry Pi OS Lite (64-bit)」を選択した。

カスタム設定でWifiやユーザーの設定を先に済ませておくと良い。

### Raspberry Pi の起動

電源ボタンはないため、通電するだけで起動する。
WiFiや有線で繋がっていれば、`ssh <設定したユーザー名>@raspberrypi.local`でSSH接続できる。

### パッケージのインストールなど
ここからはssh接続して作業する。Debian系OSなので、Ubuntuと操作性がかなり近く個人的には扱いやすかった。

カメラの設定
```bash
sudo raspi-config nonint do_camera 0
# sudo raspi-config nonint do_memory_split 256 そんな設定項目はないらしい
```

パッケージのインストール

```bash
sudo apt update
sudo apt install -y git npm libharfbuzz0b libfontconfig1 libepoxy-dev

# その他お好みで
sudo apt install screen lm-sensors
```

ホームディレクトリに`make_dirs.sh`を作成し、パーミッションを変更後、実行。

```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のダウンロード

```bash
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
```

マイクの接続確認をする。

```bash
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`を作成する。

```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` お好みで右下に時刻を表示する

パーミッションの変更を行う
```bash
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つ目の窓で、
```bash
cd node-rtsp-rtmp-server
./start_server.sh
```

2つ目の窓で、

```bash
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`を作成する。
```/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`を作成する。

```/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
```

サービスを起動する。
```code:bash
sudo systemctl daemon-reload
sudo systemctl enable picam_svr
sudo systemctl enable picam
```

設定変更時は
```
sudo systemctl restart picam
```
などとすれば良い。

### WifiのON/OFF

最初は無線LANで使用していたが、現在は有線LANに切り替えて使用している。
必ずしもする必要はないが、無線LANを無効化するのは以下のコマンドで行う。

```bash
sudo iwconfig wlan0 txpower off
```

https://qiita.com/hayate242/items/4f3d07d63a5b9577cb55

当然、有線と無線で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%には達していない。

![スクリーンショット 2024-08-22 10.58.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829116/4faddc86-0953-c72f-d752-585844e248c7.png)


RTSPであれば、音声がブツブツ切れることがあるものの動画が完全に止まることはないので、そちらを利用している。