2026年8月8日土曜日

FDK HY0020で遊んでみる(Zephyrで動かしてみる、デバッグプローブで書き込み・デバッグ)

Raspberry Pi デバッグプローブでHY0020に書き込みができたので、Zephyrを動かしてみます。

HY0020はnRF52832を搭載していますので、Zephyrをサポートしています。

まずはLチカを目指します。
サンプルボードのテンプレートをベースにスタートする例が多いですが、デバイスツリーに余計なものがあったりと、Zephyrの学習には少し冗長なので、なるべくシンプルな状態からスタートできるようにする方針で進めます。

VSCodeにnRF ConnectのExtensionをインストールし、それを使って開発環境を構築します。

nRF Connect for VSCodeのインストール

VSCodeを開き、画面左のExtensionアイコンからExtensionの検索を行います。
「nRF Connect for VS Code」を開き、インストールします。



インストールしてExtensionを有効にすると、下記のように画面左にnRF Connect for VS Codeのアイコンが追加されます。

SDKのインストール

インストールした後の初回のみ、SDKのインストールが必要です。
Welcome -> Manage SDKs -> Install SDK -> nRF Connect SDK -> 好きなバージョンを選択

しばらく待つとインストールされます。

プロジェクトの雛形を作成

nRF Connect for VS Codeのアイコンをクリックするとメニューが開きます。
Welcome -> Create a new application -> Create a blank application をクリックして新規プロジェクトを作成します。
作成するパスの入力を求められるので、任意のパスを入力します。


続いて、新規ボードを作成します。以下のように設定して作成します。


これでカスタムボードができました!
続いてBuild configurationを設定します。

左の Application -> (プロジェクト名) -> Add build configuration を選択。
Build configuration の設定画面が開くので、ボードに先ほど設定したボード名を入れる。
その他はそのままでOK。



画面下のGenerate Build Configuration ボタンをクリック

これでビルドの準備が整いました。

このままビルドしてもエラーが出るので、ファイルを作成していきます。

Lチカの準備:プログラム作成

デバイスツリーの追記

作成したボードのデバイスツリーを作成します。
/boards/(ベンダー名)/ボード名.dts
を開いてルートノード /{ ... }; に以下を追記します。
/ {
aliases {
// プログラムからled0という名前で呼び出せるようにする。
led0 = &my_led;
};

leds {
compatible = "gpio-leds";
my_led: led_0 {
// HY0020でLEDを接続するピン番号を指定
gpios = <&gpio0 12 GPIO_ACTIVE_HIGH>;
label = "User LED";
};
};
};

Kconfig(pro.conf)の記載

Zephyrは必要な機能だけを有効化してメモリを節約するOSです。GPIO(ピンの入出力)機能を使うためのスイッチをオンにします。

  1. プロジェクト直下にあるprj.confを開きます。

  2. 以下の1行を追記して保存します。

    CONFIG_GPIO=y

main.cの記載

いよいよC言語でプログラムを書きます。Zephyrの最新の書き方(Devicetreeと連携した安全なGPIO操作)で実装します。

  1. src/main.cを開き、中身をすべて以下のコードに書き換えます。

    #include <zephyr/kernel.h>
    #include <zephyr/drivers/gpio.h>

    /* DTS aliases で定義した led0 を取得*/
    #define LED0_NODE DT_ALIAS(led0)

    /* ピンの情報を構造体として取得(ビルド時に紐づけられる)*/
    static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(LED0_NODE, gpios);

    int main(void)
    {
    /* 1. デバイス(GPIOコントローラ)の準備ができているか確認 */
    if (!gpio_is_ready_dt(&led)) {
    return 0;
    }

    /* 2. ピンを出力モードに設定 */
    if(gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE) < 0) {
    return 0;
    }

    /* 3. 無限ループで点滅(Lチカ) */
    while(1){
    gpio_pin_toggle_dt(&led); /* ピンの状態を反転 */
    k_msleep(1000); /* 1000ms待機 */
    }

    return 0;
    }


    プロジェクトのビルド

    1. nRF Connectの「APPLICATIONS」パネルから Add Build Configuration をクリックします

    2. Board の選択欄で、作成したhy0020(Custom boardsカテゴリ)を選択します

    3. Build Configuration ボタンを押してビルドを実行します

    ターミナルにエラーが出ず、[100%] Built target zephyr_final などと表示されれば成功です。


    書き込みとデバッグ

    VSCodeのCortex-DebugというExtensionを使って書き込み・デバッグをしてみます。
    上記でビルドしたアプリケーションを開いておきます。

    Cortex-Debugのインストール

    Cortex-Debugがインストールされていなければインストールしましょう。
    VSCodeのExtensionから、Cortex-Debugをインストールします。


    launch.jsonの作成

    プロジェクトにデバッグ設定ファイルを作成します。
    1. VS Codeの左側のアクティビティバーから 「実行とデバッグ(Run and Debug / 再生マークと虫のアイコン)」 を開きます

    2. 「launch.json ファイルを作成します」というリンクをクリックし、環境としてCortex Debug を選択します

    3. 生成された .vscode/launch.json の中身を、以下の内容にすべて書き換えて保存します

      実行ファイルのパスは適宜指定してください。

    {
    "version": "0.2.0",
    "configurations": [
    {
    "name": "Debug nRF52 (Pico Probe)",
    "type": "cortex-debug",
    "request": "launch",
    /* VS CodeにOpenOCDの起動と管理を任せる */
    "servertype": "openocd",
    "cwd": "${workspaceFolder}",
    "executable": "${workspaceFolder}/build/${workspaceFolderBasename}/zephyr/zephyr.elf",
    /* Homebrew版のOpenOCDと、Nordic版のGDBを組み合わせる */
    "serverpath": "/opt/homebrew/bin/openocd",
    "gdbPath": "/opt/nordic/ncs/toolchains/185bb0e3b6/opt/zephyr-sdk/arm-zephyr-eabi/bin/arm-zephyr-eabi-gdb",
    "searchDir": [
    "/opt/homebrew/share/openocd/scripts"
    ],
    "configFiles": [
    "${workspaceFolder}/openocd.cfg"
    ],
    "runToEntryPoint": "main",
    "showDevDebugOutput": "none"
    }
    ]
    }

    openocdの設定

    プロジェクトのルートディレクトリ(Zephyr_blinky)フォルダの直下、CMakeLists.txt などと同じ場所)に、新しくopenocd.cfgという名前のファイルを作成し、以下の内容を入力して保存します。

    # 1. デバッガのインターフェースを指定 (Pico Probe)
    source [find interface/cmsis-dap.cfg]

    # 2. 通信方式をSWDに指定
    transport select swd

    # 3. 通信速度を指定
    adapter speed 4000

    # 4. ターゲットチップを指定 (nRF52)
    source [find target/nrf52.cfg]


    書き込み・デバッグ

    1. VS Code左側の「実行とデバッグ」タブを開きます。

    2. 画面左上のドロップダウンに Debug nRF52 (Pico Probe) が選択されていることを確認します

    3. その横の 緑色の再生ボタン(Start Debugging) をクリックするか、キーボードのF5キーを押します

    これだけで、以下の処理が自動で行われます

    • Cortex-DebugがOpenOCDを起動し、Pico Probeに接続

    • Zephyr.elf をHY0020のFlashメモリに自動書き込み(Flash)

    • プログラムをリセットして実行を開始

    • C言語の main() 関数の最初の行で自動的に一時停止(ブレーク)

    あとはVS Code上部のデバッグツールバーを使って、ステップ実行(F10/F11)や変数の確認など、モダンなC言語デバッグがフル機能で利用できます。


    Tips

    デバッグを開始した時、ブレークポイントを設定したにも関わらず止まってくれないことがあります。
    そんな時はprj.confに以下を追記します。
    CONFIG_DEBUG_OPTIMIZATIONS=y

    これで実際のコードの場所で止まってくれます。

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)なります。


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



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




2026年7月30日木曜日

FDK HY0020で遊んでみる(Arduino 環境構築編)

秋月電子で面白そうなモジュールの取り扱いが始まったので、早速買ってみました。

FDK製 BLEモジュール HY0020 ブートローダ書き込み済み

https://akizukidenshi.com/catalog/g/g131343/



DIP化キットもあります。

https://akizukidenshi.com/catalog/g/g131342

特徴

超小型のBLE(Bluetooth Low Energy)モジュールです。
外形は 3.5 x 10 x 1 mm と指先に乗る大きさです。
この大きさでBLE用のアンテナや通信用の回路、MPU(Nordic nRF52832) 動作させるための高効率DC-DCコンバータおよびLDO、発振器(32MHz/32.678kHz)まで搭載しています。
要はBLEモジュールなわけですが、必要な周辺部品がかなり少なく、ほぼ電源だけで動作させることができます。

超小型なBLE搭載マイコンボードといっても過言ではないでしょう。

こんな面白そうなもの、触ってみないわけにはいかないですよね!
秋月のマニュアルを参考に早速遊んでみます。

ハードウェア結線

秋月で扱っているものはAdafruit nRF52というブートローダが書き込まれているので、専用のデバッガがなくとも、シリアル通信経由で書き込むことが可能です。

配線は以下のようにします。DTRがない場合はGNDに接続できるようにしておきます。
(起動時にDFUをGNDに接続した状態で起動するとDFUモードに入り、書き込みができるようになります。)


USBシリアル変換側HY0020モジュール側備考
VCC (3.3V)VDD絶対に5Vを入力しないでください
GNDGND
TXD (送信)RXD (受信)クロス接続
RXD (受信)TXD (送信)クロス接続
DTRDFU 0.1µFのコンデンサを直列に挟んで接続する




DIP化モジュールのピン配置は上記の通り。わかりやすく配線されています。

開発環境の構築

今回は、Arduino環境でサンプルスケッチを動かすところまでやってみようと思います。

ボードマネージャURLの追加

Preferences / 環境設定
ファイル > 環境設定 (macOSの場合は Arduino IDE > Settings...)を開き、「追加のボードマネージャのURL」に以下を追加してOKを押します。
https://adafruit.github.io/arduino-board-index/package_adafruit_index.json



すでにURLが入っている場合は、「,」を入れてその後にURLを入れるようにしてください。

Adafruit nRF52パッケージのインストール

ボードマネージャ
ツール > ボード > ボードマネージャ を開き、検索窓に「nRF52」と入力します。
リストから Adafruit nRF52 by Adafruit を見つけてインストールする。



ターゲットボードとポートの選択

ベースモデルとしてFeatherを使用

ツール > ボード から Adafruit Feather nRF52832 を選択します。


続いて ツール > シリアルポート から、接続したUSBシリアル変換モジュールのポート (WindowsならCOM番号、Macなら /dev/cu.usbserial-xxxなど)を選択します。



プログラムのコンパイルと書き込み

適当なサンプルスケッチを書き込んで動作確認をしてみます。
今回は下記のLチカのプログラムを書き込んでみます。
ファイル > スケッチ例 > Adafruit Bruefruit nRF52 Libraries > Hardware > blinky



DFUピンをGNDに落とした状態で電源を投入します。
マイコンボードに書き込む(→ボタン)を押します。
自動的にシリアル経由で書き込みが行われます。


書き込み完了!

これで書き込みまでできましたので、次回はBluetoothを使ってみようと思います。