以前、「Bluetoothドングルを導入したらZMKキーボードのラグ問題が解決した!」という記事を書いたのですが……………間違いでした。
あのときは確かにラグが改善していました。スムーズなカーソル、キビキビした入力、「これは勝った」と喜んでいたのです。
しかしその後、またしてもラグが再発。入力は遅延し、トラックボールはスローモーションのような状態に。まるで地獄の底から引き戻されるような感覚でした。
「またこの問題か」とうなだれながらも、今回こそは原因を特定してやろうと執念で調査に踏み込み、今度こそ解決できたと思うため、記録に残します。
トラブルの概要
あらためて発生したトラブルをふりかえります。
Bluetoothインカムで通話しながらZMKベースのトラボつき左右分割無線キーボードcool642tbを操作していたところ、突如トラックボールの動きが遅くなり、キー入力にも遅延が生じはじめました。入力が画面に反映されるまでに明らかなタイムラグがあります。
Bluetooth再接続で対処しようとも、設定画面ではキーボードの名前が表示されているにもかかわらず、削除ボタンを押しても「削除できませんでした」と拒否されます。デバイスマネージャーにはcool642tbの姿すら見当たりません。まさに「見えるのに触れられない」幽霊のような存在と化していました。
Bluetoothドングルを抜き差しすると一時的に改善するものの、元のラグ状態に戻ってしまいます。
原因究明までのプロセス
ということで電波状況以外の原因究明を試みたのですが、まさかWindowsの奥底に潜るとは思っていませんでした。
Step1:電池交換・ファームウェア再起動
「まずは疑うべきは電池切れ」と考えて単4電池を新品に交換してみました。しかし、トラックボールの引っかかりはまったく改善せず。
ZMKファームウェアも再起動してLEDの点灯状態を確認しましたが、動作に変化はありません。
「これはZMKのせいではない」と、切り分けられました。
Step2:Windows側のエラー確認(イベントビューア)
以前の調査で、仕事用PCと私用スマホに接続しても問題は起きず、私用PCであってもBluetoothドングル導入により電波干渉や処理性能が原因である可能性も潰されています。となると、被疑箇所は私用PCのWindowsです。
なので、まずはイベントビューアを確認することにしました。Bluetooth関連のログやシステムエラーを注意深く調べましたが、該当しそうなログは見つかりません。つまり「Windowsは問題ないと主張している」わけです。
しかし、現実には問題が起きている。そうしたギャップが、事態の難しさを浮き彫りにしていました。
Step3:PowerShellでのデバイス状況チェック(Get-PnpDevice)
次に試したのはPowerShellコマンドです。以下のコマンドを実行し、cool642tbの状態を調査しました。
Get-PnpDevice -Class Bluetooth | Where-Object { $_.FriendlyName -like "*cool642tb*" } | Format-List
この結果、「Status: Unknown」と表示されました。InstanceId は正しく表示されており、デバイスとしてのエントリは残っているのに、Windowsがその正体を把握できていない状態です。
つまり、存在はしているのに「管理不能」な状態であるとわかりました。
Step4:「devcon」でデバイス削除に挑戦、失敗
続いて、Microsoft公式のコマンドラインツール「devcon」を使い、該当デバイスを強制的に削除しようと試みました。管理者権限のコマンドプロンプトで、devcon.exeの格納先フォルダで以下を実行します。
.\devcon.exe status "@BTHLE\DEV_XXXXXXXX"
.\devcon.exe remove "@BTHLE\DEV_XXXXXXXX"
しかし、「Device is not present.」と返されてしまい、削除には失敗。
ここで、原因は「ゴーストデバイス」だと確定しました。
真犯人「ゴーストデバイス」とは
デバイスマネージャーにも表示されず、Bluetooth設定からも削除できない。表面上は「削除された」「未接続」と表示されていても、OSの深部では破損したペアリング情報が存在し続けている。
この破損情報が、WindowsのBLEスタックに詰まりを生じさせ、ZMKとの正規なセッションの確立や安定的な通信を妨げていたのです。表面に出ることもエラーになることもなく、接続品質だけがじわじわと劣化する。まるで不完全燃焼を起こしたエンジンのように、切り分けも対処もしづらい症状を引き起こすネチネチとした奴。
──それが、Bluetoothデバイスにおける「ゴーストデバイス」です。
ゴーストデバイスの完全削除とラグ解消まで
Windowsの奥底にこびりついたゴーストデバイスを完全に削除するには、特別な手順が必要でした。
実体であるレジストリの削除
Administrator権限で起動したレジストリエディタで HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\BTHLE
を掘り進めていくと、確かにcool642tbに該当するキーが存在していました。これがゴーストデバイスの実体です。
具体的な削除対象は以下のキーでした(念のため具体値は伏せています):
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\BTHLE\DEV_XXXXXXXX
しかし、その配下の Properties
サブキーだけがどうしても削除できません。「アクセス拒否」と表示されてしまいました。
所有者を確認すると、SYSTEMになっていました。つまり、Windowsのカーネルレベルの内部でPnP構成が破損しているということです。通常のAdministrator権限では手出しできません。
PsExecでSYSTEM権限の取得
ここで最後の砦「PsExec」が登場します。Microsoftが提供するSysinternalsツールで、SYSTEM権限で任意のアプリケーションを実行できるものです。
PsExec – Sysinternals | Microsoft Learn からダウンロードしたPsExec.exeの格納先フォルダで、管理者権限のコマンドプロンプトで以下のように入力し、regeditをSYSTEM権限で開きます。
.\PsExec.exe -i -s regedit.exe
この操作によって、通常では削除できなかった Properties
サブキーまで含めて削除が可能になります。これでようやく「過去を断ち切る」ことに成功しました。
削除後はレジストリエディタを閉じてPCを再起動。次のステップへ進みます。
ZMK側の再ペアリング設定
最後に、ZMKファームウェア側でBluetoothペアリング情報をリセットしました。
&bt BT_CLR
&bt BT_SEL 2
これにより、WindowsとZMKキーボードのBLE接続が完全に新規のものとして確立されました。再接続後、あれほど悩まされたラグが嘘のように消えてしまったのです。
トラブル再発を防ぐために
このトラブル対処にかなりの時間を投下することになりました。もうこりごりです。
がっつり再発防止や再発時の対応を組むことにしました。
ZMKのBluetooth接続は「一発勝負」にする
そもそもcool642tbを触り始めた初期、なかなかセットアップがうまくいかなかったので、マイコンであるXiao BLEのBluetooth接続情報をリセットして(=リセット用のファームを焼いて)から再度ペアリングし直す、ということを何度も繰り返していました。このときになにか不手際があってWindows PC側にゴーストデバイス情報が残ってしまった可能性があります。
今となっては原因を思いつけませんが、今後はBluetooth接続まわりは一発勝負、つまりリセット用のファームは最初に焼くだけにすることを徹底したいと思います。
Windows側でのBLEデバイス管理ベストプラクティスを適用する
今回の一件を教訓に、Windowsに登録されている不要なBluetoothデバイスは定期的に見直すようにしました。
くわえて、ZMKベースのBluetoothキーボードの場合、なんらかの理由でプロファイルをクリアして再ペアリングするときは、事前に必ずWindows側で「デバイス削除」してからプロファイルをクリアして最ペアリング、という手順を徹底するようにしました。
これでBluetoothの「ゴーストデバイス」発生確率はおさえられるはずです。
再発時の手順の整理(つまり本記事の執筆)
それでもまた同じトラブルが発生したら……そのときのためにこの記事を書きました。この記録は未来の自分のためでもあります。「あのとき何をしたのか?」と迷ったときに、この記事を読み返せば全手順がすぐにわかるようにしておきました。そういう意味では、“お守り”のような記事とも言えるでしょう。(もう同じ対応なんてしたくないですけど)
まとめ:Bluetoothトラブルは「見えない場所」に潜んでいるかも
今回のトラブルは、ハードでもファームでもなく、Windowsの奥底にあるBLEスタック管理という「見えない地層」で起きていたものでした。
目に見えない不具合ほど厄介なものはありません。かなりの時間を割きましたし、正直疲れました。ただし、そのぶん原因を発見できたとき、そして解決できたときの爽快感は格別でした。
もしあなたがZMKベースのBluetoothキーボードで「デバイスが削除できない」「ラグが改善しない」と感じたら、ぜひdevconとPsExecのコンボを試してみてください。きっと、見えないゴーストの正体が浮かび上がるはずです。
ここまで読んでいただきありがとうございました。
コメント