2015年04月21日

「TWE-LITE」ファームウェアプログラミングの試み

はてなブックマークに登録

2017-01-13 追記:
TWE-LITE(旧表記「TWE-Lite」)のメーカーが変わり同社からのリクエストに基づいて関連箇所の改訂を行いました。結果として、2015年4月に公開した元の記事に2017年1月現在の新しい情報やキーワードが部分的に反映された内容となっています。念のため要所に注釈を加えており混乱につながる要素は特に含まれていないと判断していますが、記事参照の際にはご注意下さい。

モノワイヤレス株式会社様の ZigBee 無線マイコンモジュール「TWE-LITE DIP」はコストパフォーマンスが高く人気のある製品です。手軽にノード間の無線通信を実現できるため IoT を構成する要素としても所定の圏内に閉じた機器間ネットワークのための道具立てとしても有用でしょう。
標準のものに加え複数の典型的な用途に即したファームウェア群とそのソースコードが開発環境とともに無償で公開されていることも興味深く、製品はホスト PC から専用の USB アダプタ (TWE-LITE R) または市販の USB シリアル変換モジュール/ケーブル経由で自由にファームを書き換えられるようにデザインされています。

このように単なる通信モジュールではなくプログラマブルなマイコンとしての側面を持ち合わせながら価格が低廉であることが TWE-LITE DIP の大きな魅力です。また、「超簡単!」の惹句の通り出荷時の標準ファームでは扱いやすさが特に重視されており、そういった間口の広さと奥の深さがこの製品の特長と言ってよいでしょう。

試みのきっかけ

TWE-LITE ユーザはメーカーの提示するソフトウェア使用許諾契約書に基づいて TWE-NET SDK を利用することができます。また、規約の認める範囲で公式ファームのソースコードを改変したりその内容を公開することも可能です。

ネットを参照すると現時点では実際に公式ファームに手を加えて TWE-LITE DIP を使っている利用者は製品の人気に比べまだあまり多くないように見受けられます(注:2015年04月時点の記述)。その背景には、まず公式のファームウェア群が充実しているため改変の不要なケースの多いことが想像されますが、それに加えて、精密に記述されている各ファームのボリュームのあるソースコードはその内容を適切に理解しなければ手を触れにくいという事情もあるように思われます。メーカーが公開しているこれらのファームは基本的に実用を目的とするものであって教育用ではありませんから、利用する側はコードの世界をじっくり楽しみながらノウハウを覚えるスタンスに立つことが好ましいでしょう。

ただ、ここしばらく TWE-LITE に触れた印象では、そこに「ちょっとした足がかり」があれば公式ファームのコードをより見渡しやすくなり、そのことがこの優れた製品を手元で活用する機会を拡げることにもつながるように感じました。思い浮かべたのは "Hello, world!" のようにもっとも単純で簡潔な内容からはじまり徐々に処理が肉付けされていくイメージの小さなサンプルファームコード群です。でも残念ながら今のところそういうものは見当たりません(注:2015年04月時点の記述)。そこで、実験と勉強をかねて現時点での自分の到達点なりにそういうコードを書いてみることにしました。一連の過程での疑問点・不明点の解決には言うまでもなく公式ファームのソースと上記の SDK マニュアルが非常に参考になりました。この試みは今後も継続するかもしれませんが、まずはここまでのソースコードと動作の様子を公開します。興味のある方は覗いてみて下さい。

※本記事に掲載のソースコードには公式ファームウェアのソースからの
 引用が含まれます。取り扱いに際しては著作権表記を確認の上、前掲の
 「モノワイヤレスソフトウェア使用許諾契約書」の内容を遵守して下さい。
  なお、本記事での各ソースコードの掲載ならびにメーカー公式サイト上の
  個々のページへの直接のリンク・公式文書からの情報の抜粋については
  いずれも事前にモノワイヤレス様より承諾を得ています。

※本記事の本文および本記事に掲載のソースコードには誤りが含まれて
 いる可能性があります。そのことがいかなる損害に繋がったとしても
 筆者および KLab は一切の責任を負いません。あらかじめご了承下さい。

技術情報について

TWE-LITE 用プログラミングに必要な情報は多岐に渡り、メーカー公式サイトの情報前掲の TWE-NET SDK マニュアル、また、NXP 社製 JN5164 用のペリフェラル (TWE-LITE の I/O ポートまわり) API のマニュアル等が主な情報源となります。後続のソースコードを参照する上で最小限必要なもっとも基本的な資料三点を以下に抜粋します。
※図はクリックで大きく表示されます

TWE-LITE DIP のピン配置   (メーカー公式サイトの「超簡単!TWE標準アプリ」ページより)

TWE-LITE ファームウェアコードの動作フロー   (前掲の SDK マニュアルより)

Test01: LED を点滅させる

まずはマイコン・電子工作の世界での「Hello, world!」にあたる LED の点滅、いわゆる「L チカ」を行います。ネットワーク通信は行いません。

動作の様子

装置の写真と構成図(クリックで大きく表示)

ソースコード  GitHub

ユーザ定義のイベントハンドラ内で 1秒周期の E_EVENT_TICK_SECOND 通知に呼応し出力ポートの Lo, Hi をトグルする

Test02: スイッチ操作に LED の状態を連動させる

上の Test01 は全自動かつエンドレスですが、今度は人間の操作に反応させてみます。タクトスイッチの ON/OFF に LED の点灯/消灯 が連動します。ネットワーク通信は行いません。

動作の様子

装置の写真と構成図(クリックで大きく表示)

ソースコード  GitHub

既定のイベントハンドラ cbToCoNet_vMain() 内でタクトスイッチの状態に応じて LED の状態を変化させる

Test03: シリアル経由でデバッグメッセージを出力

プログラミングにはデバッグのための手段が不可欠です。Test02 のコードに、シリアル接続経由で PC 上のターミナルアプリへトレース文を出力する処理を加えてみます。PC との接続には専用の USB アダプタ 「TWE-LITE R」を使用しています。 (市販の USB シリアル変換モジュール/ケーブルも利用できます ネットワーク通信は行いません。

動作の様子

装置の写真と構成図(クリックで大きく表示)

ソースコード  GitHub

起動時に UART とデバッグ出力用の初期化を行い vfPrintf() 関数を使ってシリアルへトレース文を出力

Test04: スイッチ押下でメッセージを送信 〜 受信側は LED で反応

無線送受信を行います。Test02 の装置と同じものをもうひとつ用意します。タクトスイッチが押下されるとメッセージをブロードキャストし、受信した側は LED を一定時間点灯させます。

動作の様子

装置の写真と構成図(クリックで大きく表示)

ソースコード  GitHub

スイッチ押下時に ToCoNet_bMacTxReq() によりブロードキャストを実行。既定のイベントハンドラ cbToCoNet_vTxEvent() および cbToCoNet_vRxEvent() 内で送受信通知への対応を行う

Test05: 電力消費を抑制した送信専用コードと装置

上記 Test04 での送信処理を独立させ、消費電力を抑えることを目的にメーカー公式の「無線タグアプリ(App_Tag)」(注:2015年04月時点での名称は「Samp_Monitor」)押しボタン・磁気スイッチ対応機能における子機処理(EndDevice_Input)での以下の要所を取り入れた内容です。

  • TWE-LITE のモード設定ビット 1 (M1) が GND に接続されていれば(すなわち M1 が Lo であれば)、デジタル入力 1 (DI1) の立ち上がり (Lo -> Hi) を送信のトリガーとする
    (典型的には平時が導通状態の磁気リードスイッチが磁界から離れ切断された状況)
    • 立ち上がりトリガーの場合 節電のため DI1 の内部プルアップを無効化する。そのためこの場合は外部プルアップ抵抗を設置する。(公式サイト上の記事を参考に 1MΩ 抵抗を使用)
  • M1 が GND に接続されていなければ DI1 の立ち下がり (Hi -> Lo) をトリガーとする
    (典型的には平時が非導通状態のタクトスイッチが押下された状況)

  • 送信を終えたらすみやかに Sleep 状態へ移行し DI1 の状態が変化すると Sleep から復帰する

受信側は Test04 のものをそのまま使います。以下の動画・写真では送信側の装置は磁気リードスイッチを使っており立ち上がり検出を行っています。 ちなみにこの装置の待機(Sleep)状態の消費電流を測ったところ 3μA(0.003mA)でした。一般に CR2032 の放電容量はおよそ 225mAh であることから、下記のサイトを利用して単純計算すると待機継続可能期間は 225mAh / 0.003mA * 0.7 = 52500時間 = 2187.5日 ≒ 5.99年となります。実際の電池寿命は送信頻度によって大きく変わるでしょう。

電池寿命カリキュレータ - www.digikey.jp

動作の様子

装置の写真と構成図(クリックで大きく表示)

ソースコード  GitHub

電源投入直後やリセット後はまずそのまま Sleep 状態へ移行。DI1 の状態が変化すると起床して送信を行いふたたび Sleep へ。DI1 の立ち上がり/立ち下がりのどちらで送信を行うかは M1 の Lo / Hi 状態で決定する

付録:「無線タグアプリ」カスタマイズの記録

2015年4月、手元の実験的要件への対応のために前掲の公式アプリ「無線タグアプリ(App_Tag)」(当時の名称は「Samp_Monitor」)の親機(Parent/)および子機(EndDevice_Input/)コードのカスタマイズを試みました。以下はその記録です。

変更を加えたソース・ヘッダ

※ベースのバージョンは 2015年4月20日当時の最新版「Samp_Monitor v1.4.1 β」です(2017年1月現在は既に公開終了)
※変更箇所は識別子「MODIFIED_BY_KLAB」で区別しています

変更内容

EndDevice_Input:

  • センサモードが PKT_ID_BUTTON(押しボタン・磁気スイッチ) の場合、一度の送信完了でただちにスリープ状態へ移行せず所定の回数繰り返し送信を行ってから移行する (diff)

Parent:

  • 電子ブザーの接続を想定し DO4 の使用を追加。センサモードが PKT_ID_BUTTON の子機からパケットを受信した場合、DO1 の LED トグルに合わせ DO4 の状態もトグルする
  • PKT_ID_BUTTON の子機からの受信発生後は親機がリセットされるまで DO1 の LED を点滅させる(受信有無を事後に目で確認するための便宜) (diff)

以下の動画・写真では子機側の装置は磁気リードスイッチを使用し立ち上がり検出を行っています。したがってこの子機のパラメータ設定において「m:センサ種別の設定」には 0xFE、「p:センサ固有パラメータの設定」には 1 を指定しています。

動作の様子

装置の写真と構成図 上:親機 下:子機 (クリックで大きく表示)

(備考)

2017年1月13日時点での最新版 SDK 「2014/8月号」に収録されている旧 Samp_Monitor v1.3.2 の子機側ソースコードには本来の意図とは異なるものと考えられるロジックが含まれています。

  1. 子機のパラメータ設定内容をセーブ領域から読み出すタイミング
    (/TWESDK/Wks_ToCoNet/Samp_Monitor/EndDevice_Input/Source/EndDevice_Input.c)
    ※ 旧 Samp_Monitor v1.4.1β で改修されました
  2. 子機のセンサモードが PKT_ID_BUTTON (0xFE) の場合の固有パラメータ 立ち上がり (1) / 立ち下がり (0) 指定に対する処理
    (/TWESDK/Wks_ToCoNet/Samp_Monitor/EndDevice_Input/Source/ProcessEv_Button.c)
    ※ 旧 Samp_Monitor v1.3.3 で改修されました

そのため、今の時点で「無線タグアプリ」を使う場合は単体で配布されている版を利用するほうが良いでしょう。


(tanabe)
klab_gijutsu2 at 16:37│Comments(18)IoT | M2M

この記事へのトラックバック

1. 無線マイコンの使い方(TWE-LITE)無線マイコンとは編  [ NOBのArduino日記! ]   2016年09月07日 23:56
超簡単!無線マイコンモジュール TWE-LITE DIP  マッチ棒がトレードマークの TWE-LITE DIP (トワイライト・ディップ)は、趣味の電子工作やDIY等で無線通信を簡単に使用できる様に開発されたモジュールです。  初期状態で単純なアナログやデジタル信号であ

この記事へのコメント

1. Posted by たじま   2015年10月28日 07:56
とても参考になりました!
ありがとうございます。
2. Posted by tanabe   2015年10月28日 09:29
たじまさん、コメントをありがとうございます。
記事がお役に立ち幸いです。
3. Posted by taka   2016年01月10日 10:41
5 大変わかりやすい記事です。
おかげさまで開発期間が相当短縮できそうです。
ありがとうございます!!
4. Posted by tanabe   2016年01月10日 11:05
taka さん、コメントをありがとうございます。記事がお役に立ち幸いです。
5. Posted by poly   2016年10月20日 15:44
どのようにして内蔵マイコンにプログラムを書き込むのでしょうか?
初歩的な質問ですみません。
6. Posted by tanabe   2016年10月20日 15:53
polyさん、こんにちは。メーカーさんの以下のページに説明があります。
http://mono-wireless.com/jp/products/TWE-LITE-R/index.html
http://mono-wireless.com/jp/products/TWE-Lite-DIP/UART-USB-WR.html
良い展開をお祈りします。

8. Posted by 朱鷺   2016年12月06日 13:24
Twe-liteのプログラムをc言語で書こうと思っているのですが、基本的なコマンドが分かりません...
良ければ教えていただけませんか?
9. Posted by tanabe   2016年12月06日 13:35
こんにちは。まずはメーカーさんの公式サイトをじっくりご覧になることをお勧めします。私もそれが最も勉強になりました。良い展開をお祈りします。
10. Posted by さいとう   2017年02月08日 10:24
PWMの出力値を制御したいのですが、どのような方法がありますか?
11. Posted by tanabe   2017年02月08日 10:31
メーカーさん公式の下記アプリなど参考になるのではないでしょうか。
https://mono-wireless.com/jp/products/TWE-APPS/App_Audio/index.html
12. Posted by kenta   2017年02月15日 09:28
複数通信で、順番に通信する方法はありますか?
13. Posted by tanabe   2017年02月15日 10:11
2月8日のかたと同じ某大学のかたのようですね。
せっかくのご質問ではありますがここはサポートコーナーではなく
私自身この製品の仕様全般に精通しているわけでもありません。
ご不明な点はまず公式情報を十分に確認された上でメーカーさんへ
問い合わせを行われるのが宜しいかと存じます。
14. Posted by knon   2017年07月12日 14:24
5 TEST1〜TEST5のプログラムを読み、勉強させていただきました。大変役立ちました。ありがとうございます。状態遷移という考え方やイベントドリブンが絵を描かないと難しいですね。まずは、感謝のお礼まで。
15. Posted by tanabe   2017年07月12日 14:32
knonさん コメントをありがとうございます。記事がお役に立ち幸いです ^ ^
16. Posted by nak   2018年07月26日 07:31
5 とても良い情報ありがとうございます!Arduinoと比べるとコーディングはシンドイですね
17. Posted by tanabe   2018年07月26日 08:10
nakさん、コメントをありがとうございます。記事がお役に立ち幸いです
18. Posted by tom3   2019年05月06日 15:32
5 メーカーの公式マニュアルが素晴らしいのでまずはそれで自習,次に実装へステップアップする際にこのサイトが非常に役立ちました.ありがとうございます.
19. Posted by tanabe   2019年05月07日 08:46
tom3さん、コメントをありがとうございます。記事がお役に立ち幸いです。

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Blog内検索
Archives
このブログについて
DSASとは、KLab が構築し運用しているコンテンツサービス用のLinuxベースのインフラです。現在5ヶ所のデータセンタにて構築し、運用していますが、我々はDSASをより使いやすく、より安全に、そしてより省力で運用できることを目指して、日々改良に勤しんでいます。
このブログでは、そんな DSAS で使っている技術の紹介や、実験してみた結果の報告、トラブルに巻き込まれた時の経験談など、広く深く、色々な話題を織りまぜて紹介していきたいと思います。
最新コメント