用意するもの
-
無線LANゲートウェイ TWELITE SPOT
- 電源用 USB-C ケーブル
- USB AC アダプタ(1A 以上供給できるもの)
-
加速度センサー無線タグ TWELITE CUE (お持ちでない場合はご購入ください 👉 販売店一覧)
- CR2032 コイン電池
-
USBアダプター TWELITE R3 (お持ちでない場合はご購入ください 👉 販売店一覧)
- 通信用 USB-C ケーブル
- 💻 コンピュータ
環境を構築する
1. 開発環境を導入する 🚛
ESP32 を使ったファームウェア開発の基礎 の環境構築を行っていない場合は、これを実施してください。
2. ボード設定を行う ⚙️
ボード種別を ESP32 Dev Module
としたうえで、下記のように設定してください。
3. ライブラリを導入する 🚚
ESP32 から TWELITE を使うために必要となる MWings ライブラリをインストールします。
スケッチ -> ライブラリをインクルード -> ライブラリを管理… を開いてください。
検索ボックスに MWings
と入力し、MWings をインストールしてください。
TWELITE SPOT を準備する
1. フタをはずす ⛏️
TWELITE SPOT のケース上面のフタをはずしてください。
2. ケーブルをつなぐ 🔌
ESP32用 7P インターフェイス(ESP32
と記載)に TWELITE R3 / R2 を接続したうえで、側面の USB-C コネクタ に 5V 電源を供給してください。
まずはスケッチを動かしてみる
1. サンプルを開く 📂
Arduino IDE を起動し、ファイル -> スケッチ例 -> MWings -> monitor_spot_app_cue を選択してください。
2. シリアルポートを選ぶ ⚙️
ツール -> シリアルポート メニューから、 接続したデバイス(TWELITE R シリーズ)のポートを選択してください。
3. ESP32 を起動する 👇
ESP32 をプログラムモードで起動します。
リセットスイッチ EN(RST)
と ESP32 ブートスイッチ BOOT
を押し、EN(RST)
-> BOOT
の順で離してください。
4. スケッチを書き込む ⚒️
Arduino IDE 上部の マイコンボードに書き込む ボタンをクリックしてください。
5. シリアルモニタを開く 🖥️
画面を開く
Arduino IDE 右上の シリアルモニタ ボタンをクリックしてください。
設定する
シリアルモニタのボーレートを 115200
に設定してください。
6. ESP32 を再起動する 🚀
書き込みが完了したら、TWELITE SPOT の ESP32 リセットスイッチ EN(RST)
を押して離し、ESP32 をリセットしてください。
ESP32 を再起動すると、TWELITE も再起動します。
- ESP32 が起動すると、基板の ESP32 側に実装された LED が点滅します。
- TWELITE が起動すると、基板の TWELITE 側に実装された LED が1秒間点灯します。
7. 起動を確認する 💬
シリアルモニタに以下の文字列が表示されたら、起動に成功しています。
Monitor example for TWELITE SPOT: App_CUE (CUE Mode)
TWELITE ARIA の場合は、下記のように表示されます。
Monitor example for TWELITE SPOT: App_ARIA (ARIA Mode)
8. TWELITE CUE を起動する ⚡
TWELITE CUE に CR2032 型コイン電池を挿入してください。ただちに動作を開始します。
0x67720102
、周波数チャネル 18
)。9. 受信を確認する 💬
シリアルモニタに以下のような文字列が表示されたら、TWELITE CUE からのデータ受信に成功しています。
Packet Number: #3
Source Logical ID: 0x1
LQI: 147
Supply Voltage: 3310 mV
Accel Event: Dice (1)
Accel X Axis [0]: 72 mG
Accel Y Axis [0]: -64 mG
Accel Z Axis [0]: 1000 mG
Magnet State: Leaving or Not found
スケッチの解説
サンプルスケッチ(monitor_spot_app_cue.ino
)の内容を簡単に解説します。
ライブラリのインクルード
4行目では、さきほど導入した MWings ライブラリをインクルードしています。
#include "MWings.h"
ピン番号の定義
6-8行目では、ピン番号を定義しています。
const int RST_PIN = 5;
const int PRG_PIN = 4;
const int LED_PIN = 18;
名称 | 内容 |
---|---|
RST_PIN | TWELITE の RST ピンが接続されているピンの番号 |
PRG_PIN | TWELITE の PRG ピンが接続されているピンの番号 |
LED_PIN | 基板上の ESP32 用 LED が接続されているピンの番号 |
RST_PIN
および PRG_PIN
の番号は変更しないでください。
これらを変更してしまうと、TWELITE を正しく起動することができません。
TWELITE 設定の定義
10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。
const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称 | 内容 |
---|---|
TWE_CHANNEL | TWELITE の 周波数チャネル |
TWE_APP_ID | TWELITE の アプリケーション ID |
シリアルポートの設定
19-21行目では、使用するシリアルポートを初期化するとともに、シリアルモニタへ起動メッセージを出力しています。
Serial.begin(115200);
Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
Serial2.begin(115200);
Serial
は、Arduino IDE の シリアルモニタとの通信に使います。シリアルモニタの設定に合わせて、ボーレートを 115200
bps としています。
一方、Serial2
は、TWELITE SPOT に搭載された TWELITE 親機との通信に使います。こちらも TWELITE 親機の初期設定に合わせて、ボーレートを 115200
bps としています。
TWELITE の設定
24-26行目では、Twelite.begin()
を呼び出し、TWELITE SPOT に搭載された TWELITE 親機の設定と起動を行っています。
Twelite.begin(Serial2,
LED_PIN, RST_PIN, PRG_PIN,
TWE_CHANNEL, TWE_APP_ID);
引数 | 型 | 内容 |
---|---|---|
Serial2 | HardwareSerial& | TWELITE との通信に使うシリアルポート |
LED_PIN | int | ステータス LED を接続したピンの番号 |
RST_PIN | int | TWELITE の RST ピンを接続したピンの番号 |
PRG_PIN | int | TWELITE の PRG ピンを接続したピンの番号 |
TWE_CHANNEL | uint8_t | TWELITE の 周波数チャネル |
TWE_APP_ID | uint32_t | TWELITE の アプリケーション ID |
パケット受信時のイベントの登録
29-49行目では、Twelite.on()
を呼び出し、TWELITE CUE から送られたデータに対して行う処理を登録しています。
ここでは、受信したパケットの内容をシリアルモニタに出力しています。
Twelite.on([](const ParsedAppCuePacket& packet) {
Serial.println("");
Serial.print("Packet Number: #");
Serial.println(packet.u16SequenceNumber, DEC);
Serial.print("Source Logical ID: 0x");
Serial.println(packet.u8SourceLogicalId, HEX);
Serial.print("LQI: ");
Serial.println(packet.u8Lqi, DEC);
Serial.print("Supply Voltage: ");
Serial.print(packet.u16SupplyVoltage, DEC); Serial.println(" mV");
Serial.print("Accel Event: ");
printAccelEvent(packet.u8AccelEvent);
Serial.print("Accel X Axis [0]: ");
Serial.print(packet.i16SamplesX[0], DEC); Serial.println(" mG");
Serial.print("Accel Y Axis [0]: ");
Serial.print(packet.i16SamplesY[0], DEC); Serial.println(" mG");
Serial.print("Accel Z Axis [0]: ");
Serial.print(packet.i16SamplesZ[0], DEC); Serial.println(" mG");
Serial.print("Magnet State: ");
printMagnetState(packet.u8MagnetState, packet.bMagnetStateChanged);
});
上記のイベントは、TWELITE CUEからのパケットを受信したときにだけ呼び出されます。
受信したパケットの内容は ParsedAppCuePacket
型の引数 packet
に格納されます。
packet
には、下記のデータが含まれています(太字 のデータを上記のコード中で使用しています)。
データ | 型 | 内容 |
---|---|---|
packet.u32SourceSerialId | uint32_t | 送信元のシリアルID |
packet.u8SourceLogicalId | uint8_t | 送信元の論理デバイスID |
packet.u16SequenceNumber | uint16_t | シーケンス番号 |
packet.u8Lqi | uint8_t | LQI(電波通信品質の指標) |
packet.u16SupplyVoltage | uint16_t | 電源電圧 (mV) |
packet.i16SamplesX | int16_t[10] | 各サンプルの X 軸加速度 (mG) |
packet.i16SamplesY | int16_t[10] | 各サンプルの Y 軸加速度 (mG) |
packet.i16SamplesZ | int16_t[10] | 各サンプルの Z 軸加速度 (mG) |
packet.u8SampleCount | uint8_t | サンプル数 |
packet.bHasAccelEvent | bool | 加速度イベントがあるならtrue |
packet.u8AccelEvent | uint8_t | 加速度イベントID |
packet.u8MagnetState | uint8_t | 磁気イベントID |
packet.bMagnetStateChanged | bool | 磁気センサの状態が変化したならtrue |
TWELITE ARIA の場合には、ParsedAppAriaPacket
型を利用します。
Twelite.on()
はデータの種別ごとに記述することができ、例えば下記のような記述を追加することで TWELITE ARIA からのデータを受信した際の処理を追加できます。
Twelite.on([](const ParsedAppAriaPacket& packet) {
// Handle packet...
});
詳しくは API リファレンス をご覧ください。
TWELITE のデータの更新
55行目では、Twelite.update()
を呼び出しています。
Twelite.update();
Twelite.update()
は、TWELITE 親機から送信されるパケットデータ(ModBus ASCII 形式)を順次1バイトずつ読み出す関数です。
loop()
内で繰り返し Twelite.update()
を呼ぶことで、TWELITE 親機から送信されるパケットデータの解釈が進みます。パケットデータの解釈を終えた際に 上記 のようなイベントが呼ばれる仕組みです。delay()
などの処理でこの関数の呼び出しをブロックすると、パケットデータ文字列の読み出しが間に合わないことがあります。時間のかかる処理は必ず非同期の実装として、loop()
関数をできるだけ高速回転させるようにしてください。ステップアップに向けて、下記のスケッチ解説や 関連情報 をご覧ください。