有線キーボードをスタックチャンでBluetooth接続できるようにした

VoyagerとNavigatorを接続し、Mac miniへのBluetooth接続状態を表示するスタックチャン

最近、Mac miniとOmarchy(Linux)のPCの両方を操作することが増えた。

メインで使っているキーボードはZSAのVoyager。有線なのでMac miniにつないでいる。OmarchyにはHHKB Hybrid Type-Sを無線で接続し、トラックボールは接続先を切り替えられるものを使っていた。

つまり、キーボード2台とトラックボール1台。これをもう少しすっきりさせたい。

VoyagerにはNavigatorというトラックパッドのアドオンがあり、トラックボールの代わりになる。この組み合わせをBluetoothで両方のPCに切り替えて使えれば、HHKBもトラックボールも不要になる。

そこで、M5StackのスタックチャンにVoyagerをUSBでつなぎ、PCへBluetoothで入力を送るファームウェアを作った。

接続は、Voyager → USB → スタックチャン → Bluetooth → PC、という形になる。

キーボードからスタックチャンまではケーブルが残るものの、PCとはBluetoothで接続できる。Voyager自体を改造する必要もない。

トラックパッドの処理もスタックチャンで

Navigatorはそのままでも簡易的なマウスとして動くが、マウス互換の信号にはスクロールの情報がない。

そこで、指の位置データを直接受け取り、ポインタ移動、クリック、2本指スクロールへ変換する処理をスタックチャン側で行うようにした。

公式の常駐ソフトはUSBでの直接接続が必要なので、今回のBluetooth接続では使えない。またOryxやKeymappで設定を変更するときも、VoyagerをPCへ直接つなぎ直す必要がある。

接続先の切り替え

接続先の切り替えもできるようにした。Voyagerに割り当てたF21でMac mini、F22でLinuxへ切り替える。スタックチャンの画面からも選べる。

Mac miniとLinuxの両方で入力でき、往復して切り替えられることを実機で確認した。接続先は3台まで登録できるが、今確認しているのはこの2台。

意外と給電で苦労した

スタックチャンの内蔵バッテリーだけで使ってみると、1時間程度しか持たなかった。これでは短いので、外から電源を取ることにした。

スタックチャンには、本体と台座にそれぞれUSB-C端子がある。本体にはVoyagerをつなぐので、台座から電源を取ればよいと思っていた。

ところが、この2つの端子は電源だけでなくデータ線もつながっている。台座を普通のUSBケーブルでPCにつなぐと、本体につないだVoyagerまでPCに直接つながってしまう。

その結果、接続と切断を繰り返したり、Bluetooth経由で送るはずの入力がUSB経由でPCに届いたりした。台座からは電源だけを取り、データは流さないようにする必要があった。

データ通信をブロックするアダプタを挟んでもうまくいかず、最終的には充電専用ケーブルに替えることで、台座からの給電とキーボード入力を両立できた。

「データ通信をしない」と書いてあれば何でもよい、というわけではなかった。給電側のデータ線がどう結線されているかも関係する。今回動いたケーブルでひとまず解決した。

更新もログもWi-Fi経由で

本体のUSB-CはVoyagerが使うので、使用中はUSBでファームウェアを書き込んだり、ログを取ったりできない。更新するたびにケーブルをつなぎ替えるのも面倒なので、Wi-Fi経由のOTA(Over the Air)更新を用意した。

初回だけPCへUSB接続し、ブラウザのWeb SerialでWi-Fiを設定する。このときOTA用のトークンも設定しておく。あとはビルド後に sh tools/ota.sh を実行すれば、トークン付きでファームウェアを送り、更新して再起動できる。

ログや画面の画像もWi-Fi経由で取得できるようにした。Voyagerをつないだまま動作を調べられるし、画面の画像をAIと確認しながら修正を進められた。

まだ調整中

Navigatorで長い文章を選択するときのために、指を離してもドラッグを続け、タップで解除する動作を入れた。このあたりの使い勝手はまだ調整している。

画面の消灯や、画面をタップして復帰する休止機能も入れた。基本動作は確認したが、長時間使ったときの安定性や電池の持ちまでは、まだ検証できていない。

なお、今のところ顔は出ないし、首も動かない。スタックチャンらしい部分は見た目だけだ。

それでも、有線のVoyagerをBluetoothで使えるようになった。机の上のスタックチャンが、キーボードとPCの間を取り持ってくれている。

ソースコードはこちら。 https://github.com/pipboy3000/stack-chan-hub