Bluetooth接続のキーボードをBIOS画面とかでも使いたい

BIOS画面などOSが立ち上がっていない状態ではBluetooth接続のキーボードはそのままでは使えない。
CreativeのBT-WシリーズのようなBluetooth接続のイヤホンやヘッドホンをUSB Audioクラスに変換するBluetoothドングルがあるならUSB-HIDクラスに変換するのもあるのではと思って探してみたが自分が調べた限りでは見当たらなかった 無いことは無かったので追記
色々探したところ Raspberry Pi Zero 2 W に Bluetooth to USB (https://github.com/quaxalber/bluetooth_2_usb) をインストーするのが最も手軽にBluetooth接続のキーボードをUSB-HIDクラスに変換することができそうだったので試してみた。

用意したもの

  • Raspberry Pi Zero 2 W
  • Bluetooth接続キーボード(HHKB Professional HYBRID Type-S)
  • PC一式
  • Wi-Fi環境
  • ディスプレイ(HDMI接続)
  • Mini HDMI - HDMI 変換アダプター & HDMIケーブル
  • Micro USB Type-B OTGケーブル
  • 有線キーボード
  • microSDカード(32GB)・カードリーダー/ライター
  • 9W Micro USB Type-B ACアダプター

Raspberry Pi OS Lite(64-bit)のインストール

PCにRaspberry Pi Imagerをインストールし画面上の指示に従いmicroSDカードにRaspberry Pi OS Lite(64-bit)の書き込みを行う。Wi-Fiは未設定、SSHは無効として設定した。

書き込み後についでに不要なカーネルモジュールなどを読み込まないように設定を行う。
一度 microSD を外し再び取り付け bootfs と名前のついたドライブを開き config.txt をテキストエディターで編集する。
以下の記述がある列の頭に「#」を付けてコメントアウトした。

  • dtparam=audio=on
  • camera_auto_detect=1
  • display_auto_detect=1
  • dtoverlay=vc4-kms-v3d
  • max_framebuffers=2
設定後の内容

Bluetooth to USB のインストール

・Wi-Fi の有効化 & 接続。
Wi-Fi の有効化

nmcli radio wifi on

nmtuiを実行し Wi-Fi に接続する(2.4GHz帯のみ、WPA3には対応していないのでWi-FiルーターでWPA3のみの設定にしている場合はWPA2でも認証できるように設定を変更する必要がある)。

・Raspberry Pi OS Lite(64-bit) を最新の状態にする。

sudo apt update && sudo apt upgrade

・初期状態では Bluetooth が無効化されているので有効化する。
Bluetooth の有効化

rfkill unblock bluetooth

・git をインストールする。

sudo apt install git

・コマンドラインテキストエディターの vim-tiny がvi互換モードで動作していて使いづらいので互換モードをオフ & BackSpace を有効化する。

vi ~/.vimrc

内容に以下を記述する。

set nocompatible
set backspace=indent,eol,start

bluetoothctlでBluetooth接続のキーボードとペアリングする。

・Bluetooth to USB をgitコマンドでローカルにクローンする。

cd ~ && git clone https://github.com/quaxalber/bluetooth_2_usb.git

・最近の(?)Raspberry Pi OS Lite(64-bit) ではdwc2カーネルモジュールがビルトインになったのか Bluetooth to USB (v0.9.1) をインストールしようとするとdwc2モジュールが無いと言われる。quax-Blinka のversion 8.31.0で対応がなされたようなのでインストールする quax-Blinka パッケージのバージョンを変更する。

vi ~/bluetooth_2_usb/requirements.txt

quax-Blinka の行の 8.27.0.post2 を 8.31.0 に書き換える。

・そのままインストールすると日本独自のキー(ひらがなの「ろ」が印字されたキー、カタカナひらがなローマ字キー、¥マークが印字されたキー、変換キー、無変換キー)が反応しないのでソースコードに追記する必要がある。

一旦、インストールを行わないとvenv以下が作成されないのでインストールを行う。

sudo ~/bluetooth_2_usb/scripts/install.sh

keycode.pyの編集を行う。

vi ~/bluetooth_2_usb/venv/lib/python3.13/site-packages/adafruit_hid/keycode.py

(ここを直接編集しない方がいい気がするがプログラミングの知識が無く、他の方法が思いつかなかったので編集してます。)

301行目から305行目が次のようになるように編集する(Bluetooth to USB v0.9.1の場合)。

〜省略〜
"""GUI modifier right of the spacebar"""
INTERNATIONAL1 = 0x87
INTERNATIONAL2 = 0x88
INTERNATIONAL3 = 0x89
INTERNATIONAL4 = 0x8A
INTERNATIONAL5 = 0x8B
# pylint: enable-msg=invalid-name
〜省略〜

evdev.pyの編集を行う。

vi ~/bluetooth_2_usb/src/bluetooth_2_usb/evdev.py

1164行目から1168行目が次のようになるように編集する(Bluetooth to USB v0.9.1の場合)。

〜省略〜
ecodes.KEY_RIGHTMETA: Keycode.RIGHT_GUI,
ecodes.KEY_RO: Keycode.INTERNATIONAL1,
ecodes.KEY_KATAKANAHIRAGANA: Keycode.INTERNATIONAL2,
ecodes.KEY_YEN: Keycode.INTERNATIONAL3,
ecodes.KEY_HENKAN: Keycode.INTERNATIONAL4,
ecodes.KEY_MUHENKAN: Keycode.INTERNATIONAL5,
# Mouse buttons
〜省略〜

・Bluetooth to USB をインストール(一旦Wi-Fiをオフにしておかないと編集したファイルが巻き戻されるかも?)

sudo ~/bluetooth_2_usb/scripts/install.sh

・Raspberry Pi Zero 2 W をsudo rebootで再起動する。

・Bluetooth to USB がちゃんと動作していることを確認する。

systemctl status bluetooth_2_usb.service

ファイルシステムを読み込み専用にする(OverlayFSの有効化)

用途的に正常にシャットダウンを行わず電源を引っこ抜く形の運用になるため、ファイルの破損を防ぐことを目的としてファイルシステムを読み込み専用にする。

sudo raspi-config

Performance OptionsのOverlay File System Enable/disable read-only file systemでOverlay File Systemを有効化する。
(最初に有効化する時はoverlayrootパッケージをダウンロード・インストールする必要があるためオンライン接続が必須)
ブートパーティションを書き込み禁止するかも聞かれるのでYesを選択し、再起動を行う。

(OverlayFSを有効化した状態だと起動時に1つサービスの起動に失敗するがとりあえず無視しています)

df -hを実行し次の画像のようにtmpfs-rootやoverlayrootと表示されていれば有効化されている。

Wi-Fiをオフにする

一度設定を行えばWi-Fiに常時接続は不要なのでWi-Fiをオフにする。

  • OverlayFSが有効のままだとWi-FIをオフにしても再起動で戻ってしまうのでsudo raspi-configからOverlayFSを無効化する。
  • 再起動しnmcli radio wifi offでWi-Fiをオフにする。
  • 再度、sudo raspi-configからOverlayFSを有効化する。

完成

Raspberry Pi Zero 2 W の電源がオフ状態からPCに接続して起動するとBluetooth接続のキーボードが認識されるまで30秒くらいかかる。
デスクトップPCならシャットダウンしても電気が供給されるので Raspberry Pi Zero 2 W 起動状態が維持されキーボードの電源さえ入れればすぐ使える。
電源供給用のポートは使用せずデータ通信用ポートへのバスパワーのみで安定して使えている。
2026/1/8 追記:Bluetooth接続のマウスもペアリングしてみたがキーボードと同時使用で問題なく使えている。

起動を高速化する(2026/1/17 追記)

半月運用してみて問題なさそうだったので起動に時間がかかっているサービスを停止し高速化する。

cloud-init系のサービスをまとめて停止する。

sudo touch /etc/cloud/cloud-init.disabled

ModemManager(モバイルブロードバンドを使用する際に必要)サービスを停止する。

sudo systemctl disable ModemManager.service

NetworkManagerサービスを停止する。当然Wi-Fiとかも繋がらなくなるのでWi-Fiなど使用する場合は再度有効化する。(このサービスが起動に10秒以上と非常に時間がかかっていた)

sudo systemctl disable NetworkManager.service

サービス停止前と停止後で起動時間が半分以下に短縮できた(下記画像はsystemd-analyzeの結果)。

サービス停止前
サービス停止後

オーバークロックや他にも切り詰められそうなサービスもあるが短縮できる起動時間がそこまででは無く安定性が損なわれそうだったり再設定の際にいくつもサービスを再度有効化するのが面倒なため現在ではこの設定に留めておく。


追記
  • かつてLogicoolのキーボードに C-UV35 というBluetoothドングルが付属していて、補修部品として単体でも売られていた模様。SetPointというWindowsのアプリで事前に設定を行うことでBluetooth接続のキーボードをBIOS画面などで使用することが出来るらしいが…Logicool公式にはすでにページが存在せずGoogle検索でもあまりヒットしない。
  • 一部の汎用的なBluetoothドングルにはHID Proxyモードというものが存在しておりbccmdコマンドでHCIモードからHID Proxyモードに切り替えることでUSB-HIDとして動作するらしいがいまいちよく分からなかった…ペアリング情報もBluetoothドングルに一緒に保存してくれているのだろうか?