LoginSignup
19
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-24

イントロダクション

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

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

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

やること

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

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

Gobotとは

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

必要なハードウェア

制御系

Raspberry pi typeB(rasbian)
Aruduino Uno r3

センサー

圧力センサーFSR406
ゴムパッド 2個

照明

LEDテープ
コネクタ
ACアダプタ
パワーMOSFET

Arduinoの準備

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

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

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

GOのインストール

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

$ git clone -b go1.4 https://go.googlesource.com/go
$ cd go/src
$ ./all.bash

raspberrypi上でだいたい1時間くらいでビルドできました。

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

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

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

$ mkdir development
$ export GOPATH=$HOME/development

GOBOTをインストールする

gobotを取得してきますが、mercurialが必要になるので入れておきます。

$ sudo apt-get install mercurial

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

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

動作確認

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

画像

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

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

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

圧力センサー

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

センサー部分をベッドの足の下に仕込むことで人が乗ったことを検知します。センサーの両面にはハンズで買ってきたゴムシートを挟んであります。
sensor_detail.JPG

照明

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

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

各種色はありますが、電球色がいい感じです。
led.JPG

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

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

Code

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

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

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()
}

実行します。

$ go run seiya.go

構成

全体構成.png

最後に

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

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

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

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

19
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
18