Raspberry Pi Zero W を見守りカメラ用に設定する

玄関のあたりで動く物があったら撮影をしてくれるように設定します。
以前は Raspberry Pi を使っていましたが起動しなくなってしまったので目立たなくしやすい Pi Zero W を選びました。

今回購入した Raspberry Pi Zero W スターターキット(長い)では付属している 8GB の microSD に OS 導入用の NOOBS が入っているのでそいつを使って Raspbian をインストールします。

f:id:k-side:20180212150928j:plain
画像の電源は付属のものではないです

Raspberry Pi Zero W Starter Kit

Raspberry Pi Zero W Starter Kit

何も考えずキーボード、モニター、マウスあたりを接続して電源に繋げてあげれば GUI の OS インストーラーが立ち上がるので簡単です。
デフォルトで Raspbian ともう一つが選択肢に挙がっていますが、WiFi の設定をしてあげるとインターネット上から他の選択肢を探してきて選べるようになります。
メニューも部分的に日本語化されていました。日本語版 NOOBS なのか、どこかから日本だという情報を取得して表示していたのかはわかりませんが…。

Raspbian を選択してインストールが始まると概ね50分くらいでインストールが終わりました。
再起動すると NOOBS でセットした WiFi の設定を引き継いでいるらしく無線 LAN 経由でインターネットに接続できます。
raspi-config で ssh の起動をセットしたり、ユーザー pi のパスワードを変更する設定をしました。

ターミナルを起動したらユーザーを設定してあげます。

 $ sudo adduser zoar
 $ sudo usermod -aG sudo zoar

DHCP から取得する IP アドレスを固定するために dhcpcd.conf を編集します。個人的に /etc/network/interfaces を設定するより楽なのでこっちにしました。

$ sudo vi /etc/dhcpcd.conf
<snip>
interface wlan0
static ip_address=192.168.X.21/24
static routers=192.168.X.1
static domain_name_servers=192.168.X.1 8.8.8.8

モニターのある自分の部屋で操作していたのですが、リビングに移動するためにパッケージ類を最新にしてシャットダウンします。
よく考えたら無線 LAN さえ繋がっていればそのままリビングに移動して ssh すればよかったんですよね…。

$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo shutdown -h now

リビングで再び電源をいれて設定の続きです。ここからは ssh で接続しています。

作業用のパッケージをいくつかと、motion、撮影した画像を保存するファイルサーバーへ接続する cifs-utils を入れます。

$ sudo apt-get update
$ sudo apt-get install cifs-utils vim screen motion -y

cifs への接続情報を /etc/fstab に書き込みます。保存先は /home/zoar/smb/cam/ にする予定なので必要なディレクトリも作成しました。

$ mkdir ~/smb
$ sudo vi /etc/fstab
//192.168.X.14/share /home/zoar/smb cifs credentials=/etc/samba/.credential,uid=1001,gid=1001,rw,iocharset=utf8,file_mode=0644,dir_mode=0755,defaults 0 0
$ sudo touch /etc/samba/.credential
$ sudo vi /etc/samba/.credential
username=%Samba のユーザー名%
password=%Samba のパスワード%
$ sudo mount -a
$ mkdir ~/smb/cam

mount -a するとマウントされますが、再起動しても自動マウントされないので /etc/rc.local でもう一回マウントさせます。ちゃんとした方法ではないと思いますが…。 exit 0 の前あたりに sleep と一緒に書き込みました。5、10、15、20秒と試したのですが20秒待ってあげないと mount -a してもマウントされませんでした。なんでやろ。

$ sudo vi /etc/rc.local
<snip>
sleep 20
mount -a

exit 0

sleep を入れたこともあり、起動になかなか時間がかかるようになったので起動したら Slack に通知するようにしました。

$ sudo pip3 install slackweb
$ touch ~/send_notify_into_slack.py
$ vi ~/send_notify_into_slack.py
#!/usr/bin/env python3
import slackweb

slack = slackweb.Slack(url = "%Webhook URL%")
slack.notify(text="Raspberry Pi Zero W - cam - was booted")
$ chmod +x ~/send_notify_into_slack.py

さっきの /etc/rc.local に追記します。これで起動時に Slack へコメントが飛ぶはずです。

$ sudo vi /etc/rc.local
<snip>
mount -a

/home/zoar/send_notify_into_slack.py

exit 0

続いて motion の設定。動体検知して静止画像を保存するようにします。
まず USB の Web カメラを接続して認識しているか確認しました。

$ lsusb
Bus 001 Device 002: ID 056e:700d Elecom Co., Ltd 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
$ dmesg | grep 056e:700d
[   39.520262] uvcvideo: Found UVC 1.00 device UCAM-DLN130T series (056e:700d)

motion.conf を編集します。

$ sudo vi /etc/motion/motion.conf
<変更部分のみ>
width 1280
height 1024
quality 100
ffmpeg_output_movie off
text_double on
target_dir /home/zoar/smb/cam
picture_filename %Y%m%d/%H%M%S-%v-%q

試しに動かしてみます。

$ sudo motion -c /etc/motion/motion.conf

USB の Web カメラの前で適当にはしゃいで指定のディレクトリにファイルが保存されれば成功です。
保存される画像ファイルを日付ディレクトリで分けたくて picture_filename にスラッシュを含めてみたところ、動体をキャッチすると日付ディレクトリを作って中に画像を保存してくれました。

Pi Zero W 起動時に motion も起動するようにします。

$ sudo vi /etc/default/motion
start_motion_daemon=yes
$ sudo reboot

これで motion がデーモンとして起動…してない。
motion の設定に疲れて原因を解明する気力がなかったので雑な解決法を取りました。

$ sudo vi /etc/rc.local
<snip>
mount -a

motion -c /etc/motion/motion.conf

/home/zoar/send_notify_into_slack.py
<snip>

これで起動時に(強引に) motion が動くようになりました。

ぱっと見期待した動きはしてくれますが、なんだか撮影した画像の中で動いているものがブレまくるのでその辺がブレないように設定を変えたいところです。
別の動体認識パッケージを使ってもいいかもしれません。

ついでに撮影した画像を妻が iPad で確認できるようになんらかのサービスを立てたいですね。なにが良いんだろ。