プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

【PR】キーボード・マウス切り替え機 DeskHopを作った

キーボード・マウス切り替え機 DeskHopを作りました

※こちらもPCBGOGOによる提供です。$100分なのでこれで最後になります。


gigazine.net
www.pcbgogo.jp

これまで使用していた中華の闇、キーボードマウス切り替え機ですが切り替えが遅いという問題がありました。
s51517765.hatenadiary.jp

これは、一般的なキーボードマウス切り替え機(KVMスイッチ)では、ある程度仕方ないことで事ですがUSBの接続先PCを切り替えるときに時間がかかります。
そこで見つけた↑のgigazineの記事を見て、PCBが作れるようになった今、作るしかないと思い作りました。

DeskHopは2つのRaspberryPi PicoがそれぞれPCと、マウスまたはキーボードとつながっています。
マウスの位置を読み取ることで、どちらのPCを動かすかを決めて、マウスとキーボードの入力を転送します。
つまり、右の画面(PC)でマウスを左の端へ持ってくると、そのまま左の画面(PC)に制御を移すことができます。
このときに、USBの切り替えにほとんど時間はかかりません。

2つのRaspberryPi Picoはアイソレータという部品を通してお互いのデータをやり取りしています。
アイソレータは電気的にお互いが混じらないで通信をするための部品です。
USB接続は電気的に繋がった状態にするのはよろしく無いそうです。これをグラウンドループと言います。

これを実際に作るにあたっては、PCBの製作を3回こなし、RaspberryPi Picoのプログラミングを思い出し、DeskHopのGitHubのコードやIssueを読み込みました。
DeskHopにおいてはマウスの速度の切り替えはキーボードのHotKeyで対応していますが、物理ボタンの方が扱いやすいと考え物理ボタンを追加しました。
PCB図面を見るとかなりスペースは小さかったので、ここに入れられる小さなタクトスイッチを探し実装しました。

PCBは中国の春節明け直前の先週日曜日に発注し、木曜日に到着しました。
DHLから転送される佐川急便は、基本は土日祝日は配送されないはずなので、中国の春節と日本の3連休の間でギリギリ届きました。
春節明けで納期が遅くなることもあるだろう、と思っていましたがいつもと同じ納期で届いたことになります。

部品の入手


PCBの他の部品はすべて秋月電子で入手できました。
アイソレーターに関しては、公式GitHubで推奨されているものが入手できませんでしたがPin互換のものがありましたので、そちらを使っています。

部品 種類 数量 秋月コード 価格(円)
基板取付用USBコネクタ Aタイプ メス 2個 115180 50*2
タクトスイッチ TVBP06-B043CR-B 2個【オプション】 108213 20*2
デジタルアイソレーター ADuM121N1BRZ 1個 113619 320
チップ積層セラミックコンデンサ 0.1μF100V C0G 3216 1パック5個入 115180 120
Raspberry Pi Pico - 2個 116132 770*2
USB Type B microケーブル - 2個 自宅在庫 0

USBケーブルが余っているとすると、2120円+送料(500円)+PCBの価格となります。
また、コンデンサについてはGitHubで記載されているサイズはインチなのでmmでは3216になります。

組み立て


実装するとこんな感じです。


デバッグ用のPinヘッダは実装していませんが、必要になったら実装するかもしれません。
GitHubではケースの3Dモデルも公開されていますが、とりあえず無しで裏には適当なスポンジシートを張っておきます。

FWの修正

まだ途中ではありますが、マウスの感度がWindowsLinuxで違うので、↓のパラメータを環境に応じて調整します。

/**================================================== *
 * ==============  Mouse Speed Factor  ============== *
 * ==================================================
 *
 * This affects how fast the mouse moves.
 *
 * MOUSE_SPEED_A_FACTOR_X: [1-128], mouse moves at this speed in X direction
 * MOUSE_SPEED_A_FACTOR_Y: [1-128], mouse moves at this speed in Y direction
 *
 * JUMP_THRESHOLD: [0-32768], sets the "force" you need to use to drag the
 * mouse to another screen, 0 meaning no force needed at all, and ~500 some force
 * needed, ~1000 no accidental jumps, you need to really mean it.
 *
 * This is now configurable per-screen.
 *
 * */

/* Output A values */
#define MOUSE_SPEED_A_FACTOR_X 16
#define MOUSE_SPEED_A_FACTOR_Y 16

/* Output B values */
#define MOUSE_SPEED_B_FACTOR_X 16
#define MOUSE_SPEED_B_FACTOR_Y 16

https://github.com/hrvach/deskhop/blob/main/src/user_config.h#L48

私の使用環境では、PC AはデスクトップのWindowsで固定、PC BにはLinux NoteとWindows Noteを入れ替えて使うことを考えています。
LinuxではY方向の速度がデフォルトでは小さくなるようなのでLinuxを使うときはMOUSE_SPEED_B_FACTOR_Y を大きくする切り替え機能をタクトスイッチに割り当てようと思っています。

まとめ

DeskHopを作成しました。
FWについては、これからカスタマイズしていくつもりです。

Original
github.com

Fork
github.com
改造した基板の図面はFork先のfeature branchにあります。

また、作成した基板が数枚余分にあるので、もしほしい人が居たら送料+αでお譲りしますので、気軽にご連絡ください(Twitter、問い合わせフォーム等で)。