Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】

最近話題のIntel Edisonを用いて、温度センサ等のデータをWiFi経由でAmazon KinesisにあげてみるIoT的なのをやってみます。書いていると長くなってしまったので、前編、後編に分けてお届けします！

ちなみに、AWSのカンファレンスの[re:Invent](https://reinvent.awsevents.com/)(2014年11月)の中で、[IoT Hack Day](http://hack-day.s3-website-us-east-1.amazonaws.com/)というハッカソン的なイベントがあったのですが、ここではそのイベントで使われていた[Intel Edison Kit for Arduino](http://ark.intel.com/ja/products/84571/Intel-Edison-Kit-for-Arduino)という開発用の拡張ボード、[GROVE](https://www.switch-science.com/catalog/1221/)というセンサーキットを用いています。左上がEdison、左下がEdison Kit for Arduino、右側がGROVEキットです。

Edisonは切手くらいの大きさですが、この中にWiFiモジュールもBluetoothモジュールも含んでいます。Arduinoの開発ボードがあるので、USBケーブル経由で開発マシンに接続できますし、色々なモジュール(シールドと呼びます)が取り付けられます。GROVEセンサーキットは、このArduinoのシールドにセンサ接続モジュールをつけられるので、そこに温度センサのみなら光電センサ、スウィッチ、ブザー、ボリュームと色々なセンサをハンダ付け無しでにつなげられクールです。

今回の前編では、そのIntel EdisionとGROVEセンサーキット使ってセンサのデータをnode.js環境でJavaScriptでとるところまで、後編の記事では、そのデータをKinesisにあげるところまでやりたいと思います。

![左上がEdison、左下がEdison Kit for Arduino、右側がGROVEキット](https://qiita-image-store.s3.amazonaws.com/0/6069/b27851c0-7d19-c134-3dfc-9f8c158f252d.jpeg)

# 使用環境
今回使った環境に関しては、日本だとアマゾンか下記のスイッチサイエンスで購入できます。秋葉原の秋月電子でも購入できます。GROVEスターターキットは、少し値段が張りますが、多種のセンサが揃っているので楽しめます。

* Intel Edison Kit for Arduino - スイッチサイエンス
https://www.switch-science.com/catalog/1958/
* GROVE - スターターキットプラス - スイッチサイエンス
https://www.switch-science.com/catalog/1221/
* 秋月電子通商 電子部品 ネット通販
http://akizukidenshi.com/catalog/goods/search.aspx?search=x&keyword=edison&image=%8C%9F%8D%F5

私の開発マシンは、Mac book AirのOS X Mavericks 10.9.5です。

# 全体の流れ
では以下の流れですすめていきたいと思います！

★Edisonの準備(前編の今回の記事)
* Intel Edison Kit for Arduinoのセットアップ
* Groveスターターキットプラスのセットアップ
* センサデータをJavaScriptで取得する
★AWSリソースの準備　←ここから先は後編を予定
* AWS Cognitoでデバイスを認証する
* Amazon Kinesisのストリーム作成
* KinesisへのデータのPut
★仕上げ
* センサデータをEdisonからKinesisにPutする
* Kinesis内のデータの確認

では早速手をつけていきましょう。

# Intel Edison Kit for Arduinoのセットアップ

Mac環境でのIntel Edison Kitのセットアップは公式ガイドの[Edison Getting Started Guide - Mac](https://communities.intel.com/docs/DOC-23148)が参考になります。

Edisonのチップセットを開発ボードに取り付けネットで固定します（写真左下)。さらにミニUSBケーブルを二つ差し込み、Macなどの開発用PCにつなげます。開発ボードの裏に白い足が見えていると思いますがそちらも取り付けます。
![IMG_7957.png](https://qiita-image-store.s3.amazonaws.com/0/6069/61bb61b8-6386-85cd-0e4f-cd783ac6abe1.png)

開発マシンのMac Book Airにつなげた場合だとこのような形になると思います。
![IMG_7956.png](https://qiita-image-store.s3.amazonaws.com/0/6069/2e0bdb44-7d75-f342-f038-67a856c220df.png)

この後、Edisonを早速、Wifiに接続してみます。Macのターミナルを開き下記のように、screenコマンドを使ってEdisonに対してUSBシリアル接続をします。
“screen /dev/cu.usbserial”まで打ってから“Tab"をうつと、環境にあわせて補完してくれるでしょう。その後、続けて“115200 -L”をタイプします。(注: シリアルドライバがMacの環境に適切に入っていない場合は、[FTDIドライバーをインストール]
(http://www.oversea-pub.com/free/environment/2083.html)する必要があるかもしれません。私の場合はそうでした。)
![2014-11-30_18-36-02.png](https://qiita-image-store.s3.amazonaws.com/0/6069/5788f10a-bc50-15a4-13c3-94e749bf599b.png)


Enterを数回押すと、Edison側ですでにLinuxが立ち上がっており、rootでログインできます。
`configure_edison`でセットアップしていきます。
Edisonに名前をいれます。SSID等の名前で使われます。
![2014-11-30_18-43-25.png](https://qiita-image-store.s3.amazonaws.com/0/6069/cefc47dc-5c10-19c1-4639-27d4c7b80a70.png)
今後Edisonにログインするためのパスワードを入れます。
![2014-11-30_18-43-41.png](https://qiita-image-store.s3.amazonaws.com/0/6069/47b8bc0d-83aa-1999-850d-401825242526.png)
Wifiに接続していきます。接続ポイントを選んでパスワードを入れます。
![2014-11-30_18-45-29.png](https://qiita-image-store.s3.amazonaws.com/0/6069/3252ad30-c195-70b2-56e5-ac0c97d9f370.png)

これでEdisonがWifiに接続されました！
![2014-11-30_18-59-05.png](https://qiita-image-store.s3.amazonaws.com/0/6069/82b4ae67-90b8-9f5b-8f94-2e8024e76993.png)

curl等で適当なサイトにアクセスしても実際にアクセス出来ているのが分かります。

# GROVEスターターキットプラスのセットアップ

GROVEスターターキットの中には様々なセンサが用意されています。今回は、温度センサと光電センサ(明るさを読み取るセンサ)を使ってみたいと思います。
![IMG_7958.png](https://qiita-image-store.s3.amazonaws.com/0/6069/aafb3242-30a6-5079-f07b-3e6d9f3c1011.png)

まず、Arduinoのボードのシールド取り付け部分に、センサをつなぐためのシールド拡張ボードを差し込みます。この拡張ボードには、デジタルやアナログのセンサをつなぐ端子が沢山用意されているのが分かります。
![IMG_7959.png](https://qiita-image-store.s3.amazonaws.com/0/6069/a14dcc5e-c31a-59d6-ea41-49680f3f55a8.png)

今回は、光電センサをA0に、温度センサをA1につないでみましょう。後から何回でもつなぎ変えられるので気軽にどうぞ。
![IMG_7960.png](https://qiita-image-store.s3.amazonaws.com/0/6069/b7b91195-61e1-3427-36b9-53340378dc8f.png)

これでセンサの準備は完了です！

# センサデータをJavaScriptで取得する

つぎにこのセンサのデータをnode.jsでJavaScriptで取得してみます。IntelのIoT Developement Kitの一部として開発されているArduino向け[IOフレームワークmraa](https://github.com/intel-iot-devkit/mraa/tree/master/examples/javascript)でJavaScriptが使えます。

Edisonにmraaをインストールします。

```
$ echo "src mraa-upm http://iotdk.intel.com/repos/1.1/intelgalactic" > /etc/opkg/mraa-upm.conf
$ opkg update
$ opkg upgrade
```

これでmraaが使えます。アナログピンを読むには、こちらの[サンプルのAio](https://github.com/intel-iot-devkit/mraa/blob/master/examples/javascript/AioA0.js)が使えるので下記のように書いてみます。アナログピンのA0, A1を使っているのでその値を読み込んでみます。

```
var m = require('mraa'); //require mraa
console.log('MRAA Version: ' + m.getVersion()); 

//setup access analog inpuput pin 0, 1
var analogPin0 = new m.Aio(0); 
var analogPin1 = new m.Aio(1); 

//read the value of the analog pin
var analogValue0 = analogPin0.read(); 
var analogValue1 = analogPin1.read(); 

//write the value of the analog pin to the console
console.log("A0: " + analogValue0); 
console.log("A1: " + analogValue1); 
```

nodeで実行してみます。

```
$ node readIO.js 
MRAA Version: v0.5.2-37-g148c22f
A0: 473
A1: 336
```

見事に値がとれています！A0の光電センサのほうはセンサ部分を手で隠すと値がすぐに小さくなるのでセンサの値がとれていることが分かると思います。

今回、アナログセンサーの読み取りにAio()を用いていますが、デジタルピンは [Gpio()を使えば](https://github.com/intel-iot-devkit/mraa/blob/master/examples/javascript/GPIO_DigitalRead.js)簡単にセットしたり読んだりできます。またセンサによっては、より高レイヤーの[UPMライブラリ](http://iotdk.intel.com/docs/master/upm/)が用意されており、JSの場合はjsupm_xxxxモジュールが用意されているので、そちらが使える場合はより便利でしょう。

# 前編はここまで

さて、今回は下記の手順まで実施しました。
★Edisonの準備(前編の今回の記事)
* Intel Edison Kit for Arduinoのセットアップ
* Groveスターターキットプラスのセットアップ
* センサデータをJavaScriptで取得する

後編では以下の部分を実施したいと思います。
★AWSリソースの準備(後編予定)
* AWS Cognitoでデバイスを認証する
* Amazon Kinesisのストリーム作成
* KinesisへのデータのPut
★仕上げ
* センサデータをEdisonからKinesisにPutする
* Kinesis内のデータの確認

どうぞお楽しみに！

# さいごに所感

* Edisonは起動してすぐにwifiにつなげるし、npmでAWS SDK for JavaScriptを組み込み環境にそのままインストールできるなんてのは2000年頃に組み込み系開発をやっていた頃からすると隔世の感がある。
* GROVEスターターキットは色々なセンサーをハンダ付け無しでつないで遊べるので学習用には非常に良い。
* 組み込みボードのIOをnode.jsのJavaScriptで叩いて、そのままAWSのリソースもJavaScriptで書ける。サーバーサイド、スマホ等のクライアントサイドのみならず、デバイスサイドまでJavaScriptである。JS万歳。


免責
こちらは個人の意見で会社とは関係ありません。