Raspberry Piと純正カメラモジュールで監視カメラを作る、おそらく正しい方法 jessie版 (motion + v4l2ドライバ)

#はじめに
Raspberry Pi をポチろうとしたら純正カメラモジュールもあるみたいなので、ついでにポチっちゃいました。これは使わなければなりません。カメラを活用する方法を考えたとき、パッと思いつくのは監視カメラでしょうか。

Linux上で動作する、動体検知・ライブ配信など機能満載の監視カメラソフトウェアといえば、[motion](http://www.lavrsen.dk/foswiki/bin/view/Motion/WebHome) です。
Raspberry Pi(Raspbian)にもパッケージがあるので使いたいのですが、純正カメラモジュールには対応していないみたいです。

そこで、何とかして使おうという方法がいくつかあります。

いけてない方法から紹介しますが、手っ取り早く知りたい方は「おそらく正しい方法」からお読みください。

#いけてない方法1
ラズパイ純正カメラは使用せず、USBカメラを買ってくる！

この方法は、これからハードウェアを買う場合にはぶっちゃけオススメです。
純正カメラはUSBカメラに比べたら高いですしね。（買ってから気づいたorz）

#いけてない方法2
ラズパイ純正カメラは MMAL (Multi-Media Abstraction Layer)というAPIに対応しています。そこで、motion を MMAL に対応させたバイナリが作られ、配布されています。

パッケージのmotionを使わず、mmal対応バイナリを使う方法がこの方法です。

具体的には、
https://www.dropbox.com/s/xdfcxm5hu71s97d/motion-mmal.tar.gz
を拾ってきて使います。

ただし、これは古いRaspbian向けに作られたバイナリで、最新の jessie では動きません。

`./motion: error while loading shared libraries: libavformat.so.53: cannot open shared object file: No such file or directory`
というエラーが出て、途方に暮れるパターンです。

#いけてない方法3
前述のmotion-mmalを使うために、古いRaspbianを使います。
某知恵袋的ソリューションです。
明らかにいけてない方法ですね。

#いけてない方法4
motion-mmal を jessie に対応させたバイナリが
https://www.dropbox.com/s/6ruqgv1h65zufr6/motion-mmal-lowflyerUK-20151114.tar.gz
です。

とりあえず動きます。

でも、やっぱり外部公開とかを考えるとセキュリティパッチに追随してくれそうなパッケージ版を使いたいですよね。


#おそらく正しい方法
motion は Video for Linux Two (以下、v4l2) デバイスを扱います。つまり、純正カメラモジュールがv4l2に対応していれば何の苦も無く使えることになります。

そこで調べたところ、純正カメラモジュール用のv4l2ドライバが存在することが分かりました！

v4l2ドライバを使えるようにするのは /etc/modules に1行追加して再起動するだけです。

```text:/etc/modules
bcm2835-v4l2
```

この他に、raspi-config でCameraをEnableにすることも必要です。
この操作をすると /boot/config.txt に下記2行を追加してくれます。
（慣れてくると、raspi-configよりテキストエディタで編集する方がラクだと思います。）

```cfg:/boot/config.txt
start_x=1
gpu_mem=128
```

あとは apt-get install motion するだけ！
必要なライブラリは勝手にインストールしてくれます。

```
root@picam:/home/pi# apt-get install motion
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
  libavcodec56 libavformat56 libavresample2 libavutil54 libdrm-amdgpu1
  libdrm-freedreno1 libdrm-nouveau2 libdrm-radeon1 libelf1 libgl1-mesa-dri
  libgl1-mesa-glx libglapi-mesa libgsm1 libjpeg8 libllvm3.7 libmp3lame0
  libmysqlclient18 libogg0 libopenjpeg5 libopus0 liborc-0.4-0
  libschroedinger-1.0-0 libspeex1 libtheora0 libtxc-dxtn-s2tc0 libva1
  libvdpau1 libvorbis0a libvorbisenc2 libvpx1 libx11-xcb1 libx264-142
  libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-sync1
  libxdamage1 libxfixes3 libxshmfence1 libxvidcore4 libxxf86vm1 mysql-common
  va-driver-all vdpau-va-driver
Suggested packages:
  opus-tools speex vdpau-driver mysql-client postgresql-client
Recommended packages:
  ffmpeg
The following NEW packages will be installed:
  libavcodec56 libavformat56 libavresample2 libavutil54 libdrm-amdgpu1
  libdrm-freedreno1 libdrm-nouveau2 libdrm-radeon1 libelf1 libgl1-mesa-dri
  libgl1-mesa-glx libglapi-mesa libgsm1 libjpeg8 libllvm3.7 libmp3lame0
  libmysqlclient18 libogg0 libopenjpeg5 libopus0 liborc-0.4-0
  libschroedinger-1.0-0 libspeex1 libtheora0 libtxc-dxtn-s2tc0 libva1
  libvdpau1 libvorbis0a libvorbisenc2 libvpx1 libx11-xcb1 libx264-142
  libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-sync1
  libxdamage1 libxfixes3 libxshmfence1 libxvidcore4 libxxf86vm1 motion
  mysql-common va-driver-all vdpau-va-driver
0 upgraded, 46 newly installed, 0 to remove and 0 not upgraded.
Need to get 21.8 MB of archives.
After this operation, 79.7 MB of additional disk space will be used.
Do you want to continue? [Y/n]
```

#【おまけ】カメラのLEDが点灯しないようにする

/boot/config.txt の最後に disable_camera_led=1 を追記します

```cfg:/boot/config.txt
disable_camera_led=1
```

#【まとめ】

① /etc/modules に1行追加

```text:/etc/modules
bcm2835-v4l2
```

② /boot/config.txt に3行追加

```cfg:/boot/config.txt
start_x=1
gpu_mem=128
disable_camera_led=1
```

③ 再起動

④ apt-get install motion

以上、raspbian jessie に含まれるパッケージ・ドライバだけでmotionを使える状態にするまでの操作を紹介しました。
コンフィグは各自調べてください m(_ _)m

#【追記】
2点ほど補足します。

## 1.OS起動時にmotion起動
OS起動時にmotionも起動させる場合、/etc/default/motion を書き換える必要があります。

```cfg:/etc/default/motion
# set to 'yes' to enable the motion daemon
start_motion_daemon=yes   ←noからyesに書き換え
```

これはdebian(raspbianの元となるLinuxディストリビューション)の流儀です。

## 2.書き込みできず死ぬ件

syslog を見ると /var/lib/motion に書き込みできない旨のエラーメッセージが出ます。
パーミッションが正しく設定されていないためです。
パッケージのバグでしょうか。
次のコマンドで、motionユーザーが書き込みできるようにしましょう。

`sudo chown motion.motion /var/lib/motion`

その他のコンフィグについては、raspbian特有の話はないと思いますので割愛します。