仮想環境(WSL2)上の開発コンテナとRaspberry Pi Picoを接続する

はじめに

Thonnyを利用して行うRaspberry Pi Pico開発の環境構築と問題点

Raspberry Pi Pico(以降Picoと記載)を利用した開発を行う際の開発環境ではIDEとしてThonnyを利用しているケースが多く見られます。実際にWindowsにインストールして利用してみたところ、大変容易にセットアップを完了し、動作確認(Lチカ)を行うことができました。

しかし、実際にプロジェクトでの開発  を考えるといくつかの問題点があります。

  • Gitを利用したソースコード管理を行いたい場合、Thonnyからの直接的なGit連携機能がない。
  • 複数メンバでの開発を行う場合、開発環境の差分の発生防止が難しい。

など

以上の点から、個人としてThonnyを利用する場合は非常に利用しやすい反面、複数人で開発プロジェクトを行う際には多少不自由する点があるとも言えます。

もちろんWindows上に直接Gitをインストールして利用するなど回避方法はありますが、可能であれば開発に必要な操作一つのIDE上で済ませられると便利です。

VSCodeの開発コンテナを利用した環境の構築と問題点

前述の観点から、社内でも利用実績がある環境であるVSCode拡張機能のdevcontainerを利用して開発環境自体をコンテナ化する手法でスムーズな開発環境構築を検討しました。

この場合、Windows PC + WSL2(Ubuntu) + 開発コンテナという状態になり、仮想環境上で動作しているDockerコンテナからWindowsにUSB接続しているPicoでプログラムを動作させることになります。このような構成で開発コンテナからPicoに接続・動作させることはできるのでしょうか。

開発コンテナとPicoの接続における課題

仮想環境上の開発コンテナから物理的なUSBデバイスであるPicoに接続することは、いくつかの技術的な課題を伴います。通常、Dockerコンテナはホストマシンのハードウェアに直接アクセスすることが難しいため、以下のような問題が発生します。

1. USBデバイスの認識: 開発コンテナからPicoを認識させるためには、ホストマシン(Windows)から仮想環境(WSL2)を経由してコンテナにUSB接続をブリッジする必要があります。

2. ドライバのインストール: Picoを正しく動作させるためには、対応するドライバを仮想環境およびコンテナ内にインストールする必要があります。

usbipd-winを利用した環境構築

これらの課題を克服するために、usbipd-winを利用することで、ホストマシンのUSBデバイスをWSL2の仮想環境および開発コンテナに接続する方法を模索しました。

usbipd-winとは

usbipd-winとは、ローカルに接続されたUSBデバイスをほかのマシン(Hyper-VやWSL)に共有するためのWindowsソフトウェアです。

事前準備

  • Windowsに以下をインストール
    • WSL2(Ubuntu)
    • VSCode
  • Ubuntu上に以下をインストール
    • DockerEngine

1. usbipd-winのインストール

usbipd-winの詳細なインストールや利用手順については、こちらのMicrosoftドキュメントを参照してください。

winget install --interactive --exact dorssel.usbipd-win

2. USBデバイスの接続状況を確認

インストールが完了したらusbipdコマンドが利用できるようになります。Picoを接続した状態で以下のコマンドから接続状況を取得することができます。

usbipd list

すると、以下のようにPCに接続されているデバイス一覧と、ステータスが表示されます。今回の出力例ではUSB シリアル デバイス (COM3)  と表記されているものがPicoになります。

出力例

C:\Users\hoge>usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-3    2e8a:0005  USB シリアル デバイス (COM3)                                  Not shared
2-4    046d:c33c  G512, USB 入力デバイス, 仮想 HID フレームワーク (VHF) HID...  Not shared
2-6    04f2:b6f0  Web Camera - HD, Face Authentication Sensor, Camera DFU D...  Not shared
2-10   8087:0033  インテル(R) ワイヤレス Bluetooth(R)                           Not shared

Persisted:
GUID                                  DEVICE


C:\Users\hoge>

どのデバイスがPicoかわからない場合は、デバイスを抜き差しして前後に`usbipd list`コマンドを実行して何が増えたかを確認しましょう。

3. デバイスを共有する

先ほどの`usbipd list`の結果のBUSIDを指定し、バインドします。

usbipd bind --busid <BUSID>

4. デバイスをWSLに接続する

先ほどのusbipd listの結果のBUSIDを指定し、アタッチします。

usbipd attach --wsl --busid <BUSID>

成功すると、usbipd listの結果のSTATEがshareに変化します。

出力例

C:\Users\hoge>usbipd list
Connected:
BUSID  VID:PID    DEVICE                                                        STATE
2-3    2e8a:0005  USB シリアル デバイス (COM3)                                  share
2-4    046d:c33c  G512, USB 入力デバイス, 仮想 HID フレームワーク (VHF) HID...  Not shared
2-6    04f2:b6f0  Web Camera - HD, Face Authentication Sensor, Camera DFU D...  Not shared
2-10   8087:0033  インテル(R) ワイヤレス Bluetooth(R)                           Not shared

Persisted:
GUID                                  DEVICE


C:\Users\hoge>

WSL2にUSBデバイスが共有されたため、UbuntuからもUSBデバイスが確認できるようになっています。

出力例

root@hogehoge:~/workspaces# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2e8a:0005 MicroPython Board in FS mode
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
root@hogehoge:~/workspaces#

5. WSL上でUSBデバイスの接続先のシリアルポートを確認する

開発コンテナからUSBデバイスに接続するためにデバイスをマウントする必要があります。まずはマウントするシリアルポートを確認します。

dmesg | grep cdc_acm | grep tty

出力例

root@hogehoge:~/workspaces# dmesg | grep cdc_acm | grep tty
[   88.170736] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
root@hogehoge:~/workspaces#

この場合、シリアルポートはttyACM0であることがわかります。

6. 開発コンテナでデバイスをマウントする

今回はdevcontainerを利用しているので、devcontainer.jsonの設定に以下を設定しています。先ほど確認したシリアルポート(ttyACM0)をマウントして開発コンテナを起動するように設定します。

※devcontainerの利用方法やほかの設定についてはこの記事では割愛します。

"runArgs": ["--device=/dev/ttyACM0"],

開発環境をコンテナで開くことができれば、環境構築は完了です。

この状態で拡張機能MicroPicoを利用すると、コードの実行が行えるようになります。

まとめ

  • WindowsからWSL2へのUSBデバイスの接続はusbipd-winを利用して行うことができる。
  • WSL2にデバイスが接続できれば、Dockerコンテナからは対象デバイスをマウントすることで利用することができる。

今回の説明では割愛しましたが、拡張機能MicroPicoをdevcontainer.jsonに追加すると開発コンテナ起動後すぐに利用可能となります。devcontainerの拡張機能を併せて利用することで、非常に便利な開発環境構築を行うことができました。

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です