TWE-Lite

MONO WIRELESS(私が購入した時はTOCOSだった)の簡単無線モジュールです、

モード設定で親にも子にもなり、信号端子が同期するという、アプリがもともと入っています。クイックガイドの通りやれば、いとも簡単に無線通信ができてしまうのですが、親の方にmbedとかをつないでUARTでデータをとることを考えたとき、UARTのデータが仕様がはっきりわからなくて(当時)webにもなんか書いてあったけど、TIみたくまとまりなくていまいち頭に入ってこなかった。走行するうちに仕事が忙しくなり、そのままに放置していた。その数年後、不幸にもコロナ禍でようやく時間が取れるようになったので、もう一度トライしてみようということになった。

あいかわらず、簡単部分は分かりやすいが、webのページはあちこち飛ばされるせいで分かりづらい。みりゃわかるでしょみたいなものはたくさんあると思うが、確認しながらの結果を覚え書き(自分のための)として書いておく。

今回、ADに温度センサLM61をつけたかった。子機にLM61をつけて遠方に置き、親機は手元で液晶表示させるような使い方。最終的には、子機を数台設置して複数の場所を表示する。

ADCの仕様

これもいまいちはっきりしないことが書かれている。TWELITE-DIPのデータシートによると、

  • VREF=1.235V
  • 分解能=10bit
  • ADC入力レンジ(min)=0、max=VREFまたはVREFx2
  • 入力z=5KΩ(下記リンクより)

https://mono-wireless.com/jp/tech/Hardware_guide/QA_ADC.html
入力範囲は2.4Vで、内部Vrefは1.2Vと記載があるところから、VREFx2になるような設定になっていると思われる。(ダイナミックに変わると思えない)

そして、初級編のページに記載されている、この文章がさらに混乱させる。

アナログ入力は0~2.0Vで動作します。この例では電源電圧を半固定抵抗(10KΩ)と抵抗(10KΩ)で半分に分圧しています。初期値では可変抵抗器用に調節したPWM出力値になります。計算式は以下の通りです。

デューティー(%)= 115 X 電圧 / (電源電圧 / 2)ー 5
(100以上は100、0以下は0)

後半は、親子の同期で動作の時にはADC入力が親のPWM出力になることの話だと思うので、今回はどうでもいいが、本当は2.4Vだけど、2Vに設定変更しているということなのか、単なる誤植なのか。この例というのは、乾電池2個で接続していて、10KがVCC側(3V)で、VRがGNDという構成。なので、フルスイングで0~1.5Vということだが。だから、やっぱり、VREFx2の設定になっていると考えるべきだろう。

UARTでADC読み

次に、この出力をUARTで読みたい。まずは、つないでみた。以前MacではZtermを使っていたように記憶しているが、開発は終わっていて、64bit対応していないため、現在のMacでは動かせない。昔作ったExarのUSB-UART変換基板を使ったが、terminalの/devの下にないみたいだ(実はあったんだが)、ドライバ?入れるのかな、とりあえず、VirtualBoxのWindows7でTeraterm走らせてみることにした。VboxのUSBポートを有効にしょうとしたら、Exarのデバイスが出ている。「動いてるやん」。

Teratermからの出力はこんな感じ最初起動時にメッセージが3行あり、その後だいたい1秒ぐらい間隔で文字列が送られてくる。

!INF TOCOS TWELITE DIP APP V1-03-3, SID=0x81003872, LID=0x78
!ERR Flash loading...
!INF DIO --> 00000000000000000000
:00811501C381003BB6000011000AE51D0000FFFFFFFFFF1C
:00811501C081003BB6000049000ADB1D0000FFFFFFFFFFF1
:00811501C681003BB6000085000AF91D0000FFFFFFFFFF91

設定は親(M1=0)、子(全Open)で、子にUARTつけたときである。たぶん親から子に1秒毎にきてるのか、親でSWを押すと、タイミングが少しずれたりするので、イベントあったら、それも送信する仕組みかな。親機の電源をオフすると、データも止まる。

今度は、親を子に設定し、子を親に設定した(物理的なデバイスは変えず)。やはり、ずっとデータが送られてくる。このような仕様らしい。

!INF TOCOS TWELITE DIP APP V1-03-3, SID=0x81003872, LID=0x00
!ERR Flash loading...
!INF DIO --> 00000000010000000000
:78811501AE81003BB678070B000B5A1F0001FFFFFFFFFFC7
:78811501C981003BB678074F000B5A200001FFFFFFFFFF67
:78811501CC81003BB678079B000B5A1F0001FFFFFFFFFF19

記載あり。データはポートの値が変化した場合と定期的(約1秒周期)に送受信されます。TWELITE DIPの外部に接続したマイコン等で受信データを解釈することができます。

起動時のメッセージ(3行)

webでの説明は2行なのだが、これは持っている製品が古いからなのかもしれん。上級編に記載あり

メッセージは ! または : (コロン)ではじまります。! は主に利用者が直接理解できるような書式で、: (コロン)は外部マイコンなどで処理することを目的とした書式です。終端は CR LF です。

  • 最初の行は起動メッセージです。
  • V1-03-3 はバージョン番号で、上記の例では v1.3.3 となります。
  • SID は32bit表記の個体識別番号(16進)で、全ての無線モジュールが個別の番号を持っています。シールド缶に表示されたシリアル番号に+0x8000:0000 したものが表示されます。これは通信時の固定アドレスとしても利用されます。
    ※ 本アプリケーションは TWELITE NET ライブラリを用いて記述されています。TWELITE NET では 32bit 長アドレスを MAC アドレスの代替(IEEE802.15.4 の拡張アドレス) として使用しています。
  • LID は本アプリケーション内で使用する論理デバイスIDです。

2行目は起動時のIOの値らしいが、これは使わないからいいや。で、親にした時のLIDが00になっていて、子の時に78となっていることから、このIDでどっからきたかを判断するということと思われる。

データ列の分析

1秒間隔で送られてくるデータ列は、「相手端末からの状態通知:コマンド0x81」に記載されている。ここで、コマンドという意味が全然わからないんだが、送られてくるデータを解析するだけならデータ列をうまく取り込めば、なんとかなるから、もういいやという感じで考えた。そのページに書かれている記載内容から

:78811501CC81003BB678079B000B5A1F0001FFFFFFFFFF19

のデータ列を使って、下記

  • :78 81 15 01 
    • 78=コキからの受信
    • 81=コマンド
    • 15=パケット識別子 (アプリケーションIDより生成される)
    • 01=プロトコルバージョン (0x01 固定)
  • CC 81003BB6 78 079B 00 0B5A 1F 
    • CC=LQI値、電波強度に応じた値で 0xFF が最大、0x00 が最小
    • 81003BB6=送信元の個体識別番号(部品に刻印あった)
    • 78=宛先の論理デバイス番号(コキにしてた時の値と同じだ)
    • 079B=タイムスタンプ (秒64カウント) ※直前データと差分を調べると大体1秒ぐらい
    • 00=中継フラグ(中継回数0~3)
    • 0B5A=電源電圧(mV)=2906mV 大体合ってる(乾電池2本)
    • 1F=未使用
  • 00 01 FFFFFFFF FF 19
    • 00=DIの状態ビット
    • 01=DIの変更状態ビット
    • FFFFFFFF=AD1~AD4の変換値。0~2000[mV]のAD値を16で割った値を格納
    • FF=AD1~AD4の補正値 (LSBから順に2ビットずつ補正値、LSB側が AD1, MSB側が AD4)
    • 19=チェックサム

記載ページの説明では、「中継フラグは中継の回数を意味します。中継をしていない時は0になります。中継回数の初期値は1です。中継回数はインタラクティブモードのオプションビットで最大3まで変更できます。」とあるので、1回の中継ならこのままでも動作できそうという理解かな。

AD値の復元には以下のように計算します。

AD1[mV] = (e1 * 4 + ef1) * 4

AD ポートは未使用(VCC接続) の場合、対応する e1 ~ e4 値は 0xFF です。

実際にLM61を子機のAD1に接続

応答データを示す。

:78811501CC81003BB67809EB000B551D000033FFFFFFFC9E

先ほどの計算式(AD1[mV] = (e1 * 4 + ef1) * 4)を使うと、

=(0x33*4+0x00)*4

LM61は600mV+10mV*Tで出力されるから、AD1を使う場合の計算は、

T=(((AD1)*4+(補正値&0x03))*4 - 600)/ 10=21.6℃

AD1の値だけ考えると、分解能1.6℃ぐらいになるが、これはでかいな。いやいや、ちがうね、補正値も変化しているようだから、これは10bitデータを8bit+2bitで送っているという意味だろう。

だとしても、最後の4倍の意味がわからないが、よくわからないが、データ列の説明でデータ送信時に16で割って出力していると書いてあったからだな、でなんで4で割っているのかはわからん。本当はADは12bitなんだけど、10bitにしてるねんということはないよね?(どこにも書いてないが)

 

データは連続で送られてきて、5.2ms程度で1パケット塊だ、これなら、1ライン毎の取り込みで十分間に合うな。

次、Pythonで読んでみるというのをやってみた。