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で読んでみるというのをやってみた。
コメントを追加