
前回はファームウェアを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のシリアルナンバーに変更してください。
Coordinator | Router 1 | Router 2 | Router 3 | |
ID | 2025 | 2025 | 2025 | 2025 |
NI | ― | 1 | 2 | 3 |
DH | 0 | 13A200 | 13A200 | 13A200 |
DL | FFFF | 41AE3669 | 41AE3669 | 41AE3669 |
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