果報

二度寝して待つ

Raspberry Pi Zero W/WHをBluetoothキーボードの受信機にする

昔から愛用してるキーボードがBluetooth接続なのでUEFI/BIOSを操作できず不便でした。

Bluetooth以外の無線キーボードに乗り換えることも考えましたが、普段使いにおいては困ってないので、買い替えせずに良い解決策ないかなあと思っていたところ、以下の記事を見つけました。

moguno.hatenablog.jp

で、メルカリあたりでラズパイの中古品ないかなあと探していたところ、2,000円くらいで売られてるのを見つけて、ちょうどポイントも同じくらい余ってたので、買って実際に試してみました。

ちなみに今回の環境はこんな感じです。

  • ラズパイ:Raspberry Pi Zero WH (OS 10.7)
  • キーボード:FILCO Majestouch MINILA Air (初代)
  • 母艦PC:Windows 10 Pro

ラズパイの初期設定

本題に入る前に、まずはラズパイの初期設定を行います。これが地味に面倒です。

基本的には以下の記事に書かれているとおりですが、いくつか変えた箇所とか詰まった箇所があるのでここで言及します。

qiita.com

OSの選択

記事ではLITEを選択していますが、必要なソフトウェアがなかったりしたら嫌なのでFULLを選択しました。

ドライバの設定

母艦のWindows側でラズパイ用のドライバをインストールしますが、リンク先が若干怪しいので、正規の(?)Microsoftのダウンロード先を記載しておきます。

www.catalog.update.microsoft.com

ドライバ名は「Acer Incorporated. - Other hardware - USB Ethernet/RNDIS Gadget」です。

ネットワーク共有のエラー

母艦のWindows側でラズパイのネットワークを共有するとき、謎のNULLエラーが発生して共有できず困りましたが、以下のコメント欄を参考にタスクマネージャからICSサービスを再起動したら解消しました。

answers.microsoft.com

ただ、インターネット接続方法が上記の母艦(Windows)経由かラズパイ自体のWi-Fi接続かどちらか選べたので、母艦経由のほうを無効化しました。結果的に、上記でエラー対応したのに無意味になりました。

ついでに、Wi-FiのIPアドレスを固定化しました。

$ sudo nano /etc/dhcpcd.conf
//以下の行を追加
interface wlan0
static ip_address=192.168.0.105/24
static routers=192.168.0.1
static domain_name_servers=8.8.8.8</pre>

event2usbhid設定

ここからが本題。基本的には配布元のサイトにある手順のとおりですが、いくつか詰まった箇所があるので手順を全て記載します。

GitHubから資材のダウンロード

配布元にはない手順ですが、ここはまあ普通。

$ cd /opt
$ sudo wget --no-check-certificate https://github.com/moguno/event2usbhid/tarball/master
$ sudo tar xvf master
$ sudo mv moguno-event2usbhid-43eed1e event2usbhid

serviceファイルのインストール

配布元の手順どおりです。

$ sudo cp -p /opt/event2usbhid/misc/*.service /etc/systemd/system/
$ sudo systemctl enable mkusbhid
$ sudo systemctl enable event2usbhid_keyboard
$ sudo systemctl enable event2usbhid_mouse

Bluetoothキーボードをペアリング

今回接続するFILCOのキーボードをペアリング設定します。ちなみにBluetoothctlコマンドの使い方はこのサイトを参考にしました。

$ bluetoothctl
[bluetooth]# scan on
Device 00:18:00:3B:41:8C FILCO Bluetooth Keyboard
…
[bluetooth]# pair 00:18:00:3B:41:8C
[bluetooth]# connect 00:18:00:3B:41:8C
[bluetooth]# trust 00:18:00:3B:41:8C
[bluetooth]# scan off
[bluetooth]# quit

udevルールの設定

配布元の手順どおり。キーボード名の設定をFILCO~にします。

$ sudo nano /opt/event2usbhid/misc/99-bluetooth.rules
//以下に変更
KERNEL=="event*", ATTRS{name}=="FILCO Bluetooth Keyboard", TAG+="systemd", SYMLINK+="input/keyboard", ENV{SYSTEMD_ALIAS}="/sys/class/input/keyboard"
//変更を反映
$ sudo cp -p /opt/event2usbhid/misc/99-bluetooth.rules /etc/udev/rules.d/

モジュール読み込み設定変更

配布元のサイトに記載ありませんが、これをやってないと全く動かないので、重要な設定です。自分はこれに気付かず、一週間くらい四苦八苦しました。

$ sudo nano /boot/cmdline.txt
//以下の太字箇所を変更する
… rootwait modules-load=dwc2,<strong>g_hid</strong>

設定後、反映のために再起動します。

$ sudo reboot

起動したら、母艦のWindowsにBluetoothキーボードで入力できるはずです。お疲れさまでした。

使ってみた雑感など

反応速度は普段使いであれば気にならないレベルで、体感では母艦PCのBluetoothに接続してた頃と何ら変わりません。ただ、電源節約モード?スリープモード?からの復帰時は、若干時間がかかる気がします。

あと、手元のLogicoolのBluetoothマウスはペアリングまではうまくいきましたが、母艦PCでは認識しませんでした。キーボードと2台同時には接続不可とか、制約があるのでしょうか。今回の目的はキーボードのみで特に困らないので、スルーしました。

その他設定もろもろ

本筋とは逸れますが、ラズパイに反映したその他の設定についても記録しておきます。

ユーザ名とパスワードの変更

以下の記事を参考にしました。

qiita.com

ただ、作成したユーザでBluetoothコントローラを起動できなかったので、以下のコマンドでBluetoothのグループに所属させています。

$ sudo usermod -a -G bluetooth {ユーザ名}

IPv6の無効化

IPv4しか使わないのでIPv6を無効化します。

$ sudo nano /etc/sysctl.conf
//以下の行を追加する
net.ipv6.conf.all.disable_ipv6 = 1
//以下のコマンドで反映
$ sudo sysctl -p

MicroSDのRAM化

ラズパイのSDカードは壊れやすいようなので、以下の記事を参考にファイルシステムをリードオンリーに設定します。

github.com

ただ、自分の環境では実行するスクリプトが動作しなかったので、冒頭のKERNELVER変数を使った条件文を全部コメントアウトして実行しました。

ラズパイのバックアップ/リストア

以下の記事を参考に「Win32 Disk Imager」を使用しました。たまに途中で失敗しますが、大抵は単純リトライでなんとかなります。

gloria.cool

USBドングル

今回、ラズパイ本体から直接USB接続できる拡張ボードも購入しました。これで液晶ディスプレイに直挿ししています。

思いのほか眩しいですが、直挿しできるのは便利です。