ラズパイとWebカメラで赤ちゃんに優しいベビーモニターを作る

# はじめに

Raspberry Pi と Web カメラで赤ちゃんに優しいベビーモニター（監視カメラ）をつくります。

赤ちゃんが起きないように、Rapberry Pi とWeb カメラの録画 LED を消します。Raspberry Pi には、LAN0、LAN1、Power、Activity の 4 つの LED があります。

更新：2020/07/05 設定手順を簡略化

所要時間：60分～120分

## 環境

- Raspberry Pi
  - Raspberry Pi 3 MODEL B
  - microSD 8GB 以上
- Web カメラ
  - Logitech HD Pro Webcam C920（UVC カメラなら大丈夫）
- 母艦
  - Windows Home 10（Mac でも linux でも OK）
- ネットワーク
  - WiFi 環境がある前提
  - DHCP サーバーのIP アドレス割当一覧が確認できると楽

## 環境構築

### OS インストール

1. Windows PC に [Raspberry Pi Imager for windows](https://www.raspberrypi.org/downloads/) をインストール
1. Raspberry Pi Imager を 実行し、microSD に Raspberry Pi OS Lite (Raspbian Lite) を書き込む
1. microSD のルートディレクトリに空ファイル ssh を作成
1. microSD のルートディレクトリに wpa_supplicant.conf を作成（※下のサンプル参照）
1. Raspberry Piに microSD を刺してラズパイを起動
1. DHCP サーバーの IP アドレス割当一覧を確認し、IP アドレスに当たりをつける
    （うちのラズパイのMACアドレスベンダーコードは"b8:27:eb"でした）
1. WSL、コマンドプロンプト、Tera Term 等を起動して ssh でログイン（ユーザid:pi、パスワード:raspberry）

```sh:SSHログイン_サンプル
$ ssh pi@192.168.1.100
Password: raspberry
```


```:wpa_supplicant.conf_サンプル
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
    ssid="YourSSID"
    psk="YourPassword"
}
```

### コマンド入力

```shell
sudo apt update
sudo raspi-config  # メニューで下の項目を設定し、最後にリブート
```

再度ログインして以下のコマンドを入力。

```shell
sudo apt update
sudo apt upgrade -y
sudo apt-get install -y icecast2 uvcdynctrl ffmpeg  # 途中で icecast2 の設定 → password 変更
echo dtparam=eth_led0=14 | sudo tee -a /boot/config.txt  # LAN の Led を消す
echo dtparam=eth_led1=14 | sudo tee -a /boot/config.txt  # LAN の Led を消す 
cat > start_video.sh  # 下のほうのスクリプトをコピペして ctrl-D で終了
chmod 755 start_video.sh  # 実行属性をつける
crontab -e  # 自動実行を設定
sudo reboot  # 再起動してサービス開始！
```

再起動すると、自動的にストリーミングが始まります。起動直後は、LED が点灯しますが、ストリーミングがはじまると LED が消えます。

### 利用

同じネットワークの PC やスマホから以下のURLを参照します。

```
http://<raspberry pi ip address>:8000/
```

ストリーミング画面で「M3U」をクリックします。「[VLC](https://www.videolan.org/vlc/index.ja.html)」で開くことができました。Microsoft Media Player では開けません。


![icecast.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126852/384ac9d6-1f4a-a548-f8c2-15fcbd92450c.png)



## 各設定の詳細

### raspi-config

- Change passwd
- Network
    - hostname
- Localizeation
    - locale
        - en_GB.UTF-8、ja_JP.UTF-8 を選択
        - ja_JP.UTF-8 をデフォルトロケールに指定
    - Timezone
        - Asia
            - Tokyo
    - WLAN Country
        - JP Japan


### 映像+音声ストリーミング配信用スクリプト

```sh:start_video.sh
#!/bin/sh

PASSWORD=password  # icecast2 の source パスワードを設定
VIDEO_SIZE=320x180

# 部屋がうす暗いので、Webcam の感度を最大にします
uvcdynctrl -d video0 -s "Brightness" 255
uvcdynctrl -d video0 -s "Contrast" 255
uvcdynctrl -d video0 -s "Saturation" 255
uvcdynctrl -d video0 -s "Gain" 255

# Webcam とラズパイの LED を消します
uvcdynctrl -d video0 -s 'LED1 Mode' 0
echo 0 | sudo tee /sys/class/leds/led0/brightness
echo 0 | sudo tee /sys/class/leds/led1/brightness

ffmpeg \
  -f v4l2 -video_size $VIDEO_SIZE -framerate 1 -i /dev/video0 \
  -f alsa -i hw:1 \
  -f webm -cluster_size_limit 1M -cluster_time_limit 5100 -content_type video/webm \  -c:a libvorbis -b:a 64K \
  -c:v libvpx -b:v 0.5M -crf 30 -g 150 -deadline good -threads 4 \
  -ice_name "2F お布団の部屋" \
  -ice_description "お布団を見渡す映像" \
  -ice_genre "live camera" \
  icecast://source:${PASSWORD}@localhost:8000/webcam
```

※ Web カメラのマイクがモノラルの場合は、start_video.sh の ffmpeg コマンドオプションに `-ac 1` を追加して下さい。(@ryuusen999 さんに感謝！)

### Cron 設定

モニターを動かす時間帯を7時から19時半までとしました。
毎日7時にストリーミング配信スクリプトを起動します。
毎日19時半にストリーミング配信を停止します。
再起動後も自動的にストリーミング配信するようにしました。

```sh
$ crontab -e
0 7 * * * /home/pi/start_video.sh > /dev/null
30 19 * * * killall ffmpeg
@reboot sleep 10 ; /home/pi/start_video.sh > /dev/null
```



## その他、便利なコマンド

### 録音ハードウェアのリスト

```sh
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: C920 [HD Pro Webcam C920], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

### カメラのリスト

```sh
$ v4l2-ctl --list-devices
HD Pro Webcam C920 (usb-3f980000.usb-1.2):
        /dev/video0
$ v4l2-ctl -d /dev/video0 --info
Driver Info (not using libv4l2):
        Driver name   : uvcvideo
        Card type     : HD Pro Webcam C920
        Bus info      : usb-3f980000.usb-1.2
        Driver version: 4.14.98
        Capabilities  : 0x84200001
                Video Capture
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps   : 0x04200001
                Video Capture
                Streaming
                Extended Pix Format 
$ v4l2-ctl --list-devices --verbose --all
<出力省略>

$ v4l2-ctl  -i /dev/video0 --list-formats
<出力省略>

$ v4l2-ctl  -i /dev/video0 --list-formats-ext
<出力省略>

```

### 音声ストリーミング配信用スクリプト

```sh:start_voice.sh
#!/bin/sh

ffmpeg \
  -f alsa \
  -i hw:1 \
  -acodec libmp3lame \
  -ac 1 \
  -ab 128k \
  -content_type audio/mpeg \
  -f mp3 \
  icecast://source:password@localhost:8000/sound
```

### SSH が切れないようにする設定

```sh
# SSH のタイムアウトを延長
sudo sh -c "echo ClientAliveInterval 60 >> /etc/ssh/sshd_config"
sudo sh -c "echo ClientAliveCountMax 3 >> /etc/ssh/sshd_config"
```

Raspberry Pi 3 の場合、以下を実施します。パワーマネージメントを OFF にするため、/etc/rc.local の exit 0 の行の前に追記します。

```sh:/etc/rc.localに追記
iwconfig wlan0 power off
```

Raspberry Pi 2 の場合、以下のコマンドを実行します。パワーマネージメントを OFF にするため、一度だけ実行します。

```sh
# 無線LANのパワーマネージメントをOFFにする
sudo sh -c "echo options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1 > /etc/modprobe.d/8192cu.conf"
```