関連:
シリアル通信関連記事一覧XBee S1による無線化1、
2、
3、
4にてXBee S1 2つとSH7125 2つを使ったリモート操作を説明しました。
ただ、この方法だと
XBeeの真価を発揮していません。
XBeeには
AD変換機能が搭載されているので、送信器の入力点数が少ない場合は
送信器側にはマイコンは必要ありません。
今回はXBeeのAD変換機能を有効にしてAD値を定期送信させることでマイコン無しの送信器を作成します。
ATモードとAPIモードについて
ATモードとAPIモードについて簡単に説明しておきます。
S1とS2で違いがあると思いますが、ざっとこんな感じです。
ATモード:純粋にシリアルを無線化状態送信:送りたい文字をそのまま送信
受信:送られた文字をそのまま受信
・自分のポートを制御するにはATコマンドモードに入る
・ATコマンドモード中はモジュール間のシリアル通信できない(めんどい)
・通信相手のモジュールを制御することができない
・PAN-IDと事前に設定したDH,DLが一致した相手にのみ送信可能
APIモード:専用フォーマットで送受信する送信:専用フォーマットにしないと送信できない
受信:送られた文字がフォーマット外の場合APIフォーマットに変換されて受信
・通信相手のモジュールを制御する事ができる
・PAN-IDさえ一致していれば任意のDH,DLの相手に送信可能(らしい)
ATモードのモジュールとAPIモードのモジュールとの間で通信を行うこともできます。
ATモードのモジュールからAPIモードのモジュールに対して送信を行うと、受信側では
APIフォーマットに変換された状態でデータが出てきました。
AD変換の自動送信についてATモード、APIモード共にAD変換値を通信相手に自動送信することができます。
どちらのモードで送信、どちらのモード受信しても受信できます。
どの組み合わせでもデータはAPIフォーマットで受信することになります。
※さすがにDLを変えると受信できませんでした。
今回は
ATモード+AD値定期送信
の設定を行います。
XBee S1の設定
未だ何も設定をされていない方は
XBee S1による無線化1にてATモードによるシリアル通信を開通させておきましょう。
XBee S1のAD変換および定期送信に関する設定は、ICHIの夢の家日記様を参考にしました。
参考:ICHIの夢の家日記様
[Deep]XBee⇒PC、一定周期でセンサ値送信【XBee】定期コマンド、パケット解析結果簡単に言うとやることは
・XBeeのピン機能設定
・XBeeの定期送信周期(
本当は測定周期)の設定 ※2018/10/07修正
※周期だけ設定しても定期送信は行われませんでした。
これでAD/DI値の自動定期転送ができるようになります。(XB24、ファームVer 10EF)
APIモードを使用せずATモードのままで問題なく使用できます。
※最初は送信間隔を0x1000程度に設定しておくと分かりやすいと思います。
送信されるようになったので、あとは受信データを解析すれば・・・
のつもりでした。ここでおおいにハマりました。
AD値らしきデータは受信できているのですが、AD値が0x03FFまたは0x0000にしかなりません。
何か設定が抜けているかと色々探したのですがそれらしき情報が見つかりません。
結局のところ原因はXBeeのAD変換用の
参照電圧Vrefに電圧が入力されていないためでした。
Vrefに電圧供給しないとAD変換できないという情報はほとんど見つかりません。
もしかすると
S1特有の仕様かもしれません。
送信側モジュールの
Pin14へ
3.3Vを供給するとAD変換できることを確認しました。
Pin14へ電圧を入れなくても電源電圧をVrefとして使用する設定があっても良さそうですが見つかりませんでした。
通信データの内容
先の説明の通り、ATモードに設定した場合でもAD値の受信データは
APIフォーマットになります。
APIフォーマットについてはきむ茶工房ガレージハウス様のS2向け解説が参考なります。
参考:きむ茶工房ガレージハウス様
XBee(無線通信)の実験パート4X-CTUのTerminalにて通信データを確認できます。
送受信されるデータは「Ascii表記」だと解釈不能です。
「Binary表記」(Asciiコードをそのまま表示するようなもの)にすれば
中身がわかります。
ShowHexボタンを押すと送られたバイナリデータを確認できます。
公式の取説に一応解説はあるのですが、一部情報が欠落しています。
いないろなサイトの情報をまとめるとこんな感じです。
※S1の場合。それ以外は未確認
データ7以外は合っていると思います。
データ7の内容は不明です。
データ9はAD設定になっているポートを表します。
DIO0:0x02、DIO1:0x04、DIO2:0x08、DIO3:0x10、DIO4:0x20、DIO5:0x40
データ10はDIまたはDOUT設定になっているポートを表します。
DIO0:0x01、DIO1:0x02、DIO2:0x04、DIO3:0x08、DIO4:0x10、DIO5:0x20、DIO6:0x40、DIO7:0x80、DIO8:0x100
※DIO8をDIに設定するとデータ9の最下位ビットが1になります。
DI設定になっているポートが一つもない場合、DI情報は出力されません。
同様にAD設定になっているポートが一つも無い場合、AD情報は出力されません。
AD設定のポートを増やせば1ポートにつき1byteづつデータが増えます。
※2018/10/07 追加SUM部分は
1)スタート(7E)、送信データ長、SUM以外の値を全て加算
2)1)で計算した結果の下位8bitのみを取り出し
3)0xFFから2)の結果を引く
となります。
3)の計算は2)の結果を全ビット反転させても同じ計算結果になります。
実際に計算してみます。
まず加算
0x83+0x00+0x31+0x26+0x00+0x01+0x02+0x02+0x00+0x02+0x00+0x60
10進数だと
131+0+49+38+0+1+2+2+0+2+0+96=321
16進数に戻して
321=0x141
下位8bitのみだと
0x41(0b0100 0001)
反転させると
0xBE(0b1011 1110)
となっています。
※2018/10/07 追加リモコン作成では使用しませんが、
IT - Samples before TX(送信前測定回数)
を増やすと測定周期×測定回数分の測定を行ってから一気に測定した結果を送信します。
この値を増やすと
DI情報(1回目)、AD情報1(1回目)、AD情報2(1回目)、DI情報(2回目)、AD情報1(2回目)、AD情報2(2回目)
の様にまとめて送信されます。
これは電波の発信に使用する電力が大きいため毎回送るよりまとめて送った方が消費
電力が小さくなる(電池が長持ちする)とか、受信側の処理が楽になるとかそういった
感じだと思います。
リアルタイム性が必要ないロギング(気温を測定して後で整理する等)で有効な機能だと思います。
本当は種別83について公式の取説を調べれば情報が分かるはずなのですが、
種別83の個所に81の情報が書いてあって内容が不明です。
マイコン側でこれらの情報を解析すれば送信器として利用できます。
次回は
受信プログラム編