TWELITE で郵便受けセンサーを作る。

以前からこのデバイスには興味があった。だが、公開されているSDKの完成度が高すぎるというかほぼアプリケーションレベルであること、プログラミング方法を強制しすぎている、SDKのライセンスが気に入らない、スペックの割に価格が高い、などなど正直な所いじる楽しみがあまりないという印象しかなかったのだが、逆に言えばプログラミングなどしたくない人にとっては良いデバイスなのかもしれない。

MONOSTICK
TWELITE 2525A

現在、2525Aは後継品であるTWELITE CUE(ケース付き)に代わっており、MONOSTICKとセットになった【TWELITE CUE & MONOSTICKセット】などもあるようだ。

TWELITE CUE

ちなみに通信に限定すると...自己解決出来ない人達からはクソだと罵られるほど使い方にクセがありすぎて使いこなすのがかなり難しいのが難点ではあるが、そのクセを克服できる知識と技術があるならNordicのnRF24LXXシリーズのほうが安くて高速(Max2Mbps)だ。完璧に使いこなすのはウルトラ難しいのでお勧めはしませんが...

で、たまたま何もすることがなくなったときにMONOSTICKと2525Aを衝動買いしてしまい何もせずほったらかしにしておいたのだが、そのまま捨てておくにはもったいないのでいつかは作ろうと思っていた郵便受けセンサーを速攻で作ってみた。

郵便受けの蓋の裏側に両面テープで2525Aを貼り付け、その信号をMONOSTICKで受信するだけという超簡単な仕組みだ。

作ったのはPC側のプログラムだけだ。TWELITEは購入時のまま何もしなくて良い。なお、基本的に一対一で使うことを想定しているので、どの2525Aからの受信なのかは判断していないが、郵便受けって普通?は一家に一個しかないだろうからそれで十分だろう。

PC側のプログラムは、MingW64でコンパイルしたが、arduinoなどの組み込み系と違い、タイミングなど無関係なデータ処理のみのプログラミングというのは何かほっとする感じがあって純粋にプログラミングを楽しめる気がする。逆に言うと、いい加減に作ってもそれなりに動くものが作れるとも言えるのだが...

最初は専用の通知HWを作るつもりでいたが面倒臭くなってきたのとPCモニターの前にいることが多いのでPCモニター上で通知できればいいと考えた。でも、ポップアップで画面に表示する簡単なプログラムを作るのも面倒くさいので2525Aからの通知パケットを受信したら外部プログラムを単純に起動する仕様としてみた。

但し、2525Aからは短い間隔で複数回通知パケットが送信されるので一定期間の間その通知を無視するようにしている。

通知方法は、なんとなく便利そうに思えたのでwindowsのmsg.exeコマンドを使うことを想定してみたが、実行コマンドはオプションで指定する仕様なのでwindowsのスタートアップに登録しておけば郵便受けの蓋の開閉を知らせる仕組みが簡単に構築できる。(/・ω・)/

【スタートアップのショートカットの例】

※com?には、MONOSTICKの通信ポート名を指定。
※proのwindows/system32に入っているmsg.exeをコピーすればhomeでも使えるよ。って、自己責任でどうぞ。(-_-;)

【稼動時間】
2021-09-28
受信パケット数を出力するための変数${PKT}を追加。この変数の合計をとることで正確な受信パケット数を把握できるようになる。

2021-09-25
稼働時間を調べるために実際にデータ取りしてみた。新品の電池であれば6カ月程度は持ちそうな感じだ。

稼動日数 136 日
電圧降下 901 mV
送信回数 341 回 (※回数に含まれていない送信がある。実際にはこの8倍程度かも)

【修正履歴】
2021-02-27
monostickの通信パケットの各フィールドの内容をsystem()に渡せるように改良。これにより子機デバイスのデジタル入力信号やADCデータなどを外部プログラムで処理することが可能となる。-shellオプションに指定した文字列に下記変数指定が含まれていれば実際のデータ値に入れ替える。存在しない名前は空文字となる。

${LID} // 送信元の論理デバイスID (0x78 は子機からの通知)
${CMD} // コマンド(0x81: IO状態の通知)
${IDE} // パケット識別子 (アプリケーションIDより生成される)
${PVE} // プロトコルバージョン (0x01 固定)
${LQI} // LQI値、電波強度に応じた値で 0xFF が最大、0x00 が最小
${RID} // 送信元の個体識別番号
${RNM} // 宛先の論理デバイスID
${TMS} // タイムスタンプ (秒64カウント)
${CNT} // 中継フラグ(中継回数0~3)
${PWR} // 電源電圧[mV]
${RSV} // 未使用
${DI} // DI の状態ビット。DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1がOn(Lowレベル)。
${DIM} // DI の変更状態ビット。DI1(0x1) DI2(0x2) DI3(0x4) DI4(0x8)。1が変更対象。
${AD1} // AD1の変換値。0~2000[mV]
${AD2} // AD2の変換値。0~2000[mV]
${AD3} // AD3の変換値。0~2000[mV]
${AD4} // AD4の変換値。0~2000[mV]
${DBM} // LQIのdBm変換値
${PKT} // パケット数
${TIM} // PCの日時

2021-02-24
今回は問題にはならないが符号付データを追加したマクロ定義(NTOHL/NTOHS)に指定すると正しい結果が得られないため修正。符号付シフト演算子を使っているのが原因なのでAND後にシフトではなくシフト後にANDすべきだった。又は、符号なしシフト演算子を使うかデータを符号なしにキャストしてからシフトしても良いのだが、いつの日か安直にコピペしてしまい悩んでしまうことがないようにするための対策だ。

2021-02-23
コードコンパイルを簡単にするため、ソケットライブラリに含まれるntohl()/ntohs()を使うのをやめて代わりのマクロ定義を追加。この変更によりソケットライブラリをリンクする必要がなくなった。

【ソース・コード】

【windows binary】
monostick.zip