前回「WSL2でシリアルを使えるようにする」と書きました。しかし気づいたら既に使えるようになってました。WSL2でシリアルを使うにはusbipd-winのインストール後カーネル再ビルトが必要と思い込んでいましたが不要でした。usbipd-winのみでシリアルポート使えてます。トホホというよりタナボタな1件。
※「トホホな疑問」投稿順Indexはこちら
Windows11上のWSL2(Ubuntu)でUSBシリアルを使う
最近、USBに接続すれば「シリアルデバイス」として認識されるマイコンボードばかり使ってます。なんといってもお手軽でお楽。一方、WSL2はWindows上でLinuxがお手軽に使えて、これまたお楽。しかし、素のままではWSL2からWindowsが管理しているUSBデバイスにアクセスできません。なんとかならないの、と思った人は多かったのでしょう、御本家マイクロソフト社の以下のページにWSL2上でUSBデバイスを使う方法が説明されています。
そこで説明されているのは、以下のオープン・ソース・プロジェクトの成果物を使うもの。
上記をWindowsにインストールし、Windows管理下のUSBデバイスの所望のものをLinux側でアクセス可能なように「アタッチ」してやればあLinux側から使えるようになる、というもの。
ただし、私、誤解してました。「上記usbipd-winをインストール後、WSL2上で走っているLinuxのカーネルをUSBシリアル対応のドライバを含むものに再ビルドしないとシリアルポートとして使えない」と。どこかでネット情報(多分古い)を見たためかと思います。
しかし今回 usbipd-winのインストールだけでWSL2上のUbuntu20.04からシリアルできることを確認いたしましたデス。
なお、使用したのは以下のバージョンのWindows 11です。
そして、上記のマイクロソフト社のページの説明どおりに usbipd-win をインストールしてあります。インストール後、「コンピュータの管理」を開き、その中から「サービス」の一覧を見、以下のように「USBIP Device Host」が実行中となっておることを確認です。
一方、WSL2上で走らせているUbuntuは以下です。uname -aでみたLinuxのバージョンが以下に。
USBデバイスのアタッチ、デタッチ
Linux側でUSBデバイスにアクセスするまえに、Windowsに接続されたどのUSBデバイスをLinux側に許可するか指定が必要です。上記のマイクロソフト社の説明ページでは、PowerShellから操作せよみたいに書かれてましたが、アドミニストレータ権限のついたcommand promptからでも問題なく操作できてます。
正確にいうと、接続されているUSBデバイスをリストするための以下のコマンドにはアドミ権限不要でした。
usbipd wsl list
しかし、以下のアタッチ、デタッチ操作は要アドミ権限です。
usbipd wsl attach --busid <busid> usbipd wsl detach --busid <busid>
Arduino Uno互換機をUSBに接続してみた
互換機、Seeeduino Lotus機をUSBポートに接続し、usbipd wsl listでbusidを確認後、usbipd wsl attachをし、Linux側でどう見えているのか確認してみました。こんな感じ。
cp210x(定番のUSBシリアルデバイス)に見えてるじゃあーりませんか。/dev/ttyUSB0 として見えているようです。シリアル接続できるかどうかチェックしようとして気づきました。シリアル通信用のソフトをLotusに書き込んでなかったデス。とりあえずデタッチね。
ラズパイPico、MicroPython搭載をUSB接続
そこでUSBシリアル接続でREPLを呼び出せるハズのMicroPython書き込み済のラズパイPicoを接続しなおしました。usbpid wsl listでは以下のような素っ気ないUSBシリアルデバイスとして見えます。
上記のbusid 6-3に向けて管理者権限で以下を発行しました。
usbipd wsl attach --busid 6-3
こんどは、/dev/ttyUSB0 でなく /dev/ttyACM0 に接続されたようです。デバイス名変わったけれども、この辺の仕組みはどうなってるんだろ? ともかく、シリアル通信のテストをしてみることにいたしました。定番のminicomで /dev/ttyACM0に接続してみます。
$ sudo minicom --device /dev/ttyACM0
接続した後の画面キャプチャが以下に。ちゃんとMicroPythonのREPLが動いてました。シリアルポート、使えるじゃん。
余勢を駆って他のマイコンボードを接続してみた
アタッチしてシリアルポートとして見えたマイコンボードを以下に列挙します(メンドイので以下はイチイチminicomで接続してないですが。)
-
- Arduino Uno (純正品)
usbipd wsl listでは以下のように、Arduino Uno として見えてます。流石純正品。
アタッチすれば /dev/ttyACM0でした。
-
- ESP32 DevKitC
usbipd wsl listでは以下のようにUSBシリアルデバイスのCP210xに見えます。
アタッチすれば /dev/ttyACM0でした。
-
- ESP32C3
前回のESP32C3ですが、usbipd wsl listでは以下のようにUSBシリアルデバイスとして「も」見えてました。JTAG/serial debug unitとしても見えるみたいです。使い方はどうすんだろ?後で調べないと。
アタッチすれば /dev/ttyACM0として見えました。こちらはシリアルのみ?
-
- ST Microelectronics、Nucleo-F072RB
Nucleoボードは、usbipd wsl listではデバッグインタフェースであるST-Linkが前面に出ていて、ストレージとして見えてます。シリアルとしてはどうすんだろ?これは、アタッチしてみてません。また今度。
マイコンボードにより、どう認識されるのかは違うけれども、usbipdだけで使えるみたいじゃん。カーネル再ビルド不要か?知らんけど。