Seeed Studio XIAO nRF52840(Sense)での NFC の使い方
Seeed Studio XIAO nRF52840 シリーズの両方には、nRF52840 に内蔵された NFCT(Near Field Communication Tag)ペリフェラルをベースとしたNFC(近距離無線通信)モジュールが搭載されています。NFC Type 2 Tag 機能をサポートしており、外部 NFC アンテナを接続することで、XIAO nRF52840 を NFC タグとして動作させ、スマートフォンやその他の NFC リーダーから読み取ることができます。
この Wiki では、ライブラリのインストール、ハードウェア接続、アンテナのチューニング、セットアップの検証、自分だけの NFC タグの作成まで、NFC の使用ワークフロー全体を順を追って説明します。
このチュートリアルは XIAO_nRF52840_NFC ライブラリに基づいています。Seeed nRF52 Boards バージョン 1.1.13 でテストおよび確認済みです。
事前準備
ボードライブラリのインストールについては、Seeed nRF52 Boards のインストールを完了するために このチュートリアル を参照してください。すでにインストール済みの場合は、次に進みましょう。

Boards Manager で必ず Seeed XIAO nRF52840 ボードを選択してください。古い「Seeed nRF52 mbed-enabled Boards」ライブラリはすでにメンテナンスされておらず、使用すべきではありません。
必要なハードウェア
| Seeed Studio XIAO nRF52840 | Seeed Studio XIAO nRF52840 Plus |
|---|---|
![]() | ![]() |
| Seeed Studio XIAO nRF52840 Sense | Seeed Studio XIAO nRF52840 Sense Plus |
![]() | ![]() |
基本的な NFC 機能は、NFC1/NFC2 にアンテナをはんだ付けするだけで動作します。コミュニティでのテスト(Seeed フォーラムの andriandreo 氏に特に感謝します)の結果、以下の 2 種類のアンテナは、追加の回路チューニングなしで、はんだ付け直後から動作することが確認されました。
- MOLEX 1462360051
- TAOGLAS FXR.07.A.DG
その後、TAOGLAS FXR.07.A.DG の問い合わせ距離をさらに向上させるために、各 NFC パッド(D14, D15)から GND へ 43 pF のチューニングコンデンサを 2 個追加しました。約 40 pF というコンデンサ値は、nRF52840 MCU プロダクト仕様データシートの 「6.14.10 NFCT antenna recommendations」 節から算出したものです。
不安定な動作(ポップアップが途中で止まる、検出が断続的になるなど)が発生する場合は、マッチングコンデンサを追加することで信頼性が大幅に向上します。詳細は Antenna Tuning を参照してください。
より実践的なテスト結果については、元のフォーラムディスカッションもチェックしてみてください。
必要なソフトウェア
| 項目 | バージョン / 備考 |
|---|---|
| Arduino IDE | 1.8.x 以降 |
| Seeed nRF52 Boards | 1.1.13(Arduino IDE の Boards Manager からインストール) |
| XIAO_nRF52840_NFC ライブラリ | GitHub からダウンロードし、Sketch > Include Library > Add .ZIP Library からインストール(下記参照) |
| NFC Tools アプリ | Android / Apple |
XIAO_nRF52840_NFC ライブラリのインストール
このライブラリは Arduino Library Manager には含まれていないため、GitHub から手動でインストールする必要があります。
- Step 1. XIAO_nRF52840_NFC の GitHub リポジトリにアクセスし、緑色の Code ボタンをクリックして Download ZIP を選択します。

- Step 2. Arduino IDE を開き、Sketch > Include Library > Add .ZIP Library... を選択します。

-
Step 3. ダウンロードした ZIP ファイル(
XIAO_nRF52840_NFC-main.zip)を選択します。ステータスバーに "Library added to your libraries" と表示されるはずです。 -
Step 4. Arduino IDE を再起動します。再起動後、File > Examples > XIAO_nRF52840_NFC の下にサンプルが表示されるはずです。

ハードウェア接続
XIAO nRF52840 の NFC ピンはボードの裏面にあり、P0.09 と P0.10 と表示されています。
D14 (P0.09) — NFC1 — Antenna end A
D15 (P0.10) — NFC2 — Antenna end B
以下のように、NFC アンテナを P0.09 と P0.10 にはんだ付けします。
このチュートリアルでは、デモとして Nordic 推奨の NFC アンテナを接続した Seeed Studio XIAO nRF52840 を使用します。
表面(フロント)ビュー:

裏面(バック)ビュー:

- NFC アンテナは差動信号であり、極性はありません — どちらの端子を D14 または D15 に接続してもかまいません。
- 2 本のピンは、XIAO nRF52840 および XIAO nRF52840 Sense では工場出荷時に NFC アンテナモード(UICR =
0xFFFFFFFF)として設定されています。XIAO nRF52840 Plus および XIAO nRF52840 Sense Plus では、デフォルトで GPIO として設定されている場合があるため、まず UICR を確認してください(Step 1 を参照)。 - はんだ付け前に、マルチメータでアンテナ端子間の直流抵抗を測定することを推奨します(通常 1~3 Ω)。これにより導通を確認し、ショートを排除できます。
アンテナのチューニング
NFC は共振 LC タンク回路に依存しています。アンテナコイルがインダクタンス(L)を提供し、マッチングコンデンサがキャパシタンス(C)を提供します。これらが組み合わさることで、ターゲット周波数で共振する回路が形成されます。
f = 1 / (2π√(LC))
ターゲットは13.56 MHzです。外付けコンデンサがない場合、nRF52840 内部の約 4 pF の寄生容量だけが関与するため、共振点は 13.56 MHz から大きく外れてしまいます。NFC 機能自体は動作しますが、通信が不安定になる可能性があります。スマートフォンのポップアップに「NFC タグを検出」と表示されても内容が完全に読めなかったり、シリアル出力にエラーコードが表示されたりします。マッチング用コンデンサを追加して LC タンクを共振させることで、信頼性が大幅に向上します。
以下の操作はすべて Nordic Official NFC Antenna Design ドキュメントに基づいています。チップは、共振時に差動 100 Ω の負荷を見たときにのみフルパワーを出力します。
固定パラメータ
| 項目 | 固定値 | 出典 |
|---|---|---|
| 動作周波数 f | 13.56 MHz | グローバル NFC 規格、nRF52840 にハードコード済み |
| 負荷インピーダンス | 100 Ω(差動) | Nordic ホワイトペーパー nWP_026 |
必要な測定項目
- コイルインダクタンス L — DMM / LCR メータ / VNA を使って 100 kHz で測定し、単位は µH。
- コイル損失抵抗 R — 同じ画面に表示される直列抵抗値を読み取り、単位は Ω。
ステップ 1: インピーダンス事前チェック
インピーダンス変換式を使用します:

目標値:90–120 Ω、100 Ω に近いほど良好です。
| 結果 | 意味 | 次のステップ |
|---|---|---|
| < 60 Ω | アンテナが小さすぎる | 巻き数を増やすか、コイル面積を大きくする |
| 90 – 120 Ω | 合格 | ステップ 2 へ進む |
| > 150 Ω | アンテナが大きすぎる | 巻き数を減らすか、コイル面積を小さくする |
このゲートを通過してから初めてコンデンサ値を計算します。そうでなければ、どんなコンデンサ値も意味がありません。
ステップ 2: 共振用容量の計算
固定 13.56 MHz の式:

これにより必要な総容量が得られます。π ネットワークの場合は等分します:
C1 = C2 = C / 2
最も近い E12 系列の値(例:39 pF、47 pF、56 pF、68 pF …)を選択します。
推奨アンテナ
LCR メータを持っておらず、既知のスタートポイントを使いたい場合は、標準的な 13.56 MHz NFC コイルアンテナが XIAO nRF52840 でうまく動作します。以下はテスト時に使用したアンテナです:
| パラメータ | 値 |
|---|---|
| タイプ | 13.56 MHz NFC コイル |
| 直流抵抗 | 約 2.3 Ω |
| 接続 | NFC1 / NFC2 に直接はんだ付け |
上記のアンテナは Seeed Studio 製品ではありません。ここで示した仕様に近い 13.56 MHz NFC コイルアンテナであれば、どれでも使用できます。重要なのは、インダクタンスを測定し、上記の式を使ってマッチング用コンデンサ値を計算することです。
NFC セットアップ & サンプル
以下のワークフローでは、まず NFC ハードウェア構成を検証し、その後に独自の NFC タグを作成する手順を説明します。ここでは、nRF52840 の NFCT ペリフェラルをシンプルな Arduino API にラップした XIAO_nRF52840_NFC ライブラリを使用します。
このライブラリには 6 つのサンプルスケッチが含まれています:
| カテゴリ | サンプルスケッチ | 目的 |
|---|---|---|
| 検証 | xiao-nrf52840-nfc-probe | UICR ピン設定の確認 + RF リンクの検証 |
xiao-nrf52840-nfc-restore-uicr | NFC ピンが GPIO に変更されている場合に復元する | |
| Plus 向け修正 | xiao-nrf52840-plus-bootloader-verify | UICR 復元前に Plus バリアントのブートローダを検証する |
| デモ | xiao-nrf52840-nfc-tag-readonly | 読み取り専用タグ — スマートフォンが固定 URL を読み取る |
xiao-nrf52840-nfc-tag-writable | 書き込み可能タグ — スマートフォンからタグへデータを書き込める | |
xiao-nrf52840-nfc-tag-persistent | 永続タグ — データが電源再投入後も保持される(Flash に保存) |
ステップ 1: UICR ピン設定の確認
目的:P0.09 / P0.10 が NFC アンテナピンとして設定されていることを確認します。
File > Examples > XIAO_nRF52840_NFC > xiao-nrf52840-nfc-probe を開き、ボードに書き込みます。(ステップ 1 と 2 は同じスケッチを共有しているため、1 回の書き込みで両方を実行できます。)
シリアルモニタを 115200 baud で開きます。最初の数行に現在の UICR ステータスが表示されます:

出力の読み取り方:
| UICR 値 | 意味 | アクション |
|---|---|---|
0xFFFFFFFF | NFC アンテナモード ✅ | ステップ 2 に進む |
0xFFFFFFFE | GPIO モード ❌ | まず(Plus バリアントでは)xiao-nrf52840-plus-bootloader-verify を書き込み、その後 xiao-nrf52840-nfc-restore-uicr を書き込み、シリアルモニタで RESTORE_NFC を送信し、Verify result: PASS を確認してからボードの電源を入れ直します |
XIAO nRF52840 と XIAO nRF52840 Sense は、工場出荷時に UICR = 0xFFFFFFFF(NFC モード)に設定されています。ほとんどの場合、このステップは合格となり、追加の操作は不要です。XIAO nRF52840 Plus と XIAO nRF52840 Sense Plus は GPIO モードで出荷される場合があります — 出力が 0xFFFFFFFE を示している場合は、以下の復元手順に従ってください。
ステップ 2: プローブ — RF リンクの検証
目的:スマートフォンからの NFC コマンドフレームがボードに届いていることを確認します。
UICR チェックの後、同じスケッチは自動的に Probe モード に入ります。このモードでは、タグはどのフレームにも応答しません。受信方向だけを切り出すことで、RF リンクが生きているかどうかを簡単に確認できます。
スマートフォンの NFC エリアをアンテナに数秒間近づけ、その後シリアルモニタの出力を確認します:

重要な指標:
| カウンタ | 意味 | 合格基準 |
|---|---|---|
FIELD_DETECT | スマートフォンの 13.56 MHz RF フィールドを検出 | > 0 |
FIELD_LOST | RF フィールドが消失 | FIELD_DETECT に近い値 |
READER_FRAMES | スマートフォンから受信した NFC コマンドフレーム | > 0(重要) |
READER_FRAMES > 0は、スマートフォンのコマンドフレームがボードに正常に届き、双方向 RF リンクが確立されていることを意味します。この段階では(Probe モードは応答しないため)、スマートフォン側にポップアップは表示されないはずです。
よくあるエラーコード:
| エラーコード | 名称 | 意味 |
|---|---|---|
0x01 | FRAMEDELAYTIMEOUT | フレーム遅延タイムアウト — 期待された間隔内に次のコマンドを受信できなかった |
0x02 | NFCANTENNAERROR | NFCT がアンテナを駆動できない — 通常はインピーダンス不整合またはアンテナ未接続が原因 |
0x80 | RX フレーム受信エラー | フレームは受信したが CRC / パリティチェックに失敗した(Readonly 段階で現れる場合あり) |
デモ 1: 読み取り専用タグ
目的:固定 URL をブロードキャストするシンプルな NFC タグです。スマートフォンがそれを読み取り、ポップアップを表示します — 最も一般的な NFC のユースケースです。
File > Examples > XIAO_nRF52840_NFC > xiao-nrf52840-nfc-tag-readonly を開いて書き込みます。スマートフォンをアンテナの上に 2〜3 秒間置きます。

スマートフォンには、https://seeedstudio.com というリンクを含むポップアップが表示されるはずです。

主要な指標:
| カウンタ | 意味 | 合格基準 |
|---|---|---|
FIELD_DETECT | スマートフォンの13.56 MHz RFフィールドを検出 | > 0 |
SELECTED | スマートフォンがアンチコリジョン+SELECTハンドシェイクを完了 | > 0(コア指標) |
READ | スマートフォンがNDEFデータページの読み取りに成功 | > 0 |
FAST_READ | 受信したFAST_READリクエストの数 | 0 または少数(正常) |
UNSUPPORTED | スマートフォンが未サポートのコマンドを送信 | 少し発生するのは正常 |
SELECTED > 0が重要なしきい値です:アンチコリジョンフローが通過し、スマートフォンがType 2 Tagを認識したことを意味します。READ > 0は、実際にNDEFページが読み取られたことを示します。最終的な確認は、スマートフォンに完全なURLポップアップが表示されることです。
URLはスケッチ内にハードコードされています。変更するには、スケッチを開いてNDEFメッセージを修正し、再度アップロードしてください。タグデータはRAMに保存されており、電源を切ると失われます。
デモ2: 書き込み可能タグ
目的: スマートフォンが読み取りと書き込みの両方を行えるNFCタグ。タグはデフォルトURI(https://seeedstudio.com)から開始し、スマートフォンは NFC Tools アプリを使って新しいNDEFコンテンツでそれを上書きできます。
File > Examples > XIAO_nRF52840_NFC > xiao-nrf52840-nfc-tag-writable を開き、アップロードします。
テスト手順:
- ステップ1. 115200ボーでシリアルモニタを開きます。ブートログにはタグID(NFCID1)、初期メモリダンプ、およびデフォルトURI(
https://seeedstudio.com)が表示されます。

ブートログには、タグがブロードキャストするデフォルトURIも出力されます:

-
ステップ2. まずスマートフォンでタグを読み取ります。スマートフォンは
https://seeedstudio.comを検出するはずです。 -
ステップ3. NFC Tools(または任意のNFCライターアプリ)を開き、タグに書き込みたい内容を入力します。この例では、シンプルなテキスト
hello!を書き込みます。内容を入力したら、"Write / XX Bytes" をクリックします — バイト数はコンテンツの長さによって変わります。

- ステップ4. 再度タグを読み取ります。スマートフォンには、今書き込んだ新しいコンテンツ(
hello!)が表示されるはずです。

スマートフォンがNFCフィールドから離れると、シリアルモニタには、読み取り後の書き込みセッション全体を反映した更新済みの主要指標が表示されます:

主要な指標:
| カウンタ | 意味 | 合格基準 |
|---|---|---|
FIELD_DETECT | スマートフォンの13.56 MHz RFフィールドを検出 | > 0 |
SELECTED | スマートフォンがアンチコリジョン+SELECTハンドシェイクを完了 | > 0(コア指標) |
READ | スマートフォンがNDEFデータページの読み取りに成功 | > 0 |
WRITE | スマートフォンがタグへのデータ書き込みに成功 | > 0(コア指標) |
FAST_READ | 受信したFAST_READリクエストの数 | 0 または少数(正常) |
WRITE_REJECTED | 書き込みが拒否された回数(保護されたページ) | 0(標準的なアプリでは発生しないはず) |
UNSUPPORTED | スマートフォンが未サポートのコマンドを送信 | 少し発生するのは正常 |
WRITE > 0はWritableにおける重要なしきい値です:スマートフォンがタグへのデータ書き込みに成功したことを意味します。WRITE_REJECTEDは常に0のままであるべきです — これが増加する場合は、書き込みセッション中に何か問題が発生したことを示します。
書き込まれたデータは RAMのみに 保存され、電源を切ると失われてデフォルトURIに戻ります — そのため、繰り返し書き込みテストを行うのが容易です。電源オフ後も保持する必要があるデータには、以下の Persistent Tag デモを使用してください。
デモ3: 永続タグ
目的: 電源を切ってもデータが保持されるNFCタグ。NDEFコンテンツはnRF52840の内部Flashメモリ(LittleFS)に保存されるため、ボードの電源を切って再投入した後でも保持されます — 長期運用に最適です。
File > Examples > XIAO_nRF52840_NFC > xiao-nrf52840-nfc-tag-persistent を開き、アップロードします。
テスト手順:
- ステップ1. 初回起動時に、115200ボーでシリアルモニタを開きます。ブートログにはデフォルトURIと
Storage state: no stored content, using default URIが表示されます。

-
ステップ2. スマートフォンでタグを読み取ります。初回起動時、スマートフォンは
https://seeedstudio.comを検出します。 -
ステップ3. NFC Tools(または任意のNFCライターアプリ)を開き、タグに新しいテキストまたはURLレコードを書き込みます。この例では、シンプルなテキスト
hi!を書き込みます。内容を入力したら、"Write / XX Bytes" をクリックします — バイト数はコンテンツの長さによって変わります。

- ステップ4. スマートフォンがNFCフィールドから離れた後、シリアルモニタには
Storage: tag content saved to flashと表示され、内部Flashへの書き込みが完了したことが確認できます。

-
ステップ5. ボードの電源を入れ直します(パワーサイクル) — USBケーブルを抜き、再度接続します。
-
ステップ6. 再起動後、シリアルモニタには
Storage state: previous content restored from flashと表示され、書き込んだ内容が電源オフ後も保持されていることが確認できます。

- ステップ7. 再度スマートフォンでタグを読み取ります。スマートフォンには、ステップ3で書き込んだ内容が表示されるはずです — 電源を入れ直した後でも同じです。


主要な指標:
主要な指標は書き込み可能タグと同じです — 一覧については Writable Tag table を参照してください。
ブートログ内の
Storage state: previous content restored from flashが、Persistentにおける中核的な確認項目です:データがパワーサイクルを生き延びたことを意味します。Storage: tag content saved to flashは、各書き込みがFlashに保存されたことを確認します。
ステップ7では、スマートフォンは復元されたコンテンツを 読み取るだけ で、何も書き込みません。そのため、カウンタ内の WRITE は0のままですが、これは想定どおりです。WRITE > 0 が見られるのは、前の書き込みセッション(ステップ3〜4)の間だけです。
- 保存されたコンテンツは、スケッチ領域とは別の 内部Flashファイルシステム(
/nfc-tag-data.bin)に存在し、スケッチを再アップロードしても保持されます。 - いつでもデフォルトURIを復元するには、シリアルモニタで
RESET_TAGを送信します。 - Flashへの保存は、スマートフォンがフィールドから離れた後、書き込みセッションごとに1回行われます。スマートフォンを早く離しすぎると、コンテンツが不完全になる場合があります — その場合は、再度書き込めば修正できます。
3つのデモのまとめ:
| デモ | データ保存先 | 電源オフ後も保持されるか | スマートフォンから書き込み可能 |
|---|---|---|---|
| 読み取り専用タグ | RAM | ❌ | ❌ |
| 書き込み可能タグ | RAM | ❌ | ✅ |
| 永続タグ | Flash | ✅ | ✅ |
リソース
- [GitHub] XIAO_nRF52840_NFC Library — このチュートリアルで使用しているオープンソースのNFCライブラリ
謝辞
XIAO nRF52840 上での NFC アンテナ(MOLEX 1462360051 および TAOGLAS FXR.07.A.DG)の広範な実環境テストを行ってくださった andriandreo 氏と、コンデンサ計算のガイダンスおよび iPhone 互換性トラブルシューティングにご協力いただいた PJ_Glasso 氏に特別な感謝を申し上げます。
ここで取り上げていない NFC の問題に遭遇した場合は、元のフォーラムスレッドで有用なヒントが見つかるかもしれません:
技術サポート & 製品ディスカッション
弊社製品をお選びいただきありがとうございます。製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに応じて選べる複数のコミュニケーションチャネルをご用意しています。



