LoginSignup
13
15

スマートホームの新標準「Matter over Thread」を試してみた。

Last updated at Posted at 2023-03-14

はじめに

前回はM5Stack(ESP32)を使用してスマートホームの新標準「Matter」を試してみました。

「Matter」はアプリケーションレイヤーのプロトコルで、M5Stack(ESP32)は下位レイヤーにWi-Fiを使用しています。

matter.jpg

今回はnRF52840DK(Development Kit)とnRF52840Dongleを使用して、近距離無線通信規格IEEE802.15.4とThreadを試してみました。

Threadとは

IPv6ベースの低消費電力メッシュネットワーク技術で、ボーダールーターを経由してインターネットに接続することも可能です。

thread.jpg

構成

ボーダールーターにApple TV 4K(第三世代)(Wi-Fi + Ethernetモデル)を使用し、tvOS、iOSのホームアプリでMatterの動作確認をしました。

スクリーンショット 2023-03-13 9.31.53.png

また、ボーダールーターにラズパイを使用してThreadの動作確認をしました。

スクリーンショット 2023-03-13 13.52.13.png

ツールの準備

Zephyrビルド環境、デバイスへのインストール、nRF Connect for Desktop

  • M1 MacBook Air (2020)
  • macOS Monterey (バージョン 12.6.1)

IEEE802.15.4 Sniffer、Bluetooth LE Sniffer、nRF Connect for Desktop

  • Intel MacBook Pro (2017)
  • macOS Big Sur (バージョン 11.7.4)

Border Router

  • Raspberry Pi 4B (4GB)
  • Raspberry Pi OS with desktop (32bit 2023/2/21版)
  • nRF52840Dongle

Thread Topology Monitor

  • Windows10
  • nRF52840Dongle

デバイス(Threadデバイス、Matterデバイス)

Matterデバイス(Light bulbサンプル、Light switchサンプル)

  • nRF52840DK(Development Kit)

Threadデバイス(ot-cli-ftd, ot-rcp, IEEE802.15.4 Sniffer, Thread Topology Monitor)

  • nRF82840Dongle(E104-BT5040U、MDBT50Q-RX、Seeed XIAO BLE/BLE Sense)

デバイスへの書き込みツール

nRF Connect for Desktopをダウンロードしてインストールします。

nRF Connect for Desktopを起動します。

スクリーンショット 2023-03-13 20.02.48.png

Programmerをインストールします。
インストール後、「Open」を押します。

スクリーンショット 2023-03-13 20.02.35.png

「SELECT DEVICE」を押して、書き込み対象のnRF52840デバイスを選択します。
nRF52840の場合はJ-LINKで接続されますが、nRF52840 Dongleデバイスの場合はリセットボタンを押して書き込みモード(DFUモード)に変更します。
hexファイルをドラック&ドロップして「Write」ボタンを押してデバイスへ書き込みを行います。

スクリーンショット 2023-03-13 20.04.42.png

Seeed XIAO BLE/BLE SenseはAdafruit nRF52 Bootloaderが書き込まれていますので、UF2ファイル書き込みに対応しています。
ブートローダーモードにしてPCヘ接続するとドライブに見えます。
ドライブへuf2ファイルをコピーすると書き込みが行われます。

xiao.jpg

hexファイルをuf2ファイルへ変換するツールをインストールします。

$ git clone https://github.com/microsoft/uf2/
$ cd uf2/utils

ダウンロードしたhexファイルを同じディレクトリに置きます。

(nRF Sniffer for Bluetooth LEツールの場合)

$ python uf2conv.py -c -f 0xada52840 -o sniffer_nrf52840dongle_nrf52840_4.1.1.uf2 sniffer_nrf52840dongle_nrf52840_4.1.1.hex

(nRF Sniffer for 802.15.4ツールの場合)

$ git clone https://github.com/NordicSemiconductor/nRF-Sniffer-for-802.15.4
$ python uf2conv.py -c -f 0xada52840 -o nrf802154_sniffer_dongle.uf2 nrf802154_sniffer_dongle.hex

OpenThread CLI

ot-cli-ftd.hexファイルを作成し、デバイスへ書き込みを行います。

$ git clone https://github.com/openthread/ot-nrf528xx
$ cd ot-nrf528xx
$ git submodule update --init
$ ./script/bootstrap
$ ./script/build nrf52840 USB_trans -DOT_BOOTLOADER=USB
$ arm-none-eabi-objcopy -O ihex build/bin/ot-cli-ftd ot-cli-ftd.hex

OpenThread Border Router

ot-rcp.hexファイルを作成し、デバイスへ書き込みを行います。
(OpenThread CLIの手順と途中まで同じです)

$ arm-none-eabi-objcopy -O ihex build/bin/ot-rcp ot-rcp.hex

ラズパイへボーダールーターのソフトウェアをインストールします。
Raspberry Pi Imagerを使用してRaspberry Pi OSをSDカードへ書き込みを行います。
ラズパイへSDカードを挿入し、nRF52840 DongleデバイスをUSBへ接続して起動します。

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install dnsutils
$ git clone https://github.com/openthread/ot-br-posix
$ cd ot-br-posix
$ ./script/bootstrap

(Wi-Fiを使用する場合)

$ INFRA_IF_NAME=wlan0 WEB_GUI=1 ./script/setup

(有線LANを使用する場合)

$ INFRA_IF_NAME=eth0 WEB_GUI=1 ./script/setup

各サービスのステータスを確認します。
State: runningになっていれば正常です。

$ sudo service mdns status
$ sudo service otbr-agent status
$ sudo service otbr-web status

PCのブラウザからラズパイへアクセスし、ボーダールーターの管理画面を表示します。

ot-br.jpg

IEEE802.15.4 Sniffer

IEEE802.15.4のパケットキャプチャを解析したい場合は、IEEE802.15.4 Snifferをインストールします。
nRF52840 Dongleデバイスへファームウェアを書き込み、Wiresharkへ設定を追加してパケットキャプチャを取得します。

802154_sniffer.jpg

Bluetooth LE Sniffer

Matterの初期設定(コミッショニング)はBLEで行われますので、BLEのパケットキャプチャを解析したい場合は、Bluetooth LE Snifferをインストールします。
nRF52840 Dongleデバイスへファームウェアを書き込み、Wiresharkへ設定を追加してパケットキャプチャを取得します。

BLE_sniffer.jpg

Thread Topology Monitor

Windows用のソフトウェア(zipファイル)をダウンロードします。(macOSはサポートされていません)

zipファイルを解凍し、hexフォルダの中のnrf52840_xxaa_mbr_pca10059_usb.hexファイルをデバイスへ書き込みを行います。

スクリーンショット 2023-03-13 19.27.57.png

Windows上でnRF_TTM.exeを実行します。

nrf_ttm.jpg

スクリーンショット.png

ThreadデバイスをCLIで操作する

ot-cli-ftd.hexファイルを書き込んだ2台のThreadデバイスを使用して通信を行ってみる。
PCへnRF52840 Dongleを接続し、シリアルポート番号を確認する。

$ ls -la /dev/cu*
/dev/cu.usbmodemDE6CC665A64E2

screenコマンドを使用してシリアルポートへ接続する。

$ screen /dev/cu.usbmodemDE6CC665A64E2 115200

(ot-cli-ftd 1台目)

> dataset init new
Done

> dataset
Active Timestamp: 1
Channel: 13
Channel Mask: 0x07fff800
Ext PAN ID: 50ac06f2eda43aa5
Mesh Local Prefix: fd9b:7e79:d1b3:fb3f::/64
Network Key: 390b52814b7fe57a611f701cc553fa2d
Network Name: OpenThread-df6d
PAN ID: 0xdf6d
PSKc: fef7bf43bd3de696c7fe77e3f3e7f514
Security Policy: 672 onrc
Done

> dataset commit active
Done

> ifconfig up
Done

> thread start
Done

> state
detached
Done

> state
leader
Done

> ipaddr
fd9b:7e79:d1b3:fb3f:0:ff:fe00:fc00
fd9b:7e79:d1b3:fb3f:0:ff:fe00:f000
fd9b:7e79:d1b3:fb3f:30fb:b37a:1c0c:641a
fe80:0:0:0:6c22:e487:e01e:f6f9
Done

(ot-cli-ftd 2台目)

> dataset networkkey 390b52814b7fe57a611f701cc553fa2d
Done

> dataset commit active
Done

> ifconfig up
Done

> thread start
Done

> state
detached
Done

> state
child
Done

> ipaddr
fd9b:7e79:d1b3:fb3f:0:ff:fe00:8000
fd9b:7e79:d1b3:fb3f:f999:97b5:df46:cfb7
fe80:0:0:0:386d:7a15:70d2:b3a4
Done

> ping fd9b:7e79:d1b3:fb3f:30fb:b37a:1c0c:641a
16 bytes from fd9b:7e79:d1b3:fb3f:30fb:b37a:1c0c:641a: icmp_seq=7 hlim=64 time=8ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 8/8.0/8 ms.
Done

ボーダールーター経由でIPv6からIPv4へpingができていることも確認できます。

> ping 192.168.3.20
Pinging synthesized IPv6 address: fdf5:88ff:11c1:2:0:0:c0a8:314
16 bytes from fdf5:88ff:11c1:2:0:0:c0a8:314: icmp_seq=1 hlim=63 time=125ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 125/125.0/125 ms.
Done

ping.png

Matterデバイスを操作する

基本的には以下のページの手順に従って開発環境を構築します。

nRF Command Line Toolsをインストールする

nRF Command Line Toolsをダウンロードして、nRF ToolsとJ-LINKをインストールします。

スクリーンショット 2023-03-14 17.55.25.png

Homebrewと必要なツールをインストールする

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ brew install cmake ninja gperf python3 ccache qemu dtc wget libmagic

GN toolをインストールする

$ mkdir ${HOME}/gn && cd ${HOME}/gn

(M1/M2 Macの場合)

$ wget -O gn.zip https://chrome-infra-packages.appspot.com/dl/gn/gn/mac-arm64/+/latest

(Intel Macの場合)

$ wget -O gn.zip https://chrome-infra-packages.appspot.com/dl/gn/gn/mac-amd64/+/latest

zipファイルを解凍します。

$ unzip gn.zip
$ rm gn.zip

以下の内容を~/.bashrcファイル、または ~/.zshrcファイルに追加して、gnコマンドのパスを追加します。

export PATH=${HOME}/gn:"$PATH"

以下のコマンドを実行する、または、ターミナルを再度開いて環境変数を有効にします。

$ source ~/.bashrc
または
$ source ~/.zshrc

westコマンドをインストールする

$ pip3 install west

nRF Connect SDK codeを取得する

ncsディレクトリを作成し、その中にnRF Connect SDK codeを取得します。
--mrオプションでリリース番号を指定します。

$ mkdir ncs && cd ncs
$ west init -m https://github.com/nrfconnect/sdk-nrf --mr v2.3.0

GitHubの最新データを取得する場合は以下を実行します。

$ west init -m https://github.com/nrfconnect/sdk-nrf --mr main

データを更新する場合は、以下のコマンドを実行します。

$ west update

以下のコマンドを実行して、Zephyr CMake packageを出力します。
(nRF Connect SDKアプリケーションをビルドするために必要)

$ west zephyr-export

Pythonモジュールをインストールする

$ pip3 install -r zephyr/scripts/requirements.txt
$ pip3 install -r nrf/scripts/requirements.txt
$ pip3 install -r bootloader/mcuboot/scripts/requirements.txt

Zephyr SDKをインストールする

latest Zephyr SDKの最新リリース番号を取得し、取得したファイルを解凍して展開します。

(M1/M2 Macの場合)

$ cd ~
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.15.2/zephyr-sdk-0.15.2_macos-aarch64.tar.gz
$ tar xvf zephyr-sdk-0.15.2_macos-aarch64.tar.gz

(Interl Macの場合)

$ cd ~
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.15.2/zephyr-sdk-0.15.2_macos-x86_64.tar.gz
$ tar xvf zephyr-sdk-0.15.2_macos-x86_64.tar.gz

セットアップスクリプトを実行します。

$ cd zephyr-sdk-0.15.2
$ ./setup.sh

ビルド環境変数を設定する

以下のコマンドを実行して、ビルド環境変数を設定します。

$ cd ~/ncs
$ source zephyr/zephyr-env.sh

サンプルアプリケーションをビルドする(nRF Connect SDK)

nRF Connect SDKに含まれるサンプルアプリケーションを使用します。

Light bulb

基本的に以下のページを参考にサンプルアプリケーションのビルドとデバイスへのインストールを行います。

nRF52840 DKデバイス用にビルドとインストールを行います。

$ cd ~/ncs/nrf/samples/matter/light_bulb
$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

(使い方)
LED1: 待機している時は点滅します。初期設定(コミッショニング)が完了すると常時点灯します。
LED2: ライトとして使用します。Matterコントローラー(iOSホームアプリ)からの操作でON/OFF(点灯/消灯)、明るさ(0%〜100%)を変更できます。
LED3: 使いません
LED4: 使いません

ボタン1: 長押し(3秒以上)すると、LED1〜4が全て点灯し、ボタンを離すと初期化されます。(アプリを書き換えたり、繰り返し初期設定のテストをする場合、初期化が有効です。)
ボタン2: LED2のON/OFF状態を変更します。
ボタン3: 使いません
ボタン4: 初期設定(コミッショニング)のためのBluetooth LE(BLE)アドバタイズを有効にします。

Light switch

基本的に以下のページを参考にサンプルアプリケーションのビルドとデバイスへのインストールを行います。

$ cd ~/ncs/nrf/samples/matter/light_switch
$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

(使い方)
LED1: 待機している時は点滅します。初期設定(コミッショニング)が完了すると常時点灯します。
LED2: コマンドを受信すると点滅します。(後述で、iOSホームアプリからMatterデバイスとして正常に認識されなかったため、動作確認できませんでした。)
LED3: 使いません
LED4: 使いません

ボタン1: 長押し(3秒以上)すると、LED1〜4が全て点灯し、ボタンを離すと初期化されます。(アプリを書き換えたり、繰り返し初期設定のテストをする場合、初期化が有効です。)
ボタン2: 使いません
ボタン3: 使いません
ボタン4: 初期設定(コミッショニング)のためのBluetooth LE(BLE)アドバタイズを有効にします。

Door lock

基本的に以下のページを参考にサンプルアプリケーションのビルドとデバイスへのインストールを行います。

nRF52840 DKデバイス用にビルドとインストールを行います。

$ cd ~/ncs/nrf/samples/matter/lock
$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

(使い方)
LED1: 待機している時は点滅します。初期設定(コミッショニング)が完了すると常時点灯します。
LED2: ロックされている状態で点灯します。ロック解除されている状態で消灯します。
LED3: 使いません
LED4: 使いません

ボタン1: 長押し(3秒以上)すると、LED1〜4が全て点灯し、ボタンを離すと初期化されます。(アプリを書き換えたり、繰り返し初期設定のテストをする場合、初期化が有効です。)
ボタン2: 使いません
ボタン3: 使いません
ボタン4: 初期設定(コミッショニング)のためのBluetooth LE(BLE)アドバタイズを有効にします。

Window covering

基本的に以下のページを参考にサンプルアプリケーションのビルドとデバイスへのインストールを行います。

nRF52840 DKデバイス用にビルドとインストールを行います。

$ cd ~/ncs/nrf/samples/matter/window_covering
$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

(使い方)
LED1: 待機している時は点滅します。初期設定(コミッショニング)が完了すると常時点灯します。
LED2: 窓が閉まっている状態で点灯します。窓が開いている状態で消灯します。
LED3: 使いません
LED4: 使いません

ボタン1: 長押し(3秒以上)すると、LED1〜4が全て点灯し、ボタンを離すと初期化されます。(アプリを書き換えたり、繰り返し初期設定のテストをする場合、初期化が有効です。)
ボタン2: 使いません
ボタン3: 使いません
ボタン4: 初期設定(コミッショニング)のためのBluetooth LE(BLE)アドバタイズを有効にします。

サンプルアプリケーションをビルドする(connectedhomeip)

Matterプロジェクト(旧:Project CHIP)に含まれるサンプルアプリケーションを使用します。

lighting-app

下記のページを参考に開発環境を構築します。

$ cd ~/connectedhomeip
$ source ./scripts/activate.sh
$ cd examples/lighting-app/nrfconnect

nRF52840 DKデバイス用にビルドとインストールを行います。

$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

nRF52840 Dongleデバイス用にビルドとインストールを行います。

$ west build -b nrf52840dongle_nrf52840 -d build_nrf52840dongle_nrf52840 -- -DCONF_FILE=prj_no_dfu.con
$ west flash -d build_nrf52840dongle_nrf52840

light-switch-app

下記のページを参考に開発環境を構築します。

$ cd ~/connectedhomeip
$ source ./scripts/activate.sh
$ cd examples/light-switch-app/nrfconnect

nRF52840 DKデバイス用にビルドとインストールを行います。

$ west build -b nrf52840dk_nrf52840 -d build_nrf52840dk_nrf52840 -- -DCONF_FILE=prj.conf
$ west flash -d build_nrf52840dk_nrf52840

アプリの比較(iOSホームアプリでの見え方、動作確認)

ライトアプリ

iOSホームアプリの見え方は異なりましたが、すべて正常に動作しました。

  • nRF Connect SDK版
    • nRF52840 DK
  • connectedhomeip版
    • nRF52840 DK
    • nRF52840 Dongle

(nRF Connect SDK版)

(connectedhomeip版)

dk_1.jpg

dongle.jpg

スイッチアプリ

iOSホームアプリの見え方が異なり、nRF Connect SDK版はMatterデバイスとして認識されず(非対応表示)、connectedhomeip版はMatterデバイスとして認識されました(その他)が、正常に動作しませんでした。(デバイスのログでは、ボタン2の操作が出力される)

  • nRF Connect SDK版
    • nRF52840 DK
  • connectedhomeip版
    • nRF52840 DK

(nRF Connect SDK版)

(connectedhomeip版)

ドアロックアプリ

正常に動作しました。

  • nRF Connect SDK版
    • nRF52840 DK

(nRF Connect SDK版)

窓ブラインドアプリ

正常に動作しました。

  • nRF Connect SDK版
    • nRF52840 DK

(nRF Connect SDK版)

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15