XIAO nRF54LM20A 向け Matter

はじめに
nRF54LM20A SoC を搭載した XIAO nRF54LM20A シリーズは、Bluetooth LE、Matter、Thread、Zigbee、および 2.4GHz 独自プロトコルをサポートし、低レイテンシーなシナリオに最適な最大 4 Mbps のデータレートを実現します。
このチュートリアルでは 2 枚の XIAO nRF54LM20A ボードを使用して Matter ネットワークを検証します。1 枚は Home Assistant に接続されたボーダールーターとして動作し、もう 1 枚は Thread ネットワークに参加する Matter デバイスとして動作して、Home Assistant ダッシュボード上に模擬的な温度と湿度データを表示します。
WiKi のアイデアをご提供いただいた著者 @tutoduino に感謝します
このチュートリアルは VS Code と nRF Connect Extension を前提としています。これらに不慣れな場合は、XIAO nRF54LM20A nRFConnect SDK Usage を参照してください。
Matter とは
Matter(旧称 CHIP)は、Connectivity Standards Alliance(CSA)によって開発されたユニバーサルなアプリケーションレイヤー規格です。
- ベンダーをまたいだ IP ネットワーク(Wi-Fi/Ethernet/Thread)上での相互運用性
- 標準化されたデバイスタイプ(例:照明、ドアロック、サーモスタット)
- QR コード/NFC を用いたセキュアなコミッショニング
- Distributed Compliance Ledger(DCL)によるエンドツーエンド暗号化
OpenThread とは
OpenThread は Thread ネットワークプロトコルのオープンソース実装です。IEEE 802.15.4 無線技術を使用して、IoT デバイス向けの低消費電力でセキュアなメッシュネットワークを構築します。主な特長は次のとおりです。
- IPv6(6LoWPAN)のサポートを内蔵
- 自己組織化ネットワークトポロジ
- すべての通信に対する AES-128 暗号化
- 電球やセンサーのような小型デバイスにも対応
Matter と Thread の関係
この点について非常に詳細な説明をしている著者 @tutoduino に感謝し、その内容を引用します!
Matter と Thread の簡単な紹介の後で、Thread と Matter が異なる目的を持ち、技術スタックの異なるレイヤーで動作していることが理解できたと思います。まとめると次のとおりです。
Thread:
- Thread は、コネクテッドホームデバイス向けに設計された低消費電力の無線メッシュネットワークプロトコルです。デバイス同士およびインターネットとの間で、信頼性が高くセキュアな通信手段を提供します。
- Thread はローカルネットワークを構築し、インターネットがダウンしてもデバイス同士が通信できるようにします。
Matter:
- Matter は Thread、Wi-Fi、Ethernet などのネットワークプロトコルの上位に位置するアプリケーションレイヤープロトコルです。異なるメーカーのデバイス同士がシームレスに連携できるようにすることで、スマートホームエコシステムを簡素化・統一することを目的としています。
- Matter はアプリケーションレベルでデバイスがどのように通信し相互作用するかを定義し、相互運用性、セキュリティ、使いやすさに重点を置いています。
Thread と Matter の接続:
- Matter は基盤となるネットワークプロトコルの 1 つとして Thread を使用できます。つまり、Matter プロトコルを使用するデバイスは Thread ネットワーク上で通信できます。
- Matter と Thread を組み合わせることで、デバイスがローカルかつ効率的に通信できる、堅牢でセキュアかつ相互運用可能なスマートホームエコシステムが実現します。

Home Assistant の概要
Home Assistant は、スマートホームデバイスを単一の統合インターフェースから制御・監視できる強力なオープンソースのホームオートメーションプラットフォームです。スマートホームの中枢ハブとして機能し、ルーチンの自動化、センサーの監視、よりインテリジェントな生活空間の構築を可能にします。

ハードウェアの準備
ハードウェアの準備には 2 台の XIAO nRF54LM20A Sense が必要です。
Bluetooth アンテナ
このボードは外部 Bluetooth アンテナを使用します。より良い Bluetooth 信号品質を確保し、Bluetooth の使用体験を向上させるために、Bluetooth アンテナを取り付けることを推奨します。 接続方法は以下のとおりです。

Matter で HomeAssistant に接続する
アドオンをインストールする
Settings -> Apps に移動し、Install app を選択してアドオンを追加します。
- Open Thread Border Router を追加し、その設定を変更します。
- Settings -> Apps に移動し、Install app を選択してアドオンを追加し、Open Thread Border Router を検索してインストールを完了します。

- Matter Server を追加します

Thread ルーティングを構成する
以下の手順に従って、1 台の XIAO nRF54LM20A を Coprocessor として書き込み、ボーダールーター機器をエミュレートします。
Connect ZBT-1、Connect ZBT-2、Home Assistant Yellow などの Thread ルーティングデバイスも使用できます。
XIAO nRF54LM20A に RCP Coprocessor ファームウェアを書き込む
このチュートリアルは VS Code と nRF Connect Extension を前提としています。これらに不慣れな場合は、XIAO nRF54LM20A nRFConnect SDK Usage を参照してください。
- Create a new application を選択し、copy a sample を選んで Coprocessor を検索し、プロジェクトを作成します。

- boards フォルダ配下にデバイスツリー設定ファイルを追加・変更します。競合を避けるために PMIC が使用する I2C 設定を無効にし、UART20 のボーレートを 1000000 に設定します。
ファイルパス:~/boards:
- xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay.
&uart20 {
current-speed = <1000000>;
status = "okay";
hw-flow-control;
};
/ {
chosen {
zephyr,ot-uart = &uart20;
};
};
&pmic_i2c {
status = "disabled";
};
- xiao_nrf54lm20a_nrf54lm20a_cpuapp.conf.
CONFIG_SPI_NOR=n
# Increase Main and shell stack sizes to avoid stack overflow
# while using CRACEN
CONFIG_MAIN_STACK_SIZE=2048
CONFIG_I2C_GPIO=n
CONFIG_MFD_NPM13XX=n
CONFIG_NPM13XX_CHARGER=n
- ビルドして設定を有効にします。
- プロジェクトを設定してビルドします。

west flashを使用してファームウェアを書き込みます。

- Home Assistant でデバイスを検出するには、Coprocessor ファームウェアを書き込んだ XIAO nRF54LM20A を USB-C 経由で Home Assistant Green に接続します。
- Add-on store を開き、Open Thread Border Router を見つけて設定します。XIAO nRF54LM20A という名前のデバイスが表示されるので、ボーレートなどのパラメータを設定し、設定を保存します。

- Info タブで Start を選択します。

- Log で設定状況を確認できます。下図のように表示されていれば設定は成功です。

- Settings -> Thread に移動してデバイスを検出します。通常、
ha-thread-c6c8という名前で表示されます。

Matter デバイスを設定する
- 「Create a new application」を選択し、「copy a sample」を選び、Matter-Template を検索してプロジェクトを作成します。

- デバイスツリーファイルと設定ファイルを修正します。
-
XIAO nRF54LM20A と Nordic 公式評価ボードのハードウェアの違いにより、デバイスツリーおよび設定ファイルの修正が必要です。公式評価ボードには外付け MX25R64 フラッシュチップが搭載されていますが、XIAO nRF54LM20A は PY25Q64 を使用しているため、それに応じた調整を行う必要があります。
-
追加するファイルは以下のとおりです:

ファイルパス: ~/boards:
- xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.overlay
- xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.overlay
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/ {
aliases {
/* Use watchdog wdt31 as the application watchdog */
watchdog0 = &wdt31;
};
};
&py25q64 {
status = "disabled";
};
&wdt31 {
status = "okay";
};
xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/ {
chosen {
nordic,pm-ext-flash = &py25q64;
};
aliases {
/* Use watchdog wdt31 as the application watchdog */
watchdog0 = &wdt31;
};
};
&py25q64 {
status = "okay";
};
&wdt31 {
status = "okay";
};
ファイルパス: ~/sysbuild/mcuboot/boards:
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.conf
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_HW_STACK_PROTECTION=n
CONFIG_BOOT_WATCHDOG_FEED=n
# Disable all debug features
CONFIG_ASSERT_VERBOSE=n
CONFIG_ASSERT_NO_FILE_INFO=y
CONFIG_PRINTK=n
# Bootloader size optimization to fit into 28 KB partition.
# These options can be safely disabled because in this configuration,
# the secondary slot resides in the internal RRAM, so features
# needed to handle the external flash are not needed.
CONFIG_SPI_NOR=n
CONFIG_SPI=n
# Increase the maximum number of sectors to 512 to fit the big image size (> 1024 kB).
CONFIG_BOOT_MAX_IMG_SECTORS=512
# Currently, without tickless kernel, the SYSCOUNTER value after the software
# reset is not set properly and due to that the first system interrupt is not called
# in the proper time - the SYSCOUNTER value is set to the value from before
# reset + 1. Hence, the reboot time increases more and more.
# To avoid it enable tickless kernel for mcuboot.
CONFIG_TICKLESS_KERNEL=y
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.overlay
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/* Disable the external flash, as it's not needed
* for the configuration with secondary slot residing
* in the internal RRAM.
*/
&py25q64 {
status = "disabled";
};
xiao_nrf54lm20a_nrf54lm20a_cpuapp.conf
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#
CONFIG_HW_STACK_PROTECTION=n
CONFIG_BOOT_WATCHDOG_FEED=n
# XIAO nRF54LM20A uses SPI NOR external flash (PY25Q64)
CONFIG_GPIO=y
CONFIG_SPI=y
CONFIG_SPI_NOR=y
CONFIG_SPI_NOR_SFDP_DEVICETREE=y
CONFIG_SPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096
# Increase the maximum number of sectors to 512 to fit the big image size (> 1024 kB).
CONFIG_BOOT_MAX_IMG_SECTORS=512
# Currently, without tickless kernel, the SYSCOUNTER value after the software
# reset is not set properly and due to that the first system interrupt is not called
# in the proper time - the SYSCOUNTER value is set to the value from before
# reset + 1. Hence, the reboot time increases more and more.
# To avoid it enable tickless kernel for mcuboot.
CONFIG_TICKLESS_KERNEL=y
xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
/ {
chosen {
nordic,pm-ext-flash = &py25q64;
};
};
&py25q64 {
status = "okay";
};
プロジェクトパス ~/ :
pm_static_xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.yml
mcuboot:
address: 0x0
region: flash_primary
size: 0xA000
mcuboot_pad:
address: 0xA000
region: flash_primary
size: 0x800
app:
address: 0xA800
region: flash_primary
size: 0x125800
mcuboot_primary:
address: 0xA000
orig_span: &id001
- app
- mcuboot_pad
region: flash_primary
size: 0x126000
span: *id001
mcuboot_primary_app:
address: 0xA800
orig_span: &id002
- app
region: flash_primary
size: 0x125800
span: *id002
mcuboot_secondary:
address: 0x130000
orig_span: &id003
- mcuboot_secondary_pad
- mcuboot_secondary_app
region: flash_primary
size: 0xC0000
span: *id003
mcuboot_secondary_pad:
region: flash_primary
address: 0x130000
size: 0x800
# Compression rate 34.75%
mcuboot_secondary_app:
region: flash_primary
address: 0x130800
size: 0xBF800
factory_data:
address: 0x1F0000
region: flash_primary
size: 0x1000
settings_storage:
address: 0x1F1000
region: flash_primary
size: 0xC000
pm_static_xiao_nrf54lm20a_nrf54lm20a_cpuapp.yml
mcuboot:
address: 0x0
region: flash_primary
size: 0xD000
mcuboot_pad:
address: 0xD000
region: flash_primary
size: 0x800
app:
address: 0xD800
region: flash_primary
size: 0x1E2800
mcuboot_primary:
address: 0xD000
orig_span: &id001
- app
- mcuboot_pad
region: flash_primary
size: 0x1E3000
span: *id001
mcuboot_primary_app:
address: 0xD800
orig_span: &id002
- app
region: flash_primary
size: 0x1E2800
span: *id002
factory_data:
address: 0x1F0000
region: flash_primary
size: 0x1000
settings_storage:
address: 0x1F1000
region: flash_primary
size: 0xC000
mcuboot_secondary:
address: 0x0
orig_span: &id003
- mcuboot_secondary_pad
- mcuboot_secondary_app
region: external_flash
size: 0x1E3000
span: *id003
mcuboot_secondary_pad:
region: external_flash
address: 0x0
size: 0x800
mcuboot_secondary_app:
region: external_flash
address: 0x800
size: 0x1E2800
external_flash:
address: 0x1E3000
size: 0x5DB000
device: PY25Q64
region: external_flash
追加ファイルの目的の説明
| File | Description |
|---|---|
1. ボード Overlay ファイル (boards/)XIAO nRF54LM20A 用のアプリケーションレベルのデバイスツリー Overlay です。 | |
xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay | 外付け Flash バリアント: PY25Q64 SPI NOR Flash を OTA セカンダリスロットとして有効化します; |
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.overlay | 内蔵 Flash バリアント: PY25Q64 を無効化します(BOM コストと消費電力を削減); |
2. MCUboot 設定ファイル (sysbuild/mcuboot/boards/)MCUboot は独立した Zephyr イメージであり、専用の Kconfig とデバイスツリー Overlay ファイルが必要です。 | |
xiao_nrf54lm20a_nrf54lm20a_cpuapp.conf | 外付け Flash — Kconfig: PY25Q64 へアクセスするための SPI/SPI_NOR ドライバを有効化します; |
xiao_nrf54lm20a_nrf54lm20a_cpuapp.overlay | 外付け Flash — DTS Overlay: PY25Q64 を |
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.conf | 内蔵 Flash — Kconfig: SPI/SPI_NOR を無効化します; |
xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.overlay | 内蔵 Flash — DTS Overlay: PY25Q64 を無効化し、MCUboot が内蔵 Flash のみを使用するようにします。 |
3. 静的パーティションファイル (pm_static_*.yml)Partition Manager 用の静的パーティションテーブルであり、MCUboot、APP、OTA、Factory Data、Settings 用の Flash 全体レイアウトを定義します。 | |
pm_static_xiao_nrf54lm20a_nrf54lm20a_cpuapp.yml | 外部フラッシュバリアント: |
pm_static_xiao_nrf54lm20a_nrf54lm20a_cpuapp_internal.yml | 内部フラッシュバリアント: |
デバイスへのフラッシュとダウンロード
- ビルド構成を進めます。

- 別の XIAO nRF54LM20A をターゲットデバイスとして選択し、OpenTerminal を起動して、
west flashコマンドを使用してファームウェアを書き込みます。

Home Assistant アプリを使用して Matter デバイスを接続する
- Matter デバイスを接続し、デバイスの QR コードを生成します。
- NCS 開発環境で nRF Serial Terminal を開きます。

- インターフェース上部にシリアルポートリストがポップアップ表示されるので、XIAO nRF54LM20A に対応するシリアルポートを選択します。

- Matter デバイス情報とペアリング用 QR コードリンクがシリアルログ経由で出力されます。

- QR コードリンクを直接タップするか、リンクをコピーして別途 Web ブラウザで開きます。

- Home Assistant アプリをダウンロードします。
- Matter デバイスの Home Assistant への追加はモバイルアプリ経由で行います。表示された QR コードをスキャンしてアプリをダウンロードします。

- 設定画面に移動して Matter デバイスを追加し、ブラウザで生成された QR コードをスキャンしてペアリングを完了します。
![]() | ![]() | ![]() | ![]() | ![]() |
- Matter デバイス情報は Home Assistant のブラウザダッシュボード上で確認できます。
![]() | ![]() | ![]() |
- デバイスをダッシュボードに追加します。

- Matter デバイスのリアルタイムデータがダッシュボードに表示されます。

まとめ
上記の手順に従って、2 つの XIAO nRF54LM20A モジュールを使用して Matter over Thread ネットワークを構築し、そのネットワークを Home Assistant に正常に接続しました。Matter プロトコルは、より幅広い種類のセンサーへのアクセスをサポートしていますが、上記のデモでは温度と湿度のデータ取得のみをシミュレートしています。他のセンサーデバイスを統合する際には、Matter 仕様内に対応する Cluster が定義されているかどうかを確認してください。詳細については、Home Assistant Matter の公式ドキュメントを参照してください。
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます。弊社は、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じて選択いただける複数のコミュニケーションチャネルをご用意しています。









