XBeeモジュールの使い方(DigiMesh :MicroPythonを用いたSynchronous sleep support mode)


 6月30日の記事ではDigiMesh独自の機能として、Synchronous sleep support modeについて解説しました。XBee3のDigiMeshファームウェアにおけるSynchronous Sleep Support Mode(SM = 7)は、802.15.4やZigbee等の他のファームウェアとは異なる独自のスリープモードを有しています。最大の特徴は、全ノードが同期してスリープ/ウェイクすることが可能であるということです。ネットワーク全体のルーターおよびエンドデバイスが同時にスリープし、同時に起きるように同期されることが可能です。6月30日の記事ではアナログ温度センサMCP9701(Microchip社製)をそれぞれ3個のルーターXBeeに接続し、60秒間隔でコーディネータXBeeに結果を送信する方法を解説しました。

 今回はI2C温度センサADT7410(Microchip社製)の値をMicroPythonで読み取りSynchronous sleep support modeを用いてネットワーク全体のルーターのスリープ・起動タイミングを同期させて60秒間隔でコーディネータXBeeに結果を送信する方法を解説します。ADT7410(Microchip社製)とルーターXBeeとの接続は6月24日の記事を参考にしてください。

 ファームウェアはDigiMesh 2.3 THに設定しますが、バージョン3012(Newest)では同期をとることはできません。このバージョンで同期を試みると

[Errno 7107] ENOTCONN

というエラーが発生します。このため、同期を取るためにはファームウェアのバージョンを300B又は300Aにダウングレードする必要があります。バージョン300Dは3012(Newest)と同様にエラーが発生します。

 1個のコーディネータXBeeと3個のルーターXBeeのConfigurationを以下のように設定します。DLの値はご自分のコーディネータXBeeのシリアルナンバーを入力してください。

 CoordinatorRouter 1Router 2Router 3
ID2025202520252025
CE[0][1][1][1]
NI123
DH13A20013A20013A200
DL41AE366941AE366941AE3669
SM[7][7][7][7]
PS55000ms55000ms55000ms55000ms
ST5000ms5000ms5000ms5000ms
SO1444
PS[0][1][1][1]
AP[1][4][4][4]
BD[7][7][7][7]
D0[5][5][5]
D1[6][6][6]
P1[6][6][6]

 以下のコードをmain.pyとして3個のルータにFile System Managerを用いて書き込みました。7行目のアドレスはご自分のコーディネータXBeeのシリアルナンバーを入力してください。

import xbee
import utime
import machine
import ustruct
I2C_ADDR = 0x48  # ADT7410のI2Cアドレス
TEMP_REG = 0x00  # 温度レジスタ
DEST_ADDR = b'\x00\x13\xA2\x00\x41\xAE\x36\x69' 
i2c = machine.I2C(1, freq=100000)
while True:
    try:
        name = xbee.atcmd("NI")
        name = str(name)
        name = int(name)
        voltage_mv = xbee.atcmd('%V')
        voltage_v = voltage_mv / 1000.0
        rssi_val = xbee.atcmd('DB')
        rssi_dbm = -rssi_val
        data = i2c.readfrom_mem(I2C_ADDR, TEMP_REG, 2)
        raw_temp = ustruct.unpack_from('>h', data)[0]
        temp = raw_temp >> 3
        temp_celsius = temp * 0.0625
        payload = "NAME:{:1d},Volt:{:.2f}V,RSSI:{}dBm,T:{:.2f}C".format(name, voltage_v, rssi_dbm, temp_celsius)
        print("Sending:", payload)
        xbee.transmit(DEST_ADDR, payload)
    except Exception as e:
        print("Error:", e)
    utime.sleep(5)

 以下の図はコーディネータに送信されたフレームのLogを示しています。青線で線引しているように、3個のルーターからのフレームが同時に送信されていることを確認することができます。スリープの間にルーター1をリセットしても、3個のルーターから送信されるフレームのタイミングが同期していることを確認しました。

以下にルーター1から送信されたフレームを参考までに示します。

Receive Packet (API 1)

7E 00 32 90 00 13 A2 00 41 AE 30 F6 FF FE C1 4E 41 4D 45 3A 31 2C 56 6F 6C 74 3A 33 2E 33 30 56 2C 52 53 53 49 3A 2D 32 35 64 42 6D 2C 54 3A 33 30 2E 36 33 43 F1

Start delimiter: 7E
Length: 00 32 (50)
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 31 2C 56 6F 6C 74 3A 33 2E 33 30 56 2C 52 53 53 49 3A 2D 32 35 64 42 6D 2C 54 3A 33 30 2E 36 33 43
RF data (ASCII): NAME:1,Volt:3.30V,RSSI:-25dBm,T:30.63C
Checksum: F1