XBeeモジュールの使い方(加速度センサ:サンプリング周期高速化)


 前回はリモートXBeeからの送信側のタイミング詳しく調べるため、3軸加速度センサKXR94-2050モジュールからX,Y,Z軸方向の加速度データを読み出す際にtimestampを付けて確認することにしました。

 前回のコードではディレイとして100msを設定し、timestampを付けていましたが、今回はこれらを無効にしたコードでさらに高速化を確認します。

 以下のコードをリモートXBeeのMicroPython Terminalで実行します。5行目のCOORDINATOR_64BIT_ADDRはご自分のローカルXBeeのシリアルナンバーに変更してください

import xbee
import time
import utime
from machine import Pin, ADC
COORDINATOR_64BIT_ADDR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69'
# Initialize ADC for DIO0, DIO1, DIO2
adc_pin0 = Pin("D0", Pin.IN, Pin.PULL_UP)
adcx = ADC(adc_pin0)
adc_pin1 = Pin("D1", Pin.IN, Pin.PULL_UP)
adcy = ADC(adc_pin1)
adc_pin2 = Pin("D2", Pin.IN, Pin.PULL_UP)
adcz = ADC(adc_pin2)
print("Starting data transmission to coordinator...")

def precise_delay_ms(delay_ms):
    start = utime.ticks_ms()
    while utime.ticks_diff(utime.ticks_ms(), start) < delay_ms:
        pass

while True:
    start_time = utime.ticks_ms()
    voltage_mv = xbee.atcmd('%V')
    supply_voltage_v = voltage_mv / 1000.0
    rssi_val = xbee.atcmd("DB")
    rssi_dbm = -rssi_val
    raw_adcx_value = adcx.read()
    raw_adcy_value = adcy.read()
    raw_adcz_value = adcz.read()
    adcx_voltage = (raw_adcx_value / 4095.0) * supply_voltage_v
    adcy_voltage = (raw_adcy_value / 4095.0) * supply_voltage_v
    adcz_voltage = (raw_adcz_value / 4095.0) * supply_voltage_v
    adcx_voltage = adcx_voltage - supply_voltage_v / 2
    adcy_voltage = adcy_voltage - supply_voltage_v / 2
    adcz_voltage = adcz_voltage - supply_voltage_v / 2
    accelx = adcx_voltage / 0.66
    accely = adcy_voltage / 0.66
    accelz = adcz_voltage / 0.66
    data_payload = "Vref: {:.3f}V, RSSI: {:d}dBm, Accel_x: {:.3f}g, Accel_y: {:.3f}g, Accel_z: {:.3f}g".format(
        supply_voltage_v, rssi_dbm, accelx, accely, accelz
    )
    print("\n--- Sending Data ---")
    print("Payload: {}".format(data_payload))
    try:
        xbee.transmit(COORDINATOR_64BIT_ADDR, data_payload.encode('utf8'))
        print("Data sent successfully.")
    except Exception as e:
        print("Error sending data: {}".format(e))
    # precise_delay_ms(100)  # ディレイ
    end_time = utime.ticks_ms()
    loop_time = utime.ticks_diff(end_time, start_time)
    print("Loop time: {} ms".format(loop_time))

 以下の図が上記のコードを実行した際のリモートXBeeのMicroPython Terminalのダイアログです。前回はディレイの100msとtimestamp要した約70msが存在したためタイムループの平均は約208msとなっていましたが、ディレイとtimestampを無効にしたことにより約34ms周期でサンプリングされていることが分かります。