ラズパイPico 2枚でハードウェアKVMスイッチを11ユーロ自作する方法
デスクの上にPCが2台あるのに、キーボードとマウスは1セットしかない。そんな経験はありませんか?通常、2つの解決策があります。1つはソフトウェアベースの方法(BarrierやInput Leapなど)です。しかし、ここから面倒が始まります:ネットワーク切断、社内のVPNがローカル通信をブロック、作業用PCではサードパーティ製のソフトウェアをインストールできなかったりします。2つ目の選択肢はAliExpressで安く買えるUSBスイッチです。小さなボックスのボタンを押し、OSがデバイスを再初期化するまで数秒待ち、そして1日に何度もこれを繰り返します。
開発者のhrvachも同じ悩みを抱え、自作することを決意しました。プロジェクト名はDeskHop。キーボードとマウスを2台のPC間で瞬時に切り替えられるオープンなデバイスです。ホットキーでも、画面端にマウスカーソルをドラッグするだけで切り替えられます。2台のPCに1台のモニターを接続した場合と同じ感覚です。

内部の動作原理
回路はRP2040チップベースの標準的なラズパイPico 2枚で構成されています。各ボードはUSBでそれぞれのPCに接続します。マイコン同士はガルバニック絶縁チップ(TI ISO7721DRまたはADuM1)を介してUARTで通信します。
ここでの電源絶縁は本物です:2台のPCのグラウンドと電源ラインは互いに完全に分離されています。どちらかのPCが故障したりサージを発生させても、もう片方は安全に保たれます。
ホスト側のUSB処理にはPico-PIO-USBライブラリを使用しています。RP2040チップのプログラム可能なI/O(PIO)が通常のGPIOピンをフル機能のUSBポートに変えます。1枚のPicoボードがUSBホストとして動作し、キーボードとマウスを接続します。両方のボードは接続先のPCに対して標準的なHIDデバイスをエミュレートします。
シームレスな画面切り替え
DeskHopの最大の機能はシームレスなデスクトップエミュレーションです。1台目のPCのモニター上でマウスカーソルを右端に移動させると、DeskHopは信号経路を即座に2台目に切り替え、同じ高さでカーソルが2台目の画面左端に現れます。

キーボードは自動的にマウスに追随します。Linuxでコードを書いている時に、マウスを右に動かしてMacの画面に移ると、次のキーストロークはmacOSに送られます。

カーソル位置を追跡するため、DeskHopはHIDマウスデスクリプタを絶対座標に切り替えます。デバイスは内部で相対移動を合計して、画面上の正確な位置を計算します。
マウスでの切り替えが不便な場合は、Left Ctrl + Caps Lockホットキーが常に動作します。
便利な追加機能と動作モード
作者は、2つのシステムで作業する際の一般的な問題に対処するために、 firmwareにいくつかの専用モードを追加しています:
- マウス低速モード(
Right Ctrl + Right Alt)。このコンボを押すと、マウスの感度が急激に低下します。グラフィックエディタで1ピクセルだけ取得したり、ビデオでスライダーを精密に移動させたりする際に便利です。 - ゲームモード(
Left Ctrl + Right Shift + G)。絶対座標は多くの3Dゲームや仮想マシンで操作を壊してしまいます。ゲームモードでは、DeskHopは自動画面切り替えを無効にし、标准的な相対位置決めに戻ります。 - 切り替えロック(
Right Ctrl + K)。コントロールを現在のPCにロックし、通話中に誤って手を動かしてカーソルが2台目のモニターに飛んでいくのを防ぎます。 - スクリーンセーバーモード(
Left Ctrl + Right Shift + S)。カーソルがpongのボールのように画面上をランダムにジャンプし、PCがスリープに入るのを防ぎます。
ハードウェアと自作組み立て
このプロジェクトは、当初から誰でもキッチンテーブルの上で作れるように設計されました。2層PCBは最小限の部品点数です。

組み立て用部品(PCB v1.1):
| 部品 | 数量 | 概算価格 | | --- | --- | --- | | Raspberry Pi Pico | 2個 | 約8.20 € | | ボード用USB-Aコネクタ | 2個 | 約0.40 € | | TI ISO7721DRアイソレータ | 1個 | 約1.40 € | | キャパシタと抵抗(0805) | 8個 | 約0.44 € | | TPD4E1U06DBVR ESD保護チップ | 2個 | 約0.62 € |
部品代の合計は約11〜12ユーロです。ケースは3Dプリンタのprintsで数時間で出力でき、ボードはねじなしでパチッと嵌まります。

自分で半田付けしたくない人のために、リポジトリにはガーバーファイルが含まれています。Elecrowから完成品やキットを注文できます。
ファームウェアと設定
CMakeまたはDockerを使ってソースからプロジェクトをビルドできます:
docker-compose -f misc/docker.yml run --rm build_container
ソースからのビルドが面倒な場合は、リリースセクションに完成済みのfirmware.uf2ファイルがあります。デバイスをフラッシュするには、Left Ctrl + Right Shift + C + Oを押しながら保ちます。DeskHopが再起動し、「DESKHOP」という名前の仮想ドライブとして認識されるので、.uf2ファイルをそこにドロップするだけです。
異なるサイズのモニター間の移行高さを校正するためのホットキーコンボRight Shift + F12 + Yが用意されています。

設定はセキュリティを考慮して設計されています。Webサーバーもクラウドサービスも不要です。セットアップモードに入ると、仮想ドライブにconfig.htmファイルが現れます。それをChromeまたはYandex Browserでローカルに開き、WebHIDでブラウザ内で直接パラメータを編集できます。



作者はセキュリティ上の懸念について別のセクションを割いています:
- システム間のクリップボード共有やファイル転送はありません。
- ネットワークインターフェース、Wi-Fi、Bluetoothはありません。
- PCはキーボードの物理的なボタンを押さずにデバイスのファームウェアを強制更新することはできません。
制限事項と注意点
プロジェクトは素晴らしい出来ですが、完璧ではありません。製作前に知っておきたいことがいくつかあります:
- マルチモニター環境。Windows 10のアップデートKB50036以降、絶対HID座標の動作がマルチモニターで壊れました。カーソルが最初の画面に貼りつく可能性があります。firmwareには実験的な回避策がありますが、問題はまだ解決中です。
- 複雑な周辺機器。画面付きのキーボード、マクロパッド、20個もの追加ボタン付きマウスなどは正しく動作しない可能性があります。 экзотическиеエンコーダのないシンプルなオフィス用メカニカルキーボードは正常に動作します。
- 電源。両方のPCがUSBポートに電源を供給する必要があります。どちらかのPCが完全に電源オフの場合、デバイスは外部ハブなしでは起動しません。

マウスポーリングレートは1,000 Hzに達するため、移動中の遅延を感じることはありません。
自作する価値はあるか?
DeskHopは素晴らしい週末DIYプロジェクトです。2つのワークステーションで同時に作業しており、ソフトウェアKVMの遅延や安い中国製スイッチのボタンクリックにうんざりしているなら、この小さなボックスは初日で元が取れます。CのソースコードとPCB回路図はGPL-3.0ライセンスの下で完全にオープンです。
関連プロジェクト
