Raspberry Pi 3 で超音波距離センサを使ってみる

前回の「[Intel Edisonで超音波距離センサを使ってみる](http://qiita.com/hira3/items/c91581b19b03111145ea)」では
「GROVE - 超音波距離センサ」が使えなかったので、今回は Raspberry Pi 3 で試してみます。

![DSC_0039.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/df5ce8af-d4e4-f0eb-12c9-056384bbed48.jpeg)

# GrovePi+ 取り付け
Raspberry Pi 3 に対応しているって書いていないけど、GrovePi+ を取り付けてみます。

![DSC_0054.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/9e89e3e0-123d-3072-3fe6-dde014f3e07b.jpeg)

GrovePi+の裏側は、USBポートに触れる部分に絶縁テープを貼りました。
![DSC_0056.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/cf29f561-3fb8-8a68-7c4b-483151e16444.jpeg)

合体！
![DSC_0057.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/9c8e2637-05c7-99df-5090-8c23bd7fb11c.jpeg)

# GrovePi の設定
まずは、もろもろ最新に。

```bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

## GrovePi ソフトウェアをインストール
[公式サイト](http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/)通りにソフトウェアを取得してインストールする。

```bash
$ cd /home/pi/Desktop
$ sudo git clone https://github.com/DexterInd/GrovePi.git

$ cd GrovePi/Script/
$ sudo chmod +x install.sh
$ sudo ./install.sh
```

インストールが終わると勝手に reboot する。

## ファームウェアの Update
ファームウェアを Update しろと公式サイトに書いてあるので、続けて実施します。
まずは、Update 前にバージョンを確認。 

```bash
$ python grove_firmware_version_check.py
GrovePi has firmware version: 255.255.255
```
なんか変な値になっている。

ファームウェアを Update する。
```bash
$ cd /home/pi/Desktop/GrovePi/Firmware
$ sudo chmod +x firmware_update.sh
$ sudo ./firmware_update.sh
```

正常に終わったら、ファームウェアのバージョンを確認する。

```bash
$ cd /home/pi/Desktop/GrovePi/Software/Python/
$ python grove_firmware_version_check.py
GrovePi has firmware version: 1.2.2
```

バージョン 1.2.2 になったけど、これでいいのかな？


## GrovePi+ の確認
公式サイトにしたがって Raspberry Pi が GrovePi を検出できることを確認する。

```bash
$ sudo i2cdetect -y 1
```

![i2cdetect.png](https://qiita-image-store.s3.amazonaws.com/0/134613/de98e9d6-cfed-c941-1900-efa18c3a88a1.png)
これで検出できているらしい。

Lチカでも確認する。（Python スクリプトがインストールされていました。）

```bash
$ cd /home/pi/Desktop/GrovePi/Software/Python
$ python grove_led_blink.py
```

OFFから
![DSC_0063.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/9a0dbb28-b025-1181-b516-3f83e2c644a5.jpeg)
ON！！！
![DSC_0062.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/a53a18b2-b39b-bef0-53cf-18a6b79c75c7.jpeg)

上手くいったみたい。
超音波距離センサ用の Python スクリプトもあったので確認する。

![DSC_0064.jpg](https://qiita-image-store.s3.amazonaws.com/0/134613/6a232c68-3d79-3f95-149d-58fc06f83eeb.jpeg)

```bash
$ python grove_ultrasonic.py
```

![ultrasonic_python.png](https://qiita-image-store.s3.amazonaws.com/0/134613/f30e8260-3ee7-086b-9039-d6d4da5ae0bc.png)
いい感じですね。

Python だったら超簡単！！！ 


# Node.js でもやってみる
前回の「[Intel Edisonで超音波距離センサを使ってみる](http://qiita.com/hira3/items/c91581b19b03111145ea)」は Node.js でやったので、
Raspberry Pi 3 でも Node.js でやってみます。

## Node.js をインストール

```bash
# Node.js のバージョン確認
$ node -v
v0.10.29

# 古いのでバージョンアップする
# まずは削除
$ sudo apt-get --purge remove nodejs

# nodebrew をインストールする
$ curl -L git.io/nodebrew | perl - setup

# nodebrew を PATH に通す
$ vi ~/.bashrc
# この行を追加
export PATH=$HOME/.nodebrew/current/bin:$PATH

# PATH を追加したので
$ source ~/.bashrc

# Node.js の安定版をインストール
$ nodebrew install-binary stable

# インストールされているバージョンを確認
$ nodebrew ls
v6.3.1

# このバージョンを設定
$ nodebrew use stable
use v6.3.1

# Node.js のバージョン確認
$ node -v
v6.3.1
$ npm -v
3.10.3
```

## GrovePi for Node.js
Node.js 用のパッケージをインストールします。

```bash
$ mkdir ultrasonic
$ cd ultrasonic
$ npm install node-grovepi
```

## Node.js で確認

コードはこんな感じです。

```js:ultrasonic.js
var GrovePi = require('node-grovepi').GrovePi

var Board = GrovePi.board
var UltrasonicDigitalSensor = GrovePi.sensors.UltrasonicDigital

var board

function start() {
    console.log('starting')

    board = new Board({
        debug: true,
        onError: function(err) {
            console.log('ERROR')
            console.log(err)
        },
        onInit: function(res) {
            if (res) {
                // Ultrasonic Ranger
                var ultrasonicSensor = new UltrasonicDigitalSensor(4)
                ultrasonicSensor.stream(100, function(res) {
                    console.log(res)
                })
            }
            else {
                console.log('TEST CANNOT START')
            }
        }
    })

    board.init()
}

function onExit(err) {
    console.log('ending')
    board.close()
    process.removeAllListeners()
    process.exit()
    if (typeof err != 'undefined') {
        console.log(err)
    }
}

// starts the test
start()
// catches ctrl+c event
process.on('SIGINT', onExit)
```

ちゃんと取れました！！
![ultrasonic_nodejs.png](https://qiita-image-store.s3.amazonaws.com/0/134613/9e67b221-7b49-4b79-89a8-0572a93c1c0b.png)

# まとめ
Intel Edison で苦労したことが、Raspberry Pi 3 では簡単にできました。
Raspberry Pi 3 は Pi 2 より高性能になってますし、Wi-Fi や Bluetooth 4.1 も標準搭載されています。
そのせいで消費電力が高くなっているようですが。。。
ただ、扱いやすさや情報量の多さでは Intel Edison より Raspberry Pi 3 のほうがいいなと思いました。
あと、価格も安いしね。

Wi-Fi や Bluetooth 等で簡単にネットワークや他デバイスに接続できるので、
これから色々やってみたいと思います。