秋月で取り扱いの始まったFDK製 超小型BLEモジュール HY0020 にはAdafruit nRF52 ブートローダが書き込まれており、UART経由で容易にプログラムを書き込むことができます。
このブートローダを利用することで書き込みは容易になりますが、リアルタイムOS Zephyrを使うこともできません。
そのため、このブートローダを使用せずに書き込みを行ってみます。
HY0020に搭載されているNordic nRF52832はArmプロセッサが載っており、SWD(Serial Wire Debug)を使用することができます。
このSWDは規格化されたものですので、SWDに対応したデバッガであれば基本的にどのようなものでも使用できます。
今回は手元にあったRaspberry Pi Pico用のデバッガ Raspberry Pi デバッグプローブを使って書き込みできる環境を整えます。
デバッグプローブがなくとも、Raspberry Pi Picoがあればデバッグプローブ化することが可能です。
ハードウェアの接続 (SWD)
Pico Debug Probeの SWD端子(付属のブレッドボード用ジャンパ線)をHY0020モジュールに接続します。
SWDではSWDIO, SWCLKピンを使いますが、秋月のDIP化モジュールではSWCLK, SWDIOは基板真ん中に近いところに配置されていますので、他のピンと逆向きにピンヘッダをつけると、そのままデバックプローブを接続することができます。(この辺りの設計はさすがですね)
| Pico Debug Probe (SWD側) | HY0020モジュール | 役割 |
|---|---|---|
| SWCLK (1ピン / 橙) | SWDCLK (P0.21) | クロック信号 |
| GND (2ピン / 黒) | GND | 共通グランド |
| SWDIO (3ピン / 黄) | SWDIO (P0.18) | データ信号 |
VS Code での書き込み
今回はPlatformIOを使ったArduino環境を構築します。もしPlatformIOがインストールされていなければ拡張機能からインストールしておいてください。
1. VS Codeに 「Cortex-Debug」 拡張機能をインストールします。
4. platformio.inoを以下のように記載します。[env:adafruit_feather_nrf52832]
platform = nordicnrf52
board = adafruit_feather_nrf52832
framework = arduino
; ==== 書き込みとデバッグの設定 ====
; Pico Debug Probe (CMSIS-DAP) を指定
upload_protocol = cmsis-dap
debug_tool = cmsis-dap
; シリアルモニタの通信速度
monitor_speed = 115200 #include <Arduino.h>
#include <bluefruit.h>
// Lチカで使用したピン(P0.17)
const int ledPin = 12;
// BLE UARTサービスのインスタンスを作成
BLEUart bleuart;
// アドバタイズ設定用の関数
void startAdv(void){
Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
Bluefruit.Advertising.addTxPower();
Bluefruit.Advertising.addService(bleuart);
Bluefruit.ScanResponse.addName();
Bluefruit.Advertising.restartOnDisconnect(true);
Bluefruit.Advertising.setInterval(32, 244);
Bluefruit.Advertising.setFastTimeout(30);
Bluefruit.Advertising.start(0);
}
void setup(){
Serial.begin(115200);
// LEDピンの初期設定
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// BLEの初期化
Bluefruit.begin();
Bluefruit.setTxPower(4);
Bluefruit.setName("HY0020_LED");
// UARTサービスの開始
bleuart.begin();
// アドバタイズの開始
startAdv();
Serial.println("BLE UART LED Control Ready.");
}
void loop(){
if(bleuart.available()){
// 1文字読む
char c = (char)bleuart.read();
// シリアルモニタに受信した文字を表示
Serial.print("Received: ");
Serial.println(c);
// 受信した文字に応じた処理
if(c == '1'){
digitalWrite(ledPin, HIGH);
Serial.println("-> LED Turned ON");
bleuart.println("LED is ON");
}
else if (c == '0'){
digitalWrite(ledPin, LOW);
Serial.println("-> LED Turned OFF");
bleuart.println("LED is OFF");
}
}
}
VSCodeの左下の✔️マークがビルド、→マークが書き込みです。
書き込みを行ってみます。
書き込みができれば下記のようにターミナルに表示されます。
動作確認してみます。













