XBeeモジュールの使い方(DigiMeshを用いたセンサネットワーク:I2C温度センサADT7410)


 前回はファームウェアをZigBeeに設定しI2C温度センサADT7410(Microchip社製)を3個のルーターのXBeeに接続し、コーディネータXBeeで60秒間隔で温度データを検出する方法を解説しました。今回はファームウェアをDigiMeshに設定しI2C温度センサADT7410(Microchip社製)を3個のルーターのXBeeに接続し、コーディネータXBeeで60秒間隔で温度データを検出する方法を解説します。

 温度センサADT7410とXBeeの接続方法は前回と同様に温度センサのXBeeのVDDから常時給電するのではなくD0のDigital Out, High [5]から取得することにしました。これによりルーターの電源の消費を抑えることができます。

 ファームウェアをXBee3 DigiMesh 2.4 THに設定し、1個のコーディネータXBeeと3個のルーターXBeeのConfigurationを以下のように設定します。7行目のDLはご自分のローカルXBeeのシリアルナンバーに変更してください。

 CoordinatorRouter 1Router 2Router 3
ID2025202520252025
NI123
DH013A20013A20013A200
DLFFFF41AE366941AE366941AE3669
SM[0][0][0][0]
PS[0][1][1][1]
AP[1][4][4][4]
BD[3][7][7][7]
D0[5][5][5]
D1[6][6][6]
P1[6][6][6]

 ルーターXBeeのMicroPython Terminalに書き込むコードを以下に示します。このコードはルーターXBeeのNI、VDD、RSSI及び温度データを読込み、コーディネーターXBeeに送信します。4行目のADDRはご自分のコーディネーターXBeeのシリアルナンバーに変更してください。まず、MicroPython Terminalでこのコードを実行することによりコーディネーターXBeeにフレームが送信されることを確認します。その後、このコードをファイル名main.pyとして、以前説明したFile System Managerを用いてXBeeに書き込みます。

from machine import I2C
import time
import xbee
i2c = I2C(1, freq=100000)
ADDR_COORDINATOR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69'
x = xbee.XBee()

def get_name():
    # "NI" ATコマンドでNameを取得
    name = xbee.atcmd("NI")
    name = str(name)
    name = int(name)
    #print(name)
    return name

def read_temp():
    # 温度データを読み取る
    data = i2c.readfrom_mem(0x48, 0x00, 2)
    temp = (data[0] << 8 | data[1]) >> 3
    # 13ビットのデータから温度を計算
    if temp & (1 << 12):
        temp -= 1 << 13
    temp = temp * 0.0625
    #print(temp) 
    return temp

def get_rssi():
    # "DB" ATコマンドでRSSIを取得
    rssi = xbee.atcmd("DB")
    rssi = str(rssi)
    rssi = int(rssi,16)
    #print(rssi)
    return rssi

def get_battery_voltage():
    # "%V" ATコマンドでバッテリ電圧(mV)単位を取得
    voltage = xbee.atcmd("%V")
    # ミリボルトからボルトに変換
    voltage = voltage/1000
    #print(voltage)
    return voltage

while True:
    #if xbee.atcmd('AI') == 0:
    #if count >= 0:
    time.sleep(0.01)  # 短い待機
    # Nameを読み取る
    sensor_name = get_name()
    # 温度データを読み取る
    temperature = read_temp()
    # RSSI値を取得
    rssi_value = get_rssi()
    # バッテリ電圧を取得
    voltage_value = get_battery_voltage()
    # データを送信
    payload = "NAME: {:1d}".format(sensor_name) + " Temperature: {:.2f}C".format(temperature) + " RSSI: {:03d}dB".format(rssi_value) + " Battery Voltage: {:.2f}V".format(voltage_value)
        
    xbee.transmit(ADDR_COORDINATOR, payload)
    time.sleep(60) 

 以下の図がコーディネータXBeeのコンソール画面です。各受ルーターから60秒間隔で送信されたフレームを確認することができます。

ルーター1から送信されたフレームの構造を以下に示します。ルーターXBeeのNI、VDD、RSSI及び温度データがフレームに含まれていることを確認できました。

Receive Packet (API 1)

7E 00 4A 90 00 13 A2 00 41 AE 30 F6 FF FE C1 4E 41 4D 45 3A 20 31 20 54 65 6D 70 65 72 61 74 75 72 65 3A 20 32 39 2E 31 39 43 20 52 53 53 49 3A 20 30 37 30 64 42 20 42 61 74 74 65 72 79 20 56 6F 6C 74 61 67 65 3A 20 34 2E 30 31 56 95

Start delimiter: 7E
Length: 00 4A (74)
Frame type: 90 (Receive Packet)
64-bit source address: 00 13 A2 00 41 AE 30 F6
16-bit source address: FF FE
Receive options: C1
RF data (HEX): 4E 41 4D 45 3A 20 31 20 54 65 6D 70 65 72 61 74 75 72 65 3A 20 32 39 2E 31 39 43 20 52 53 53 49 3A 20 30 37 30 64 42 20 42 61 74 74 65 72 79 20 56 6F 6C 74 61 67 65 3A 20 34 2E 30 31 56
RF data (ASCII): NAME: 1 Temperature: 29.19C RSSI: 070dB Battery Voltage: 4.01V
Checksum: 95