Arduino+Raspberrypi+GoBotで恋人たちの聖夜を支援する

## イントロダクション
こんにちは、今夜は恋人たちのお祭りクリスマスですね。
どうやら日本では12月24日の午後9時から翌25日の午前3時までの6時間は1年間で最もセックスをする人の多い「性の6時間」らしいです。

僕の大好きなどぶろっくも歌ってましたね。

きっと今夜に勝負をかける男性諸君も多いことでしょう。
そこで、恋人たちをスムーズな聖夜に導くため、ベッドインすると自動的に照明が消えるしくみを作りました。

### やること
ベッドの下に仕込んだ圧力センサーでベッドに乗ったことを検知して、照明をコントロールします。圧力センサーの測定、照明のOnOffにはArduinoをRaspberrypiからコントロールします。

Arduinoだけでも実現可能ですが、Raspberrypiを使うことで将来的な拡張性を持たせています。まぁGolangで書きたかったのとGobotを使いたかったのが本音です。

### Gobotとは
[http://gobot.io/](http://gobot.io/)
Golang製のロボティクス用フレームワークです。
ArduinoやRaspberrypiを始めとして、Ardrone,Edison,LeapMotionなど各種プラットフォームに対応しており、おうちはっくのメインコントローラとしても適していると思います。
類似のプロダクトとして、Cylon.js(javascript)やArtoo(Ruby)などがあります。


## 必要なハードウェア
### 制御系
Raspberry pi typeB(rasbian)
Aruduino Uno r3

### センサー
[圧力センサーFSR406](http://akizukidenshi.com/catalog/g/gP-04158/ "圧力センサーFSR406")
ゴムパッド ２個

### 照明
[LEDテープ](http://www.amazon.co.jp/gp/product/B008GMLZMQ "LEDテープ")
[コネクタ](http://www.amazon.co.jp/gp/product/B00DE45ZA4 "コネクタ")
[ACアダプタ](http://www.amazon.co.jp/gp/product/B00AJDAPM6 "ACアダプタ")
[パワーMOSFET](http://www.marutsu.co.jp/pc/i/59330/ "パワーMOSFET")



## Arduinoの準備
Arduino上でGoは動かないので、Arduinoを外部から操作するために[Firmata](http://www.firmata.org/ "Firmata")を使用します。
そのために、ArduinoにFirmataを入れておきます。
ラズパイから入れてもいいですが、WindowsでもMacから入れたほうが早いと思います。
ArduinoIDEに標準で入っているのでそれを焼いておきます。
`ファイル→スケッチの例→Firmata→StandardFirmata`
にあります。

Firmataがちゃんと動いているかはFirmataTestProgramをインストールして確認しましょう。
各ピンの情報が送られてきているはずです。

ちなみに現時点(2014/12)でGobotが対応しているArduinoはArduino uno r3とTeensy 3.0となっています。


## GOのインストール
armへのGoのインストールはよくわからんのでビルドしました。

```bash
$ git clone -b go1.4 https://go.googlesource.com/go
$ cd go/src
$ ./all.bash
```
raspberrypi上でだいたい1時間くらいでビルドできました。

とりあえずパスを通しておきます。
動作も確認しておきましょう。

```bash
$ export PATH=$PATH:$HOME/go/bin
$ go version
```

これで'go version go1.4 linux/arm'と表示されていれば大丈夫でしょう。
$GOPATHも設定しておきます。場所は各自好みのところに作ってください。

```bash
$ mkdir development
$ export GOPATH=$HOME/development
```

## GOBOTをインストールする
gobotを取得してきますが、mercurialが必要になるので入れておきます。

```bash
$ sudo apt-get install mercurial
```

とりあえず、公式のGetting StartedにしたがってGobotを入れます。

```bash
$ o get -d -u github.com/hybridgroup/gobot/...
```

## 動作確認
ArduinoとRaspberryPiをUSBで繋いでおいてください。
動作確認といえば定番のLチカですね。
Arduinoの13番ピンとGNDの間に適当なLEDと抵抗を繋ぎましょう。

画像

サンプルプログラムがあるのでそれを実行します。

```bash
$ cd $GOPATH/src/github.com/hybridgroup/gobot/examples/
$ go run firmata_blink.go
```

これでArduinoに接続されたLEDが点滅するはずです。

## 圧力センサー
今回使用した圧力センサーは圧力がかかると抵抗値が減少するタイプなので、適当な分圧回路で電圧の変化として読み取ります。今回は`150Ω`の抵抗を入れてあります。
回路は下の構成図を見てください。

センサー部分をベッドの足の下に仕込むことで人が乗ったことを検知します。センサーの両面にはハンズで買ってきたゴムシートを挟んであります。
![sensor_detail.JPG](https://qiita-image-store.s3.amazonaws.com/0/61250/2207b5ea-b70b-8c5a-95ca-a0c5f1ed3ccd.jpeg)



## 照明
当初、照明はHueのテープタイプを使う予定だったのですが、30000円以上もするので断念し、自作することにしました。
ブルジョワジーな皆様方におかれましては、Hueをご購入いただき、ベッド・インに連動してムーディーな照明にすることをオススメいたします。

今回はLEDテープを買ってコントロールします。5mで700円と激安です。ただ、使った感じとしては照明としてはかなり暗いので、8畳の部屋を間接照明で明るくするには3本以上はあったほうがいいと思います。

各種色はありますが、電球色がいい感じです。
![led.JPG](https://qiita-image-store.s3.amazonaws.com/0/61250/f9936f8f-cbdb-2afc-d800-eedc4d8fc9c5.jpeg)

RGBで色をコントロールできるタイプも試してみましたが、電球色を作るのは難しいです。


やったことは簡単で接続コネクタを切断して間にパワーMOSFETを挟んだだけです。
LEDテープの長さが小さければトランジスタでも大丈夫だと思いますが、5mとかだと12V1Aくらい流れるので気をつけてください。


## Code

センサーのしきい値はベッドの重さや間に入れた抵抗等によって変化するため**Threshold**の値は書き換えてください。

センサーの値はたまにノイズが入るので10回の中間値にしてノイズをカットしています。

```golang:seiya.go
package main

import (
	"fmt"

	"github.com/hybridgroup/gobot"
	"github.com/hybridgroup/gobot/platforms/firmata"
	"github.com/hybridgroup/gobot/platforms/gpio"
	"sort"
	"time"
)

const Threshold int = 320

func main() {
	gbot := gobot.NewGobot()

	firmataAdaptor := firmata.NewFirmataAdaptor("firmata", "/dev/ttyACM0")
	sensor := gpio.NewAnalogSensorDriver(firmataAdaptor, "sensor", "0")
	led := gpio.NewLedDriver(firmataAdaptor, "led", "13")

	var i int = 0
	var dArray = make([]int, 10)

	work := func() {
		gobot.Every(100*time.Millisecond, func() {
			data, _ := sensor.Read()
			if i != 9 {
				dArray[i] = data
				i++
			} else {
				sort.Sort(sort.IntSlice(dArray))
				median := dArray[len(dArray)/2]

				if median < Threshold {
					fmt.Println("On The Bed")
					led.Off()
				} else {
					fmt.Println("Out Of The Bed")
					led.On()
				}

				i = 0
			}
		})
	}

	robot := gobot.NewRobot("sensorBot",
		[]gobot.Connection{firmataAdaptor},
		[]gobot.Device{sensor},
		work,
	)

	gbot.AddRobot(robot)

	gbot.Start()
}
```

実行します。

```bash
$ go run seiya.go
```

## 構成
![全体構成.png](https://qiita-image-store.s3.amazonaws.com/0/61250/092bde47-352a-17d7-03f4-b5bca69b3470.png)

## 最後に
クリスマスの投稿ということで、ネタな感じにしましたが、僕は電気つけたまま寝てしまうことが多いので、ベッドに入ると照明が消えるシステムは本当に欲しかったものです。

今回は照明のOnOffだけにしましたが、圧力センサーの変化を読み取れば、睡眠状態を記録できる可能性もあると思います。昨今の活動量計であれば睡眠を取得できるものもありますが、寝るときも活動量計をつけるのに抵抗がある人も多いと思うのでその点では優位性があると思います。


薄々気づいてましたが部屋まで連れてこれたら支援する必要ありませんよね。誰か彼女が作れるシステム作ってくれないかなー



**免責
内容には責任を負いかねます。あくまでこれで動いたレベルなのであまり信用しないでください。特に火災等に気をつけて回路は作ってください。
あと、恋人とうまく行かなかった等の苦情も受け付けられません。**