セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2024-11-14 現在

キューアプリのデータを取得

v1.0.1
    キューアプリ (App_CUE) のデータを取得・表示するサンプルスケッチ monitor_spot_app_cue の解説です。

    サンプルスケッチの保存場所

    MWings ライブラリを導入していれば、Arduino IDE の ファイル -> スケッチ例 -> MWings -> monitor_spot_app_cue からスケッチを開くことができます。

    保存場所

    保存場所

    スケッチ

    以下はソースコード本体です。

    // Monitor example for TWELITE SPOT: Receive data from App_CUE (CUE Mode)
    
    #include <Arduino.h>
    #include "MWings.h"
    
    const int RST_PIN = 5;
    const int PRG_PIN = 4;
    const int LED_PIN = 18;
    
    const uint8_t TWE_CHANNEL = 18;
    const uint32_t TWE_APP_ID = 0x67720102;
    
    void printAccelEvent(const uint8_t event);
    void printMagnetState(const uint8_t state, const bool changed);
    
    void setup()
    {
        // Initialize serial ports
        Serial.begin(115200);
        Serial.println("Monitor example for TWELITE SPOT: App_CUE (CUE Mode)");
        Serial2.begin(115200);
    
        // Initialize TWELITE
        Twelite.begin(Serial2,
                      LED_PIN, RST_PIN, PRG_PIN,
                      TWE_CHANNEL, TWE_APP_ID);
    
        // Attach an event handler to process packets from App_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);
        });
    }
    
    void loop()
    {
        // Update TWELITE
        Twelite.update();
    }
    
    void printAccelEvent(const uint8_t event)
    {
        switch (event) {
        case 0x01: { Serial.print("Dice (1)"); break; }
        case 0x02: { Serial.print("Dice (2)"); break; }
        case 0x03: { Serial.print("Dice (3)"); break; }
        case 0x04: { Serial.print("Dice (4)"); break; }
        case 0x05: { Serial.print("Dice (5)"); break; }
        case 0x06: { Serial.print("Dice (6)"); break; }
        case 0x08: { Serial.print("Shake"); break; }
        case 0x10: { Serial.print("Move"); break; }
        default: break;
        }
        Serial.println("");
    }
    
    void printMagnetState(const uint8_t state, const bool changed)
    {
        if (changed) {
            switch (state) {
            case 0x0: { Serial.print("Leaving or Not found"); break; }
            case 0x1: { Serial.print("N-pole is getting closer"); break; }
            case 0x2: { Serial.print("S-pole is getting closer"); break; }
            default: break;
            }
        } else {
            switch (state) {
            case 0x0: { Serial.print("Not found"); break; }
            case 0x1: { Serial.print("N-pole is close"); break; }
            case 0x2: { Serial.print("S-pole is close"); break; }
            default: break;
            }
            Serial.print(" (Periodic packet)");
        }
        Serial.println("");
    }

    ライブラリのインクルード

    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);

    パケット受信時のイベントの登録

    29-49行目では、Twelite.on() を呼び出し、送られたデータに対して行う処理を登録しています。

    ここでは、受信したパケットの内容をシリアルモニタに出力しています。

        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 Numberパケットの続き番号
    Source Logical ID送信元 TWELITE の論理デバイスID
    LQI無線通信品質(0~255)
    Supply Voltage電源電圧 (mV)
    Accel Event加速度センサーの状態
    Accel X AxisX 軸加速度(1サンプル目)
    Accel Y AxisY 軸加速度(1サンプル目)
    Accel Z AxisZ 軸加速度(1サンプル目)
    Magnet State磁気センサーの状態
    加速度センサーの状態

    出力される加速度センサーの状態は以下の通りです。

    • Dice (1) - Dice (6) サイコロの目(姿勢)を検知した。
    • Shake 揺さぶるような動きを検知した。
    • Move ゆっくりとした動きを検知した。
    磁気センサーの状態

    出力される磁気センサーの状態は以下の通りです。

    • S-pole is getting closer 新たに磁石のS極を検知した。
    • N-pole is getting closer 新たに磁石のN極を検知した。
    • Leaving or Not found 磁石が検知できなかった。
    • S-pole is close (Periodic packet) 磁石のS極を検知している。
    • N-pole is close (Periodic packet) 磁石のN極を検知している。
    • Not found (Periodic packet) 磁石を連続で検知できていない(定期送信パケット)。

    TWELITE のデータの更新

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

        Twelite.update();