GrovePi+ Starter Kit で Parking Sensor が 10 分でできてしまった話


#始めに
10分は大げさにいっているのではなく本当で、内訳は関係ありそうなサンプルプログラムを眺めてた時間が5分ぐらい、パーツを繋いでコード書く（実体はコピペ）のに5分ぐらいで合計10分ぐらいでした

#GrovePi+ Starter Kit
[GrovePi+ Starter Kit](http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/grove-pi-starter-kit/)は Seeed 社の [Grove センサー](http://www.seeedstudio.com/depot/s/grovefamily.html) を Raspberry Pi で使えるようにする拡張ボード [GrovePi](http://www.dexterindustries.com/GrovePi/)に、いくつかの Grove センサーを詰め合わせてお得なお値段でセットになった、ようするに Raspberry Pi ユーザ用の Grove システムのスターターキットです（名前から分かる事しか説明できてないですね ^^;）

MagPi の [Issue 33](https://www.raspberrypi.org/magpi/issues/33/)の Review のコーナー (P56) で [GrovePi+ Starter Kit](http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/grove-pi-starter-kit/)が __もしあなたがエレクトロニクスをはじめてみたいと思っている python ファンだったら素晴らしい選択__ という釣書で紹介されていたのが気になっていました。それまで単に __電気的な接続を気にしないですむ__ だけなんだろう（私のように電気が苦手なソフト屋には、それを気にしないですむだけでも大変ありがたいのですが）と思っていたのですがどうもそうではなく、大変便利な __Cleaver Script__ が使えるそうです

#とりあえずセンサーを繋いでサンプルプログラムを走らせながら読んでみた印象
[どのプログラムがどのセンサーのサンプルなのか分かりにくかった](http://qiita.com/UedaTakeyuki/items/ea8ae922b4b957f85df0)のですが、とりあえず動かしているとだんだんわかってきました。これはたしかに楽そうで、とにかく線をつなげて、Arduino のスケッチみたいな構文でリード＆ライトするだけでなんでもできそうです。
特に、 __LCD が凄く便利で、表示したい文字列とバックライトの色を set するだけという簡単さ__で、これだけでも買った元がとれそうです

#Parking Sensor
Kit の部品を眺めていて、MagPi の [issue 31](https://www.raspberrypi.org/magpi/issues/31/)にでていた Parking Sensor がつくれそうなきがしてきました。ここから、完成までが 10分ぐらいでした。とにかく __なにも考える必要がない__ と思うぐらい簡単です

## 材料
基本的に RaspberryPi と GrovePi+ Starter Kit だけなのですが

1. Raspberry Pi (Raspbian に GrovePi の設定済み。その際、[こういう](http://qiita.com/UedaTakeyuki/items/824fed05714560ab2676)トラブルもありましたが Q&Aが速くて安心)
2. GrovePi+
3. LCD (何番でもいいので I2C に接続)
4. 超音波距離センサー (Pixcer のロボットキャラの目玉みたいな奴、D2に接続)
5. 緑LED (D5に接続)
6. 赤LED (D6に接続)
7. ブザー (D8に接続、ビクッとする程の大音響なので穴を爪楊枝とかで塞いでもいいかも)

完成イメージはこんな感じです

![スクリーンショット 2015-06-14 18.54.44.png](https://qiita-image-store.s3.amazonaws.com/0/46544/fb659236-ab23-94e0-2abf-908dc0636a67.png "スクリーンショット 2015-06-14 18.54.44.png")

すみません^^; 今は関係ない DHT（デジタル湿度温度計、青い奴）が写っちゃってます ^^;;;;
近日中にこちらの測定値を [M2X](https://m2x.att.com) に送るのも簡単だった話も...

## 仕様

超音波距離センサーで駐車場の壁までの距離を測って

1. 測った距離を LCD に表示する
2. 距離が 1m 以下になったら LCD のバックライトを緑にして、緑の LED を点灯させる
3. 距離が 30cm 以下になったら LCD のバックライトを赤にして、赤の LED を点灯させ、ブザーを鳴動させる

車を駐車するのに多分便利なんでしょうね。実は私はドライバーズライセンスを持った事がないのでよく知らないのですが...

バックライトはサンプルプログラムを参考（コピペ）にフェードアウトの効果をいれてみました。完成コードの中では for ループでバックライトの色を変えて実現してます


## 完成品の紹介動画

完成品の動作は[こんな感じ](https://www.youtube.com/watch?v=uiPA0du3I5E)です

## 参考にしたサンプルプログラムと完成コード

以下のコードをまず眺めました、ぱっと見てすぐわかるような短いコードばっかりです

1. [LEDのオンオフ](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_led_blink.py)
2. [距離センサー](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_ultrasonic.py)
3. [ブザー](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_buzzer.py)
4. [LCD](https://github.com/DexterInd/GrovePi/blob/master/Software/Python/grove_rgb_lcd/example2.py) これはちょっと長いですが、要は色と文字列を set してるだけですね

これらをなんとなくくっつけて以下のコードが完成。やってることは単にループをまわして距離を測って、距離に合わせて表示を変えているだけの簡単なものなのですが、それはそうとマジックナンバーだらけでコメントが十分じゃないあたりの手抜きこそが、10分で出来た本当の理由な気が...

```python:完成コード
import sys
sys.path.append("/home/pi/GrovePi/Software/Python/grove_rgb_lcd")

import time
from grovepi import *
from grove_rgb_lcd import *

# Connect the Grove Ultrasonic Ranger to digital port D4
# SIG,NC,VCC,GND
#ultrasonic_ranger = 4
ultrasonic_ranger = 2
led_green = 5
led_red   = 6
buzzer = 8

pinMode(buzzer,"OUTPUT")
pinMode(led_green,"OUTPUT")
pinMode(led_red,"OUTPUT")
time.sleep(1)

while True:
    try:
        # Read distance value from Ultrasonic
        distance = ultrasonicRead(ultrasonic_ranger)
        print distance
        dist = int(distance)
        if dist > 100:
        	# non
            digitalWrite(led_green,0)
            digitalWrite(led_red,0)
            setText("distance = "+str(dist))
            for c in range(0,255):
                setRGB(255-c,255-c,255-c)
                time.sleep(.0039)
        elif dist > 30:
        	# green
            digitalWrite(led_green,1)
            digitalWrite(led_red,0)
            setText("distance = "+str(dist))
            for c in range(0,255):
                setRGB(255-c,255,255-c)
                time.sleep(.0039)
        else:
        	# red, buzzer 1sec
            digitalWrite(led_green,0)
            digitalWrite(led_red,1)
            digitalWrite(buzzer,1)
            setText("distance = "+str(dist))
            for c in range(0,255):
                setRGB(255,255-c,255-c)
                time.sleep(.0039)
            digitalWrite(buzzer,0)



    except TypeError:
        print "Error"
    except IOError:
        print "Error"
```

#感想
ほんとになにからなにまで簡単です。

1. ハンダ付けはもちろん不要
2. センサーの接続方法（電圧が5Vか3.3Vか、プロトコルは etc）を意識する必要なし、単に線を接続するだけ
3. ソフトウェアは GrovePi で用意されている Python の関数を呼ぶだけ

これだけでなんとなく電子工作っぽいことができてしまう簡単さはたしかに MagPi のいうとおり __”a great choice”__ だったなと思いました

#残課題
距離センサーの測定値がちょっと短い気がします。超音波距離センサーは音速に超音波のパルス波が物体に反射してかえってくるまでの時間を掛けて距離を測るのですが、その音速（温度や湿度の関数です）の設定値がちょっと速すぎる（高温多湿の場所を基準にした？）のではと推測されます。補正用の温度、湿度をあたえる API がないので、正確な距離を求めるためにアプリ側での補正が必要そうです

#Futur works
GrovePi+ を使ってdht11温室度センサーの測定値をm2xに10分で送信できた話