ArduinoをBluemixに接続するチュートリアルのTips

「[Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する](http://www.ibm.com/developerworks/jp/views/cloud/libraryview.jsp?contentarea_by=Cloud+computing&search_by=Arduino+Uno+%E3%81%A8+IBM+IoT+Foundation+%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E5%AF%BE%E5%BF%9C%E3%81%AE%E6%B8%A9%E5%BA%A6%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%3A)」は私のようなArduino初心者でも挑戦できるIoTのチュートリアルですが、記事が2014年11月公開で少々古いためにBluemixサービスに変更があったり、また、誤記によってはまってしまうポイントがあります。2015年11月時点でこのチュートリアルを実施し、チュートリアルを最後まで実施するために有用な情報をまとめました。

# [第1回](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot1/)

## Arduino を導入する

Adruinoはインターネットにつながるようにする必要があります。イーサネットシールドから有線でブロードバンドルーターなどを経由してインターネットにつながればよいのですが、私の場合は有線ではインターネットにつなげることができない環境でした。
しかしWiFiシールドはお高いので、できるだけお安く簡単にネットワークにつなぐ方法を考え、以下のような構成を取りました。

Arduino - (有線) - イーサネットコンバータ - (WiFi) - iPhone - (3G/4G) - インターネット

![arduino.png](https://qiita-image-store.s3.amazonaws.com/0/86449/126ddf98-0577-13da-f7a3-80304ec1bb50.png)


用意したものは以下です。

* Arduino UNO R3（[参考](http://www.amazon.co.jp/gp/product/B008PQEWIW/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B008PQEWIW&linkCode=as2&tag=sotoiwaproduc-22)）
* Arduino イーサネットシールド2（[参考](http://www.amazon.co.jp/gp/product/B00XC054NS/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00XC054NS&linkCode=as2&tag=sotoiwaproduc-22)）
* DHT11温度センサー（[参考](http://www.amazon.co.jp/gp/product/B008XCRHKS/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B008XCRHKS&linkCode=as2&tag=sotoiwaproduc-22)）
* イーサネットコンバータ（[参考](http://www.amazon.co.jp/gp/product/B00NAJEJ3M/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00NAJEJ3M&linkCode=as2&tag=sotoiwaproduc-22)）

ポイントはイーサネットコンバータとしても使える安いWiFiルーターを探すことです。「[Elecom WRH-300BK2-S](http://www2.elecom.co.jp/products/WRH-300BK2-S.html)」はイーサネットコンバーターとしても機能し、小型で価格も手ごろなのでオススメです。
インターネットへの接続はiPhoneのテザリング機能を使用しています。

なお、今回のイーサネットシールドは「イーサネットシールド2」なので、1.7.2以降のArduino IDEで開発する必要があります。今回は1.7.8を使用しました。

## Web サーバーのサンプルを機能させる

Webサーバーのサンプルを動作させる際、イーサネットシールド2を使用しているので、「スケッチの例 > Ethernet2 > WebServer」を使います。
この段階では、WiFiルーターは使わずにイーサネットシールドとPCを直接LANケーブルで接続し、PCのイーサネットポートにはアドレスを手動割り当てして動作を確認します。

# [第2回](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot2/)

## ローカルでMQTTをテストする

### MQTTライブラリ

ライブラリのダウンロード先は以下に変更になっています。今回は2.4で試したところ、ローカルのMQTTブローカーと接続できるもののPublishが上手くいかなかったため、1.9.1を使用しました。

* [Arduino Client for MQTT](http://pubsubclient.knolleary.net/)

### Mosquitto

今回はMosquittoは1.4.5を使用しました。
[前提](http://git.eclipse.org/c/mosquitto/org.eclipse.mosquitto.git/tree/readme-windows.txt)として以下も必要なので別途インストールする必要があります。

* [OpenSSL](http://slproweb.com/products/Win32OpenSSL.html)
* [pthreads](ftp://sourceware.org/pub/pthreads-win32)

```
Dependencies - win32
--------------------

* OpenSSL
    Link: http://slproweb.com/products/Win32OpenSSL.html
    Install "Win32 OpenSSL <version>"
    Required DLLs: libeay32.dll ssleay32.dll
* pthreads
    Link: ftp://sourceware.org/pub/pthreads-win32
    Install "pthreads-w32-<version>-release.zip
    Required DLLs: pthreadVC2.dll

Please ensure that the required DLLs are on the system path, or are in the same directory as
the mosquitto executable.
```

### サンプル・スケッチに変更を加える

イーサーネットシールド2を使用してるため、`Ethernet2.h`をインクルードします。

```
#include <SPI.h>
#include <Ethernet2.h>
#include <PubSubClient.h>
#include <dht11.h>
```

「MQTT_IOT_SENSORS.ino」のサンプルファイルは正しいのですが、記事内の`servername`の`messaging.quickstart.internetofthings.ibmcloud.com`は`quickstart.messaging.internetofthings.ibmcloud.com`の誤記です。
また、`clientName`も`d:quickstart:arduino:`ではなく`d:iotsample-quickstart:arduino:`とします。後ほど登場しますが、「quickstart」の部分はIoT Foundationの組織名、「iotsample-quickstart」はデバイス・タイプです。
正しくは以下です。

```
char servername[]="quickstart.messaging.internetofthings.ibmcloud.com";
String clientName = String("d:quickstart:iotsample-arduino:") + macstr;
```

`clientName`が長くなったため、`loop()`関数の中の以下の場所も修正が必要です。

```
char clientStr[44];
clientName.toCharArray(clientStr,44);
```

[参考リンク](https://developer.ibm.com/answers/questions/166285/mqtt-iot-sensorsino-running-on-arduino-uno-cannot/)

## ArduinoをIoT Foundation Quickstartに接続する

ここからはAdruinoをインターネットにつなぐ必要があるため、イーサネットコンバータを使用します。WRH-300BK2をイーサネットコンバータとして設定する方法については以下のリンク先を参照下さい。

* http://qa.elecom.co.jp/faq_detail.html?id=5962

私の場合はiPhoneのテザリング機能を使用し、iPhoneを無線LAN親機、WRH-300BK2を無線LAN子機として接続しました。

WRH-300BK2はDHCPでArduinoにアドレスを割り振ってくれるため、ArduinoがDHCPクライアントとして動作するためには、コードを少しだけ変更します。

```
  // Ethernet.begin(mac, ip);
  Ethernet.begin(mac);
```

[Quickstart](https://quickstart.internetofthings.ibmcloud.com/)のデザインは変更になっていますが、機能は同じです。

![quickstart.png](https://qiita-image-store.s3.amazonaws.com/0/86449/f2f8223c-d060-995b-0326-a64404bcf8a7.png)

# [第3回](https://www.ibm.com/developerworks/jp/cloud/library/cl-arduino-iot3-app/)

## ステップ 3: 基本的な登録済みアプリケーションにデータベースを追加するという変更を加える

[IBMがComposeを買収](http://www-06.ibm.com/jp/press/2015/07/2802.html)したことに伴い、Bluemixカタログページから「MongoLab」や「monogodb」がなくなり、代わりに「MongoDB by Compose」があります。Bluemix Labs Catalogにはまだ「mongodb」がありますので、カタログページを一番下までスクロールして「Bluemix Labs Catalog」のリンクをクリックし、このページにある「mongodb」を使用します。

![mongodb.png](https://qiita-image-store.s3.amazonaws.com/0/86449/cf279c8c-75bd-65cd-43d0-b5baba0d395e.png)

### IoT Foundation に機器を登録する

IoT FoundationのUIはかなり変更になっています。

Peopleは「アクセス」から追加しますが、既に自分自身がゲストとして追加されているため追加する必要はありません。

次にデバイスの登録ですが、「Adruino Uno」という定義済みのデバイス・タイプはないため、最初にデバイス・タイプを追加する必要があります。このときデバイス・タイプの名前は「iotsample-arduino」とします。デバイス・タイプのその他の設定項目は特に設定する必要はありません。

![devicetype.png](https://qiita-image-store.s3.amazonaws.com/0/86449/a529d886-3c7c-3a43-c7c5-b7214f4f0b0c.png)

デバイス・タイプを作成したら、デバイスを作成します。記事の通り、MACアドレスをデバイスIDにします。認証トークンなどの情報をメモすることを忘れないようにして下さい。

## ステップ 4: Arduino スケッチをダウンロードして変更を加える

これまでと同様に記事の作業に加えて以下の変更を加えます。

* `Ethernet.h`の代わりに`Ethernet2.h`をインクルードする
* DHCPを使用してアドレスを取得するため`Ethernet.begin(mac);`に変更する

## ステップ 5: Node-RED でコードを編集する

Node-REDエディターにコードをインポートする際、リスティングを直接コピペすると途中の不要な改行によって失敗します。改行を半角スペースに変更します。また、「&&」であるべきところに「& &」のように不要なスペースが入っている箇所がある場所がありますのでそこも修正が必要です。

```
[{"id":"b1b4a786.d22c58","type":"ibmiot","name":"Bluemix IOT Token"},{"id":"68bf71d.f97409","type":"mongodb","hostname":"192.155.243.23","port":"10057","db":"db","name":"IBMCloud MongoDB"},{"id":"5c60019b.6aa8c8","type":"mongodb out","service":"_ext_","mongodb":"68bf71d.f97409","name":"Mongo Store","collection":"data","payonly":false,"upsert":false,"multi":false,"operation":"store","x":625.2000122070312,"y":121.19999694824219,"z":"cae409bb.8c23e8","wires":[]},{"id":"fc410194.f40058","type":"mongodb in","service":"_ext_","mongodb":"68bf71d.f97409","name":"MongoDB Query","collection":"data","x":539.2000122070312,"y":192.20001220703125,"z":"cae409bb.8c23e8","wires":[["9b229426.5a4378"]]},{"id":"9b229426.5a4378","type":"http response","name":"data output","x":732.2000122070312,"y":197.20001220703125,"z":"cae409bb.8c23e8","wires":[]},{"id":"7bfb2916.58f4f8","type":"debug","name":"","active":true,"console":false,"complete":false,"x":612.2000122070312,"y":63.19999694824219,"z":"cae409bb.8c23e8","wires":[]},{"id":"291be4b5.cca914","type":"function","name":"get and append time","func":"var d = new Date();\nvar n = d.getTime(); \nmsg.payload.d.time=n;\nreturn msg;","outputs":1,"x":343.20001220703125,"y":61.19999694824219,"z":"cae409bb.8c23e8","wires":[["5c60019b.6aa8c8","7bfb2916.58f4f8"]]},{"id":"15bd57a9.534cd8","type":"function","name":"update payload","func":"if ((typeof msg.payload.start == \"string\") && (typeof msg.payload.end == \"string\")) {\n\tvar stt = parseInt(msg.payload.start);\n\tvar edd = parseInt(msg.payload.end);\n\tmsg.payload =   {\n    \t\"payload.d.time\": {$gt: stt, $lt: edd}\n    }\n} else {\n\tmsg.payload = {}\n}\nreturn msg;","outputs":1,"x":334.20001220703125,"y":192.20001220703125,"z":"cae409bb.8c23e8","wires":[["fc410194.f40058"]]},{"id":"d3e8d05c.3bc0b","type":"http in","name":"data web service GET","url":"/data","method":"get","x":118.40000915527344,"y":192.40003967285156,"z":"cae409bb.8c23e8","wires":[["15bd57a9.534cd8"]]},{"id":"3fd8fa81.81641e","type":"ibmiot in","authentication":"boundService","apiKey":"b1b4a786.d22c58","inputType":"evt","deviceId":"","applicationId":"","deviceType":"","eventType":"","commandType":"","format":"","name":"IBM IoT App In","service":"registered","allDevices":true,"allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":true,"x":96.19999694824219,"y":61.19999694824219,"z":"cae409bb.8c23e8","wires":[["291be4b5.cca914"]]}]
```

Mongo データベース・ノードの設定はサービスを選択するだけで可能になっています。
上のフローの「Mongo Store」ではオペレーションは「save」を選択します。下のフローの「MongoDB Query」ではオペレーションは「find」を選択します。

![mongoquery.png](https://qiita-image-store.s3.amazonaws.com/0/86449/3dfac3c5-b212-09e0-07ba-639cc3d6f151.png)

# [第4回](https://www.ibm.com/developerworks/jp/cloud/library/cl-arduino-iot4-app/)

## ステップ 1: GUI を作成する

「Moment.js」「Chart.js」のファイル名にご注意下さい。先頭大文字です。

## ステップ 2: Nginx にページをデプロイする

「[nginx-buildpack](https://github.com/cloudfoundry-community/nginx-buildpack)」は廃止予定であるため、代わりに「[staticfile-buildpack](https://github.com/cloudfoundry/staticfile-buildpack)」を使用します。このとき、stackとして「cflinuxfs2」を指定する必要があります。また、記事にある「myappname は、第 3 回で指定したアプリケーション名に置き換えてください」は誤りで、**第3回で指定したアプリケーションとは別のアプリケーション名**を指定します。

```
cf push myappname -b https://github.com/cloudfoundry-community/staticfile-buildpack -m 64M -s cflinuxfs2
```

## ステップ 3: Node-RED を使用して作成したアプリケーションの構成に変更を加える

記事に記載がありませんが、コードを変更した後はコミットとプッシュが必要です。

# 元記事リンク

## 翻訳記事

* [Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する: 第 1 回 回路を組み立てて環境を構築する](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot1/)
* [Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する: 第 2 回 スケッチを作成して IBM IoT Foundation Quickstart に接続する](https://www.ibm.com/developerworks/jp/cloud/library/cl-bluemix-arduino-iot2/)
* [Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する: 第 3 回 Node-RED を使ってカスタム・アプリケーションを作成する](https://www.ibm.com/developerworks/jp/cloud/library/cl-arduino-iot3-app/)
* [Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する: 第 4 回 クエリー用 GUI の Web ページをデプロイする](https://www.ibm.com/developerworks/jp/cloud/library/cl-arduino-iot4-app/)

## 英語元記事リンク

* [Build a cloud-ready temperature sensor with the Arduino Uno and the IBM IoT Foundation, Part 1: Build the circuit and set up the environment](http://www.ibm.com/developerworks/cloud/library/cl-bluemix-arduino-iot1/)
* [Build a cloud-ready temperature sensor with the Arduino Uno and the IBM IoT Foundation, Part 2: Write the sketch and connect to the IBM IoT Foundation Quickstart](http://www.ibm.com/developerworks/cloud/library/cl-bluemix-arduino-iot2/)

英語の第3回と第4回の記事は2015年11月時点でリンク切れとなっています。