/

TWELITE 子機からのデータ受信

TWELITE CUE から受信した加速度データをシリアルモニタに出力してみる
TWELITE SPOT は、ESP32 に TWELITE を組み合わせることで、多数の小型で省電力な無線タグを利用できるようにしています。

用意するもの

環境を構築する

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 電源を供給してください。

接続例 (ESP32)

接続例 (ESP32)

まずはスケッチを動かしてみる

1. サンプルを開く 📂

Arduino IDE を起動し、ファイル -> スケッチ例 -> MWings -> monitor_spot_app_cue を選択してください。

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 をリセットしてください。

リセットスイッチの位置

リセットスイッチの位置

7. 起動を確認する 💬

シリアルモニタに以下の文字列が表示されたら、起動に成功しています。

Monitor example for TWELITE SPOT: App_CUE (CUE Mode)
起動に成功した様子

起動に成功した様子

8. TWELITE CUE を起動する ⚡

TWELITE CUE に CR2032 型コイン電池を挿入してください。ただちに動作を開始します。

コイン電池の挿入

コイン電池の挿入

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_PINTWELITE の RST ピンが接続されているピンの番号
PRG_PINTWELITE の PRG ピンが接続されているピンの番号
LED_PIN基板上の ESP32 用 LED が接続されているピンの番号

TWELITE 設定の定義

10-11行目では、TWELITE SPOT に搭載された TWELITE 親機に適用する設定を定義しています。

const uint8_t TWE_CHANNEL = 18;
const uint32_t TWE_APP_ID = 0x67720102;
名称内容
TWE_CHANNELTWELITE の 周波数チャネル
TWE_APP_IDTWELITE の アプリケーション 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);
引数内容
Serial2HardwareSerial&TWELITE との通信に使うシリアルポート
LED_PINintステータス LED を接続したピンの番号
RST_PINintTWELITE の RST ピンを接続したピンの番号
PRG_PINintTWELITE の PRG ピンを接続したピンの番号
TWE_CHANNELuint8_tTWELITE の 周波数チャネル
TWE_APP_IDuint32_tTWELITE の アプリケーション 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.u32SourceSerialIduint32_t送信元のシリアルID
packet.u8SourceLogicalIduint8_t送信元の論理デバイスID
packet.u16SequenceNumberuint16_tシーケンス番号
packet.u8Lqiuint8_tLQI(電波通信品質の指標)
packet.u16SupplyVoltageuint16_t電源電圧 (mV)
packet.i16SamplesXint16_t[10]各サンプルの X 軸加速度 (mG)
packet.i16SamplesYint16_t[10]各サンプルの Y 軸加速度 (mG)
packet.i16SamplesZint16_t[10]各サンプルの Z 軸加速度 (mG)
packet.u8SampleCountuint8_tサンプル数
packet.bHasAccelEventbool加速度イベントがあるならtrue
packet.u8AccelEventuint8_t加速度イベントID
packet.u8MagnetStateuint8_t磁気イベントID
packet.bMagnetStateChangedbool磁気センサの状態が変化したならtrue

TWELITE のデータの更新

55行目では、Twelite.update() を呼び出しています。

    Twelite.update();

Twelite.update() は、TWELITE 親機から送信されるパケットデータ(ModBus ASCII 形式)を順次1バイトずつ読み出す関数です。