WSL2上のUbuntuでUSBシリアル通信

現在、Genesisを使ってみようと、色々と試みています。
今回は、実機のサーボ関節角をシリアル通信経由でGenesisに取り込む実験をば。


ここでは、この実現の際にちょっとハマった
「WSL2環境で、Ubuntu側からWindows上のUSBシリアルデバイスを使用する方法」
について、備忘録的に記載しようと思います。

なお、実行環境は以下のとおり。
----
OS: Windows11(24H2) + WSL2(Ubuntu 24.04.1 LTS)
CPU: Intel Corei9-13900KF
GPU: GeForceRTX4070Ti Super
システムメモリ: 64GB
USBシリアルデバイス: CH343
シリアル通信先マイコン: ESP32
----

Windows側の設定

まず、Ubuntu側からWindows上のUSBデバイスにアクセスするための仕組みとして、「usbipd」を導入します。詳しく知りたい方はMicrosoftのこちらの解説をご覧ください。

導入方法だけ抜粋すると、Windowsのコマンドプロンプトにて以下を実行します。
(コマンドプロンプトの管理者権限が必要)

【usbipdのインストール】
# winget install usbipd

【接続されているUSBデバイスを表示】
# usbipd list
  7-2    xxxx:xxxx  USB-Enhanced-SERIAL CH343 (COM2)                              Not shared
 ⇒ USBシリアルが7-2というIDであることがわかる。

【WSL側で使いたいデバイスをバインド】
# usbipd bind --busid 7-2

ここまでは、一度実行すればOKです。

次に、実際にUSBをUbuntu側から見えるようにするコマンドです。
(Windowsを起動する毎に実行が必要。管理者権限は不要)

 # usbipd attach --busid 7-2 --wsl
  ⇒ ★attachをした時点でWindows側から見えなくなり、代わりにUbuntu側から見えるようになる。


attachは毎回実行する必要があるので、私は以下のようなバッチファイルを作りました。

【AttachSerialUsb.batの例】
usbipd list
usbipd attach --busid 7-2 --wsl
pause


ちなみに、attachの逆の状態になる、detachもあります。

 # usbipd detach --busid 7-2

Ubuntu側からの確認

上記attach処理を実行すると、Ubuntu上では /dev/tty*** として認識されます。
(今回使用しているCH343については、 /dev/ttyACM0 として認識されました)

Genesisは基本pythonでの開発となるため、今回はpyserialにて動作確認をば。

【pyserialのインストール】
# pip install pyserial


以下のコードでテストしてみたところ、無事WSL上のUbuntuから、ESP32とUSBシリアル通信ができましたとさ。

ちなみに、私の手元で使っているCH343のUSBシリアルデバイスでは、baudrate=3Mbpsでも安定して通信できました。Aliexpressで購入したこちらの激安のものなのですが、ケースにちゃんと格納されているし結構いい感じどす。(アフィリンクじゃないよ)

ということで、おしまい。