Wio LTEとAWSを連携させ、IoTサービスを開発する~オムロン絶対圧センサー編~

本コンテンツは、オムロン株式会社様から発売されているGroveコネクタ付き絶対圧センサーを利用して、別記事「Wio LTE と AWS を連携させ、 IoT サービスを開発する」
* 【作業】ステップ 2: 超音波距離センサと対象物との距離を SORACOM Harvest で可視化
* 【作業】ステップ 4: AWS IoT Core のルールエンジンを使って双方向通信
それぞれに応用的に取り組むためのハンズオン手順です。
(参考)オムロンがセンサーをラズパイ対応にした狙い

そのため、本記事の章は本編「Wio LTE と AWS を連携させ、IoTサービスを開発する」に沿ったものとなっております。

2-8. 絶対圧センサーの値を SORACOM Harvest で可視化」では、 HTTP/UDP/TCP 通信に対応している SORACOM Havest を利用してデータを可視化します。
4-3. 絶対圧センサーの値を AWS IoT Core に送信する」では、 SORACOM Beamの MQTT・MQTTS 通信を利用し、 AWS のサービス“AWS IoT Core”でデータの受信を確認します。こちらは双方向通信を利用しているので、取得した絶対圧の値に応じてブザーを鳴らすなどの応用が可能です。

二つの構成を図に表すとこのようになります:
abs_pressure_overall_architecture.png

ぜひ、本編の記事を参考にしながら、挑戦してみてください!

2-8. 絶対圧センサーの値を SORACOM Harvest で可視化

abs_pressure_harvest_architecture.png

2-8-0. Wio LTE に絶対圧センサーを取り付ける

一度、全てのセンサーを取り外してください。
続いて、絶対圧センサーは Wio LTE の I2C に取り付けてください。

absolute_wioLTE.jpg

2-8-1. SORACOM Harvest の設定をする

  • Wio LTEに 取り付けている SIM が所属する SIM グループの SORACOM Harvest を[ON]にして[保存]

image.png

  • 本編ステップ 2-3. を参考に行なってください
  • Wio LTE に取り付けている SIM の[グループ]が、先ほど SORACOM Harvest を[ON]にしたグループになっていることを確認します

image.png

2-8-2. スケッチを作成する

  • Arduino IDE を起動する
  • メニューの [ツール] で [ボード: “Wio Tracker LTE”] と表示されていることを確認する
    表示されていない場合は一覧から “Wio Tracker LTE” を選んでください。
  • Arduino IDE の [ファイル] > [新規ファイル]を開く
  • スケッチにコードを貼り付ける
    立ち上がったファイルのスケッチを全て消し、以下のコードを貼り付けてください。
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
// https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger
#include <Omron2SMPB02E_WIO.h>
#include <stdio.h>

#define INTERVAL (1000)
#define RECEIVE_TIMEOUT (10000)

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"

#define HARVEST_SERVER_HOST  "harvest.soracom.io"
#define HARVEST_SERVER_PORT  (8514)

WioLTE Wio;
Omron2SMPB02E_WIO sensor;

// 初期化処理
// 起動時に一度だけ実行される
void setup() {
    delay(200);

    SerialUSB.println("");
    SerialUSB.println("--- START ---------------------------------------------------");

    SerialUSB.println("### I/O Initialize.");
    Wio.Init();
    Wio.PowerSupplyGrove(true);

    SerialUSB.println("### Power supply ON.");
    Wio.PowerSupplyLTE(true);
    delay(500);

    // 絶対圧センサーを使用するための初期化処理
  SerialUSB.println("setup()");
  sensor.begin();
  sensor.set_mode(MODE_NORMAL);
  delay(300);

    SerialUSB.println("### Turn on or reset.");
    if (!Wio.TurnOnOrReset()) {
        SerialUSB.println("### ERROR! ###");
        return;
    }

    // SORACOMへの接続確認
    SerialUSB.println("### Connecting to \"soracom.io\".");
    if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
        SerialUSB.println("### ERROR! ###");
        return;
    }

    SerialUSB.println("### Setup completed.");
}

// 無限ループ
void loop() {
    char data[100] = {0};
    // 温度情報を取得
    float tmp = sensor.read_temp();
    // 気圧情報を取得
    float pressure = sensor.read_pressure();

    SerialUSB.println("### Open.");
    // harvestとの接続確認を行う
    int connectId;
    connectId = Wio.SocketOpen(HARVEST_SERVER_HOST, HARVEST_SERVER_PORT, WIOLTE_UDP);

    // harvestに適切に接続できない場合
    if (connectId < 0) {
        SerialUSB.println("### ERROR! ###");
        goto err;
    }


    SerialUSB.println("### Send.");

    SerialUSB.print("temperature ");
    SerialUSB.print(tmp);
    SerialUSB.println(" [degC]");

    SerialUSB.print("pressure ");
    SerialUSB.print(pressure);
    SerialUSB.println(" [Pa]");

    sprintf(data, "{\"absolute_pressure\":%f,\"temperature\":%f}", pressure, tmp);

    // 温度データと気圧データををharvestに送信
    if (!Wio.SocketSend(connectId, data)) {
        SerialUSB.println("### ERROR! ###");
        goto err_close;
    }


    SerialUSB.println("### Receive.");

    // harvestのレスポンスコードを受信
    int length;
    length = Wio.SocketReceive(connectId, data, sizeof (data), RECEIVE_TIMEOUT);
    if (length < 0) {
        SerialUSB.println("### ERROR! ###");
        goto err_close;
    } if (length == 0) {
        SerialUSB.println("### RECEIVE TIMEOUT! ###");
        goto err_close; 
    }
    SerialUSB.print("Receive:");
    SerialUSB.print(data);
    SerialUSB.println("");
    err_close: SerialUSB.println("### Close.");
    if (!Wio.SocketClose(connectId)) {
        SerialUSB.println("### ERROR! ###");
        goto err; 
    }
    err:delay(INTERVAL); 
} 
ライブラリをダウンロードする

ライブラリをこちらからダウンロードします↓
2smpb02e-grove-wio

Arduino IDE の[スケッチ] > [ライブラリをインクルード] > [.ZIP 形式のライブラリをインストール… ]をクリックする

先ほどダウンロードした zip ファイルをインストールしてください。
6-1-6.png

Wio LTE と PC を接続して DFU モードにする
新しく開いたウィンドウの[マイコンボードに書き込む](→)をクリックする

新規作成したスケッチを書き込む際、保存するかどうかを聞かれるので[キャンセル]を選択してください。
writeWioLTE.png

書き込みが完了したら、 Wio LTE を通常モードにする(RST ボタンを押せば通常モードになります)

通常モードで起動次第、SORACOM Harvest へデータを送信し始めます(電源投入から送信開始までは 20 ~ 25 秒程度かかります)

2-8-3. 各コンソール上でデータの取得を確認

データを取得できているか、まずはシリアルコンソール上で確認します。
Tera Term を使用したシリアルコンソールや Arduino IDE シリアルコンソールの操作方法がわからない場合は、本編ステップ 2-5. をご確認ください。

abs_pressure_harvest_console.png

トラブルシュート: [マイコンボードに書き込む]でエラーになる場合

本編ステップ 1-3. のトラブルシュートをご参考ください。
うまくいかない場合、インクルードライブラリの「Wio LTE for Arduino by Seeed K.K.」のバージョンを確認してください。
バージョンが 2.7.0 の場合、動作しないことが確認されています。
Wio LTE for Arduino by Seeed K.K が 2.7.0 になっている場合は、現在動作確認済みかつ最新であるバージョン 2.8.0 にアップデートしてください。

インクルードライブラリのバージョンの確認・更新方法

  • [スケッチ] > [ライブラリをインクルード] > [ライブラリを管理…]を選択
  • Wio LTE for Arduino で検索し、一覧の中から “Wio LTE for Arduino”を選択する
  • [バージョンを選択]で最新バージョン(2.8.0)を選び、[更新]

wiolte_library_update.png

2-8-4. SORACOM Harvest で確認

次に、データの取得を SORACOM コンソール上で確認します。

  • SORACOM コンソールに移動し、対象の SIM にチェックを入れ、[操作] > [データを確認]

58b62e05-0978-9ad0-995d-ab1d0d0bb91e.png

自分の SIM の IMSI が選択されているかを確認後、[自動更新]を ON にしてください。絶対圧(absolute_pressure)の値が表示されるようになります。

2-8-4graph.png

2-8-5. Wio LTE の動作を止め、SORACOM Harvest の設定を OFFにする

本編ステップ 2-6. 以降に従い、以下の作業を行なってください。
* Wio LTE に空のスケッチを書き込む(SORACOM Harvest を OFF にした後もデータを送信し続けることを避けるため)
* SORACOM Harvest の設定を OFF にする(ON のままだと課金対象となります)

課題が終わったら

Wio LTE と AWS を連携させ、 IoT サービスを開発するステップ 3 に進んでください。

4-3. 絶対圧センサーの値を AWS IoT Core に送信する

下図の通りオムロン製絶対圧センサーを Wio LTEに接続し、計測値を AWS IoT Core に送信します。
また、応用編では気圧の変化を高精度に検知する機能を利用し、“センサーの高さによってリパブリッシュを行い、ブザーを鳴らしてみる”という課題を設けています。是非そちらもやってみてください。

abs_pressure_beam_architecture.png

4-3-0. Wio LTE に絶対圧センサーを取り付ける

一度、全てのセンサーを取り外してください。
続いて、絶対圧センサーは Wio LTE の I2C に取り付けてください。

absolute_wioLTE.jpg

4-3-1. スケッチを作成する

  • Arduino IDE を起動する
  • メニューの [ツール] で [ボード: “Wio Tracker LTE”] と表示されていることを確認する
    表示されていない場合は一覧から “Wio Tracker LTE” を選んでください。
  • Arduino IDE の [ファイル] > [新規ファイル]を開く
  • スケッチにコードを貼り付ける
    立ち上がったファイルのスケッチを全て消し、以下のコードを貼り付けてください。
#include <WioLTEforArduino.h>
#include <WioLTEClient.h>
// https://github.com/knolleary/pubsubclient
#include <PubSubClient.h>
#include <stdio.h>
#include <Omron2SMPB02E_WIO.h>

#define INTERVAL  (5000)

#define APN               "soracom.io"
#define USERNAME          "sora"
#define PASSWORD          "sora"

#define MQTT_SERVER_HOST  "beam.soracom.io"
#define MQTT_SERVER_PORT  (1883)

#define ID                "WioLTE"
#define OUT_TOPIC         "absolute_pressure/pub"
#define IN_TOPIC          "absolute_pressure/sub"

WioLTE Wio;
WioLTEClient WioClient(&Wio);
PubSubClient MqttClient;

Omron2SMPB02E_WIO sensor;

void setup() {

  delay(200);

  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();

  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  Wio.PowerSupplyGrove(true);
  delay(300);

  SerialUSB.println("setup()");
  sensor.begin();
  sensor.set_mode(MODE_NORMAL);
  delay(300);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("### ERROR! ###");
    return;
  }

  // soracomへの接続設定と接続確認
  SerialUSB.println("### Connecting to \""APN"\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  // MQTT接続設定と接続確認
  SerialUSB.println("### Connecting to MQTT server \""MQTT_SERVER_HOST"\"");
  MqttClient.setServer(MQTT_SERVER_HOST, MQTT_SERVER_PORT);
  MqttClient.setClient(WioClient);
  if (!MqttClient.connect(ID)) {
    SerialUSB.println("### ERROR! ###");
    return;
  }
  MqttClient.subscribe(IN_TOPIC);

  SerialUSB.println("### Setup completed.");
}

void loop() {
  char data[100];
  float tmp = sensor.read_temp();
  SerialUSB.print("temperature ");
  SerialUSB.print(tmp);
  SerialUSB.println(" [degC]");
  float pressure = sensor.read_pressure();
  SerialUSB.print("pressure ");
  SerialUSB.print(pressure);
  SerialUSB.println(" [Pa]");
  sprintf(data, "{\"absolute_pressure\":%f,\"temperature\":%f}", pressure, tmp);
  SerialUSB.print("Publish:");
  SerialUSB.print(data);
  SerialUSB.println("");
  MqttClient.publish(OUT_TOPIC, data);

  unsigned long next = millis();
  while (millis() < next + INTERVAL)
  {
    MqttClient.loop();
  }
}
ライブラリをダウンロードする

ライブラリをこちらからダウンロードします↓

Arduino IDE の[スケッチ] > [ライブラリをインクルード] > [.ZIP 形式のライブラリをインストール… ]をクリックする

先ほどダウンロードした zip ファイルをインストールしてください。
6-1-6.png

Wio LTE と PC を接続して DFU モードにする
新しく開いたウィンドウの[マイコンボードに書き込む](→)をクリックする

新規作成したスケッチを書き込む際、保存するかどうかを聞かれるので[キャンセル]を選択してください。
writeWioLTE.png

書き込みが完了したら、 Wio LTE を通常モードにする(RST ボタンを押せば通常モードになります)

通常モードで起動次第、 SORACOM Beam を経由し、 AWS IoT Core へデータを送信し始めます(電源投入から送信開始までは 20 ~ 25 秒程度かかります)。
トピック名が異なるので、本編のステップ 4-1-3. で作成したルールは適用されません。

4-3-2. 各コンソール上でデータの取得を確認

データを取得できているか、まずはシリアルコンソール上で確認します。
Tera Term を使用したシリアルコンソールや Arduino IDE シリアルコンソールの操作方法がわからない場合は、本編ステップ 2-5. をご確認ください。
absolute_console.png

トラブルシュート: [マイコンボードに書き込む]でエラーになる場合

本編ステップ 1-3. のトラブルシュートをご参考ください。
うまくいかない場合、インクルードライブラリ「Wio LTE for Arduino by Seeed K.K.」のバージョンを確認してください。
バージョンが 2.7.0 の場合、動作しないことが確認されています。
Wio LTE for Arduino by Seeed K.K が 2.7.0 になっている場合は、現在動作確認済みかつ最新であるバージョン 2.8.0 にアップデートしてください。

インクルードライブラリのバージョンの確認・更新方法:
* [スケッチ] > [ライブラリをインクルード] > [ライブラリを管理…]を選択
* Wio LTE for Arduino で検索し、一覧の中から “Wio LTE for Arduino”を選択する
* [バージョンを選択]で最新バージョン(2.8.0)を選び、[更新]

wiolte_library_update.png

4-3-3. AWS IoT Coreでデータを確認

ステップ 3 で用意した Beam の設定とAWS IoT Core のThings, Policy の設定をそのまま使い回すことができます。
ただし、 Act で作成したルールはトピックが異なるので使い回せません。

AWS IoT Core に戻り、[Test] をクリックする

test_iotCore.png

サブスクライブしてみる

すべてのトピックをサブスクライブするために、ワイルドカードの意味を持つ#を入力します。入力した後、[Subscribe to topic] をクリックします。
sub_topic.png

正しくデータが送られてきていると、赤枠内のようにデータが自動で表示される

下図のように表示されていれば成功です。センサーを持ち上げたり下ろしたりして、値が変化することを確認してください。
absolute_iotcore.png

4-3-4. 応用課題: 気圧の変化(机からの高さ)によってブザーを鳴らしてみる

お疲れ様でした。ここまでできた方は、是非以下の応用課題にも取り組んでみてください!

課題の内容:

センサーの高度によって値が変化することを利用して、一定の高さを超えたらブザーを鳴らす仕組みを作ってみましょう。以下にヒントを示しますので、挑戦してみてください。
腕に自信のある方はヒントを見ずに先ほどのコードと本編を参考にしながら挑戦してみてください!
architecture_absolute_buzzer.png

ヒント:
  • WioLTEのソースコードを書き足しましょう
    subscribetopic にメッセージが届いたらブザーが鳴るようにソースコードを書き足します。詳細はステップ 3-6-4. を参考にしてください

  • AWS IoT Core のルールを追加しましょう
    topic名を書き換え、distanceabsolute_pressure に置き換えて作成しましょう(式の調整が必要です)
    アクションはAWS IoT のトピックにメッセージを再パブリッシュするを追加しましょう。
    詳細はステップ 4-2. を参考にしてください。

上手くいかない場合:
  • WioLTE のピンの設定に問題ありませんか?
    センサーを足す場合はピン設定の関数をソースコードに追記する必要があります。ステップ 3-6-4. のソースコードにコメントで解説してありますので、そちらをご参照ください

  • MqttClient.setCallback 関数と MqttClient.subscribe 関数は追記されていますか?
    subscribeのトピックにメッセージが届いた時にどう挙動させるかは、ステップ 3-6-4. のソースコードを確認してください

課題が終わったら

Wio LTE と AWS を連携させ、 IoT サービスを開発するステップ 5 に進んでください。