テクノロジーの混沌とした世界では、左利き用のドライバーや自動で隠れる目覚まし時計のような、非常にニッチな問題を解決しようとする奇抜なプロジェクトが常に存在することに気づいたことはありますか?

私は日常のワークフローで2台の異なるコンピュータを使用し、1組のキーボード/マウスを共有しています。Amazonで見つけたUSB切替ボックスをいくつか試した結果、すべてに共通の問題があることに気づきました。切替に時間がかかり、ボタンを見つける作業がかなり面倒で、正直に言って、時間が経っても改善されません。

私が望んでいたのは、キーボードショートカットで出力を素早く切り替えられる方法と、マウスポインタをモニター間で魔法のように移動させることで同じ操作ができる機能です。このプロジェクトでは、コンピュータが異なるオペレーティングシステムで動作していても、両方を実現できます!

DeskHop case and board

機能

  • 完全にフリーでオープンソース
  • 切替時の遅延が目立たない
  • マウスポインタをコンピュータ間でドラッグするだけ
  • ソフトウェアのインストール不要
  • 手頃で入手しやすい部品(15€未満)
  • 3Dプリント可能なスナップフィットケース
  • 出力間の完全なガルバニック絶縁
  • Linux、macOS、Windowsで動作

ユーザーマニュアルが利用可能になりました

Open Source Hardware Logo


仕組み

このデバイスはキーボード/マウスとコンピュータの間に仲介役として機能し、両方のコンピュータと同時に接続を確立・維持します。そして選択に応じて、マウスやキーストロークをどこに転送するかを決定します。キーボードはマウスに追従し、その逆も同様なので、単にマウスを別のデスクトップにドラッグするだけで両方が切り替わります。

マウス

マウスカーソルを魔法のようにジャンプさせるため、マウスHIDレポート記述子を絶対座標を使用するように変更し、相対的な動きで送られてくるマウスレポートを内部で累積して位置の正確な集計を保持します。

モニターエリアから別のモニター方向に離れようとすると、Y座標を維持し、最大Xを最小Xに入れ替えてから出力を切り替えます。これにより、カーソルが別のモニターの同じ高さにシームレスに表示され、スムーズな遷移の感覚が向上します。

DeskHop Mouse Demo

MacからLinuxにマウスをドラッグすると、自動的に出力が切り替わります。


実際の切替は、一方の矢印が動きを止め、もう一方が動き始める瞬間に発生します。

キーボード

USBホストとして動作し、キーボードを定期的にクエリして、HIDレポートに事前設定されたホットキー(通常はCtrl + Caps Lock)がないかを探します。見つかった場合、それ以降のすべての文字を別の出力に転送します。

どの出力を使用しているかを視覚的に確認できるように、キーボードのLEDを再利用して必要なフィードバックを提供できます。

各コンピュータのLED状態も記憶しているため、以前の状態を正確に引き継ぐことができます。

DeskHop Typing Demo

ビルド方法

ビルド時のバージョン不整合や報告されたパス問題を避け、大規模なSDKのダウンロードを省くため、プロジェクトは現在、最小限のPico SDKとTinyUSBをバンドルしています。

Debian/Ubuntuシステムでは、以下をインストールしてください:

apt update
apt install \
    build-essential \
    cmake \
    gcc-arm-none-eabi \
    libnewlib-arm-none-eabi \
    python3

以下を実行することでビルドできるはずです:

cmake -S . -B build
cmake --build build

さらに、Web UIを再ビルドするにはwebconfig/を確認して./render.pyを実行してください。jinja2のインストールが必要です。

代替として、'docker compose'または'docker-compose'経由でDockerを使用できます:

docker-compose -f misc/docker.yml run --rm build_container

これにより、再現可能なビルドが保証されます。

ディスクを再ビルドするには、disk/フォルダを確認して./create.shを実行してください。必要に応じてシステムに合わせて調整してください。dosfstools(mkdosfsを提供するため)が必要です。

ビルド済みイメージの使用

代替として、ビルド済みイメージを使用できます。バージョン0.6以降は、単一のユニバーサルイメージのみです。.uf2ファイルが必要で、以下のいずれかの方法でデバイスにコピーするだけです:

ファームウェアのアップグレード

オプション1 - (ファームウェア0.6以降) 左Ctrl + 右Shift + C + Oを同時に押してデバイスを「設定モード」にします。キーボードが接続されている側のデバイスが再起動し、「DESKHOP」というUSBドライブに変わります。あとは.uf2ファイルをコピーするだけです。イメージが検証されると、デバイスがフラッシュして再起動し、もう一方のボードのアップグレードに進みます。この操作中はLEDが点滅します。完了すると、フラッシュに書き込んで再起動し、操作が完了します。

注意 - これは実際の汎用USBドライブではありません。ファイルをコピーすることはできません。

オプション2 - ROMブートローダーの使用 - 各Picoを接続しながらオンボードボタンを押したままにし、表示されるフラッシュドライブにuf2をコピーします。0.6以降のイメージは、電源の調整をせずにボタンを押したままにすることをサポートしていますが、「プラグインしながらボタンを押す」方法は、デバイスの状態に関係なく常に動作します。

オプション3 - CDCフラッシュコマンド(デバッグビルドのみ) - ファームウェアがDH_DEBUG_CDC_FLASH=ONでビルドされている場合、CDCシリアルコマンドでブートローダーモードをトリガーできます:

echo -n 'flash' > /dev/tty.usbmodem11104

これにより、デバイスは即座にブートローダーモードにリセットされ、「RPI-RP2」ドライブとして表示されます。この機能は開発ワークフローを目的としています。

その他の機能

マウス減速

YouTube動画のスライダーを特定の位置に移動しようとしたのに、マウスが飛びすぎて、まるで5歳の子供が「Operation」をプレイするように、超慎重に手を動かす羽目になったことはありませんか?

右CTRL + 右ALTを押すとスローマウスモードが切り替わります。マウスポインタが大幅に遅くなり、細かい精密作業が可能になり、同じキーを素早く押すと通常のマウス移動に戻ります。

スイッチロック

1つの画面にロックしたい場合は、RIGHT CTRL + Kを使用します。 これにより、誤って現在の画面から離れることを防げます。オフにするには、同じキーコンボをもう一度押します。

両画面ロック

RIGHT CTRL + Lを使用すると、両方のコンピュータを同時にロックできます。 この機能を使用するには、まず各出力のOSを設定してください(ショートカットが異なるため)。

ゲームモード

ゲームをしている場合、ゲームが絶対マウスモードで正しく動作しない可能性があります。この問題に対処するため、ゲームモードが導入されており、LEFT CTRL + RIGHT SHIFT + Gで切り替えられます。ゲームモードでは、現在の画面にロックされ、マウスは標準的な相対マウスとして動作します。これにより、さまざまな仮想マシンの問題や、現在サポートされていないオペレーティングシステムなども修正されるはずです。

スクリーンセーバー

コンピュータがスタンバイに入るのを防ぐために組み込まれているとされていますが、正直なところ、ただ見ていて楽しいだけです。デフォルトでオフで、マウスポインタがポンボールのように画面上を跳ね回ります。有効にすると、ユーザ設定ヘッダーで定義された非アクティブ期間後に起動し、その画面に向かって何らかの出力を送信するとすぐに自動的にオフになります。

潜在的な使用例 - スタンバイからビデオを再開しないバグのあるUSBドックがあるので、スリープさせないことは便利な回避策になります。

ハードウェア

回路は2つのRaspberry Pi Picoボードをベースにしています。安価(1台あたり4.10€)で、手はんだ付けが可能で、ほとんどのサプライヤーが在庫しているため選択されました。

PicoはUARTを使用して接続され、Analog Devices ADuM1201デュアルチャネルデジタルアイソレータ(約3€)または、より安価で高速、ピン互換のTI ISO7721DR(約1.5€)で分離されます。TI ISO7721DRが推奨の選択肢です。

通常はデュアルUSBのサポートはありませんが、RP2040のプログラマブルIOの魔法を使ったUSB実装である素晴らしいプロジェクトのおかげで、USBホストとデバイスの両方として動作するサポートがあります。

PCB [更新済み]

DIYビルドをできるだけシンプルにするため、トレースは片面に保持され、部品数は最小限に抑えられています。

PCB Image

USB D+/D-差動線は長さが同一であるべきですが、対応するGPIOトレースとPICO PCB自体の長さの差を補正するため、意図的にわずかに非対称になっています。そのため、全体の長さは一致するはずです。

Zd(差動インピーダンス)は90オームを目標としています(約107オームを達成、十分に近い : ))。

厚さはスナップフィットが期待通りに動作するよう1.6mmに設計されています。

PCBには2つのバージョンがあります(ユーザーにとって大きな違いはありません)。オリジナル(v1.0)ははんだ付けと組み立てが容易で、v1.1には以下のようなアップグレードがあります:

  • ESD保護の追加(TPD4E1U06DBVR)

  • キーボード/マウスコネクタ用のVBUSコンデンサの追加

  • シルクスクリーン方向マーキング

  • ヘッダーが事前にはんだ付けされたクローンボード用の穴とより簡単な位置合わせ

  • USB 27オーム抵抗

    このバージョンは、小型の過渡電圧サプレッサICと0805抵抗のため、手はんだ付けがやや困難ですが、完全に可能です。TVSは理論上省略可能ですが(推奨されません)、動作します。

今後 - Picoを必要とせず、より小型で便利なベアrp2040ボード。

ケース

私は3Dがあまり得意ではないので、ケースはシンプルで基本的なものですが、役目を果たします。印刷しやすく、フィラメント約33gを使用し、数時間で完了します。

水平方向のPCB移動は穴を通るペグで、垂直方向の移動は側面のスナップフィットラグで阻止されます。ネジは不要です。ケースはロゴと2つの追加スナップフィットラグを備えるようわずかに再設計され、より良いシールを提供します。

両ボードのMicro USBコネクタはケースの側面からオフセットされているため、ケーブルが届くように穴をやや大きくする必要があります。

蓋はスナップフィット設計で、開けるためのドライバースロットがあります。上面のマーキングは凹型で、クレヨンなどで仕上げてコントラストを良くできます(またはそのままにすることもできます)。

DeskHop with 3D Printed Case

部品表

オリジナルPCB v1.0 BOMを表示するにはここをクリック
部品 数量 単価 / € 価格 / €
Raspberry Pi Pico 2 4.10 8.20
ADuM1201BRZ 1 2.59 2.59
Cap 1206 SMD 100nF 2 0.09 0.18
USB-A PCB conn. 2 0.20 0.40
Headers 2.54 1x03 2 0.08 0.16
合計 11.53

ADuMの代わりにTI ISO7721DRを使用できます。ピン互換で、より安価で、より優れた仕様です。

PCB v1.1

部品 部品番号 数量 単価 / € 価格 / €
U1, U2 Raspberry Pi Pico 2 4.10 8.20
J1, J4 USB-A PCB conn. 2 0.20 0.40
U4 TI ISO7721DR 1 1.40 1.40
(または ADuM1201BRZ)
C1, C2 Cap 0805 SMD 100nF 2 0.09 0.18
R1, R2, R3, R4 Res 0805 SMD 27ohm 4 0.03 0.12
U3, U5 TPD4E1U06DBVR 2 0.31 0.62
C3, C4 Cap 4.7uF SMD 0805 2 0.07 0.14
J2, J3 Headers 2.54 1x03 2 0.08 0.16
合計 11.22

USB-AコネクタはMolex MX-67643-0910または同じ寸法の安価なものを使用できます。

追加の手順:

組み立てガイド

電子工作の経験がある場合は、これを必要としないでしょう。ただし、経験がない方もいるかもしれないので、このビデオがプロセスのガイドになるかもしれません。はんだ付け後は、腐食を防ぐためにPCBからフラックスを除去してください。

その標準的な方法は、イソプロピルアルコールと古い歯ブラシを使用することです。しかし、私の古い歯ブラシをオンラインに載せるつもりはないので、その部分は各自で工夫してください :)

PCB Assembly Guide

[注意] このビデオ組み立てガイドはpcb v1.0をカバーしています。改訂版は非常に似ており、手順は基本的に同じです。

使用ガイド

キーボードショートカット - (fwバージョン0.68以降)

設定:

  • Left Shift Left Ctrl + Right Shift + C + O - 設定モードに入る
  • Right Shift + F12 + D - フラッシュ設定を削除
  • Right Shift + F12 + Y - 画面切替オフセットを保存

使用:

  • Right CTRL + Right ALT - 低速マウスモードの切り替え
  • Right CTRL + K - マウスデスクトップ切替のロック/ロック解除
  • Right CTRL + L - 両出力の同時ロック(事前に出力OSを設定、以下のショートカットを参照)
  • Left Shift Left CTRL + Right Shift + G - ゲームモードの切り替え(画面にロックし、標準マウスとして動作)
  • Left CTRL + Right Shift + S - スクリーンセーバーの有効化
  • Left CTRL + Right Shift + X - スクリーンセーバーの無効化
  • Left CTRL + Caps Lock - 出力間の切替

注: 一部のキーボードは両方のシフトキーを同時に正しく送信しないため、ショートカットが変更されました。これで誰でも動作します。混乱を招いたことをお詫びします。

カーソル高さのキャリブレーション切替

これは必須ではありませんが、画面が完全に揃っていない場合やサイズが異なる場合に便利です。目的は、マウスポインタが正確に同じ高さで出てくるようにすることです。

Border height difference

大きい画面にマウスを駐車し、小さい/低い画面の高さに合わせてRight Shift + F12 + Yを押します。LED(とCaps Lock)が点滅して確認します。

下部の境界線についても(大きい画面の境界線より上にある場合)繰り返します。これがフラッシュに保存され、今後はこのキャリブレーション値が保持されます。

出力ごとの複数画面

WindowsとMacには複数画面と絶対位置指定の問題があるため、回避策が必要です(まだ実験的)。より良い回避策が開発中ですが、現時点では各出力のオペレーティングシステムと画面数を設定する必要があります。

メイン画面は中央に、セカンダリ画面は端に配置する必要があります。実際のオプションを設定するには、デバイスのWeb設定ページを開いてください。

Multiple screens per output

Web設定モード

fw 0.6から、改善された設定モードが導入されました。デバイスを設定するには、以下の手順に従ってください:

  1. Left Ctrl + Right Shift + C + Oを押す - デバイスが再起動して設定モードに入ります(キーボードが接続されている側)。設定セッション中はLEDが点滅し続けます。

  2. 「DESKHOP」という名前の新しいUSBドライブが表示され、config.htmという単一のファイルがあります

  3. そのファイルをChromium / Chromeで開きます。残念ながらFFは現在サポートされていません。WebHIDの実装を避けているためです。

  4. 「接続」をクリックし、deskhopデバイスにペアリングを許可します。

    Web Browser with URL

  5. 希望するオプションを設定し、「保存」をクリックしてデバイスに書き込みます。

  6. 安全のため、メニューの「終了」をクリックして設定モードを終了します。

    Web Config

Linuxでデバイスが表示されない?ここをクリック。

Q: LinuxのChromiumが動作しない。

A: /devの権限を調整するか、対応するudevルールファイルを作成し、ユーザーが正しいグループに所属していることを確認する必要があります:

/etc/udev/rules.d/99-deskhop.rules

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="c000", GROUP="plugdev", MODE="0660"

Q: Viaのような素敵なオンラインページを作成する代わりに、この奇妙なUSBドライブの仕組みを使うのはなぜですか?

A: ランダムなオンラインの場所からJavaScriptを読み込んで入力デバイスとやり取りするのは、潜在的なセキュリティリスクです。設定用Webページはローカルのみで、外部から何も読み込まれません。

設定用Webページが「奇妙」なのは、意図的な難読化によるものではないことに注意してください。ストレージが非常に限られているため自己展開するのです。ソース全体は100%オープンで、このリポジトリの一部です。自分で再ビルドすることをお勧めします。

機能検証

新しいUSB周辺機器を接続すると、ボードはLEDを2回点滅させ、もう一方のボードにも同じことを指示します。これにより、各ボードのUSBと送信通信が動作しているかをテストできます。

まず一方にキーボードを接続し、次にもう一方に接続してこのテストを行ってください。すべてが正常であれば、両方のケースでLEDが素早く点滅します。

セキュリティと安全性

使いやすくしたり、設定をシンプルにしたりする機能の一部は、意図的に省かれています。これらの決定の内訳を簡単に説明します:

  • システム間のコピー&ペーストやあらゆる情報共有はありません。これにより、情報漏洩を防ぎます。
  • 明示的なユーザーの同意なしのWebHIDデバイス管理はありません。出力コンピュータからのインバウンド接続はありません。標準的なキーボードLEDのオン/オフメッセージの例外を除き、1バイトのデータに厳しく制限されています。
  • 出力からのFWアップグレードトリガーはありません。特別なキーボードショートカットによる明示的で意図的なユーザーアクションのみが可能です。
  • 接続されたキーボード/マウスのカスタムエンドポイントは公開されず、これらのデバイスへの情報転送も行われません。これらの潜在的な脆弱性は、コンピュータから効果的にファイアウォールされます。
  • 入力履歴の保持は許可されていません。
  • いかなる理由でも、デバイスが開始するキーストロークはありません。出力されるのは、ユーザーが入力/トリガーしたものだけです。
  • 出力は物理的に分離され、最小絶縁電圧2kVのガルバニック絶縁されています。
  • デバイス間で交換されるすべてのパケットは固定長で、転送される設定オプションは短いリストに制限されています。ほとんどのオプションは読み取り専用です。クロスデバイスのファームウェアアップグレードは無効にできます。
  • BluetoothやWi-Fi、ネットワーク、インターネットアクセスなどはありません。
  • 接続されたコンピュータは、いかなる状況でも信頼されません。
  • 設定モードは、非アクティブ期間後に自動的に無効になります。
  • コード全体はオープンソースで、バイナリブロブは一切なく、その目的を説明する詳細なコメントが付けられています。誰も信頼せず、自分が実行しているものを手動で監査して確認することをお勧めします。

これでも何も保証されませんが、安全で保護された状態を保つための合理的な一連の基本ルールになると信じています。

FAQ

  1. 2つのPicoだけを持っていますが、PCBとアイソレータなしでできますか?

    はい。アイソレータは推奨されますが、なくても動作するはずです。

  2. モニターの解像度が2つ異なる場合はどうなりますか?

    マウス移動は抽象的な座標空間で行われ、コンピュータが物理画面との対応関係を判断するため、正常に動作するはずです。

  3. どこで購入できますか?

    私は何も販売していません。これは個人的な非営利の趣味プロジェクトです。

    更新1: このリンクからElecrowでPCB、組み立て済みPCB、または完全組み立て済みデバイスのいずれかを1個から注文できるようです ユーザーの報告によると、ボードは空白の状態で届くので、自分でファームウェアを書き込む必要があります。

    更新2: Elecrowに何も依頼したわけではありませんが、数日前、将来のボードプロトタイピングに使用される少額の予算でプロジェクトをスポンサーすることを申し出てくれました。より良いボードを作成し、2つ以上の出力を追加することが私の目標なので、プロトタイピングサービスはプロジェクトに有益だと考えています。

  4. マウスでアクティブな画面が変更された場合、キーボードも追従しますか(その逆も)?

    はい。まるで1台のコンピュータであるかのように動作させることを意図していました。

  5. Logitech Unifyingレシーバーのようなキーボード/マウスコンボドングルで動作しますか?

    動作するはずです。最近のFW更新後、コンボレシーバーのサポートが大幅に改善されました。

  6. ワイヤレスマウスとキーボードが別々のワイヤレスレシーバー(マウス用とキーボード用)を持つ場合、動作しますか?

    動作するはずです。Ankerのワイヤレスマウスと別レシーバーで試したところ、正常に動作しました。

  7. ビルドやコンパイルに問題があります

    回答があるかもしれないトラブルシューティングWikiを確認してください。

ソフトウェア代替案

特定の状況で動作する場合は、いくつかのソフトウェア代替案を使用できます。

  1. Barrier - 無料、オープンソース
  2. Input Leap - 無料、オープンソース
  3. Synergy - 商用
  4. Mouse Without Borders - 無料、Windowsのみ
  5. Universal Control - 無料、Appleの機能

欠点

  • Windows 10はKB5003637でHID絶対座標の動作を破壊したため、Windowsでは1画面を超えて使用できません(マウスはメイン画面に留まります)。より良い回避策が開発中です。
  • コードのクリーンアップやリファクタリングが必要です。
  • 多様なデバイスでテストされていないため、お使いのハードウェアで動作するかどうかは不明です。最初から動作しない可能性は十分にあります。
  • ノブ、追加ボタン、スライダー付きの高度なキーボードでは、これらの追加ハードウェアが動作しない問題に直面するでしょう。
  • 300個のボタンを持つ超現代的なマウスでは、一部のボタンが期待通りに動作しない可能性があります。
  • 注意: この動作には両方のコンピュータが接続され、USBに電源を供給する必要があります(各ボードは接続先のコンピュータから電源供給されるため)。最近の多くのデスクトップとラップトップは、電源オフ時でも電源を供給します。1つのボードを完全に切断して動作させる必要がある場合は、USBハブを使用してキーボードとマウスの両方を単一のポートに接続できるはずです。
  • MacOSには1画面を超える問題があり、最新のファームウェアではそれを修正する実験的な回避策を提供しています。

進捗状況

では、この熱意の理由は何でしょうか?信じられません。皆さんに感謝します!シンプルな個人的プロジェクトにこれほどの関心が寄せられるとは予想していませんでしたので、初期の機能はかなり基本的なもの(私の料理の腕前と同様に)で、主に私自身のユースケースをカバーしています。より幅広いデバイス互換性、追加機能、バグの削減をもたらすファームウェアの更新にご期待ください。これは趣味のプロジェクトなので、時間に制約があることへのご理解をいただき、最善を尽くすことをお約束します。

計画中の機能:

  • WindowsとmacOSのマルチスクリーン向けのより良い回避策
  • 透過/ゲームモード
  • 2つ以上の出力のサポート
  • 設定UIの改善
  • ...など!

単一のPico Wボードだけで基本機能を提供し、コストをさらに削減し、追加のハードウェアやPCBなしで試せるライトバージョンを開発中です。

マウスのポーリングは現在1000Hzで動作するはずです(グラフのディップは動きすぎて腕が痛くなったためです :-)):

Mouse polling rate

スポンサー/寄付

私は利益やその他の理由ではなく、すべての人により良い作業環境を提供しようとするためだけにこれを行っています。 プロジェクトをさらにサポートしたい場合は、国境なき医師団のような慈善団体への少額の寄付を検討してください。

Donate to Doctors Without Borders, with PayPal

ご支援を検討してくださったすべての方に感謝します!

免責事項

このプロジェクトの構築を試みるすべての方に、私は傷害、損害、その他の結果について一切の責任を負わないことを理解し、認めていただくようお願いします。安全は重要であり、プロセス全体を通じて必要な予防措置を講じ、自身の幸福に個人的な責任を持つよう、慎重にこのプロジェクトに取り組むことをお勧めします。感電、火傷、ストレス、怒りを避けてください。楽しんでください!

Happy switchin'!