PAL_AMB
環境センサーパル AMBIENT SENSE PAL を用い、センサー値の取得を行います。
このアクトには以下が含まれます。
無線パケットの送受信
インタラクティブモードによる設定 - <STG_STD>
ステートマシンによる状態遷移制御 - <SM_SIMPLE>
<PAL_AMB>ボードビヘイビアによるボード操作
アクトの機能
環境センサーパル AMPIENT SENSE PAL を用い、センサー値の取得を行います。
コイン電池で動作させるための、スリープ機能を利用します。
アクトの使い方
必要なTWELITE
アクトの解説
インクルード
環境センサーパル <PAL_AMB> のボードビヘイビアをインクルードします。
setup()
最初に変数などの初期化を行います。ここではステートマシンstepの初期化を行っています。
最初にボードサポート <PAL_AMB> を登録します。ボードサポートの初期化時にセンサーやDIOの初期化が行われます。最初に行うのは、ボードのDIP SWなどの状態を確認してから、ネットワークの設定などを行うといった処理が一般的だからです。
つづいて、インタラクティブモード関連の初期化と読出しを行います。
ここではsetオブジェクトの取得、アプリ名の反映、デフォルトのアプリケーションIDの反映、設定メニューで不要項目の削除を行います。
次にSETピンの状態を読み出します。このサンプルはスリープによる間欠動作を行うため、+++入力によるインタラクティブモード遷移は出来ません。替わりに起動時のSETピン=LO状態でインタラクティブモードに遷移します。このときSETTINGS::open_at_start()を指定していますが、これはsetup()を終了後速やかにインタラクティブモード画面に遷移する指定です。
最後に.reload()を実行して設定値をEEPROMから読み出します。設定値を各変数にコピーしています。
続いてLEDの設定を行います。ここでは 10ms おきに ON/OFF の点滅の設定をします(スリープを行い起床時間が短いアプリケーションでは、起床中は点灯するという設定とほぼ同じ意味合いになります)。
このアクトではもっぱら無線パケットを送信しますので、TWENET の設定では動作中に受信回路をオープンにする指定(TWENET::rx_when_idle())は含めません。
ボード上のセンサーはI2Cバスを用いますので、バスを利用開始しておきます。
ボード上のセンサーの取得を開始します。startSensorCapture()の解説を参照ください。
loop()
loop()は、SM_SIMPLEステートマシンstepを用いた制御を行っています。スリープ復帰からセンサー値取得、無線パケット送信、送信完了待ち、スリープといった一連の流れを簡潔に表現するためです。ループの戦闘ではbrdオブジェクトを取得しています。
case STATE::INTERACTIVE:
インタラクティブモード中にメインループが動作するのは都合が悪いため、この状態に固定します。
case STATE::INIT:
センサーのデータ取得を開始します。
case STATE::SENSOR:
ボード上のセンサーは .sns_LTR308ALS または .sns_SHTC3 という名前でアクセスでき、このオブジェクトに操作を行います。センサーの完了待ちを行います。まだセンサーの取得が終わっていない場合(.available()がfalse)はセンサーに対して時間経過のイベント(.process_ev(E_EVENT_TICK_TIMER))を送付します。
上記2つのセンサーがavailableになった時点で、センサー値を取得し、STATE_TXに遷移します。
照度センサーは.get_luminance() : uint32_tで得られます。
温湿度センサーは以下のように取得できます。
.get_temp_cent():int16_t: 1℃を100とした温度 (25.6 ℃なら 2560).get_temp():float: float値 (25.6 ℃なら 25.6).get_humid_dmil():int16_t: 1%を100とした湿度 (56.8%なら 5680).get_temp():float: float値 (56.8%なら 56.8)
case STATE::TX:
送信手続きについては他のアクトのサンプルと同様です。ここでは、再送1回、再送遅延を最小にする設定になっています。
パケットのペイロード部に識別子のFOURCHARSとセンサーデータを格納します。得られた値のうち温度値は int16_t ですが、送信パケットのデータ構造は符号なしで格納するため、uint16_tにキャストしています。
送信要求を行います。送信要求が成功したら送信完了街の準備を行います。完了イベントを待つために.clear_flag()、万が一のときのタイムアウトをset_timeout(100)を指定します。パラメータの100の単位はミリ秒[ms]です。
case STATE::TX_WAIT_COMP:
ここではタイムアウトの判定、送信完了イベントの判定を行います。
STATE::GO_SLEEP:
sleepNow()の処理を行います。
on_tx_comp()
送信完了時に呼び出されるシステムイベントです。ここでは.set_flag()により完了としています。
sleepNow()
スリープに入る手続きをまとめています。
スリープ前に.on_sleep(false)によりステートマシンの状態を初期化します。パラメータのfalseはスリープ復帰後STATE::INIT(=0)から始めます。
ここでは、起床までの時間を乱数により 1750ms から 2250ms の間に設定しています。これにより他の同じような周期で送信するデバイスのパケットとの連続的な衝突を避けます。
8,9行目、この例ではシリアルポートからの出力を待ってスリープに入ります。通常は消費エネルギーを最小化したいため、スリープ前のシリアルポートの出力は最小限(または無し)にします。
12行目、スリープに入るには the_twelite.sleep() を呼びます。この呼び出しの中で、ボード上のハードウェアのスリープ前の手続きなどが行われます。たとえばLEDは消灯します。
パラメータとしてスリープ時間をmsで指定しています。
TWELITE PAL では、必ず60秒以内に一度起床し、ウォッチドッグタイマーをリセットしなければなりません。スリープ時間は60000を超えないように指定してください。
wakeup()
スリープから復帰し起床すると wakeup() が呼び出されます。そのあとloop() が都度呼び出されます。wakeup()の前に、UARTなどの各ペリフェラルやボード上のデバイスのウェイクアップ処理が行われます。例えばLEDの点灯制御を再始動します。
応用編
消費エネルギーの削減
アクト PAL_AMB-UseNap は、センサーのデータ取得待ちをスリープで行い、より低消費エネルギーで動作できます。
最終更新