2026年9月21日月曜日

feather-nrf52832をn-able-arduinoで動かす


背景

n-able-ArduinoとはNimBLE-Arduinoを作ったh2zeroさんが作ったnrf52向けのプログラムの環境です。
n-able-Arduinoでnrf52を動かせば、NimBLE-Arduinoをnrf52で使えます。

使い方を把握したので備忘録として手順を記事に残します。

使ったもの

  • ファームウェアを書き換え可能なように信号線を引き出したfeather-nrf52832 と stlink2
    前回把握したopenocdとstlink2を使う方法を実現する構成を用意します。
  • USB microBケーブル
    nrf52へUSB経由でプログラムを書き込むためのケーブルです。
  • プログラムを書き込むPC
    PlatformIOでプロジェクトを作り動作確認しました。

n-ableのブートローダーを書き込む

stlink2でnrf52832にブートローダーを書き込みます。


方法1 ブートローダーを単独で書き込む

今回書き込むのは利用する開発ボードに載っているマイコンnrf52832に対応した下記のブートローダーです。
https://github.com/h2zero/n-able-Arduino/tools/nrf52832_serial_adabl.hex

上記のブートローダーを書き込むと、adafruilt-nrfutilを利用してUSBケーブル経由でプログラムの書き換えが可能になります。

ブートローダーをダウンロードし、前回把握したopenocdとstlink2を使う方法で書き込みます。
PATH_HEX=./nrf52832_serial_adabl.hex
openocd \
-f interface/stlink.cfg \
-f target/nrf52.cfg \
-c init \
-c "reset init" \
-c halt \
-c "nrf5 mass_erase" \
-c "program $PATH_HEX verify" \
-c "reset run" \
-c exit

書き込みが成功すると赤いLEDがじんわり点滅を繰り返します。

方法2 PlatformIOでプロジェクトのコードと共にブートローダーを書き込む

PlatformIOでn-able環境で該当するブートローダーを使うプロジェクトをビルドし、uploat_protocolをstlinkと指定すれば、PlatforIOがOpenOCDのコマンドを組み立ててstlink2経由で書き込んでくれます。

platformio.ini
[env:nable]
platform = https://github.com/h2zero/platform-n-able.git@^1.0.0
framework = arduino
lib_deps =
https://github.com/h2zero/NimBLE-Arduino
board = adafruit_feather_nrf52832
; board_bootloader = none
board_bootloader = adafruit
; upload_protocol = adafruit-nrfutil
upload_protocol = stlink

src/main.cpp
#include <Arduino.h>
#include <NimBLEDevice.h>

#define PIN_LED LED_BLUE
// #define PIN_LED LED_RED

void setup() { pinMode(PIN_LED, OUTPUT); }

void loop() {
digitalWrite(PIN_LED, HIGH);
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1000);
}

uploadコマンドを実行するとmain.cppとadafruitのUSBアップロード対応のブートローダーを含んだプログラムがstlink経由で書き込まれます。
書き込み後はupload_protocolをadafruit-nrfutilにすると、featherのUSB経由でプログラムを書き込めます。
pio run -t upload

USB経由でのアップロードを使わない場合は、board_bootloaderをnoneにしても良いです。

書き込みが成功するとmain.cppの処理通り青色LEDが1秒毎に点滅します。

PlatformIOでUSBとadafruit-nrfutil経由でプログラムを書き込む

n-ableのadafruit対応ブートローダーを書き込んだ場合にadafruit-nrfutil経由でプログラムの書き込みが可能です。
adafruit本家のブートローダーはn-able環境ではないため、繰り返しになりますがstlinkなどを利用してn-ableのブートローダーを書き込む必要があります。

外すのが手間だったのでstlinkは繋いだまま、featherのUSBケーブル経由でプログラムを書き込みます。


platformio.iniのupload_protocolをadafrult-nrfutilにすれば、USB経由でプログラムを書き込めます。
platformio.ini
[env:nable]
platform = https://github.com/h2zero/platform-n-able.git@^1.0.0
framework = arduino
lib_deps =
https://github.com/h2zero/NimBLE-Arduino
board = adafruit_feather_nrf52832
; board_bootloader = none
board_bootloader = adafruit
upload_protocol = adafruit-nrfutil
; upload_protocol = stlink

stlinkで書き込んだプログラムと処理を変化させるべく、今度はLED_REDを光らせます。
src/main.cpp
#include <Arduino.h>
#include <NimBLEDevice.h>

// #define PIN_LED LED_BLUE
#define PIN_LED LED_RED

void setup() { pinMode(PIN_LED, OUTPUT); }

void loop() {
digitalWrite(PIN_LED, HIGH);
delay(1000);
digitalWrite(PIN_LED, LOW);
delay(1000);
}

USBケーブルをfeatherに繋いでプログラムを書き込みます。
pio run -t upload

main.cppの通り赤いLEDが1秒毎に点滅したら書き込み成功です。

おわり

n-ableの環境でNimBLE-arduinoをincludeしたcppプログラムをnrf52832に書き込んで動かせました。
ESP32でNimBLE-arduinoに馴染みがある自分としては、同じ関数でnrf52のBLEも使えるのが嬉しいです。

参考

n-able-Arduino
NimBLE-Arduino
feather-nrf52832のブートローダーをstlink2とopenocdで書き込む

0 件のコメント :