はじめに
Windows 11 + WSL2 + Docker 環境の Visual Studio Code (以下、VS Code) で、 Zephyr RTOS を使った micro:bit v1/v2 向けのアプリケーションを開発するためのセットアップガイドです。
usbipd-win を通じて USB デバイス(micro:bit)を Docker Desktop の WSL2コンテナ に接続でき、CMSIS-DAP を使った フラッシュ や デバッグ にも対応しています。
過去の記事では、Windows上に開発環境を構築しましたが、今回の記事では、Docker Desktop fow Windows を用いたコンテナ化された開発環境を紹介しています。
USBデバイスの認識は、usbipd-winを利用しています。
過去の記事
Zephyr RTOS を micro:bit で学ぶ
この開発環境は、リアルタイムOSの学習に最適です。
低価格で入手可能な micro:bit を使って、RTOSの概念を実践的に体験できます:
- スレッド管理
- スケジューリング
- ハードウェア抽象化レイヤー(HAL)
- デバイスツリーと Kconfig
しかも、すべてが コンテナ化された開発環境で動作するため、ホスト環境(Windows11)に依存せず再現性も高く、初心者から上級者まで快適に使える構成です。
対象環境
コンポーネント | 内容 |
---|---|
RTOS | Zephyr RTOS |
対応ボード |
bbc_microbit (v1)、bbc_microbit_v2 (v2) |
OS | Windows 11 + WSL2 |
IDE | VS Code (Visual Studio Code) |
コンテナランタイム | Docker Desktop for Windows |
USB ブリッジ | usbipd-win |
デバッグプローブ | CMSIS-DAP(micro:bit内蔵) |
micro:bitには、DAPLinkというソフトウエアがあらかじめ書き込まれています。
これをファームウェアと呼んでおり、USB接続するとUSBストレージとして認識されるようになっています。
DAPLinkには、USBストレージだけでなく、シリアル通信やCMSIS-DAP、WebUSBといった機能も含まれています。
DAPLinkとUSBインターフェース
セットアップ手順
1. 必要なツールのインストール(Windows側)
Windows11上で、次のツールをインストールします。
2. プロジェクトの取得方法
次の GitHub リポジトリを使って、開発環境をすぐに構築できます。
🔗 https://github.com/jp-rad/vscode-zephyr-ubit
プロジェクトを VS Code で開き、Dev Container に接続することで、すぐに開発を開始できます。
方法1:リポジトリをクローンする
git clone https://github.com/jp-rad/vscode-zephyr-ubit.git
cd vscode-zephyr-ubit
方法2:テンプレートとして新規プロジェクトを作成する
GitHubの jp-rad/vscode-zephyr-ubit 内で、「Use this template」ボタンをクリックし、自分のリポジトリとしてプロジェクトを生成し、それをクローンします。
おすすめ
方法2なら、オリジナルの履歴を持たずにクリーンな状態で始められ、自分のプロジェクトとして管理できます。
開発手順
VS Codeでコンテナを開く
VS Codeで、プロジェクトを開き、Reopen in Container
で、コンテナを開きます。
初回は、Dockerfileのビルドが実行されます。
「すぐに開発を開始できます」と書きましたが、/home/vscode
フォルダだけでも、9.1Gのファイルが構築されますので、Dockerfileのビルドが完了するのを気長にお待ちください。
du -sh /home/vscode
vscode ➜ ~ $ du -sh /home/vscode
9.1G /home/vscode
サンプルプログラムのビルド
プロジェクトには、micro:bitディスプレイのデモンストレーション・サンプルコードが含まれていますので、VS Codeのメニューから次の手順で、ビルドを実行します。
Terminal → Run Build Task… → Generate micro:bit universal hex
ビルドに成功すると、3つのHEXファイルがプロジェクトのルートフォルダに生成されます。
このHEXファイルをUSB接続したmicro:bitのUSBストレージにコピーするとmicro:bit本体で実行されます。
- microbit-v1.hex - v1専用
- microbit-v2.hex - v2専用
- microbit-universal.hex - v1/v2両用
デバッグ手順(CMSIS-DAP)
CMSIS-DAP経由で、フラッシュ(書き込み)やデバッグを実行することができます。
CMSIS-DAP接続に失敗する場合
CMSIS-DAP接続に失敗する場合、micro:bitへのフラッシュやデバッグができません。micro:bit firmwareのページを参照し、ファームウェアの更新を試みてください。
ファームウェア(firmware)
USB デバイスのバインド(Windows側)
- micro:bit を USB 接続
- 管理者権限でコマンドプロンプトを開く
- コマンド
usbipd list
でデバイスを確認 -
VID:PID = 0d28:0204
の micro:bit を探し、BUSID
を取得 - コマンド
usbipd bind --busid <BUSID>
でバインド
コマンドプロンプトは、「管理者として実行」で開いてください。
usbipd list
usbipd bind --busid <BUSID>
<BUSID>
は、usbipd list
で探したBUSID
に置き換えてください。
USB デバイスのアタッチ(Windows側)
micro:bitをUSB接続するたびに、WSL2 に対してデバイスをアタッチする必要があります。
Windows 側でバッチファイルmicrobit_attach.bat
を実行してください。
microbit_attach.bat
これにより、CMSIS-DAP 経由で WSL2 コンテナから micro:bit にアクセス可能となります。
開発環境(Docker) → WSL2コンテナ → Windows OS → USB接続 → micro:bit
micro:bitをUSB接続するたびに、microbit_attach.bat
を実行し、USBデバイスをアタッチしてください。
尚、USBバインドは、一度実行するだけでよく、Windowsを再起動しても、バインドされたままの状態になります。
ビルドとフラッシュ
VS Codeのメニューから次の手順で、ビルド(コンパイル)とフラッシュ(書き込み)を一括実行できます。
Terminal → Run Build Task… → Build and Flash
microbit-toolchain.sh
が、接続されているmicro:bitのv1/v2を自動選択し、 west build
/ west flash
を実行します。
デバッグ(GDB)
VS Code のデバッグビューから、(GDB) micro:bit
を選択し、開始ボタンでデバッグを開始します。
Run and Debug(Ctrl + Shift + D)→ (GDB) micro:bit
ブレークポイントの設定やステップ実行が可能です。
構成ファイルの説明
Dockerfile の構成
このプロジェクトの Dockerfile
は、Zephyr SDK と micro:bit 開発に必要なツールをすべて含んだ Dev Container を構築します。
主なポイント:
- Python ベースの Dev Container イメージを使用
- Zephyr SDK の依存パッケージをインストール
-
west
による Zephyr プロジェクトの初期化 - CMake のバージョン固定インストール(例:4.0.3)
- Zephyr のマニフェスト・リビジョン固定インストール(例:v4.1.0)
- Node.js +
microbit-universal-hex
の導入 - WSL2 で USB デバイスにアクセスするための
usbutils
の導入
RUN west init --mr ${MANIFEST_REVISION} && west update && west zephyr-export
docker-compose.yml の構成
-
バージョン固定
Python(VARIANT
)、CMake(CMAKE_VERSION
)、Zephyr(MANIFEST_REVISION
)を引数で指定 -
USB デバイスアクセス対応
/dev/bus/usb
をマウントし、privileged: true
により CMSIS-DAP 経由のフラッシュとデバッグに対応
version: '2'
services:
dev:
image: "zephyr-ubit:v4.1.0"
build:
context: "."
dockerfile: ./dev/Dockerfile
args:
VARIANT: "3.13"
CMAKE_VERSION: "4.0.3"
MANIFEST_REVISION: "v4.1.0"
volumes:
- ..:/home/vscode/zephyr/dev/zephyrproject:cached
- ./dev/.vscode:/home/vscode/zephyr/dev/.vscode:cached
- /dev/bus/usb:/dev/bus/usb
devices:
- /dev/bus/usb:/dev/bus/usb
privileged: true
tty: true
command: bash
USBデバイスのマウント
/dev/bus/usb:/dev/bus/usb
の指定は、volumes
とdevices
の両方に行います。
また、privileged: true
が必要です。
VS Code Dev Container の構成(devcontainer.json)
-
docker-compose.yml
のdev
サービスに接続 - Zephyr 開発に必要な拡張機能を自動インストール
- ワークスペースは
/home/vscode/zephyr/dev
に固定
{
"name": "development",
"dockerComposeFile": [
"docker-compose.yml"
],
"service": "dev",
"workspaceFolder": "/home/vscode/zephyr/dev",
"customizations": {
"vscode": {
"settings": {
},
"extensions": [
"ms-vscode.cpptools-extension-pack"
]
}
},
"remoteUser": "vscode"
}
microbit-toolchain.sh の解説
コンテナ化された開発環境には、scripts/microbit-toolchain.sh
スクリプトが含まれており、3つの操作を統合しています:
-
build
: Zephyr アプリケーションのビルド -
flash
: CMSIS-DAP 経由で micro:bit に書き込み -
debugserver
: GDB デバッグサーバーの起動
USB 権限の設定
Windows上でバインド、アタッチされたUSBデバイスにアクセスするため、開発環境のvscode
ユーザーに権限を設定します。
lsusb → /dev/bus/usb → chmod 666
ボードの自動判定
USB 接続された micro:bit を pyocd で判定し、v1/v2 を自動選択します。
pyocd list | grep "nrf51" → bbc_microbit
pyocd list | grep "nrf52" → bbc_microbit_v2
VS Code タスク定義(tasks.json)
個別ビルドタスク
v1/v2 向けに個別ビルドタスクを定義。
{
"label": "(internal) build bbc_microbit",
"command": "scripts/microbit-toolchain.sh",
"args": ["build", "bbc_microbit"]
}
HEX ファイルの統合
v1/v2 の HEX を統合し、microbit-universal.hex
を生成します。
{
"label": "Generate micro:bit universal hex",
"dependsOn": [
"(internal) build bbc_microbit",
"(internal) copy bbc_microbit.hex",
"(internal) build bbc_microbit_v2",
"(internal) copy bbc_microbit_v2.hex",
"(internal) micro:bit universal hex"
]
}
ビルド・フラッシュタスク
ボードを自動判定し、ビルドとフラッシュを一括実行します。
{
"label": "Build and Flash",
"dependsOn": ["(internal) build", "(internal) flash"]
}
おわりに
このセットアップにより、Windows + WSL2 + Docker + VS Code というコンテナ化された開発環境で、Zephyr RTOS を使ったmicro:bitアプリケーションの開発が簡単に始められます。
CMSIS-DAP によるデバッグや universal HEX の生成もスクリプト化されており、初心者から上級者まで快適に使える構成です。