XBeeモジュールの使い方(加速度センサ:バイナリ形式による送信)


 3軸加速度センサKXR94-2050モジュールを使用してXBeeによる加速度データの無線送信に関して連続して解説してきました。前回はコンパイルしたコードをmain.mpyとして/flashに保存して実行させることにより、どの程度のサンプリング間隔の短縮が可能か確認してみました。

 今回はデータをバイナリ形式で送ることによりどの程度のサンプリング間隔の短縮が可能か確認してみました。  リモートXBeeのMicroPython Terminalに書き込むコードを以下に示します。前回と同様にX軸の加速度のみをAD値のみを読込み、ローカルXBeeに送信します。3行目のADDRはご自分のローカルXBeeのシリアルナンバーに変更してください。 MicroPython Terminalのプロンプト>>>で、Ctrl + Fを押します。これによりプロンプトが^^^に変わります。この状態で右クリックしてPastを選択して下記のコードを張り付けます。

import xbee
import struct
from machine import Pin, ADC
ADDR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69'
adc_pin0 = Pin("D0", Pin.IN, Pin.PULL_UP)
adcx = ADC(adc_pin0)
while True:
    x = adcx.read()
    data= struct.pack('>H', x)
    xbee.transmit(ADDR, data)

 この中で使用しているstruct.pack()はデータをバイト列に変換する関数です。以下にこの関数のフォーマット文字列の一部を示します。

structモジュールのフォーマット文字列の一部

フォーマット文字列意味サイズ
`B`符号なし 8ビット整数1バイト
`H`符号なし 16ビット整数2バイト
`h`符号あり 16ビット整数2バイト
`I`符号なし 32ビット整数4バイト
`i`符号あり 32ビット整数4バイト
`>`ビッグエンディアン(XBeeでは推奨)

 ビッグエンディアンとはバイトで表現される数値やデータをメモリに格納したり、ネットワークで送受信する際に、MSB(Most Significant Bit、最上位ビット)から順に並べる方式です。

 ビッグエンディアン形式での送信方法は、多くの通信プロトコルにおいて、異なるシステムやアーキテクチャ間での一貫性と互換性を確保するための一般的な方法です。従って、XBeeにおいてもビッグエンディアン形式を使用する他のシステムとの互換性を維持するために、ビッグエンディアンの使用が推奨されています。

 上記のコードをペースとしたらCtrl+Dを押すとコンパイルが始まります。さらに、起動時にこのコードを自動的に実行するか聞いて来るのでYを押します。

 さらにこの状態でCtrl+Rを押すことによりmain.mpyが実行されます。

 実行を停止する場合はCtrl+Cを押します。また、ローカルXBeeの電源をoffにするかリセットボタンを押しても実行を停止できます。

 これによりローカルXBeeにはフレームが送信されます。ローカルXBeeのFrames LogのTimeの値を参考にして10秒間に受信したフレーム数を10回カウントした平均値は634であり、サンプリング間隔を14.5msであることを確認することができました。

 前回の10秒間に受信したフレーム数を10回カウントした平均値が634で。サンプリング間隔が15.8msであったので、僅かに短縮できたことが分かります。