【補足記事】USBIPD-WIN 4.0.0以降を使う方法【SPIKE-RTでロボコンに出よう!!】

# 本記事について

本記事は、【SPIKE-RTでロボコンに出よう!!】シリーズ #1 開発環境を作ろう の 『Step 3. 転送方法の構築』を補足する記事です。

https://qiita.com/koushiro/items/02dd13a797afbd568beb#step-3-%E8%BB%A2%E9%80%81%E6%96%B9%E6%B3%95%E3%81%AE%E6%A7%8B%E7%AF%89

2023年12月6日、usbipd-winの新しいバージョン「4.0.0」がリリースされました。
これに伴い、コマンドの変更等が発生したため、本記事にて改めて説明することとします。

# USBIPD-WIN プロジェクトをインストールする

このソフトは、Windowsに接続されたUSBデバイスを、WSLにも認識させるために必要なツールです。
デフォルトでは、PCに接続されたUSBデバイスは、自動的にはWSLに接続されません。
これを、USB/IPという仕組みを用いて、WSLにも接続できるように設定を行います。

まず、下記のリンクからインストーラをダウンロードします。

https://github.com/dorssel/usbipd-win/releases

ダウンロードするのは`usbipd-win_4.0.0.msi`です。

![usbipd-dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/9cb2e244-1d60-829e-6ca0-6dbbbd5bfa08.png)

ダウンロード出来たら、インストーラを実行します。
すると以下のような画面が表示されるので、「Install」ボタンを押しましょう。

![usbipd_win_installer1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/4e468221-5c08-cf4f-038f-8fb28baba0c5.png)

インストールが完了すると以下のような画面に変わるので、「Close」ボタンを押してウィンドウを閉じましょう。

![usbipd_win_installer3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b235558d-278b-0d6f-0581-f446d6ff9d11.png)

## バージョンの確認

インストールが完了したら、Powershellにて`usbipd`と入力して、バージョンを確認しましょう。
以下のように表示されればOKです。

```powershell:powershell
> usbipd
usbipd-win 4.0.0

Description:
  Shares locally connected USB devices to other machines, including Hyper-V guests and WSL 2.

Usage:
  usbipd [command] [options]

Options:
  --version       Show version information
  -?, -h, --help  Show help and usage information

Commands:
  attach   Attach a USB device to a client
  bind     Bind device
  detach   Detach a USB device from a client
  license  Display license information
  list     List USB devices
  server   Run the server on the console
  state    Output state in JSON
  unbind   Unbind device
```

#  HUBブロックの接続

では、PCにSPIKE Prime HUBブロックを接続します。
この時、特殊な方法でPCと接続する必要があるため、その手順を説明します。

まず、HUBブロックの上面にある、Bluetoothアイコンが印字された丸いボタンを押します。
このボタンを押し続けた状態で、USBケーブルによりHUBブロックをPCと接続します。

接続した直後、Bluetoothボタンの淵が紫色に点灯します。
この状態のままさらに5秒程押し続けると、消灯⇒赤⇒緑⇒青の順に光り始めます。
これで、HUBブロックを「DFUモード」でPCと接続することができました。

![spike_dfu.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/85bd0cc1-69a5-8298-0668-1c87474452d2.gif)

DFUモードはファームウェア(元となるソフト、OSのようなもの)を書き換えるためのモードです。

SPIKE-RTは現時点でダイナミックローディング(ファームウェア内に複数のプログラムを入れる方式)には対応しておらず、スタンドアローン(1ファームウェアにつき1プログラム方式)となるので、毎度OSごと書き換えているようなイメージです。

## USBデバイスの確認

HUBブロックをDFUモードで接続出来たら、WSLを有効化したときと同じ手順でPowershellを**管理者権限**で起動し、WSLに接続可能なUSBデバイスを確認します。

```powershell:Powershell
> usbipd list
```

実行すると、以下のように表示されます。
(USBの接続状況によって異なるため、以下は一例に過ぎません。)

```powershell:Powershell
> usbipd list
BUSID  VID:PID    DEVICE                                                        STATE
2-1    0694:0008  LEGO Technic Large Hub in DFU Mode                            Not shared
2-2    0781:5571  USB 大容量記憶装置                                            Not shared
2-5    27c6:538d  Goodix fingerprint                                            Not shared
2-6    0c45:671b  Integrated Webcam                                             Not shared
2-10   0cf3:e007  Qualcomm QCA61x4A Bluetooth                                   Not shared
```

ここで、`LEGO Technic Large Hub in DFU Mode`がHUBブロックを指しているので、これの一番左の`BUSID`を控えておきます。
今回の場合、`2-1`となります。

## Prime HubをWSL2にバインド(共有)

以下のコマンドにより、Windows側からWSL側に、USBデバイスをバインド(共有)します。
`--busid`の後は、先ほど控えた`BUSID`を指定します。

```powershell:Powershell
> usbipd bind --busid 2-1
```

このコマンドを入力後、もう一度`usbipd list`を入力すると、一番右側の`STATE`の部分が`shared`に代わります。

```powershell:Powershell
> usbipd list
BUSID  VID:PID    DEVICE                                                        STATE
2-1    0694:0008  LEGO Technic Large Hub in DFU Mode                            shared
2-2    0781:5571  USB 大容量記憶装置                                            Not shared
2-5    27c6:538d  Goodix fingerprint                                            Not shared
2-6    0c45:671b  Integrated Webcam                                             Not shared
2-10   0cf3:e007  Qualcomm QCA61x4A Bluetooth                                   Not shared
```

## Prime HubをWSL2にアタッチ(接続)

以下のコマンドにより、Windows側からWSL側に、USBデバイスをアタッチ(接続)します。
`--busid`の後は、先ほど控えた`BUSID`を指定します。

```powershell:Powershell
> usbipd attach --wsl --busid 2-1
```

このコマンドにより、HUBブロックをWSLに接続することが出来るのですが、このコマンドは一回限りのアタッチになります。
これを、USBを外して再度接続しなおしても、自動的にWSLにアタッチされるようにするには、以下のように`--auto-attach`オプションを付加します。

```powershell:Powershell
> usbipd attach --wsl --busid 2-1 --auto-attach
```

これにより、ロボットを動かすために一時的にUSBを取り外しても、USBを接続しなおせば自動的にWSLにアタッチされます。

## 接続解除

接続を解除する場合は以下のコマンドで解除することができます。

```powershell:Powershell
> usbipd detach --wsl --busid 2-1
> usbipd unbind --wsl --busid 2-1
```

これにより、接続解除⇒共有解除を行えます。

# 補足終了

以上がアップデートに伴う補足となります。
以降は、『PyUSBの導入』の部分から、環境構築を再開してください。

https://qiita.com/koushiro/items/02dd13a797afbd568beb#pyusb%E3%81%AE%E5%B0%8E%E5%85%A5

# 参考記事

https://qiita.com/motoJinC25/items/e332d731111c2a29ca25