HID Remapperを使ってみる その②

デュアルバージョンのHID Remapperを使ってみたいと思います。

作ってみる

デュアルバージョンはRaspberry Pi Picoを2つ使って、自作することができます。
github.com

今回もWaveshare RP2040-Zeroを使いたいと思いますが、GPIO20(UART1 TX), GPIO21(UART1 RX)が背面の小さなパッドにあり、配線が難しいので別のピンにすることにしました。
(ピンを変更するとファームウェアの設定も変更する必要があります。)

A側 B側
5V 5V
GND GND
GPIO8 (TX) GPIO9 (RX)
GPIO9 (RX) GPIO8 (TX)
GPIO10 (CTS) GPIO11 (RTS)
GPIO11 (RTS) GPIO10 (CTS)

RP2040のGPIO0からGPIO29までのGPIOピンはUART0またはUART1のいずれかのピンに設定できるので、どのピンでも大丈夫だと思います。(RP2040のデータシート参照 1.4.3. GPIO Functions)
HID RemapperではUART1を使うようになっているので、今回はGPIO8, GPIO9, GPIO10, GPIO11を使うことにしました。
(RP2040-ZeroのUSBコネクタの反対側にある9~13ピンはRP2040-Oneとは位置が異なるので、ZeroとOneを共通で使用したい場合は側面のピンを選択する方が良いと思います。勝手にZeroとOneのフットプリントは同じだと思い込んでいました😋)

前回と同じように2つのマイコンボードを接続する基板を作成します。

ファームウェア

ピンを変更したので、Releasesにあるファームウェアは使用できません。ピンの設定を変更して、ファームウェアをビルドする必要があります。

ビルド方法は、REAMEにある通りです。

自分が使用する設定をfirmware/src/boardsに作成して、その設定をPICO_BOARDに指定する方法にしました。
pico-sdkにあるRP2040-Zero用の設定を参考にHID Remapper用の設定(firmware/src/boards/waveshare_rp2040_zero_remapper.h)を作成しました。
GPIO_VALID_PINS_BASEでは使用していないGPIOピンにスイッチを接続して、拡張できるようになっています。(custom-board v4を参照)
また、GPIO出力もできるのでLEDを接続して、レイヤーの可視化などもできるようです。

// firmware/src/boards/waveshare_rp2040_zero_remapper.h

#ifndef _BOARDS_WAVESHARE_RP2040_ZERO_REMAPPER_H
#define _BOARDS_WAVESHARE_RP2040_ZERO_REMAPPER_H

#define WAVESHARE_RP2040_ZERO_REMAPPER

#define GPIO_VALID_PINS_BASE 0b00000000000000000000000000000000

// hid remapper single
#ifndef PICO_DEFAULT_PIO_USB_DP_PIN
#define PICO_DEFAULT_PIO_USB_DP_PIN 0
#endif

// --- FLASH ---
#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1

#ifndef PICO_FLASH_SPI_CLKDIV
#define PICO_FLASH_SPI_CLKDIV 2
#endif

#ifndef PICO_FLASH_SIZE_BYTES
#define PICO_FLASH_SIZE_BYTES (2 * 1024 * 1024)
#endif

// All boards have B1 RP2040
#ifndef PICO_RP2040_B0_SUPPORTED 
#define PICO_RP2040_B0_SUPPORTED  0
#endif

#endif

デュアルバージョンのUARTのピン設定はserial.hにあるので、今回の設定を追加します。

// serial.h
#ifdef HID_REMAPPER_BOARD

#define SERIAL_TX_PIN 24
#define SERIAL_RX_PIN 25
#define SERIAL_CTS_PIN 26
#define SERIAL_RTS_PIN 23

#elif defined WAVESHARE_RP2040_ZERO_REMAPPER

#define SERIAL_TX_PIN 8
#define SERIAL_RX_PIN 9
#define SERIAL_CTS_PIN 10
#define SERIAL_RTS_PIN 11

#else

#define SERIAL_TX_PIN 20
#define SERIAL_RX_PIN 21
#define SERIAL_CTS_PIN 26
#define SERIAL_RTS_PIN 27

#endif
$ cd hid-remapper/firmware/build
$ PICO_BOARD=waveshare_rp2040_zero_remapper cmake ..
$ make

remapper_dual_a.uf2, remapper_dual_b.uf2をそれぞれのRP2040-Zeroに書き込みます。remapper_dual_a.uf2のRP2040-ZeroをPCに接続し、remapper_dual_b.uf2のRP2040-Zeroにデバイスを接続します。

使ってみる

使い方はシングルバージョンのHID Remapperと同じです。

前回の記事にも書きましたが、シングルバージョンでは、デバイスによってはPCの再起動や休止から復帰時に認識しないことがありましたが、デュアルバージョンでは問題なく認識しました。シングルバージョンでうまく動かない場合はデュアルバージョンも試してみると良いかもしれません。

HID RemapperはUSBハブを使用して複数デバイスをまとめて入力することができるようです。(custom-board v5を参照)
シングルバージョンでは私の使っているUSBハブの相性なのか認識されませんでした。
しかし、デュアルバージョンではUSBハブを使用して複数のデバイスをまとめてリマップすることができました。

USBハブを使うことで複数のデバイスでレイヤーを共有できるようになります。ただ、デバイス毎に設定は出来ませんでした。マウスを複数接続し右クリックを変更した場合、接続したすべてのマウスで変更が適用されるようです。
マウスとマウス以外のHIDデバイスをリマップする場合にUSBハブを使うといった使い方が良さそうです。
例えば、テンキーをマクロパッドとしてカスタマイズし、テンキー側でマウスのレイヤーを切り替えたりと色々面白そうな使い方ができそうです。

私が試した限りではELECOMのワイヤレスHugeはUSBハブに接続するとうまく動きませんでした。USBハブとデバイスの相性等があるのかもしれません。直接接続すると問題ありません。

まとめ

今回はデュアルバージョンのHID Remapperを使ってみました。
デュアルバージョンはマイコンを2つ使用するのでシングルバージョンより少し割高ですが、私の環境ではデバイスがうまく認識したり、USBハブが使えたりと利点がありました。

ただ、RP2040-Zeroを使うにあたり使用するGPIOを変更したため、ファームウェアをビルドし直す必要があるので少し手間でした。サイズが大きくなりますが、デフォルトで設定されているGPIOが使えるRaspberry Pi Picoの互換ボードを使う方が楽だと思います。

安価に購入できるメーカー製のメンブレンパンタグラフのテンキーを手軽にワイヤレスなマクロパットとして、マウスと併せて運用できるのは便利でした。

2024/03/15 追記

記事を書いた時点から変更された部分を追記します。
r2024-02-14のバージョン時点の内容です。

バイス毎のリマップ

r2024-01-03からUSBハブを使用した際にデバイス毎にリマップすることができるようになりました。
(以前と同様に複数のデバイスをまとめてリマップもできます。)

Inputの項目で変更したいUSBデバイスが接続されているポートを選択します。
試した2ポートのUSBハブではPort 2, 4に接続されていました。
どのポートに接続されているかは分からなかったので、ポートを変えながら接続されているポートを見つけました。

例えば、Port 2に接続されているマウスの左クリックを右クリックに変更し、Port 4に接続されているマウスの左クリックはそのまま左クリックにする場合は以下のように設定しました。

serial.h

記事を書いた時点ではUARTのピン設定はserial.hを変更する必要がありましたが、設定ファイル(PICO_BOARD)から設定できるようになりました。

// firmware/src/boards/waveshare_rp2040_zero_remapper.h

#define SERIAL_TX_PIN 8
#define SERIAL_RX_PIN 9
#define SERIAL_CTS_PIN 10
#define SERIAL_RTS_PIN 11