XBeeモジュールの使い方(加速度センサ:XBee3による12ビットADC)


 前回は3軸加速度センサKXR94-2050モジュールを使用し、ローカルXBeeで受信したフレームからX,Y,Z軸方向の加速度データを読み取り、Processing を用いてリアルタイムでデータを表示するスクロールグラフをご紹介しました。この際に使用したXBeeはシリーズ1であり、ファームウェアは802.15.4を使用しました。XBee内蔵の10ビットADCを用いた1対1の簡便なデータ通信では問題なく使用できます。しかし、5月27日の「XBeeモジュールの使い方(加速度センサ:12ビットADC)」で解説したようにXBee3には12ビットADCが搭載されております。今回はXBee3の用いて3軸加速度センサKXR94-2050モジュールを使用し、ローカルXBeeで受信したフレームからX,Y,Z軸方向の加速度データの読み取りを試みます。

  ローカルXBeeとリモートXBeeのファームウェアはいずれもZigbee 3.0 THとし、Configurationの設定は以下のとおりです。

パラメータリモートXBeeローカルXBee
CEJoin Network [0]Form Network [1]
ID20252025
APMicroPython REPL [4]API Without Escape [1]
BD115200 [7]115200 [7]
D0ADC [2]
D1ADC [2]
D2ADC [2]
AVVDD reference [2]

 XBee3には12ビットADCを使用するためにはMicroPython Terminalを使用します。 MicroPython Terminalのダイアログを開き、以下のコードを張り付けます。4行目のCOORDINATOR_64BIT_ADDRはご自分のローカルXBeeのシリアルナンバーに変更します。

import xbee
import time
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...")
while True:
    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))
    time.sleep_ms(100)

 貼り付けたらプロンプト>>>の状態でCtrl+Dで実行させます。これによりコーディネータXBeeにフレームが100ms間隔で送信されます。プログラムを停止する場合はMicroPython Terminal でCtrl+Cを押して停止させます。

 ローカルXBeeで受信したフレームです。このフレームのFrames LogのTimeの欄を確認すると100msのスリープを設定したにも関わらず約128ms間隔でデータを受信していることが分かります。

フレームの中身を確認すると送信元の64ビットアドレスが含まれていることが分かります。

 ローカルXBeeで受信したフレームの内容を以下に示します。3軸加速度センサKXR94-2050モジュールからのX,Y,Z軸方向の加速度データを確認することができます。

Receive Packet (API 1)

7E 00 59 90 00 13 A2 00 41 AE 36 24 BE 3D 01 56 72 65 66 3A 20 33 2E 32 39 32 56 2C 20 52 53 53 49 3A 20 2D 35 30 64 42 6D 2C 20 41 63 63 65 6C 5F 78 3A 20 30 2E 38 33 34 67 2C 20 41 63 63 65 6C 5F 79 3A 20 30 2E 31 39 37 67 2C 20 41 63 63 65 6C 5F 7A 3A 20 30 2E 34 35 36 67 78

Start delimiter: 7E

Length: 00 59 (89)

Frame type: 90 (Receive Packet)

64-bit source address: 00 13 A2 00 41 AE 36 24

16-bit source address: BE 3D

Receive options: 01

RF data (HEX): 56 72 65 66 3A 20 33 2E 32 39 32 56 2C 20 52 53 53 49 3A 20 2D 35 30 64 42 6D 2C 20 41 63 63 65 6C 5F 78 3A 20 30 2E 38 33 34 67 2C 20 41 63 63 65 6C 5F 79 3A 20 30 2E 31 39 37 67 2C 20 41 63 63 65 6C 5F 7A 3A 20 30 2E 34 35 36 67

RF data (ASCII): Vref: 3.292V, RSSI: -50dBm, Accel_x: 0.834g, Accel_y: 0.197g, Accel_z: 0.456g

Checksum: 78