はじめに
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 インストール
- Windows PC に Raspberry Pi Imager for windows をインストール
- Raspberry Pi Imager を 実行し、microSD に Raspberry Pi OS Lite (Raspbian Lite) を書き込む
- microSD のルートディレクトリに空ファイル ssh を作成
- microSD のルートディレクトリに wpa_supplicant.conf を作成(※下のサンプル参照)
- Raspberry Piに microSD を刺してラズパイを起動
- DHCP サーバーの IP アドレス割当一覧を確認し、IP アドレスに当たりをつける
(うちのラズパイのMACアドレスベンダーコードは"b8:27:eb"でした) - WSL、コマンドプロンプト、Tera Term 等を起動して ssh でログイン(ユーザid:pi、パスワード:raspberry)
$ ssh pi@192.168.1.100
Password: raspberry
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="YourSSID"
psk="YourPassword"
}
コマンド入力
sudo apt update
sudo raspi-config # メニューで下の項目を設定し、最後にリブート
再度ログインして以下のコマンドを入力。
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」で開くことができました。Microsoft Media Player では開けません。
各設定の詳細
raspi-config
- Change passwd
- Network
- hostname
- Localizeation
- locale
- en_GB.UTF-8、ja_JP.UTF-8 を選択
- ja_JP.UTF-8 をデフォルトロケールに指定
- Timezone
- Asia
- Tokyo
- Asia
- WLAN Country
- JP Japan
- locale
映像+音声ストリーミング配信用スクリプト
#!/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時半にストリーミング配信を停止します。
再起動後も自動的にストリーミング配信するようにしました。
$ 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
その他、便利なコマンド
録音ハードウェアのリスト
$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: C920 [HD Pro Webcam C920], デバイス 0: USB Audio [USB Audio]
サブデバイス: 1/1
サブデバイス #0: subdevice #0
カメラのリスト
$ 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
<出力省略>
音声ストリーミング配信用スクリプト
#!/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 が切れないようにする設定
# 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 の行の前に追記します。
iwconfig wlan0 power off
Raspberry Pi 2 の場合、以下のコマンドを実行します。パワーマネージメントを OFF にするため、一度だけ実行します。
# 無線LANのパワーマネージメントをOFFにする
sudo sh -c "echo options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1 > /etc/modprobe.d/8192cu.conf"