
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のシリアルナンバーを入力してください。
Coordinator | Router 1 | Router 2 | Router 3 | |
ID | 2025 | 2025 | 2025 | 2025 |
CE | [0] | [1] | [1] | [1] |
NI | - | 1 | 2 | 3 |
DH | - | 13A200 | 13A200 | 13A200 |
DL | - | 41AE3669 | 41AE3669 | 41AE3669 |
SM | [7] | [7] | [7] | [7] |
PS | 55000ms | 55000ms | 55000ms | 55000ms |
ST | 5000ms | 5000ms | 5000ms | 5000ms |
SO | 1 | 4 | 4 | 4 |
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