2026年8月4日火曜日

FDK HY0020で遊んでみる(Raspberry Pi デバッグプローブで書き込み)

秋月で取り扱いの始まった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)データ信号

こんな感じで接続してみました。わかりにくいですが、黒はGNDに接続しています。


VS Code での書き込み

今回はPlatformIOを使ったArduino環境を構築します。もしPlatformIOがインストールされていなければ拡張機能からインストールしておいてください。

1. VS Codeに 「Cortex-Debug」 拡張機能をインストールします。


2. PlatformIOで新規Projectを作成します。


3. Adafruit Bluefruit nRF52832 Featherを選択します。


完了すればプロジェクトが作成されます。

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 

今回はBLE_uartのサンプルを元にLEDをuartコマンドで制御するプログラムを作成してみました。
#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の左下の✔️マークがビルド、→マークが書き込みです。



書き込みを行ってみます。

書き込みができれば下記のようにターミナルに表示されます。


動作確認してみます。

BLEの動作確認

スマートフォンに「Bluefruit Connect」というアプリをインストールします。
このアプリ経由でBLEの接続、通信を行います。

アプリを立ち上げるとBLEで接続可能な相手(ペリフェラル)の一覧が表示されます。
HY0020_LEDというペリフェラルに接続します。



接続に成功すると、機能が選択できますので、uartを選択します。
これでBLEを経由したUARTで通信ができます。


画面下にテキストボックスが現れますので、文字を送ります。
今回のプログラムでは、"1"を送るとP0.12ピンがHに(LED ON)、"0"を送るとP0.12ピンがLに(LED OFF)なります。


実際に送るとこんな感じになります。



これで書き込みができるようになりました!
ブートローダを間違って消してしまっても、復旧することが可能です。




0 件のコメント:

コメントを投稿