LoginSignup
18
18

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-12-01

Arduino Uno と IBM IoT Foundation を利用してクラウド対応の温度センサーを作成する」は私のようなArduino初心者でも挑戦できるIoTのチュートリアルですが、記事が2014年11月公開で少々古いためにBluemixサービスに変更があったり、また、誤記によってはまってしまうポイントがあります。2015年11月時点でこのチュートリアルを実施し、チュートリアルを最後まで実施するために有用な情報をまとめました。

第1回

Arduino を導入する

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

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

arduino.png

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

  • Arduino UNO R3(参考
  • Arduino イーサネットシールド2(参考
  • DHT11温度センサー(参考
  • イーサネットコンバータ(参考

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

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

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

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

第2回

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

MQTTライブラリ

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

Mosquitto

今回はMosquittoは1.4.5を使用しました。
前提として以下も必要なので別途インストールする必要があります。

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」のサンプルファイルは正しいのですが、記事内のservernamemessaging.quickstart.internetofthings.ibmcloud.comquickstart.messaging.internetofthings.ibmcloud.comの誤記です。
また、clientNamed: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);

参考リンク

ArduinoをIoT Foundation Quickstartに接続する

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

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

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

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

Quickstartのデザインは変更になっていますが、機能は同じです。

quickstart.png

第3回

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

IBMがComposeを買収したことに伴い、Bluemixカタログページから「MongoLab」や「monogodb」がなくなり、代わりに「MongoDB by Compose」があります。Bluemix Labs Catalogにはまだ「mongodb」がありますので、カタログページを一番下までスクロールして「Bluemix Labs Catalog」のリンクをクリックし、このページにある「mongodb」を使用します。

mongodb.png

IoT Foundation に機器を登録する

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

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

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

devicetype.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

第4回

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

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

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

nginx-buildpack」は廃止予定であるため、代わりに「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 を使用して作成したアプリケーションの構成に変更を加える

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

元記事リンク

翻訳記事

英語元記事リンク

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

18
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
18
18