TWELITE(トワイライト)のインタラクティブモードを実装する

組み込みエンジニア

こんにちは、ENGかぴです。

TWELITEのインタラクティブモードはZigBee通信の特徴である複数グループで通信する場合などに必要な周波数チャンネル、アプリケーションID、再送回数などの重要なパラメータを簡単に設定できるのが特徴です。MWSTAGEでインタラクティブモードを実装する方法をまとめました。

インタラクティブモードを実装する

MWSTAGEではインタラクティブモードを実装のためのライブラリとして設定 (STG) – インタラクティブモードが準備されています。下記リンクに詳細の説明があります。

モノワイヤレス社ー設定 (STG) – インタラクティブモード

モノワイヤレス社のHPで使用方法について説明されていますが動作確認した一部の機能を紹介します。

実装方法

#include <TWELITE>
#include <STG_STD>

STG_STDライブラリを使用するためインクルードします。

void setup() {

    auto&& set = the_twelite.settings.use<STG_STD>()
    set << SETTINGS::appname("MY_APP"); //アプリ名
    set << SETTINGS::appid_default(0x1234cdef); //デフォルトID
}

the_twelite.settings.use<STG_STD>でライブラリ内容を変数に格納します。インタラクティブモードで設定値を表示する前にアプリ名とデフォルトIDを設定することができます。

アプリ名とデフォルトIDのみインタラクティブモードを呼び出す前に設定できます。インタラクティブモードでデフォルト値に初期化した際に最初に設定した値がデフォルト値として使用されます。

インタラクティブモードの起動

pinMode(PIN_DIGITAL::DIO12, PIN_MODE::INPUT_PULLUP);
 //DIO12を使用

if (digitalRead(PIN_DIGITAL::DIO12) == LOW) {
    set << SETTINGS::open_at_start(); //インタラクティブモード起動
    appmode = APP_MODE::INTERACTIVE; //loop()で動作しないようにするため            
}

set.reload(); //データの読み込み

インタラクティブモードを起動する条件はシステム構成によって任意ですが、今回は電源ONして初期化時にDIO12のピンの状態を確認しLOWであればインタラクティブモードを起動させます。

DIO12ピンをプルアップ付きのDIピン設定を行うため何も接続しない場合はHIGHになります。インタラクティブモードで起動する場合は電源を投入する前にDIO12ピンをGNDにする必要があります。

void loop() {

    switch (appmode){
    case APP_MODE::INTERACTIVE:
        //インタラクティブモード(何も処理しない)
        break;
    case APP_MODE::NORMAL:

        //通常時の動作
        break;
    default:
        break;
    }
}

インタラクティブモード中もsetup()関数から抜けloop()に遷移するため通常の処理が動作します。通常の処理によってインタラクティブモードによる変数の変更に支障が出る場合があるため注意が必要です。

インタラクティブモードを起動してもソースコードが進むためloop()に遷移します。遷移した場合に他の動作が処理されないようにモードで切り分ける等工夫が必要です。

例ではインタラクティブモードを起動するときにインタラクティブモードに遷移していることを通知するモードをセットしloop()内で何も処理しないようにしています。

動作確認

インタラクティブモードの動作確認用の回路図
インタラクティブモードの動作確認用の回路図

MWSTAGEのアクトにSTG_STDライブラリを追加して各種設定を行います。インタラクティブモードで動作させるためDIO12(15ピン)をGNDに接続して電源をONします。

GNDに接続していない場合はインタラクティブモードに遷移せずタイムスタンプを表示します。Tera Termで動作確認しましたがインタラクティブモードに遷移させない場合にタイムスタンプが表示されることを確認しています。

基本操作

インタラクティブモード動作確認1
インタラクティブモード動作確認1

インタラクティブモードに遷移すると設定できる項目が表示されます。左側に表示されているの項目のa,i,c等の文字を入力することで各項目の設定ができます。アプリケーションIDを変更するためにはaを入力してリターンキーを押します。

インタラクティブモード動作確認2
インタラクティブモード動作確認2

aを押してアプリケーションIDの設定画面に遷移すると変更したいIDを入力してリターンキーを押すと一時保存できます。同様にしてDevice IDやChannelなどを変更することができます。

一時保存したデータはコンフィグレーション画面(最初の画面)でS(大文字)を入力するとEEPROM書き込まれるため電源をOFFしても設定した内容が保存できます。

インタラクティブモードのその他の機能
インタラクティブモードのその他の機能

コンフィグレーション画面で[M]:Extr Menuがあります。M(大文字)を入力するとその他の機能が使用できます。EEPROMのデータを確認したりハードウェアピンのDI情報やI2C接続されているI2Cモジュールのアドレス確認等ができます。

EEPROMのデータの操作

インタラクティブモードのEEPROM操作画面(セクターリード)
インタラクティブモードのEEPROM操作画面(セクターリード)

Extr Menuで1を入力しリターンキーを押すとEEPROM UTILモード遷移します。ここではEEPROMのデータのリードとイレースを操作できます。rでセクターごとにEEPROMのデータが確認できます。

例ではsector1をリードしています。アプリケーションIDがアドレス0x040の後方にから0x050の前方に11223344が表示されています。

Rで全セクターをリードすることができます。

インタラクティブモードのEEPROM操作画面(全セクターリード)
インタラクティブモードのEEPROM操作画面(全セクターリード)

0x0300及び0x0380にデータが書き込まれているのが分かります。このデータは下記記事で操作したEEPROMのデータです。

トワイライト(TWELITE)のEEPROMを使い方

EEPROMのデータがセクター毎もしくは全セクターについてインタラクティブモードで簡単に読み込んで表示できるため便利だと感じています。

I2Cのアドレスの確認

インタラクティブモード(H/W UTIL)

Extr Menuで2を入力しリターンキーを押すとH/W UTILモード遷移します。DI statusは現在のDIのHまたはLを示すものですがインタラクティブモード中に確認しても特に処理することがないため使用する頻度は少ないと思います。

probe i2c busは接続したi2c通信ができるセンサーのアドレスを確認することができます。

インタラクティブモード(I2Cのアドレスを確認)
インタラクティブモード(I2Cのアドレスを確認)

ハードの接続でSCL及びSDAの配線を間違えていない限り接続されているモジュールのI2Cアドレスを確認することができます。BME280を配線しているので0x76が確認できています。

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。チェックはしておりますがコメントなど細かな部分で間違っている可能性があります。参考としてお使いいただければと思います。

#include <TWELITE>
#include<STG_STD>

// very simple state machine
enum  APP_MODE{
    INTERACTIVE = 0,
    NORMAL
};
APP_MODE appmode = APP_MODE::NORMAL;

uint32_t APP_ID;
uint8_t CHANNEL;
uint8_t LID;
int16 cnt;
uint32_t tmcnt;

/*** the setup procedure (called on boot) */
void setup() {
    uint16_t adrs;
    uint8_t data;

    Serial.begin();

    auto&& set = the_twelite.settings.use<STG_STD>();
    set << SETTINGS::appname("MY_APP"); //アプリ名
    set << SETTINGS::appid_default(0x1234cdef); //デフォルトID
 
	// read SET pin (DIO12)
	pinMode(PIN_DIGITAL::DIO12, PIN_MODE::INPUT_PULLUP);
	if (digitalRead(PIN_DIGITAL::DIO12) == LOW) {
		set << SETTINGS::open_at_start(); //インタラクティブモード起動
		appmode = APP_MODE::INTERACTIVE; //loop()で動作しないようにするため                                  
	}

    set.reload();

    APP_ID = set.u32appid();
    CHANNEL = set.u8ch();
    LID = set.u8devid();

    Serial <<" id: " << int(APP_ID) << "ch: " << int(CHANNEL) << "LID: " << int(LID) << crlf << flush;

}

/*** the loop procedure (called every event) */
void loop() {

    switch (appmode){
    case APP_MODE::INTERACTIVE:
        //インタラクティブモード
        break;
    case APP_MODE::NORMAL:
        if( TickTimer.available()){
            if( ++cnt >= 1000 ){
                cnt -= 1000;
                tmcnt+=1;
                Serial << "ts:" << int(tmcnt)<< crlf << flush;
            }
        }
        break;
    default:
        break;
    }
}

関連リンク

トワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。

トワイライト(TWELITE)のソフト開発と無線通信でできること

あなたの市場価値を見いだす転職サイト【ミイダス】無料会員登録

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました