
Seeed Studio XIAO nRF54L15(Sense) 入門ガイド
はじめに
Seeed Studio XIAO nRF54L15 は、最先端のNordic nRF54L15チップを搭載したコンパクトで高性能な開発ボードです。この次世代SoCは、超低消費電力マルチプロトコル2.4 GHz無線と、128 MHz Arm® Cortex®-M33プロセッサおよび高度な電力管理用のArm® Cortex®-M0+を含むMCUを統合しています。1.5 MB NVMおよび256 KB RAMまでのスケーラブルメモリを提供し、内蔵の超低消費電力設計によりバッテリー寿命を大幅に延長します。その強力な無線機能はBluetooth® 6.0(Channel Soundingを含む)、Matter、Thread、Zigbee、および最大4 Mbpsの高スループット2.4 GHz独自モードをサポートします。このボードには包括的なペリフェラルセット、統合された128 MHz RISC-Vコプロセッサ、および**TrustZone®**分離と暗号化エンジン保護などの高度なセキュリティ機能が含まれています。内蔵Li-ionバッテリー管理により、XIAO nRF54L15はスマートウェアラブル、産業用センサー、高度なHMIなどのコンパクトで安全かつエネルギー効率的なIoTソリューションに最適です。
仕様
項目 | XIAO nRF54L15 | XIAO nRF54L15 Sense |
---|---|---|
MCU | Arm Cortex-M33 128 MHz RISC-V コプロセッサ 128 MHz FLPR | Arm Cortex-M33 128 MHz RISC-V コプロセッサ 128 MHz FLPR |
無線接続 | Bluetooth LE 6.0(Channel Soundingを含む) | Bluetooth LE 6.0(Channel Soundingを含む) |
メモリ | NVM 1.5 MB + RAM256 KB | NVM 1.5 MB + RAM256 KB |
内蔵センサー | N/A | 6軸IMU(LSM6DS3TR-C) マイクロフォン (MSM261DGT006) |
送信電力 | +8 dBm | +8 dBm |
受信感度 | -96 dBm | -96 dBm |
主要ペリフェラル | 14ビットADC、グローバルRTC | 14ビットADC、グローバルRTC |
電源 | USB Type-Cインターフェース電源供給 | USB Type-Cインターフェース電源供給 |
動作温度 | -40 to 105°C | -40 to 105°C |
供給電圧範囲 | 3.7 to 5 V | 3.7 to 5 V |
ESBおよび2.4 GHz独自プロトコル | 最大4 Mbps | 最大4 Mbps |
タンパー検出器 | YES | YES |
Bluetoothチャネルサウンディング | YES | YES |
特徴
- 強力なCPU: DSP命令とFPU浮動小数点演算をサポートする128 MHz Arm® Cortex®-M33プロセッサ、32ビットRISCアーキテクチャ、および統合された128 MHz RISC-Vコプロセッサ。
- 超低消費電力: 優れた超低消費電力設計により、バッテリー寿命を大幅に延長し、高度な電力管理を含みます。
- マルチモード無線伝送: 統合された2.4 GHzマルチプロトコル無線トランシーバーは、Bluetooth Low Energy(Channel Soundingを含む)、802.15.4-2020、Matter、Thread、Zigbee、および2.4 GHz独自モード(最大4 Mbps)をサポートします。
- 堅牢なセキュリティ: TrustZone®分離、タンパー検出、暗号化エンジン側のチャネルリーク保護を含む高度なセキュリティ機能。
- 豊富なオンチップリソース: 最大1.5 MB NVMおよび256 KB RAMまでのスケーラブルメモリ構成により、十分なストレージ容量を提供します。
- 豊富なインターフェース: 新しいグローバルRTC(System OFFモードで利用可能)、14ビットADC、高速シリアルインターフェースを含む包括的なペリフェラルセット。内蔵リチウムバッテリー管理。
ハードウェア概要
- XIAO nRF54L15
- XIAO nRF54L15 Sense
XIAO nRF54L15 前面図解 |
---|
![]() |
XIAO nRF54L15 背面図解 |
![]() |
XIAO nRF54L15 ピン一覧 |
![]() |
XIAO nRF54L15 Sense 前面図解 |
---|
![]() |
XIAO nRF54L15 Sense 背面図解 |
![]() |
XIAO nRF54L15 Sense ピン一覧 |
![]() |
nRFConnect SDK の使用方法
nRF Connect SDK(NCS)は、Nordic nRF52、nRF53、nRF54、nRF70、およびnRF91シリーズベースの無線デバイス向けの低消費電力無線アプリケーション構築専用に設計された、Nordic Semiconductorの拡張可能で統一されたソフトウェア開発キットです。
NCSは、開発プロセスを簡素化し、市場投入時間を短縮するために設計された、すぐに使える豊富なサンプルアプリケーション、プロトコルスタック、ライブラリ、ハードウェアドライバーのエコシステムを提供します。そのモジュラーで設定可能な性質により、開発者はメモリ制約のあるデバイス向けにサイズ最適化されたソフトウェアを構築する柔軟性と、より高度で複雑なアプリケーション向けの強力な機能を得ることができます。NCSはGitHubでホストされているオープンソースプロジェクトであり、Visual Studio Codeなどの統合開発環境に対する優れたサポートを提供します。
VSCodeでのnRF Connect SDK使用
事前にnRF Connect SDK知識をインストール
このドキュメントでは、Windows 11コンピューターにnRF Connect SDK開発環境をインストールする方法を詳しく説明します。以下は、インストールが必要なツールの概要です
-
VS Studio Codeのインストール
-
nRF Command Line Tools
-
nRF Connect for Desktop
-
Git
-
Ninja
ninja --version
- CMake
cmake --version
- Zephyr SDK
west --version
- nRF Connect SDK
- VSCode nRF Connect プラグイン
コンピュータに事前にインストールされている場合は、以下のコマンドでツールのバージョン番号を確認できます
VSCodeでボードを設定し、書き込みファイルをビルドする
VS Codeを開き、プラグインセンターでnRF Connect for VS Code Extension Packを検索してください。このプラグインパックは、nRF Connectに必要な他のVS Codeプラグインを自動的にインストールします。

nRF Connect for VS Code拡張機能により、開発者は人気のVisual Studio Code統合開発環境(VS Code IDE)を利用して、NordicのnRF Connect SDK(Software Development Kit)に基づく組み込みアプリケーションの開発、ビルド、デバッグ、デプロイを行うことができます。この拡張機能には、コンパイラインターフェース、リンカー、完全なビルドシステム、RTOS対応デバッガー、nRF Connect SDKとのシームレスなインターフェース、デバイスツリー可視化エディター、統合シリアルターミナルなどの便利な開発ツールが含まれています。
VS Code用nRF Connect拡張パッケージには、以下のコンポーネントが含まれています:
- nRF Connect for VS Code:メイン拡張機能で、ビルドシステムとnRF Connect SDK間のインターフェース、およびnRF Connect SDKバージョンとツールチェーンを管理するインターフェースが含まれています。
- nRF DeviceTree:デバイスツリー言語サポートとデバイスツリー可視化エディターを提供します。
- nRF Kconfig:Kconfig言語サポートを提供します。
- nRF Terminal:シリアルおよびRTTターミナル。
- Microsoft C/C++:IntelliSenseの機能を含むC/C++の言語サポートを追加します。
- CMake:CMake言語サポート。
- GNU Linker Mapping Files:リンカーマッピングファイルのサポート。 拡張機能を通じて、nRF Connect SDKとそのツールチェーンの任意の希望するバージョンをダウンロードできます。完全なnRF Connect for VS Codeドキュメントは https://docs.nordicsemi.com/bundle/nrf-connect-vscode/page/index.html で利用できます。
ツールチェーンのインストール
ツールチェーンは、アセンブラー、コンパイラー、リンカー、CMakeコンポーネントを含む、nRF Connect SDKアプリケーションをビルドするために連携して動作するツールのコレクションです。 nRF Connect for VS Codeを初めて開くと、ツールチェーンのインストールを求められます。これは通常、拡張機能がコンピュータにインストールされたツールチェーンを検出しない場合に発生します。 Install Toolchainをクリックすると、コンピュータにダウンロードしてインストールできるツールチェーンバージョンのリストが表示されます。使用予定のnRF Connect SDKのバージョンと一致するツールチェーンのバージョンを選択してください。常にnRF Connect SDKの最新のタグ付きバージョンを使用することをお勧めします。
デフォルトでは、nRF Connect for VS CodeはツールチェーンのReleasedタブ(つまり、安定版)のみを表示します。新機能を評価していて、PreviewタブまたはCustomer Sampling(-cs)などの他のタイプのタブを使用したい場合は、以下に示すように「Show all toolchain versions」をクリックしてください:

ここでのToolChainは3.0.1以上です
nRF Connect SDKのインストール
VS Code用nRF Connect拡張機能で、Manage SDKをクリックしてください。Manage SDKメニューから、nRF Connect SDKバージョンをインストールまたはアンインストールできます。拡張機能を初めて使用するため、インターフェースには2つのオプションのみが表示されます。
Install SDKをクリックすると、ローカルにダウンロードしてインストールできる利用可能なnRF Connect SDKバージョンがすべて一覧表示されます。プロジェクトの開発に必要なnRF Connect SDKのバージョンを選択してください。

VS CodeでSDKフォルダを開いている場合、Manage SDKメニューオプションの代わりに、Manage west workspaceが表示されます。この問題を解決するには、VS Codeで別のウィンドウまたはフォルダを開いてください。
ここでのnRF Connect SDKは3.0.1以上です
これらのオプションのいずれも表示されない場合は、最新バージョンのnRF Connect for VS Code拡張パッケージがインストールされていることを確認してください。 nRF Connect SDKはIDE独立であることに注意することが重要です。つまり、任意のIDEを選択して使用するか、まったく使用しないかを選択できます。nRF Connect SDKは https://www.nordicsemi.com/Products/Development-tools/nRF-Util (nrfutil)コマンドラインインターフェース(CLI)を介して利用でき、nRF Connectをダウンロードしてインストールします。ただし、VS CodeでnRF Connect for VS Code拡張機能を使用することを強くお勧めします。これは、便利なグラフィカルユーザーインターフェース(GUI)と効率的なコマンドラインインターフェース(CLI)を統合するだけでなく、ファームウェア開発を大幅に簡素化する多くの機能も含んでいるためです。nRF Connect SDKで動作するように他のIDEを設定するには、このコースの範囲を超える追加の手動ステップが必要です。
ユーザープログラムの作成
この演習では、blinkyサンプルに基づいた簡単なアプリケーションを作成して、開発ボード上のLEDの点滅を制御します。これは、サポートされているすべてのNordicSemiconductor開発ボード(nRF54、nRF53、nRF52、nRF70、またはnRF91シリーズ)に適用されます。目標は、サンプルをビルドして書き込むために必要なすべてのツールが正しく設定されていることを確認することです。焦点は、「Copy Example」テンプレートを使用してアプリケーションを作成し、ビルドして、Nordic チップ開発ボードに書き込む方法を学ぶことです!
- VS Codeで、nRF Connect拡張機能アイコンをクリックしてください。Welcomeビューで、Create New Applicationをクリックしてください。

- 検索バーにblinkyと入力し、以下に示すように2番目のBlinkyサンプル(パス zephyr/samples/basic/blinky)を選択してください。

Blinkyサンプルは、開発ボード上のLED1を継続的に点滅させます。 最初のアプリケーションはBlinkyサンプルに基づいて作成されます。BlinkyサンプルはnRF Connect SDK内のZephyrモールドブロックから派生しているため、サンプルパスにzephyrという名前が表示されます:zephyr\samples\basic\blinky。
XIAO nRF54L15ボードの追加
開始するには、GitHubリンクからリポジトリをクローンしてくださいgit clone https://github.com/Seeed-Studio/platform-seeedboards.git
お好みのローカルフォルダに。クローンしたら、platform-seeedboards/zephyr/
ディレクトリに移動してください。このzephyr
フォルダのパスを覚えておいてください;
VS CodeでnRF Connect用にボードを設定するには、以下の手順に従ってください:
-
VS Codeを開き、Settingsに移動してください。
-
検索ボックスにnRF Connectと入力してください。
-
Board Roots 設定項目を見つけて、settings.json で Edit をクリックします。
-
ダウンロードした XIAO nRF54L15 ボードファイルの
zephyr
パスを boardRoots 配列に追加します。

-
アプリケーションビューで、アプリケーション名の下にある Add Build Configuration をクリックします。
-
Board target で XIAO nRF54L15 のモデルを選択し、Base configuration files でデフォルトの prj.config ファイルを選択し、最後に
Generate and Build
をクリックしてファイルをビルドします。

書き込みプラグインのダウンロード
- Window
- Mac OS
追加プラグイン:
Windows では、Chocolatey パッケージマネージャーを使用して OpenOCD をインストールします。
1.PowerShell を開く(管理者として実行):
- Windows 検索バーで「PowerShell」と入力します。
- "Windows PowerShell" を右クリックして "Run as administrator" を選択します。
2.PowerShell 実行ポリシーを確認:
Get-ExecutionPolicy
と入力して Enter を押します。Get-ExecutionPolicy -List
と入力して Enter を押します。
3.Chocolatey をインストール:
- 以下のコマンドを貼り付けて実行します:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
このコマンドは現在の PowerShell セッションの実行ポリシーをバイパスして Chocolatey をインストールします。インストール後、PowerShell ウィンドウを閉じて再度開いてください(引き続き管理者として実行)。
4.OpenOCD をインストール:
- 新しい PowerShell ウィンドウ(管理者として)で、以下を入力します:
choco install openocd
5.OpenOCD インストールの確認:
-
Get-Command openocd
と入力して Enter を押します。 -
インストールが成功した場合、このコマンドは openocd.exe へのパスを表示します。
追加プラグイン:
macOS では、Homebrew パッケージマネージャーを使用して必要なツールをインストールします。
1.Homebrew をインストール(まだインストールされていない場合):
-
Terminal.app を開きます。
-
以下のコマンドを実行します:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- 画面の指示に従ってください。macOS ユーザーパスワードの入力が必要な場合があります。インストール後、ターミナルが指示するコマンドを実行して Homebrew を PATH 環境変数に追加してください
(例:eval "$(/opt/homebrew/bin/brew shellenv)")
。その後、ターミナルを閉じて再度開いてください。
2.Ccache をインストール:
ターミナルで以下を入力します:
brew install ccache
3.OpenOCD をインストール:
ターミナルで以下を入力します:
brew install openocd
4.OpenOCD インストールの確認:
-
which openocd
と入力して Enter を押します。 -
インストールが成功した場合、このコマンドは
openocd
実行ファイルへのパスを表示します。
West Flash 書き込みプログラム
-
nRF ターミナルを開きます
-
west flash
コマンドを入力するだけです。デバイスにフラッシュするには、単純に west flash コマンドを入力します。赤でハイライトされたパスは、コンパイルされた .elf ファイルの場所を示しています。この同じパスを使用して対応する .hex ファイルを見つけることができ、これは J-Link デバッガーでのプログラミングに適しています。

west flash エラーが発生した場合、VS Code の CMake プラグインとの競合があることを意味し、CMake プラグインを削除する必要があります。

Seeed Studio XIAO nRF54L15 Sense にプログラムを正常に書き込むと、ボード上のユーザーインジケーターが緑色に点滅し続けるのを確認できます。同じ効果が得られた場合、成功です!🎊

Blinky プログラムの説明
/*
* Copyright (c) 2016 Intel Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <stdio.h>
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>
/* 1000 msec = 1 sec */
#define SLEEP_TIME_MS 1000
/* The devicetree node identifier for the "led0" alias. */
#define LED0_NODE DT_ALIAS(led0)
/*
* A build error on this line means your board is unsupported.
* See the sample documentation for information on how to fix this.
*/
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
int main(void)
{
int ret;
bool led_state = true;
if (!gpio_is_ready_dt(&led)) {
return 0;
}
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
return 0;
}
while (1) {
ret = gpio_pin_toggle_dt(&led);
if (ret < 0) {
return 0;
}
led_state = !led_state;
printf("LED state: %s\n", led_state ? "ON" : "OFF");
k_msleep(SLEEP_TIME_MS);
}
return 0;
}
LED デバイス定義:
#define LED0_NODE DT_ALIAS(led0)
:「led0」エイリアスのデバイスツリーノード識別子を取得し、LED へのハードウェア非依存の参照を可能にします。static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios)
:デバイスツリーノードを使用して GPIO 仕様構造体(led
)を作成し、LED のハードウェア詳細(ピン、ポート)を含みます。ここでビルドエラーが発生した場合、サポートされていないハードウェアを示します。
main() 関数の初期化:
-
変数設定:
int ret
:関数の戻り値を格納して操作の成功を確認します。bool led_state = true
:LED の状態を追跡します(「ON」に初期化)。
-
GPIO 準備確認:
if (!gpio_is_ready_dt(&led)) { return 0; }
:LED の GPIO ハードウェアが準備完了かを確認します(例:ドライバーがロードされているか)。準備ができていない場合は終了します。
-
GPIO 設定:
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE)
:LED の GPIO ピンをアクティブハイ出力として設定します。- 失敗時(
ret < 0
)は終了して無効な操作を防ぎます。
メインループ:
無限の while (1)
ループで実行され、LED を定期的に切り替えます:
-
LED 状態の切り替え:
ret = gpio_pin_toggle_dt(&led)
:LED の GPIO 出力を反転します(ON ↔ OFF)。失敗時は終了します。
-
状態追跡の更新:
led_state = !led_state
:ソフトウェア状態フラグをハードウェア状態と同期します。
-
ログと遅延:
printf("LED state: %s\n", led_state ? "ON" : "OFF")
:シリアル出力を介して現在の LED 状態を印刷します。k_msleep(SLEEP_TIME_MS)
:Zephyr の RTOS 遅延関数を使用して 1000ms(1秒)一時停止し、点滅頻度を制御します。
nRF Connect SDK 内部の詳細解説
nRF Connect SDK の内部原理をより深く理解したい場合は、以下のコースを参照してください:
工場出荷時設定の復元
XIAO nRF54L15 ボード用に、ボードを不良状態から回復するための工場リセットスクリプトが提供されています(例:内部 NVM 書き込み保護によりアップロードできない場合)。このスクリプトはフラッシュの一括消去を実行し、工場出荷時ファームウェアをプログラムします。
場所 スクリプトは scripts/factory_reset/ ディレクトリにあります。 使用方法 スクリプトは必要なツールをインストールするためのローカル Python 仮想環境を自動的に作成・管理するため、そのまま実行できます。
Window
- Windows の場合:scripts/factory_reset ディレクトリに移動して実行します:
.\factory_reset.bat
Linux-MacOS
- Linux と macOS の場合:scripts/factory_reset ディレクトリに移動して実行します:
bash factory_reset.sh
ワイヤレス切り替えモード
この例では、Seeed Studio XIAO nRF54L15 の RF スイッチを制御してオンボードの
::: 以下の例は PlatformIO と nRF Connect SDK の両方で動作します。PlatformIO では直接使用でき、SDK では手動でファイルを追加する必要があります。このリンクを参照してください :::

外部アンテナ
-
セラミックアンテナと外部アンテナ。
-
ユーザーボタン(SW0)を押してセラミックアンテナと外部アンテナを切り替えます。
-
ユーザーLEDが現在のアンテナ選択を示します(外部アンテナの場合はLED ON、セラミックアンテナの場合はLED OFF)。
-
起動時のデフォルトアンテナはprj.confで設定できます。
/*
* Copyright (c) 2024 Seeed Technology Co.,Ltd
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/logging/log.h>
#include <zephyr/devicetree.h>
LOG_MODULE_REGISTER(app, CONFIG_LOG_DEFAULT_LEVEL);
/* Devicetree node identifiers */
#define RFSW_REGULATOR_NODE DT_NODELABEL(rfsw_ctl)
#define SW0_NODE DT_ALIAS(sw0)
#define LED0_NODE DT_ALIAS(led0)
/* State variables */
static uint8_t onoff_flag = 0;
#ifdef CONFIG_DEFAULT_ANTENNA_EXTERNAL
static bool is_external_antenna = true;
#else
static bool is_external_antenna = false;
#endif
/* GPIO device specs */
/* Manually build gpio_dt_spec for rfsw_ctl */
static const struct gpio_dt_spec rfsw_gpio = {
.port = DEVICE_DT_GET(DT_GPIO_CTLR(RFSW_REGULATOR_NODE, enable_gpios)),
.pin = DT_GPIO_PIN(RFSW_REGULATOR_NODE, enable_gpios),
.dt_flags = DT_GPIO_FLAGS(RFSW_REGULATOR_NODE, enable_gpios),
};
static const struct gpio_dt_spec button = GPIO_DT_SPEC_GET(SW0_NODE, gpios);
static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);
/* Button callback data */
static struct gpio_callback button_cb_data;
/* Forward declarations */
void button_pressed(const struct device *dev, struct gpio_callback *cb, uint32_t pins);
void update_antenna_switch(void);
/* Function to update antenna switch and LED */
void update_antenna_switch(void)
{
int ret;
is_external_antenna = !is_external_antenna;
if (is_external_antenna) {
/* Switch to external antenna */
LOG_INF("Switching to External Antenna");
// To get a physical high level (Inactive state), we need to set the logic to '0'
ret = gpio_pin_set_dt(&rfsw_gpio, 0);
if (ret < 0) {
LOG_ERR("Error setting rfsw-ctl to physical HIGH: %d\n", ret);
}
// Turn on the LED (set 0 for on)
ret = gpio_pin_set_dt(&led, 0);
if (ret < 0) {
LOG_ERR("Error turning on LED: %d\n", ret);
}
} else {
/* Switch back to ceramic antenna */
LOG_INF("Switching to Ceramic Antenna");
// To get a physical low level (Active state), we need to set the logic to '1'
ret = gpio_pin_set_dt(&rfsw_gpio, 1);
if (ret < 0) {
LOG_ERR("Error setting rfsw-ctl to physical LOW: %d\n", ret);
}
// Turn off the LED (set 1 for off)
ret = gpio_pin_set_dt(&led, 1);
if (ret < 0) {
LOG_ERR("Error turning off LED: %d\n", ret);
}
}
}
/* Button pressed callback function */
void button_pressed(const struct device *dev, struct gpio_callback *cb,
uint32_t pins)
{
update_antenna_switch();
}
int main(void)
{
int ret;
/* Check if GPIO devices are ready */
if (!gpio_is_ready_dt(&rfsw_gpio)) {
LOG_ERR("RF switch control GPIO not ready\n");
return -1;
}
if (!gpio_is_ready_dt(&button)) {
LOG_ERR("Button GPIO not ready\n");
return -1;
}
if (!gpio_is_ready_dt(&led)) {
LOG_ERR("LED GPIO not ready\n");
return -1;
}
/* Configure GPIO pins */
ret = gpio_pin_configure_dt(&rfsw_gpio, GPIO_OUTPUT);
if (ret < 0) {
LOG_ERR("Error configuring rfsw-ctl: %d\n", ret);
return ret;
}
/* Configure LED as output, default off */
ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
LOG_ERR("Error configuring LED: %d\n", ret);
return ret;
}
/* Set initial LED state based on antenna selection */
if (is_external_antenna) {
// External antenna
LOG_INF("Initial state: External Antenna");
ret = gpio_pin_set_dt(&rfsw_gpio, 0);
if (ret < 0) {
LOG_ERR("Error setting rfsw-ctl to physical HIGH: %d\n", ret);
}
ret = gpio_pin_set_dt(&led, 0); // Turn on LED
if (ret < 0) {
LOG_ERR("Error turning on LED: %d\n", ret);
}
} else {
// Ceramic antenna
LOG_INF("Initial state: Ceramic Antenna");
ret = gpio_pin_set_dt(&rfsw_gpio, 1);
if (ret < 0) {
LOG_ERR("Error setting rfsw-ctl to physical LOW: %d\n", ret);
}
ret = gpio_pin_set_dt(&led, 1); // Turn off LED
if (ret < 0) {
LOG_ERR("Error turning off LED: %d\n", ret);
}
}
/* Configure button as input */
ret = gpio_pin_configure_dt(&button, GPIO_INPUT);
if (ret < 0) {
LOG_ERR("Error configuring button: %d\n", ret);
return ret;
}
/* Configure button interrupt */
ret = gpio_pin_interrupt_configure_dt(&button, GPIO_INT_EDGE_TO_ACTIVE);
if (ret < 0) {
LOG_ERR("Error configuring button interrupt: %d\n", ret);
return ret;
}
/* Initialize button callback */
gpio_init_callback(&button_cb_data, button_pressed, BIT(button.pin));
gpio_add_callback(button.port, &button_cb_data);
LOG_INF("Antenna switch example started. Press SW0 to switch.\n");
return 0;
}
外部アンテナまたは内部アンテナを切り替えたい場合は、zephyr/prj.confファイルを変更する必要があります。 外部アンテナを有効にするには # CONFIG_DEFAULT_ANTENNA_EXTERNAL=y のコメントを外してください。内部アンテナを使用する場合は、この行をコメントアウトしてください。
CONFIG_GPIO=y
CONFIG_SERIAL=y
CONFIG_LOG=y
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_SHELL_BACKEND_SERIAL=y
CONFIG_SHELL_BACKEND_DUMMY=n
CONFIG_PM_DEVICE=y
CONFIG_NRFX_POWER=y
CONFIG_POWEROFF=y
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="zephyr-ble"
# Enable this option to default to external antenna
# CONFIG_DEFAULT_ANTENNA_EXTERNAL=y
プログラムを書き込むためのJ-Linkピンへのアクセス
プログラミングにJLinkを使用したい場合は、以下の手順に従ってください。ただし、Seeed Studio XIAO nRF54L15ボードに内蔵されているシリアルポートを使用してプログラミングすることをお勧めします。これははるかに便利です。
必要なハードウェア
nRF54L15モデルボードのサポートを受けるには、最新バージョンのJ-Linkをダウンロードする必要があります。
必要なソフトウェア
ウェブサイトからSeggerソフトウェアをダウンロードする必要があります。
- ステップ 1. Jlinkを使用して以下のピンを接続します:
- ステップ 2. J-Flashを起動してnRF54L15_M33を検索し、新しいプロジェクトを作成します:
- ステップ 3. "Target"をクリックして、"Connect"を選択します。
- ステップ 4. binまたはhexファイルをソフトウェアにドラッグします。その後、F4とF5をその順序で押します。再フラッシュが完了します。
バッテリー駆動ボード
XIAO nRF54L15には電源管理チップが内蔵されており、バッテリーを使用してXIAO nRF54L15を独立して電源供給したり、XIAO nRF54L15のUSBポートを通じてバッテリーを充電したりできます。
XIAOにバッテリーを接続したい場合は、認定された充電式3.7Vリチウムバッテリーを購入することをお勧めします。バッテリーをはんだ付けする際は、プラス端子とマイナス端子を区別するよう注意してください。

バッテリー接続回路図
バッテリー使用に関する注意事項:
- 仕様に適合する認定されたバッテリーを使用してください。
- バッテリー使用中でも、XIAO をデータケーブルでコンピューターデバイスに接続できます。XIAO には回路保護チップが内蔵されているため、安全です。
- XIAO nRF54L15 はバッテリー駆動時には LED が点灯しません(特定のプログラムを書いていない限り)。LED の状態で XIAO nRF54L15 が動作しているかどうかを判断せず、プログラムによって合理的に判断してください。
同時に、バッテリー充電用の赤色インジケーターライトを設計し、インジケーターライトの表示を通じて充電中のバッテリーの現在の状態をユーザーに知らせます。
はんだ付け時に正極と負極をショートさせてバッテリーや機器を焼損させないよう注意してください。
バッテリー電圧検出
XIAO nRF54L15 は、TPS22916CYFPR ロードスイッチを使用してバッテリー電力測定を効率的に管理することを中心としたバッテリー電圧検出機能を統合しています。このガイドでは、バッテリー検出のソフトウェア実装 (特に main.c コード) の分析に焦点を当て、Zephyr NCS SDK の複雑さを避けて、PlatformIO 環境でこの機能を簡単にデプロイして使用する方法をガイドします。

バッテリー検出回路図
TPS22916CYFPR チップの機能:
-
オンデマンドでバッテリー電圧のオン・オフを制御するインテリジェント電源スイッチです。バッテリー電圧を測定する必要がある場合はオンになり、バッテリーを分圧回路に接続します。測定する必要がない場合はオフになり、接続を切断します。
-
この機能は何に役立つのでしょうか? このオンデマンドスイッチング機構により、チップは不要な電流消費を大幅に削減し、バッテリー寿命を効果的に延長します。後続の分圧回路と nRF54L15 の ADC(アナログ-デジタル変換器)と組み合わせることで、XIAO nRF54L15 はバッテリーの残量を正確に監視でき、IoT デバイスなどのバッテリー駆動・低消費電力アプリケーションに重要な範囲最適化を提供します。
以下のサンプルコードは PlatformIO 用に設計されていますが、nRF Connect SDK とも互換性があります。
PlatformIO での XIAO nRF54L15 の使用 PlatformIO で XIAO nRF54L15 を使用したい場合は、このチュートリアルを参照して設定してください:XIAO nRF54L15 PlatformIO 設定。
オーバーレイの追加と conf ファイルの変更
nRF Connect SDK でこのバッテリールーチンを使用したい場合は、app.overlay を追加し、prj.conf ファイルを変更する必要があります。
-
プロジェクトディレクトリの下に
app.overlay
という名前の新しいファイルを作成します。次に、以下のコードを貼り付け、最後に Ctrl + S を押して保存します。- オーバーレイファイルはハードウェア記述層を拡張し、デバイスツリーを通じて物理的なハードウェア接続をカスタマイズします。コードロジックを変更するのではなく、実際のハードウェアの詳細を宣言して、ドライバーが物理デバイスを正しく初期化できるようにします。
app.overlay コード
/ {
/*
* @brief Device Tree Overlay for XIAO nRF54L15
*
* This file customizes the base board device tree to configure
* peripherals for a specific application, including:
* - User-defined ADC channels
* - PWM-controlled LED
* - Buttons and a relay
* - E-paper display (UC8179) via SPI
* - OLED display (SSD1306) via I2C
*
* To switch between the two displays, simply uncomment one and comment
* out the other in the "chosen" node below.
*/
/************************************************************
* Aliases for easy access to devices in application code
************************************************************/
aliases {
pwm-led = &pwm0_led0;
sw1 = &xiao_button0;
relay0 = &xiao_relay0;
};
/************************************************************
* Display selection (choose one if multiple)
************************************************************/
chosen {
zephyr,display = &uc8179_7inch5_epaper_gdew075t7;
zephyr,display = &ssd1306_128x64;
};
/************************************************************
* PWM LED, Button, and Relay configuration
************************************************************/
pwm_leds {
compatible = "pwm-leds";
pwm0_led0: my_pwm_led {
// PWM channel 0 on PWM instance 20
// PWM_MSEC(20) sets a period of 20ms
pwms = <&pwm20 0 PWM_MSEC(20) PWM_POLARITY_NORMAL>;
status = "okay";
};
};
buttons {
compatible = "gpio-keys";
xiao_button0: button_0 {
// Connect to the XIAO nRF54L15 pin D1
// GPIO_PULL_UP ensures the pin is high when the button is not pressed
// GPIO_ACTIVE_LOW means the button press drives the pin low
gpios = <&xiao_d 1 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
zephyr,code = <INPUT_KEY_0>;
};
};
relay {
compatible = "gpio-leds";
xiao_relay0: relay_0 {
// Connect to the XIAO nRF54L15 pin D0
gpios = <&xiao_d 0 GPIO_ACTIVE_HIGH>;
};
};
/************************************************************
* Local nodes that don't modify existing ones
************************************************************/
zephyr,user {
io-channels = <&adc 0>, <&adc 1>, <&adc 2>, <&adc 3>,
<&adc 4>, <&adc 5>, <&adc 6>, <&adc 7>;
};
// MIPI-DBI SPI interface for the E-paper display
mipi_dbi_xiao_epaper {
compatible = "zephyr,mipi-dbi-spi";
spi-dev = <&xiao_spi>;
// D3 pin for Data/Command control
dc-gpios = <&xiao_d 3 GPIO_ACTIVE_HIGH>;
// D0 pin for Reset
reset-gpios = <&xiao_d 0 GPIO_ACTIVE_LOW>;
write-only;
#address-cells = <1>;
#size-cells = <0>;
uc8179_7inch5_epaper_gdew075t7: uc8179@0 {
compatible = "gooddisplay,gdew075t7", "ultrachip,uc8179";
// Max SPI frequency for the display
mipi-max-frequency = <4000000>;
reg = <0>;
width = <800>;
height = <480>;
// D2 pin for Busy signal from the display
busy-gpios = <&xiao_d 2 GPIO_ACTIVE_LOW>;
softstart = [17 17 17 17];
full {
pwr = [07 07 3f 3f];
cdi = <07>;
tcon = <0x22>;
};
};
};
};
/************************************************************
* Device fragments (modifying nodes from the base board DTS)
************************************************************/
// PWM instance 20
&pwm20 {
status = "okay";
pinctrl-0 = <&pwm20_default>;
pinctrl-1 = <&pwm20_sleep>;
pinctrl-names = "default", "sleep";
};
// GPIO pin control
&pinctrl {
pwm20_default: pwm20_default {
group1 {
// Configure PWM channel 0 on P1.04 pin (Pin D0)
psels = <NRF_PSEL(PWM_OUT0, 1, 4)>;
};
};
pwm20_sleep: pwm20_sleep {
group1 {
psels = <NRF_PSEL(PWM_OUT0, 1, 4)>;
low-power-enable;
};
};
};
// PDM instance 20 for DMIC
dmic_dev: &pdm20 {
status = "okay";
};
// Power configuration
&pdm_imu_pwr {
/delete-property/ regulator-boot-on;
};
// UART instance 20
&uart20 {
current-speed = <921600>;
};
// SPI peripheral
&xiao_spi {
status = "okay";
// D1 pin for Chip Select
cs-gpios = <&xiao_d 1 GPIO_ACTIVE_LOW>;
};
// I2C peripheral
&xiao_i2c {
status = "okay";
zephyr,concat-buf-size = <2048>;
ssd1306_128x64: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>;
width = <128>;
height = <64>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <63>;
segment-remap;
com-invdir;
prechargep = <0x22>;
};
};

-
prj.conf ファイルの下に以下の内容を追加します
- prj.conf は Zephyr プロジェクトのコア設定ファイルです。コンパイル時のソフトウェア機能選択のために Kconfig システムによって管理されます。どのドライバー(ADC、ディスプレイ、Bluetooth など)、ミドルウェア(LVGL など)、システムサービス(ログ、メモリ管理など)をファームウェアに含めるかを決定し、それらの動作パラメータ(ログレベル、ヒープサイズなど)を設定します。最後に Ctrl + S を押して保存してください。
prj.conf コード
# =========================================================
# Basic system configuration
# =========================================================
CONFIG_GPIO=y
CONFIG_I2C=y
CONFIG_ADC=y
CONFIG_ADC_ASYNC=y
CONFIG_PWM=y
CONFIG_SENSOR=y
CONFIG_INPUT=y
# =========================================================
# Power management
# =========================================================
CONFIG_PM_DEVICE=y
CONFIG_NRFX_POWER=y
CONFIG_POWEROFF=y
CONFIG_HWINFO=y
CONFIG_CRC=y
# =========================================================
# Serial port and console configuration
# =========================================================
CONFIG_SERIAL=y
CONFIG_CONSOLE=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_UART_ASYNC_API=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_NRFX_UARTE_ENHANCED_RX=y
CONFIG_CBPRINTF_FP_SUPPORT=y
# =========================================================
# Log and Debugging
# =========================================================
CONFIG_LOG=y
CONFIG_LOG_PRINTK=y
CONFIG_LOG_MODE_IMMEDIATE=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_PWM_LOG_LEVEL_DBG=y
CONFIG_PRINTK=y
# =========================================================
# Memory and Stack
# =========================================================
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_HEAP_MEM_POOL_SIZE=16384
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y
# =========================================================
# Bluetooth configuration
# =========================================================
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="zephyr-ble"
# =========================================================
# Audio configuration
# =========================================================
CONFIG_AUDIO=y
CONFIG_AUDIO_DMIC=y
# =========================================================
# Display and Graphics
# =========================================================
CONFIG_DISPLAY=y
CONFIG_MIPI_DBI_SPI=y
CONFIG_SSD1306=y
CONFIG_CHARACTER_FRAMEBUFFER=y
# LVGL Graphics Library
CONFIG_LVGL=y
CONFIG_LV_Z_MEM_POOL_SIZE=49152
CONFIG_LV_Z_SHELL=y
CONFIG_LV_USE_MONKEY=y
CONFIG_LV_USE_LABEL=y
CONFIG_LV_COLOR_DEPTH_1=y
CONFIG_LV_FONT_MONTSERRAT_12=y
CONFIG_LV_FONT_MONTSERRAT_14=y
CONFIG_LV_FONT_MONTSERRAT_16=y
CONFIG_LV_FONT_MONTSERRAT_18=y
CONFIG_LV_FONT_MONTSERRAT_24=y
CONFIG_LV_USE_FONT_COMPRESSED=y
# =========================================================
# Shell configuration
# =========================================================
CONFIG_SHELL=y
CONFIG_SHELL_BACKEND_DUMMY=y

コアコード
#include <inttypes.h>
#include <stddef.h>
#include <stdint.h>
#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/regulator.h>
#include <zephyr/drivers/adc.h>
#include <zephyr/kernel.h>
#if !DT_NODE_EXISTS(DT_PATH(zephyr_user)) || \
!DT_NODE_HAS_PROP(DT_PATH(zephyr_user), io_channels)
#error "No suitable devicetree overlay specified"
#endif
#define DT_SPEC_AND_COMMA(node_id, prop, idx) \
ADC_DT_SPEC_GET_BY_IDX(node_id, idx),
/* Data of ADC io-channels specified in devicetree. */
static const struct adc_dt_spec adc_channels[] = {
DT_FOREACH_PROP_ELEM(DT_PATH(zephyr_user), io_channels,
DT_SPEC_AND_COMMA)};
static const struct device *const vbat_reg = DEVICE_DT_GET(DT_NODELABEL(vbat_pwr));
int main(void)
{
int err;
uint16_t buf;
int32_t val_mv;
struct adc_sequence sequence = {
.buffer = &buf,
/* buffer size in bytes, not number of samples */
.buffer_size = sizeof(buf),
};
regulator_enable(vbat_reg);
k_sleep(K_MSEC(100));
/* Configure channels individually prior to sampling. */
if (!adc_is_ready_dt(&adc_channels[7]))
{
printf("ADC controller device %s not ready\n", adc_channels[7].dev->name);
return 0;
}
err = adc_channel_setup_dt(&adc_channels[7]);
if (err < 0)
{
printf("Could not setup channel #7 (%d)\n", err);
return 0;
}
(void)adc_sequence_init_dt(&adc_channels[7], &sequence);
err = adc_read_dt(&adc_channels[7], &sequence);
if (err < 0)
{
printf("Could not read (%d)\n", err);
return 0;
}
/*
* If using differential mode, the 16 bit value
* in the ADC sample buffer should be a signed 2's
* complement value.
*/
if (adc_channels[7].channel_cfg.differential)
{
val_mv = (int32_t)((int16_t)buf);
}
else
{
val_mv = (int32_t)buf;
}
err = adc_raw_to_millivolts_dt(&adc_channels[7],
&val_mv);
/* conversion to mV may not be supported, skip if not */
if (err < 0)
{
printf(" value in mV not available\n");
}
else
{
printf("bat vol = %" PRId32 " mV\n", val_mv * 2);
}
regulator_disable(vbat_reg);
return 0;
}
リソース
Seeed Studio XIAO nRF54L15
Seeed Studio XIAO nRF54L15 Sense
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます!弊社製品での体験ができるだけスムーズになるよう、さまざまなサポートを提供しています。さまざまな好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。