nRF54L15のカスタムboardを作って、IFをデバッグしてみた内容を紹介します
GPIO,UART,ADC,I2C,SPI,PWM,I2S,NFC含めて確認しています。
実際にデバッグしたテスト内容含めて紹介します。
nRF54L15の評価ボードを自作して、IFをデバッグしてみた
nRF54L15のカスタムboardを制作しましたので、IFをデバッグしてみた内容を紹介します
GPIO,UART,ADC,I2C,SPI,PWM,I2S,NFC含めて確認しています。
実際にデバッグしたテスト内容含めて紹介します。
Maker's nRF54L15 Debug Board
今回作成した基板としてはNordicのnRF54L15を搭載したカスタムボードです。
実際の設計データ作成方法に関しては下記記事を参照ください。
Autodesk Fusionの個人利用で回路図を引いて、基板作ってみた

回路図・BOM・ガーバーデータ
基板の回路図ガーバーデータ・部品表は下記GitHubに保存しています。
ソフトウェアの設計について
このプロジェクトのソフトウェア設計について紹介します。
ソースコードやボードファイル(DeviceTree)は全てGitHubで公開しています
ソフトウェア開発には、RTOSとして Zephyr RTOS を使っています。
そしてSDKとして Nordic Semiconductor nRF Connect SDK を利用しています。
開発環境の構築に関しては下記記事を参照ください。VSCode上で実施しています。
nRF Connectの開発環境をVSCodeで構築してみた

また実際のカスタムボードへのプログラム書き込みについては下記記事で紹介しています。
nRF54L15-DKを使ってSWD (Serial Wire Debug)の書き込み

ソースコード
今回デバッグで使用したソースコードはこちらのGitHubのフォルダにまとめています。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project
また、テストプログラムの実装にあたっては、以下の2つの公式ライブラリを参考にしています。
基本はこの2つから使えそうなものを利用して、弄っただけです。
- Zephyr samples:
zephyr/samples at main · zephyrproject-rtos/zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple... - nRF Connect SDK samples:
sdk-nrf/samples at main · nrfconnect/sdk-nrfnRF Connect SDK main repository. Contribute to nrfconnect/sdk-nrf development by creating an account on GitHub.
ボードファイル (DeviceTree)
ソフトウェア開発には、RTOSとして Zephyr RTOS を使っています。
そしてSDKとして Nordic Semiconductor nRF Connect SDK を利用しています。
ハードウェア情報を定義するボードファイル(DeviceTree)はこちらで公開しています。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/board
具体的には以下のファイルが含まれています。
- test_nrf54l15dk_nrf54l15_cpuapp.dts, dtsi (ARM_M33コア用)
- test_nrf54l15dk_nrf54l15_cpuflpr.dts, dtsi (RISC-Vコア用)
Nordicの評価ボードであるnRF54L15-DKのボードファイルをベースにしています。
今回のカスタムボードに合わせて修正を加えて作成しました。
作成・編集は、開発環境である nRF Connect for VS Code 上で行いました。
これらのボードファイルを使用することで、開発環境を誰でも簡単に再現することが可能です。
プロジェクトのビルド設定時には、主にこのボードファイルを指定して開発を進めます。
nRF54L15 + GPIO
まずは基本的な機能であるGPIOから行いました。
カスタムボード上にはLEDとスイッチが搭載されています。
これらの部品を使って外付け部品なしでGPIOの基本的な動作確認が可能です。
GPIOに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 |
led1: led_1 { gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>; label = "Green LED 1"; |
nRF54L15 + UART
また、Type-Cコネクタ経由でのUSBシリアル(UART)通信も可能です。
GPIOの確認と一緒にデバッグメッセージの確認も行いました。
ボード上にはUSB-UART変換ICとして、Silicon Labs社のCP2102Nを搭載しています。
テストに使用したプログラムは以下のリンクからご確認ください。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/gpio
UARTに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 |
&pinctrl { /omit-if-no-ref/ uart20_default: uart20_default { group1 { psels = <NRF_PSEL(UART_TX, 1, 4)>, <NRF_PSEL(UART_RTS, 1, 6)>; }; group2 { psels = <NRF_PSEL(UART_RX, 1, 5)>, <NRF_PSEL(UART_CTS, 1, 7)>; bias-pull-up; }; }; |
デモの様子はこちらの動画でご覧いただけます。
動画では、LEDが正常に点灯し、GPIOが正しく動作していることが確認できます。
また、Type-Cコネクタ経由でUSBシリアル通信を行っています。
UARTでデバッグメッセージが正常に受信できていることも確認しました。
nRF54L15 + PWM
nRF54L15のPWM機能のデバッグを行いました。
外部のサーボモーター(SG-90)を使用しています。
PWMの周波数を変化させることでモーターの角度制御ができるか検証しました。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/pwm
ボード上には5V電源ピンが用意されています。
外部電源なしで直接ボードからサーボモーターに給電して動作させることが可能です。
PWMに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 |
/omit-if-no-ref/ pwm20_default: pwm20_default { group1 { psels = <NRF_PSEL(PWM_OUT0, 1, 14)>; }; }; |
PWMのデモの様子はこちらの動画でご覧いただけます。
nRF54L15のP1.14ピンをPWM出力として使用しています。
サーボモーター(SG-90)の回転角度を正常に制御できていることが確認できます。
また、オシロスコープでPWM波形を測定し、パルス幅(600us〜2400us)も確認しました。
nRF54L15 + ADC
アナログ入力を扱うADC(Analog-to-Digital Converter)のデバッグも行いました。
外部抵抗やサーマルセンサーを使用して電圧を変化させています。
アナログ値が正しく測定できるか検証しました。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/adc
ADCに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
channel@0 { reg = <0>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>; zephyr,input-positive = <NRF_SAADC_AIN4>; /* P1.11 */ zephyr,resolution = <10>; }; channel@1 { reg = <1>; zephyr,gain = "ADC_GAIN_1"; zephyr,reference = "ADC_REF_INTERNAL"; zephyr,acquisition-time = <ADC_ACQ_TIME_DEFAULT>; zephyr,input-positive = <NRF_SAADC_AIN2>; /* P1.06 */ zephyr,resolution = <12>; zephyr,oversampling = <8>; }; |
**注:** ADCのテストには、ADCチャンネル定義のOverlayファイルを追加します。
今回はnRF54L15-DK用の設定ファイルを参考にしています。
ボード設定時に「Extra Devicetree overlays」で指定しています。
デモの様子はこちらの動画でご覧いただけます。
抵抗(47kΩ固定 + 10kΩ可変)とサーマルセンサー(LM35)を配置しています。
動画では、3つのADCチャンネルを使ってアナログ電圧を測定している様子が確認できます。
① 内部リファレンス電圧を測定し、約0.9Vであること(OK)
②可変抵抗を操作して電圧を変化させ、測定値が約0Vから0.579Vの範囲で変化すること
(計算値とも一致しておりOK)
* Vout_min = 3.3V * (0Ω / (47000Ω + 0Ω)) = 0V
* Vout_max = 3.3V * (10000Ω / (47000Ω + 10000Ω)) = 0.579V
③ サーマルセンサー(LM35)を室温(約24℃)を確認しました。
またコーヒーで加熱した場合の測定値(348mV ≒ 35℃)も確認しています。
nRF54L15 + I2C
I2C(TWIM)のデバッグも行いました。
外部のEEPROM(Atmel AT24C256)を使用して、Read/Write操作ができるか検証しました。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/i2c
I2Cに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 6 |
/omit-if-no-ref/ i2c21_default: i2c21_default { group1 { psels = <NRF_PSEL(TWIM_SDA, 1, 11)>, <NRF_PSEL(TWIM_SCL, 1, 12)>; }; }; |
デモの様子はこちらの動画でご覧いただけます。
動画では、nRF54L15からEEPROMへSCLとSDAの信号線を接続しています。
SCLクロックは100kHzに設定しました。
デバッグメッセージにより、I2CのRead/Write操作が成功していることが確認できます。
さらに、オシロスコープでSCL(CH1)とSDA(CH2)の波形を測定しました。
波形から、I2C通信中にデータ「0xAA」の書き込みまたは読み出しが確認できます。
また、SCLクロックの波形も約100kHzであることを確認しました。
nRF54L15 + SPI
SPIのデバッグを行いました。
ボード上に搭載されているFLASH(Macronix MX25L6433FZNI-08G)を使用しています。
Read/Write操作ができるか検証しました。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/spi
SPIに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 6 7 |
/omit-if-no-ref/ spi00_default: spi00_default { group1 { psels = <NRF_PSEL(SPIM_SCK, 2, 1)>, <NRF_PSEL(SPIM_MOSI, 2, 2)>, <NRF_PSEL(SPIM_MISO, 2, 4)>; }; }; |
デモの様子はこちらの動画でご覧いただけます。
nRF54L15とFLASH ROMは、設計したボード上に実装されています。
ボードをリセットすると、nRF54L15がSPI通信を開始します。
デバッグメッセージにより、SPIのRead/Write操作が成功していることが確認できます。
(データは0x55 0xAA 0x66 0x99を使用)
nRF54L15 + I2S
I2Sのデバッグを行いました。
外部のI2S-DACデコーダーとスピーカーを使用して、ビープ音を鳴らせました。
DAC ICにはMAX98357Aボードを使用しました。Amazonでも売っている汎用ボードです。
**注:** これは簡易的なI2Sデモです。
nRF54L15にはオーディオPLLがないため、48KHz/24KHz/16KHzのような非常に正確なサンプリング周波数を生成することはできません。
また、サンプリング周波数をトランスポート層(例: BLE)と同期させるように調整することもできないため、いくつかの制限がある可能性があります。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/i2s
I2Sに関するDeviceTreeの設定の一部を以下に示します。
1 2 3 4 5 6 7 |
/omit-if-no-ref/ i2s0_default_alt: i2s0_default_alt { group1 { psels = <NRF_PSEL(I2S_SCK_M, 1, 12)>, <NRF_PSEL(I2S_LRCK_M, 1, 13)>, <NRF_PSEL(I2S_SDOUT, 1, 11)>; }; }; |
デモの様子はこちらの動画でご覧いただけます。
動画では、DAC+スピーカーとnRF54L15をI2Sで接続し、ビープ音のみを鳴らす準備をしています
リセットすると、I2S経由でビープ音が鳴る様子が確認できます。
オシロスコープで波形も確認しました。(CH1: 3.3V, CH2: BCLK, CH3: DIN, CH4: LRC)
BCLKの波形は約1.4 MHzでした。これは以下の計算に基づくと予想通りの値です。
BLCK = 44100 Hz × 2チャンネル × 16ビット/チャンネル = 1.4112 MHz
nRF54L15 + NFC
最後に、NFC機能のデバッグを行いました。
外部のNFCアンテナとして、Nordic nRF54L15 DKに付属していたものを使用しました。
**注:** これは簡易的なNFCデモです。
NFCアンテナは今回のデモのためにジャンパー線で接続を修正しています。
NFCフィルターも未搭載です。この回路は完全な/標準的なものではありません。
テストに使用したプログラムはこちらです。
https://github.com/iotengineer22/Board-Designer-Competition/tree/main/src/project/nfc
nRF54L15は専用のNFCTペリフェラルを持っています。
またNFCT_ANT1およびNFCT_ANT2というNFC通信専用のRFピンを持っています。
一般的なGPIOピンとは異なります。
prj.conf
でのソフトウェア設定でNFCTハードウェアを有効化してます。
1 2 3 4 5 6 |
CONFIG_NFC_T2T_NRFXLIB=y CONFIG_NFC_NDEF=y CONFIG_NFC_NDEF_MSG=y CONFIG_NFC_NDEF_RECORD=y CONFIG_NFC_NDEF_URI_REC=y CONFIG_NFC_NDEF_LAUNCHAPP_MSG=y |
今回はNFCアンテナをフィルターなしで直接接続しています(適切な回路ではありません)。
適切なNFC回路の詳細は、以下のデータシートのセクションを参照してください。
https://docs.nordicsemi.com/bundle/ps_nrf54L15/page/nfct.html#ariaid-title11
デモの様子はこちらの動画でご覧いただけます。
動画では、「nRF NFC Toolbox」というアプリを使ってNFC通信を確認しています。
今回はフィルターなし、アンテナ直結という簡易回路です。
検出にやや時間がかかりますが、最終的にNFCタグとして検出することができました。
適切に設計されたNFC回路であれば、より迅速な検出が可能です。
Nordic nRF54L15 DKを使用すると、NFCタグ情報を素早く検出できました。
まとめ
nRF54L15のカスタムboardを作って、IFをデバッグしてみた内容を紹介します
GPIO,UART,ADC,I2C,SPI,PWM,NFC含めて確認しています。
実際にデバッグしたテスト内容含めて紹介しました。
コメント