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で購入したこちらの激安のものなのですが、ケースにちゃんと格納されているし結構いい感じどす。(アフィリンクじゃないよ)
ということで、おしまい。