以前より、iPadやiPhoneに接続できる軽量の英語配列のキーボードが欲しいと思っていました。しかしながら、iPadやiPhoneでは、macのように「英かな」や「karabiner」などのツールがないため、英語・日本語の切り替えが面倒なるので困っていました。また、日本語配列のキーボードには抵抗感がありました。
keychron b1 proを購入し、ファームウェアを更新することで、「英かな」や「karabiner」と同様の設定をキーボード側に設定することで、快適にキーボード入力できるようにします。macにおいては、「英かな」や「karabiner」での設定が不要になります。
また、keychron b1 proでは、macとwindowsの切り替え機能があったので、windows環境においてもmacと同様に日本語が入力できるようにします。つまり、右ALTキーをタップすると日本語入力モードになり、左ALTキーをタップすると英語入力モードになります。ALTキーを長押したり、ALTキーと他のキーを組み合わせて入力すると、本来のALTキーとして動作するようにします。
これによって、windows, mac, iPad, iPhoneのすべてで似たような感じにキーボードを使うことができ、指が絡まるような混乱はなくなります。
keychron b1 proとは
keychron b1 proは、薄型・軽量のキーボードで、mac & windows対応、どこかしらApple Magic Keyboard (US)と似た感じのキーボードです。普段、Apple Magic Keyboardを使っていたとしても、違和感なく、移行できるのではないかと思います。
また、ZMK Firmwareに対応しており、ファームウェアを更新すれば、自作キーボードかのようにカスタマイズできます。
ファームウェアの更新方法
keychron b1 proは、keychron launcherというウェブ上でキーボードのカスタマイズができるツールを用意しています。しかしながら、キーを短くタップしたときと、キーを長押し・組み合わせて入力したときで、別々のキーの動作するような設定ができません。ファームウェアのソースを入手し、自分でビルドする必要があります。
ファームウェアのビルドについては、以下のホームページを参考にさせていただきました。
上記の記事においては、windows上のwsl環境でビルドしていたため、私もwindowsでビルドしましたが、macやlinuxにdockerを導入すれば、似たような感じでファームウェアがビルドできると思います。
WSLの導入
- 管理者権限でPowerShellを起動する
- PowerShellから
wsl --installを投入する - Windowsを再起動する
Ubuntuを導入
- PowerShellを起動する
- PowerShellから
wsl --install -d Ubuntuを投入する - アプリ一覧からUbuntuを選択して、Ubuntuを起動する
- 初めてUbuntuを起動した場合は、ユーザを作成するように促されるので、ユーザーを作成する
dockerのインストール
- Ubuntuのコマンドプロンプトから
sudo apt update && sudo apt upgrade -yを投入し、Ubuntuを最新の状態にする - Ubuntuのコマンドプロンプトから
curl -fsSL https://get.docker.com -o get-docker.shを投入し、dockerをインストールするスクリプトを入手する - Ubuntuのコマンドプロンプトから
./get-docker.shを投入し、dockerをインストールする - Ubuntuのコマンドプロンプトから
sudo usermod -aG docker $USERを投入し、ユーザをdockerグループに所属させる - Ubuntuのコマンドプロンプトをいったん閉じて、再び開くことで、グループを反映させる
- Ubuntuのコマンドプロンプトから
sudo systemctl enable --now dockerを投入し、dockerを起動する
devcontainerのインストール
- Ubuntuのコマンドプロンプトから
sudo apt install npmを投入して、npmをインストールする - Ubuntuのコマンドプロンプトから
sudo npm install -g @devcontainers/cliを投入して、devcontainerをインストールする
zmkビルド環境の構築
- Ubuntuのコマンドプロンプトから
git clone -b keychron_bpro https://github.com/keychron/zmk.gitコマンドを投入し、ファームウェアのプログラムソースをクローンする - Ubuntuのコマンドプロンプトから
mkdir zmk-configとmkdir zmk-modulesを投入し、空のディレクトリを作成する
※zmk-configとzmk-modulesは、使わないのですが、ディレクトリが存在しないとビルドに失敗するようです - Ubuntuのコマンドプロンプトから
docker volume create --driver local -o o=bind -o type=none -o device="/absolute/path/to/zmk-config/" zmk-configを投入し、zmk-configボリュームを作成する
※"/absolute/path/to/zmk-config/"は、先ほど作成した空のzmk-configディレクトリの絶対パスです - Ubuntuのコマンドプロンプトから
docker volume create --driver local -o o=bind -o type=none -o device="/absolute/path/to/zmk-modules/" zmk-modulesを投入し、zmk-modulesボリュームを作成する
※"/absolute/path/to/zmk-modules/"は、先ほど作成した空のzmk-modulesディレクトリの絶対パスです - Ubuntuのコマンドプロンプトから
devcontainer up --workspace-folder "/absolute/path/to/zmk"を投入して、devcontainerを作る - Ubuntuのコマンドプロンプトから
docker psを投入して、先ほど作成したdevcontainerの名前を確認する - Ubuntuのコマンドプロンプトから`docker exec -w /workspaces/zmk -it devcontainer-name /bin/bash'を投入して、docker内に入る
※ devcontainer-nameは、先ほど作成したdevcontainerの名前です -
ここを参考に、docker内のコマンドプロンプトで以下のコマンドを投入していく
west init -l app/ west update cd zephyr git config --global user.email "YOUR_EMAIL" git config --global user.name "YOUR NAME" git am ../0001-esb-nrf-fix.patch
ファームウェアプログラムの修正
keychronが公開しているファームウェアのプログラムソースには、誤りがあるそうです。
zmk/app/src/dfu/tdfu_prv.hの3行目を以下のように修正してください。
修正前
#include "..\version.h"
修正後
#include "../version.h"
※WindowsのNative環境でビルドするときは、修正前の状態でもコンパイルができるのかもしれません。
キーマップの更新
Hold-Tap Behaviorの機能を使って、右Commandキーを短くタップすると日本語入力モードになり、左Commandキーを短くタップすると英語入力モードになるように修正します。Commandキーを長押したり、Commandキーと他のキーを組み合わせて入力すると、本来のCommandキーとして動作するように修正します。
zmk/app/boards/shields/keychron/b1/us/keychron_b1_us.keymapファイルの204行目を以下のように修正します。
修正前
&uc LCMD
修正後
&mt LCMD LANG2
修正前
&uc RCMD
修正後
&mt RCMD LANG1
zmk/app/boards/shields/keychron/b1/us/keychron_b1_us.keymapファイルの229行目を以下のように修正します。
修正前
&kp LALT
修正後
&mt LALT LANG2
修正前
&kp RALT
修正後
&mt RALT LANG1
※LANG1とLANG2のキーは、Macの英数・かなのキーコードです。古いWindowsにおいてはLANG1とLANG2は無視され機能しませんが、最近のWindows 11では、Macと同様に、IMEのON/OFFとして動作するようです。いつ頃からそうなったのか、今後もそのように動作するのかわかりませんが、現在はうまく動作しているようです。
私は、ついでに&bootloaderのキー割当と、CapsLockとControlキーの入れ替えをしました。以下、私のkeymapの設定です。
keymap {
compatible = "zmk,keymap";
//mac
default_layer {
bindings = <
//ESC //f1 //f2 //f3 //f4 //f5 //f6 //f7 //f8 //f9 //f10 //f11 //f12 //DEL
&kp ESC &kp C_BRIGHTNESS_DEC &kp C_BRIGHTNESS_INC &kp C_AC_DESKTOP_SHOW_ALL_WINDOWS &kp C_AC_MAC_LAUNCH &kp C_AC_SEARCH &kp C_AL_LOCK &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT &kp C_MUTE &kp C_VOLUME_DOWN &kp C_VOLUME_UP &kp DEL
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
&kp CLCK &uc LALT &mt LCMD LANG2 &kp SPACE &mt RCMD LANG1 &mo 1 &kp LEFT &kp UP &kp DOWN &kp RIGHT
&mo 2 &out OUT_BLE &out OUT_24G &out OUT_CHG &out OUT_CHGD
>;
};
//mac
layer_one {
bindings = <
&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans
&trans &bt_pair_0 0 0 &bt_pair_1 0 0 &bt_pair_2 0 0 &bt_pair_3 0 0 &trans &trans &trans &trans &trans &trans &trans &kp C_AC_SEARCH &trans
&trans &trans &trans &trans &trans &trans &trans &trans &kp INS &trans &trans &trans &trans &uc LG(LS(N4))
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &uc LC(LG(SPACE))
&trans &trans &trans &trans &kp RCTRL &trans &kp HOME &kp PG_UP &kp PG_DN &kp END
//
&none &none &none &none &none
>;
};
//win
layer_two {
bindings = <
&kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp DEL
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
&kp CLCK &kp LGUI &mt LALT LANG2 &kp SPACE &mt RALT LANG1 &mo 3 &kp LEFT &kp UP &kp DOWN &kp RIGHT
//
&none &out OUT_BLE &out OUT_24G &out OUT_CHG &out OUT_CHGD
>;
};
//win
layer_three {
bindings = <
//ESC //f1 //f2 //f3 //f4 //f5 //f6 //f7 //f8 //f9 //f10 //f11 //f12 //DEL
&trans &kp C_BRIGHTNESS_DEC &kp C_BRIGHTNESS_INC &uc LG(TAB) &uc LG(E) &kp C_AC_SEARCH &uc LG(L) &kp C_PREVIOUS &kp C_PLAY_PAUSE &kp C_NEXT &kp C_MUTE &kp C_VOLUME_DOWN &kp C_VOLUME_UP &trans
&trans &bt_pair_0 0 0 &bt_pair_1 0 0 &bt_pair_2 0 0 &bt_pair_3 0 0 &trans &trans &trans &trans &trans &trans &bootloader &kp C_AL_CALC &trans
&trans &trans &trans &trans &trans &trans &trans &trans &kp INS &trans &trans &trans &trans &uc LG(LS(S))
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &uc LG(DOT)
&trans &trans &trans &trans &kp RCTRL &trans &kp HOME &kp PG_UP &kp PG_DN &kp END
//
&none &none &none &none &none
>;
};
};
ファームウェアのビルド
- docker内のコマンドプロンプトから、
cd /workspaces/zmk/appコマンドを投入し、カレントディレクトリを移動する - docker内のコマンドプロンプトから、
west build -b keychron -p -- -DSHIELD=keychron_b1_usコマンドを投入し、ファームウェアをビルドする - ビルドされたファームウェアが、zmk/app/build/zephyr/zmk.uf2という名前で保存されているか確認する
ファームウェアの更新
ここの下の方にある「How to manually flash the keyboard firmware」の記事を参考にウェアームウェアを更新します
- Keychron B1 proをWinに切り替えます。トグルをケーブルモードにスライドし、電源ケーブルをキーボードに接続します
- 「fn」+「-」ボタンを3秒間押し続けます。充電インジケータライトが青色に点灯し、点滅を始めます
- コンピュータがハードドライブ(NRF52BOOT)を認識します
- エクスプローラーなどから新しいファームウェア (zmk.uf2 ファイル) をハードドライブ ( NRF52BOOT ) にドラッグ&ドロップしてフラッシュを完了します
- しばらくお待ちください。キーボード ファームウェアのフラッシュが完了すると、ハード ドライブが自動的にポップアップします。
Windowsでの動作について
- Windowsのキーボードレイアウトの設定は、「英語キーボード(101/102キー)」にしてください。「日本語キーボード(106/109キー)」にすると、記号などが正しく入力できません。
- キーボードレイアウトを「英語キーボード(101/102キー)」に設定した場合、変換(INT4)や無変換(INT6)のキーが無視され機能しません。Macで使われている英数(LANG2)と、かな(LANG1)のキーコードは無視されず、IMEのON/OFFとして動作するようなので、キーマップを更新する際には、LANG1とLANG2を使ってください。
