RaspberryPiを使って簡易防犯カメラを作ってみる

#電子回路とか全く知識ないけど、RaspberryPiで遊びたい！！
という、普段はUnityを使ってゲーム作ってる人間がたまには他のこともやってみたというお話。

##このお話は不良です。あくまでも失敗談や参考適度にでお願いします。

#用意するもの
* RaspberryPi B+
* 人感センサー[(焦電型赤外線センサーモジュール（焦電人感センサ）　ＳＢ６１２Ａ)](http://akizukidenshi.com/catalog/g/gM-08767/)
* RasPi Camera

#RaspberryPiの準備
買ったばかりのRaspberryPiはなんにもセットアップされていないので、まずはセットアップしましょう。
ちょうど[この辺](http://qiita.com/satzz@github/items/d203ca8b0c00f8ccd1e1)が参考になります。

#カメラを有効にする
RaspberryPiカメラはデフォルトでは有効になっていないので、まずは有効にしましょう。

```cmd:cmd
> sudo raspi-config
```

「5 Enable Camera」からEnableにしてFinishして再起動
これでカメラが有効になります。

再起動が完了したら、カメラの動作チェックです。

```cmd:cmd
> raspistill -o img.jpg
```

正常に動作すれば、カレントディレクトリにimg.jpgの名前で画像が保存されます！

#人感センサーを取り付ける
あまり自信が一番ない部分で、電子回路的に合っているかどうか不安な部分となってます。

秋月電子通商のサイトにあるモジュール仕様書.pdfの図のとおりにRaspberryPiと接続していきます。

|センサー|GPIO|
|:--:|:--:|
|GND|GND|
|TEST|25Pin|
|VCC|3.3v|

もう一つの端子「LOAD-」と「LOAD+」は何なんだ？
とりあえずこれで動作したので後で調べてみようと思います。

#人感センサーの動作チェック
コマンドラインからGPIOにアクセスして動作をチェックしてみます。

```cmd:com
> sudo su
# echo 25 > /sys/class/gpio/export
# echo in > /sys/class/gpio/gpio25/direction
```

これでセンサーの動作準備ができ、valueに結果が入っていくはずなので、実際にチェックしてみます

```cmd:cmd
# cat /sys/class/gpio/gpio25/value
1
# cat /sys/class/gpio/gpio25/value
0
```

ここでは1で反応あり0で反応なしとなります。
切り替わるタイミングが少し遅いので何度か試してみましょう。

#MonoをインストールしてC#を使って開発してみる
RaspberryPiの本を探していると、意外とRubyやPythonで書かれた本が多いですが、ここではC#を使って開発したいと思います。
(RubyとかPythonを使ったことがないことは内緒)

まずはMonoをインストールします。

```cmd:cmd
> sudo apt-get install mono-complete
```

200MBぐらいのパッケージ使用でちょっと時間がかかりました。

#C#で組んでみる
今回RaspberryPiの制御に「[RaspberryPi.Net](https://github.com/cypherkey/RaspberryPi.Net/)」というライブラリを使用しました。

```csharp:main.cs
using System;
using RaspberryPiDotNet;

class main
{
	static void Main(string[] args)
	{
		GPIOMem sensor = new GPIOMem(GPIOPins.GPIO_25);
		sensor.PinDirection = GPIODirection.In;

		while (true)
		{
			var pinState = sensor.Read();
			Console.WriteLine(pinState.ToString());

			if (pinState == PinState.High)
			{
				string nowTime = DateTime.Now.ToString("yyyyMMddHHmmss");

				System.Diagnostics.Process prog = new System.Diagnostics.Process();
				prog.StartInfo.FileName = "raspistill";
				prog.StartInfo.Arguments = string.Format("-t 2 -w 480 -h 360 -n -o {0}.jpg", nowTime);
				prog.Start();

				System.Threading.Thread.Sleep(10000);
				continue;
			}
			System.Threading.Thread.Sleep(500);
		}
	}
}
```

これをビルドし下記の3つのファイルをRaspberryPiに持っていきます。
* RaspberryPiDotNet.dll
* application.exe
* libbcm2835.so (このファイルはRaspberryPi.Netの「Using GPIOMem」の項目にあります。)

#実際に動かしてみる。
持ってきた3つのファイルを同じフォルダ階層にまとめて実行します。
ここではDesktopに新しいフォルダを作成して実行しています。

```cmd:cmd
> cd Desktop/camapp
> sudo ./application.exe
```

するとコマンドラインにセンサーの結果が出力されていきます。
センサーがHighになって2秒後に画像が保存されます。
画像保存が完了したら10秒間止まってまたセンサーチェックを開始し続ける動作になると思います。
10秒間止めているのは、連続撮影の防止です。

プログラムを終了される場合は「Ctrl + C」で止まります。

#なんでセンサーに反応されてから2秒後なん？
どうもraspistillコマンドが呼ばれてからカメラの初期化を行っているようで、
引数 -t で撮影開始時間をデフォルトの5秒から短くしてしまうと、初期化が間に合わず真っ黒な画像ができるときがあるそうです。
ですが今回はちょっと早めに撮影してほしい事情があったため、おそらくぎりぎり初期化が終わっているであろう2秒後の撮影にしました。
ここは各人で調整してほしいところです。

#終わりに
全く電子回路には知識がありませんでしたが、どうにかここまでつくり上げることが出来ました！
これから数時間ほど試してみて、なにか面白い画像が写り込んでないか試そうと思います。

この簡易防犯カメラを作るにあったていろいろ参考にさせて頂きました。

* [RaspberryPiで人感センサーを作る](http://qiita.com/inaBowBow/items/dca01622d086f113db00)
* [Raspberry Pi電子工作で、C#のWeb技術を生かす！](http://www.buildinsider.net/small/raspisignalr/01)