本コンテンツは、オムロン株式会社様から発売されている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”でデータの受信を確認します。こちらは双方向通信を利用しているので、取得した絶対圧の値に応じてブザーを鳴らすなどの応用が可能です。
二つの構成を図に表すとこのようになります:
ぜひ、本編の記事を参考にしながら、挑戦してみてください!
2-8. 絶対圧センサーの値を SORACOM Harvest で可視化
2-8-0. Wio LTE に絶対圧センサーを取り付ける
一度、全てのセンサーを取り外してください。
続いて、絶対圧センサーは Wio LTE の I2C に取り付けてください。
2-8-1. SORACOM Harvest の設定をする
- Wio LTEに 取り付けている SIM が所属する SIM グループの SORACOM Harvest を[ON]にして[保存]
- 本編ステップ 2-3. を参考に行なってください
- Wio LTE に取り付けている SIM の[グループ]が、先ほど SORACOM Harvest を[ON]にしたグループになっていることを確認します
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 ファイルをインストールしてください。
Wio LTE と PC を接続して DFU モードにする
新しく開いたウィンドウの[マイコンボードに書き込む](→)をクリックする
新規作成したスケッチを書き込む際、保存するかどうかを聞かれるので[キャンセル]を選択してください。
書き込みが完了したら、 Wio LTE を通常モードにする(RST ボタンを押せば通常モードになります)
通常モードで起動次第、SORACOM Harvest へデータを送信し始めます(電源投入から送信開始までは 20 ~ 25 秒程度かかります)
2-8-3. 各コンソール上でデータの取得を確認
データを取得できているか、まずはシリアルコンソール上で確認します。
Tera Term を使用したシリアルコンソールや Arduino IDE シリアルコンソールの操作方法がわからない場合は、本編ステップ 2-5. をご確認ください。
トラブルシュート: [マイコンボードに書き込む]でエラーになる場合
本編ステップ 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)を選び、[更新]
2-8-4. SORACOM Harvest で確認
次に、データの取得を SORACOM コンソール上で確認します。
- SORACOM コンソールに移動し、対象の SIM にチェックを入れ、[操作] > [データを確認]
自分の SIM の IMSI が選択されているかを確認後、[自動更新]を ON にしてください。絶対圧(absolute_pressure)の値が表示されるようになります。
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 に送信します。
また、応用編では気圧の変化を高精度に検知する機能を利用し、“センサーの高さによってリパブリッシュを行い、ブザーを鳴らしてみる”という課題を設けています。是非そちらもやってみてください。
4-3-0. Wio LTE に絶対圧センサーを取り付ける
一度、全てのセンサーを取り外してください。
続いて、絶対圧センサーは Wio LTE の I2C に取り付けてください。
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 ファイルをインストールしてください。
Wio LTE と PC を接続して DFU モードにする
新しく開いたウィンドウの[マイコンボードに書き込む](→)をクリックする
新規作成したスケッチを書き込む際、保存するかどうかを聞かれるので[キャンセル]を選択してください。
書き込みが完了したら、 Wio LTE を通常モードにする(RST ボタンを押せば通常モードになります)
通常モードで起動次第、 SORACOM Beam を経由し、 AWS IoT Core へデータを送信し始めます(電源投入から送信開始までは 20 ~ 25 秒程度かかります)。
トピック名が異なるので、本編のステップ 4-1-3. で作成したルールは適用されません。
4-3-2. 各コンソール上でデータの取得を確認
データを取得できているか、まずはシリアルコンソール上で確認します。
Tera Term を使用したシリアルコンソールや Arduino IDE シリアルコンソールの操作方法がわからない場合は、本編ステップ 2-5. をご確認ください。
トラブルシュート: [マイコンボードに書き込む]でエラーになる場合
本編ステップ 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)を選び、[更新]
4-3-3. AWS IoT Coreでデータを確認
ステップ 3 で用意した Beam の設定とAWS IoT Core のThings
, Policy
の設定をそのまま使い回すことができます。
ただし、 Act で作成したルールはトピックが異なるので使い回せません。
AWS IoT Core に戻り、[Test] をクリックする
サブスクライブしてみる
すべてのトピックをサブスクライブするために、ワイルドカードの意味を持つ#
を入力します。入力した後、[Subscribe to topic]
をクリックします。
正しくデータが送られてきていると、赤枠内のようにデータが自動で表示される
下図のように表示されていれば成功です。センサーを持ち上げたり下ろしたりして、値が変化することを確認してください。
4-3-4. 応用課題: 気圧の変化(机からの高さ)によってブザーを鳴らしてみる
お疲れ様でした。ここまでできた方は、是非以下の応用課題にも取り組んでみてください!
課題の内容:
センサーの高度によって値が変化することを利用して、一定の高さを超えたらブザーを鳴らす仕組みを作ってみましょう。以下にヒントを示しますので、挑戦してみてください。
腕に自信のある方はヒントを見ずに先ほどのコードと本編を参考にしながら挑戦してみてください!
ヒント:
- WioLTEのソースコードを書き足しましょう
subscribe
のtopic
にメッセージが届いたらブザーが鳴るようにソースコードを書き足します。詳細はステップ 3-6-4. を参考にしてください -
AWS IoT Core のルールを追加しましょう
topic名
を書き換え、distance
をabsolute_pressure
に置き換えて作成しましょう(式の調整が必要です)
アクションはAWS IoT のトピックにメッセージを再パブリッシュする
を追加しましょう。
詳細はステップ 4-2. を参考にしてください。
上手くいかない場合:
-
WioLTE のピンの設定に問題ありませんか?
センサーを足す場合はピン設定の関数をソースコードに追記する必要があります。ステップ 3-6-4. のソースコードにコメントで解説してありますので、そちらをご参照ください -
MqttClient.setCallback 関数と MqttClient.subscribe 関数は追記されていますか?
subscribe
のトピックにメッセージが届いた時にどう挙動させるかは、ステップ 3-6-4. のソースコードを確認してください
課題が終わったら
Wio LTE と AWS を連携させ、 IoT サービスを開発するステップ 5 に進んでください。