この記事について
SPRESENSE + LTEボード を Arduino Library を使用して実装するときに、eDRX の設定を行う方法をまとめてみます。
eDRX とは?
簡単に言うと、LTE-M / NB-IoT での省電力の手法です。
詳細はドコモの この辺の資料 を参照してみてください。
SPRESENSE + Arduino Library での eDRX 設定方法
SPRESENSEの Arduino Libraryのリファレンス を見てみても、eDRX の設定を行うための関数などは用意されていません(2020/04現在・ver.1.5.1)。
しかし、より低層のライブラリである Spresense SDK の関数を使用することにより、eDRXの設定が可能となるようです。
実装内容
ざっと説明していきます。
include
SPRESENSE SDK の LTEライブラリである lte/lte_api.h
を include しておきます。
#include <LTE.h> // SPRESENSE Arduino Lib LTEライブラリ
#include <lte/lte_api.h> // SPRESENSE SDK LTEライブラリ ←これを include しておく
setup()
eDRXの設定は、モデムの初期化後から回線を接続するまでの間に設定する必要があります。つまり LTE.begin()
と LTE.attach()
の間です。
eDRX の設定は、lte_edrx_setting
構造体の各メンバに設定値を代入し、lte_set_edrx_sync()
関数にそれを渡します。 lte_edrx_setting
構造体で設定する値は こちらのページ をご参照ください。
// APN data
#define LTE_APN "your.apn.info.here"
#define LTE_USER_NAME "username"
#define LTE_PASSWORD "password"
// initialize the library instance
LTE lteAccess;
void setup() {
while (true) {
if (lteAccess.begin() == LTE_SEARCHING) {
setup_edrx(); // この部分でeDRXの設定を行う。この関数の内容はこの後に記載。
if (lteAccess.attach(LTE_APN, LTE_USER_NAME, LTE_PASSWORD) == LTE_READY) {
Serial.println("attach succeeded.");
break;
}
Serial.println("An error occurred, shutdown and try again.");
lteAccess.shutdown();
sleep(1);
}
}
}
int setup_edrx() {
//eDRXの設定を記述する
//設定値は https://developer.sony.com/develop/spresense/developer-tools/api-reference/api-references-spresense-sdk/structlte__edrx__setting.html を参照。
lte_edrx_setting edrx;
edrx.enable = LTE_ENABLE; // eDRXを有効にする
edrx.act_type = LTE_EDRX_ACTTYPE_WBS1; // LTE-Mを使用する場合は LTE_EDRX_ACTTYPE_WBS1 を設定しておく
edrx.edrx_cycle = LTE_EDRX_CYC_16384; // eDRXサイクルを 163.84sec に設定する
edrx.ptw_val = LTE_EDRX_PTW_512; // PTWを 5.12sec に設定する
int ret = lte_set_edrx_sync(&edrx); // eDRX を設定する
Serial.print("lte_set_edrx_sync result="); Serial.println(ret);
return ret;
}
PSMについて
同様に、lte_set_psm_sync()
関数や lte_psm_setting
構造体が用意されていますので、こちらでPSMの設定をすることも可能のようです(試していない)。
詳細は このへん や このへん をご参照ください。