こんにちは、ENGかぴです。
TWELITEのスリープを使うことで低消費電流での動作ができます。スリープからのウェイクアップ方法はDIの変化を検出する方法やパルスカウンタによる方法があります。DIの変化を検出しながらパルスカウンタの値を確認する方法をまとめました。
ウェイクアップの要因を決定する
ウェイクアップする要因は以下の通りのパターンとなります。
- スリープタイマの時間経過
- パルスカウンタが規定値以上になる
- DIの状態変化のパルスを検出
今回はDIの状態変化でウェイクアップしてBME280の情報を親機に送信するアクトを作ります。パルスカウンタはマイコンを介さずにパルスの状態変化の回数をカウントすることができるためスリープでもパルスによる変化を検出できる機能です。
パルスカウンタの実装
パルスカウンタについての詳細はモノワイヤレスのHPに記載されているためポイントだけ説明します。
モノワイヤレス社のHP-MWX Library PulseCounter
例ではパルスカウンタの0を使用していますがパルスカウンタの1を使用する場合は0を1に置き換えてください。0や1を入れない場合は1を選択されます。
//パルスカウンタ1を使う場合PulseCounter1にする
void setup() {
PulseCounter0.setup();
PulseCounter0.begin(0,PIN_INT_MODE::FALLING,3);
}
setup()関数でパルスカウンタの初期化を行います。begin()関数でパルスカウンタの動作に関する設定を行います。
begin()の第1引数はパルスカウンタの値が規定値よりも大きい場合にウェイクアップ割り込みを発生させる回数です。0を指定するとウェイクアップ要因になりませんが、パルスのカウント数を獲得することができます。
第2引数はパルスのエッジを指定します。立ち上がりエッジの場合PIN_INT_MODE::RISINGを指定し、立下りエッジの場合PIN_INT_MODE::FALLINGを指定します。
第3引数はノイズ対策で連続サンプル数の一致を確認してエッジの検出を行います。指定できる設定は0~3であり2の乗数に対応したサンプル数の一致の検出となります。
パルスカウンタの設定をした後直ちにスリープさせたい場合はbegin()関数内でパルスカウンタの設定を行うと効率がよさそうです。
void begin() {
PulseCounter0.begin(0,PIN_INT_MODE::FALLING,3);
sleepNow();
}
PR:わからないを放置せず、あなたにあった最低限のスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
パルスカウンタが使用できるピン
TWELITE-DIPのデータシートを確認すると機能割り当て(※3)にPC1がDIO8に割り当てられておりPC0はDIO0に割り当てられています。詳細は下記リンクのデータシートを参照してください。
MW-PDS-TWELITEDIP-JP.pdf (mono-wireless.com)
TWELITE-DIPのシルク印刷の1に入力するとパルスカウンタ0が動作します。シルク印刷の8に入力するとパルスカウンタ1が動作します。
DIの状態変化(パルスエッジで検出)
void setup() {
pinMode(PIN_DI1,PIN_MODE::WAKE_FALLING_PULLUP);
}
pinMode()関数でピンの設定ができます。第1にDI/DOのピン番号を指定します。第2引数にピンの機能を選択します。INPUT/OUTPUTなどがありますがPIN_MODEの型で選択できる機能が定義されています。
WAKE_FALLING_PULLUPを選択するとINPUT機能となり立下りエッジでスリープ状態からウェイクアップするようになります。またプルアップが有効になるためDI情報がHIGHレベルになります。
PR:わからないを放置せず、あなたにあったスキルを身に着けるコツを教える テックジム 「書けるが先で、理解が後」を体験しよう!
パルスカウンタとDIの状態変化の検出の組み合わせ
void wakeup(){
uint16_t pulcnt;
pulcnt = PulseCounter0.read();
if (b_senser_started) { //napからwakeup
if( pulcnt == 0){
if( b_found_bme280 ){
eState = E_STATE::WORK_JOB;
}
else{
eState = E_STATE::INIT;
}
b_transmit = false;
}
else{
napNow();
}
}
else{ //sleepからwakeup
if(pulcnt >= 1){
b_senser_started = true;
sns_bme280.begin();
napNow();
}
else{
sleepNow();
}
}
}
ウェイクアップしwakeup()が呼び出される条件は以下の通りとなります。
- DIが立下りエッジを検出する
- スリープで設定した時限を経過する
- パルスカウンタで指定した回数以上になる
今回はパルスカウンタの規定値に0を指定するためウェイクアップの要因になりませんが0以上を指定している場合はウェイクアップの条件となります。
ウェイクアップしたときパルスカウンタの値を読み込むと1以上の値になっているとDIの変化によるウェイクアップであることが確認できます。
パルスカウンタの値の値が0であればスリープの時間が経過したことによるウェイクアップであるためBME280の計測を開始せずに再びスリープを開始します。
パルスカウンタの値が1以上であるとBME280の計測を開始しショートスリーブ(ナップ)します。
動作確認
TWELITE-DIPを含むモジュールを子機、MONOSTICKを親機とします。

BME280モジュールはプルアップ抵抗が実装されているためプルアップ抵抗は必要ありません。 TWELITEはSW1が押されるまでスリープで待機します。SW1が押されるとBME280の計測を行いMONOSTICKに温湿度・気圧のデータを送信してスリープします。
SW1を接続しているDIはパルスカウンタ0を兼ねているピンでありマイコン内蔵のプルアップを使用して立下りエッジを検出して動作するようにします。

スリープの時間を10秒にしているため10秒経過するとsleeping 10000msが表示されます。SW1を押すとウェイクアップしてBME280の計測を行い温湿度・気圧データを表示しています。表示した後はMONOSTICKに対して無線通信を行っています。

MONOSTICK(親機)に無線通信で受信したBME280の情報が表示されていることが確認できました。子機と親機の情報が一致していることが分かります。
チャタリング防止についてはパルスカウンタの判定を厳しくするなどで調整することで解決できそうです。子機側は低消費電流のリモコンを作ることができますが、親機は無線情報を受信する必要があるためスリープすることができないため低消費電流での動作はできません。
ソースコード全体
ソースコードは記事作成時点において動作確認できていますが、使用しているライブラリの更新により動作が保証できなくなる可能性があります。また、ソースコードを使用したことによって生じた不利益などの一切の責任を負いかねます。参考資料としてお使いください。
リンクからZIPファイル形式のファイルをダウンロードし、任意の場所に展開していただくとテキストファイルが生成されます。
TWELITEのソースコードはMWSTAGEの環境でアクトのソースファイルにコピーすると使用できます。
関連リンク
トワイライトを太陽光パネルで動作させたことやMWSTAGEの環境でソフト開発して無線通信したことなどについてまとめています。
トワイライト(TWELITE)のソフト開発と無線通信でできること
最後まで、読んでいただきありがとうございました。