SparkFun Pro nRF52840 MiniをArduino Coreで使う

ArduinoでBLE開発をする際に大変便利なnRF52840のブレイクアウトボードですが、開発環境のセットアップに戸惑ったので備忘録を残しておきます。

# 対象ボードについて

[SparkFun Pro nRF52840 Mini](https://learn.sparkfun.com/tutorials/sparkfun-pro-nrf52840-mini-hookup-guide)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59328/1128dfbc-347f-97a6-b477-08a5a2f265af.png)


国内でも入手性の良いボードで、千石電商やスイッチサイエンスさんで取り扱いがあります。

- https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5CP8
- https://www.switch-science.com/catalog/5508/

記事執筆時点(19/08/20)で、ArduinoでBLE開発を手軽に行うのにとても適したボードだと思います。
Adafruitの強力なライブラリを使用できますが、利用にあたりいくつか注意点があります。

#### ハードウェア

##### ピン配列の違い
Adafruit の Feather nRF52840 Express は情報が多いですが、現在ディスコンになっています。
SparkFun Pro nRF52840 Miniは上記と同型のブレイクアウトボードですが、ピン配置の違いが大きくあります。

##### I2C端子が扱いづらい
I2C端子がQwiic端子というJST-SH4ピンの独自規格で、簡単には引き出せません。
自前で配線するか、ブレッドボードで扱う場合は下記の変換ケーブルを買うしかありません。

[Qwiicケーブル（Qwiic - 4ピンオス）](https://www.switch-science.com/catalog/3541/)

#### ソフトウェア

##### Adafruitボードの完全互換ではない
Adafruitのライブラリを使用できますが、そのままでは、単なるnRF52840が動く"のみ"のボードとなってしまいます。

下記で紹介するセットアップを飛ばしても、Adafruitのライブラリをインポートし、ボード設定を```Nordic nRF52840DK PCA10056```とすることでも使用できるようですが、正式サポートではないので下記のセットアップをお勧めします。

# 開発環境のセットアップ

基本的には下記ページに沿ってセットアップしていくのですが、全て英語なので重要な点をかいつまんで説明します。

https://learn.sparkfun.com/tutorials/nrf52840-development-with-arduino-and-circuitpython#arduino-installation


### Adafruitのリポジトリを追加してインストール

ArduinoのボードマネージャのURLに下記のURLを追加して、ボードマネージャからインストールします。
https://www.adafruit.com/package_adafruit_index.json

※追加の仕方は各自ググってください。

### SparkFunのボード定義を追加

下記の場所にあるファイルを直接編集してボード定義を追加します。
Windows: ```%LOCALAPPDATA%\Arduino15\packages\adafruit\hardware\nrf52\<version>```

```boards.txt
#**********************************************
# SparkFun Pro nRF52840 Mini
#**********************************************
sparkfunnrf52840mini.name=SparkFun Pro nRF52840 Mini

# DFU Mode with CDC only
sparkfunnrf52840mini.vid.0=0x1B4F
sparkfunnrf52840mini.pid.0=0x002A

# DFU Mode with CDC + MSC (UF2)
sparkfunnrf52840mini.vid.1=0x1B4F
sparkfunnrf52840mini.pid.1=0x0029

# Application with CDC + MSC
sparkfunnrf52840mini.vid.2=0x1B4F
sparkfunnrf52840mini.pid.2=0x8029

# CircuitPython
sparkfunnrf52840mini.vid.2=0x1B4F
sparkfunnrf52840mini.pid.2=0x802A

sparkfunnrf52840mini.bootloader.tool=bootburn

# Upload
sparkfunnrf52840mini.upload.tool=nrfutil
sparkfunnrf52840mini.upload.protocol=nrfutil
sparkfunnrf52840mini.upload.use_1200bps_touch=true
sparkfunnrf52840mini.upload.wait_for_upload_port=true
#sparkfunnrf52840mini.upload.native_usb=true

# Build
sparkfunnrf52840mini.build.mcu=cortex-m4
sparkfunnrf52840mini.build.f_cpu=64000000
sparkfunnrf52840mini.build.board=NRF52840_FEATHER
sparkfunnrf52840mini.build.core=nRF5
sparkfunnrf52840mini.build.variant=sparkfun_nrf52840_mini
sparkfunnrf52840mini.build.extra_flags=-DNRF52840_XXAA {build.flags.usb}
sparkfunnrf52840mini.build.vid=0x1B4F
sparkfunnrf52840mini.build.pid=0x5284
sparkfunnrf52840mini.build.usb_manufacturer="SparkFun"
sparkfunnrf52840mini.build.usb_product="nRF52840 Mini Breakout"

# SofDevice Menu
# Ram & ROM size varies depending on SoftDevice (check linker script)

sparkfunnrf52840mini.menu.softdevice.s140v6=s140 6.1.1 r0
sparkfunnrf52840mini.menu.softdevice.s140v6.build.sd_flags=-DS140
sparkfunnrf52840mini.menu.softdevice.s140v6.build.sd_name=s140
sparkfunnrf52840mini.menu.softdevice.s140v6.build.sd_version=6.1.1
sparkfunnrf52840mini.menu.softdevice.s140v6.build.sd_fwid=0x00B6
sparkfunnrf52840mini.menu.softdevice.s140v6.build.ldscript=nrf52840_s140_v6.ld
sparkfunnrf52840mini.menu.softdevice.s140v6.upload.maximum_size=815104
sparkfunnrf52840mini.menu.softdevice.s140v6.upload.maximum_data_size=248832

# Debug Menu
sparkfunnrf52840mini.menu.debug.l0=Level 0 (Release)
sparkfunnrf52840mini.menu.debug.l0.build.debug_flags=-DCFG_DEBUG=0 -Os
sparkfunnrf52840mini.menu.debug.l1=Level 1 (Error Message)
sparkfunnrf52840mini.menu.debug.l1.build.debug_flags=-DCFG_DEBUG=1 -Os
sparkfunnrf52840mini.menu.debug.l2=Level 2 (Full Debug)
sparkfunnrf52840mini.menu.debug.l2.build.debug_flags=-DCFG_DEBUG=2 -Os
sparkfunnrf52840mini.menu.debug.l3=Level 3 (Segger SystemView)
sparkfunnrf52840mini.menu.debug.l3.build.debug_flags=-DCFG_DEBUG=3 -Os
```

下記リポジトリからzipでダウンロードし、
https://github.com/sparkfun/nRF52840_Breakout_MDBT50Q

解凍したフォルダにある```/firmware/Arduino/variants/sparkfun_nrf52840_mini```を、上記のboards.txtがあった場所と同じ場所へコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59328/3b92ea82-984b-3b7c-b06e-532af958c908.png)
※画像はSparkFunのサイトから引用

### ArduinoIDEを再起動
重要な手順です。
ArduinoIDEを起動している場合、再起動しないとボード情報が正常に反映されません。


# 注意点

- Adafruit nRF52のライブラリが更新されるたびに上記の作業を行う必要があります。
- ライブラリを更新する場合、Adafruit nRF52のバージョンと、SparkFunのライブラリの対応バージョンを確認の上、Adafruit nRF52のライブラリを更新してください。