はじめに
前回はM5Stack(ESP32)を使用してスマートホームの新標準「Matter」を試してみました。
「Matter」はアプリケーションレイヤーのプロトコルで、M5Stack(ESP32)は下位レイヤーにWi-Fiを使用しています。
今回はnRF52840DK(Development Kit)とnRF52840Dongleを使用して、近距離無線通信規格IEEE802.15.4とThreadを試してみました。
Threadとは
IPv6ベースの低消費電力メッシュネットワーク技術で、ボーダールーターを経由してインターネットに接続することも可能です。
構成
ボーダールーターにApple TV 4K(第三世代)(Wi-Fi + Ethernetモデル)を使用し、tvOS、iOSのホームアプリでMatterの動作確認をしました。
また、ボーダールーターにラズパイを使用してThreadの動作確認をしました。
ツールの準備
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を起動します。
Programmerをインストールします。
インストール後、「Open」を押します。
「SELECT DEVICE」を押して、書き込み対象のnRF52840デバイスを選択します。
nRF52840の場合はJ-LINKで接続されますが、nRF52840 Dongleデバイスの場合はリセットボタンを押して書き込みモード(DFUモード)に変更します。
hexファイルをドラック&ドロップして「Write」ボタンを押してデバイスへ書き込みを行います。
Seeed XIAO BLE/BLE SenseはAdafruit nRF52 Bootloaderが書き込まれていますので、UF2ファイル書き込みに対応しています。
ブートローダーモードにしてPCヘ接続するとドライブに見えます。
ドライブへuf2ファイルをコピーすると書き込みが行われます。
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のブラウザからラズパイへアクセスし、ボーダールーターの管理画面を表示します。
IEEE802.15.4 Sniffer
IEEE802.15.4のパケットキャプチャを解析したい場合は、IEEE802.15.4 Snifferをインストールします。
nRF52840 Dongleデバイスへファームウェアを書き込み、Wiresharkへ設定を追加してパケットキャプチャを取得します。
Bluetooth LE Sniffer
Matterの初期設定(コミッショニング)はBLEで行われますので、BLEのパケットキャプチャを解析したい場合は、Bluetooth LE Snifferをインストールします。
nRF52840 Dongleデバイスへファームウェアを書き込み、Wiresharkへ設定を追加してパケットキャプチャを取得します。
Thread Topology Monitor
Windows用のソフトウェア(zipファイル)をダウンロードします。(macOSはサポートされていません)
zipファイルを解凍し、hexフォルダの中のnrf52840_xxaa_mbr_pca10059_usb.hexファイルをデバイスへ書き込みを行います。
Windows上でnRF_TTM.exeを実行します。
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
Matterデバイスを操作する
基本的には以下のページの手順に従って開発環境を構築します。
nRF Command Line Toolsをインストールする
nRF Command Line Toolsをダウンロードして、nRF ToolsとJ-LINKをインストールします。
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
スイッチアプリ
iOSホームアプリの見え方が異なり、nRF Connect SDK版はMatterデバイスとして認識されず(非対応表示)、connectedhomeip版はMatterデバイスとして認識されました(その他)が、正常に動作しませんでした。(デバイスのログでは、ボタン2の操作が出力される)
- nRF Connect SDK版
- nRF52840 DK
- connectedhomeip版
- nRF52840 DK
ドアロックアプリ
正常に動作しました。
- nRF Connect SDK版
- nRF52840 DK
窓ブラインドアプリ
正常に動作しました。
- nRF Connect SDK版
- nRF52840 DK