
3軸加速度センサKXR94-2050モジュールを使用してXBeeによる加速度データの無線送信に関して連続して解説してきました。前回はデータをバイナリ形式で送ることによりどの程度のサンプリング間隔の短縮が可能か確認してみました。
今回は加速度データをバッファリングして送ることによりどの程度のサンプリング間隔の短縮が可能か確認してみました。バッファリングすることによりシリアルデータを連続してサンプリングすることはできなくなりますが、高速のサンプリングデーアを断片的に取得することができます。
リモートXBeeのMicroPython Terminalに書き込むコードを以下に示します。前回と同様にX軸の加速度のみをAD値のみを読込み、ローカルXBeeに送信します。5行目のADDRはご自分のローカルXBeeのシリアルナンバーに変更してください。 MicroPython Terminalのプロンプト>>>で、Ctrl + Fを押します。これによりプロンプトが^^^に変わります。この状態で右クリックしてPastを選択して下記のコードを張り付けます。
このコードのバッファサイズは127であり、サンプリングインターバルを0としています。バッファリングしたデータを送信する直前でタイムスタンプで時間を取得してプリントしています。
import xbee
import struct
import utime
from machine import Pin, ADC
ADDR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69'
adc_pin0 = Pin("D0", Pin.IN, Pin.PULL_UP)
BUFFER_SIZE = 127
SAMPLE_INTERVAL_MS = 0
buffer = []
adcx = ADC(adc_pin0)
while True:
x = adcx.read()
data= struct.pack('>H', x)
buffer.append(data)
if len(buffer) >= BUFFER_SIZE:
timestamp = utime.ticks_ms()
msg = b''.join(buffer) + b"\n"
xbee.transmit(ADDR, msg)
print("Start: {}".format(timestamp))
buffer = []
utime.sleep_ms(SAMPLE_INTERVAL_MS)
上記のコードを実行した際のリモートXBeeのMicroPython Terminalのウィンドウを示します。

ZigbeeのMAC層制限により、1フレームあたりのヘッダなどを除いた実データであるMTU(最大伝送単位)は127バイト前後とされていますが、上記のコードでも127を超えるとエラーが発生し送信できなくなりました。
バッファサイズ | タイムスタンプの時間差の平均値[ms] |
1 | 22.4 |
10 | 25.6 |
50 | 115.3 |
100 | 213.0 |
127 | 303.1 |
バッファサイズが1の場合に22.4msの時間を要しているのは、そのほとんどがxbee.transmitによるものと思われます。最大のバッファサイズ127でタイムスタンプの時間差の平均値は303.1msですが、xbee.transmitに要した時間を差し引き1バッファあたりの送信に要する時間を求めてみます。
(303.1-22.4)/127=2.2ms
バッファリングにより1バッファあたりのサンプリング間隔の最小値が2.2msであることが分かりました。上記のコードではSAMPLE_INTERVAL_MSを0に設定していましたが、この値を適切に設定することによりサンプリング周期を調節することも可能です。