はじめに
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
の拡張機能を併せて利用することで、非常に便利な開発環境構築を行うことができました。