
今回はアナログ・デバイセズ社のI2C・16Bit温度センサーモジュールADT7410をXBee3に接続して温度データ読み取り方法を解説していきます。I2Cはフィリップス社(現NXP社)が提唱する通信インターフェースで、クロックに同期させてデバイス間のデータの通信を行う2線式プロトコルの同期式シリアル通信のひとつです。クロックラインである SCL とデータラインである SDA の2本のワイヤで構成されています。
XBee3モジュールとADT7410温度センサーモジュールを以下のように接続します。
ADT7410モジュール | XBee3モジュール |
VCC (+3.3V) | ピン1 (VCC/3.3V) |
SDA | ピン7 (SDA) |
SCL | ピン19 (SCL) |
GND | ピン10 (GND) |
また、XBeeを以下のように設定します。
XBeeのConfiguration | 設定 |
ID | 2025 |
PS | Disabled [0] |
AP | MicroPython REPL [4] |
BD | 115200 [7] |
D1 | I2C SCL [6] |
P1 | I2C SDA[6] |
ToolsのMicroPython Terminalを開き、左上のアイコンでモジュールを接続します。
エンターキーを押してMicroPythonプロンプトの状態にします。
以下のコードをコピーしてMicroPython Terminalにマウスの右クリックでPasteを選択して貼り付けます。
import machine
i2c = machine.I2C(1, freq=100000)
print('I2C devices found:', [hex(addr) for addr in i2c.scan()])
コードの2行目について説明します。
i2c = machine.I2C(1, freq=100000)
machine.I2C はMicroPythonのmachineライブラリ内で、I2C(Inter-Integrated Circuit)通信を扱うためのクラスです。I2Cオブジェクトを作成しており、XBee3ではI2C(1)を使用します。ADT7410の周波数は最大400kHzですが、今回は100kHzに設定しています。
このコードを実行すると、以下のように0x48がリストに表示されました。これがADT7410のデフォルトI2Cアドレスです。

次にMicroPython Terminalで以下のコードをマウスの右クリックでPasteを選択して貼り付けて実行します。
import machine
import ustruct
ADT7410_ADDR = 0x48
TEMP_REG = 0x00
i2c = machine.I2C(1, freq=100000)
data = i2c.readfrom_mem(ADT7410_ADDR, TEMP_REG, 2)
raw_temp = ustruct.unpack_from('>h', data)[0]
temp = raw_temp >> 3
temp_celsius = temp * 0.0625
print("Temperature: {:.3f} C".format(temp_celsius))
ADT7410で計測した温度が表示されました。

このように、XBee3モジュールはI2C通信を内蔵しているため、別途ドライバを用意することなくI2Cセンサを接続できます。つまり、必要なプロトコルとインターフェースはXBee3のファームウェアに既に統合されており、I2Cデバイスと直接通信できます。
一方、Arduinoのようなプラットフォームは、より汎用的なマイクロコントローラ環境を提供するため、追加のセンサドライバが必要になることがよくあります。Arduinoは、あらゆるセンサや通信プロトコルを内蔵しているわけではありません。そのため、通常は各センサタイプの通信プロトコルとデータ処理を行うために、専用のライブラリやドライバが必要となります。
XBee3の設計では、センサとのシームレスな統合が不可欠なIoTアプリケーションなどの特定のユースケース向けに最適化されています。この内蔵機能により、追加のソフトウェアコンポーネントの必要性が減り、開発プロセスが簡素化されています。