
前回まではファームウェアを802.15.4に設定しアナログ温度センサMCP9701(Microchip社製)を3個のエンドデバイスXBeeに接続し、温度センサのネットワークを構築して温度データをスクロールグラフ化する方法を解説しました。今回はファームウェアをZigBeeに設定しI2C温度センサADT7410(Microchip社製)を3個のルーターのXBeeに接続し、コーディネータXBeeで60秒間隔で温度データを検出する方法を解説します。
ZigBeeはIEEE 802.15.4を物理層およびMAC層の基盤とし、その上にメッシュネットワーク機能、アプリケーション層、セキュリティ層などを追加した本格的な無線通信プロトコルです。ZigBee Allianceによって標準化されています。各ノード(ルーター)が他のノードのルーターとしても機能し、データの経路を動的に選択・変更可能であり、ツリー型やメッシュ型のネットワークを構成することができます。これにより、ネットワークの範囲を拡張し、耐障害性を高めます。また、ネットワーク内のノードが自動的に参加・離脱し、障害が発生した際には代替経路を自動的に発見・利用します。
温度センサADT7410とXBeeの接続方法について説明します。今回は温度センサのXBeeのVDDから常時給電するのではなくD0のDigital Out, High [5]から取得することにしました。これによりルーターの電源の消費を抑えることができます。
ファームウェアをXBee3 Zigbee 3.0 THに設定し、1個のコーディネータXBeeと3個のルーターXBeeのConfigurationを以下のように設定します。
Coordinator | Router 1 | Router 2 | Router 3 | |
CE | [0] | [1] | [1] | [1] |
ID | 2025 | 2025 | 2025 | 2025 |
JV | [0] | [1] | [1] | [1] |
NI | - | 1 | 2 | 3 |
PS | [0] | [1] | [1] | [1] |
AP | [1] | [4] | [4] | [4] |
BD | 115200[7] | 115200[7] | 115200[7] | 115200[7] |
D0 | - | [5] | [5] | [5] |
D1 | - | [6] | [6] | [6] |
P1 | - | [6] | [6] | [6] |
ルーターXBeeのMicroPython Terminalに書き込むコードを以下に示します。このコードはルーターXBeeのNI、VDD、RSSI及び温度データを読込み、コーディネーターXBeeに送信します。7行目のADDRはご自分のローカルXBeeのシリアルナンバーに変更してください。まず、MicroPython Terminalでこのコードを実行することによりコーディネーターXBeeにフレームが送信されることを確認します。その後、このコードをファイル名main.pyとして、以前説明したFile System Managerを用いてXBeeに書き込みます。
import xbee
import time
import machine
import ustruct
I2C_ADDR = 0x48 # ADT7410のI2Cアドレス
TEMP_REG = 0x00 # 温度レジスタ
DEST_ADDR = b'\x00\x13\xA2\x00\x42\x1B\xC1\xAC'
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)
time.sleep(60)
以下の図がコーディネータXBeeのコンソール画面です。各受ルーターから60秒間隔で送信されたフレームを確認することができます。

ルーター1から送信されたフレームの構造を以下に示します。ルーターXBeeのNI、VDD、RSSI及び温度データがフレームに含まれていることを確認できました。
Receive Packet (API 1)
7E 00 32 90 00 13 A2 00 42 1C 0C 75 D0 FB 01 4E 41 4D 45 3A 31 2C 56 6F 6C 74 3A 34 2E 30 35 56 2C 52 53 53 49 3A 2D 33 36 64 42 6D 2C 54 3A 33 31 2E 32 35 43 15
Start delimiter: 7E
Length: 00 32 (50)
Frame type: 90 (Receive Packet)
64-bit source address: 00 13 A2 00 42 1C 0C 75
16-bit source address: D0 FB
Receive options: 01
RF data (HEX): 4E 41 4D 45 3A 31 2C 56 6F 6C 74 3A 34 2E 30 35 56 2C 52 53 53 49 3A 2D 33 36 64 42 6D 2C 54 3A 33 31 2E 32 35 43
RF data (ASCII): NAME:1,Volt:4.05V,RSSI:-36dBm,T:31.25C
Checksum: 15