keyball39 を組み立てた

同僚が使っていた keyball44 を触らせてもらって「キーボードにトラックボールがついているのは最高だな!」となったので私も keyball を買ってみました。ここ最近買っているキーボードはこれから長く常用するためのものというよりも自分でキーボードを設計する際の参考資料という面が強いので今まで体験したことがない片手5列の keyball39 を選択してみました。

購入当初は片手5列に慣れることは難しいだろうと思っていたので本当に資料になるだけと思っていましたが、3日もしたら大体の操作に慣れて、その頃にはすっかりこのキーボードの虜になってしまいました。

私は格子配列が好きでカラムスタッカードは趣味ではないと思っていましたが、5列だとそんなに違和感がありませんでした。6列カラムスタッカードだと両端の列を小指で打つのは辛いと感じますが5列だとそれほど苦でもありませんでした。ただ、親指キーの孤がゆるいので個人的には一番内側(pro micro 側)のキーはより手前にほしいと感じます。

スイッチは軽めのタクタイルである Kailh Super Speed Switch Copper と親指キーは Kailhロープロファイルスイッチ茶にしました。親指キーの方は早々にバネを 25 g のものに交換しました。 最初は親指キーのバネを変えずにそのまま打っていましたが、あまりの重さに親指が痛くなってきたのでバネの交換をしました。バネを変えたらどういうわけか親指キー以外の本体のキーの打鍵も軽く感じるようになって、全体的なバランスは重要なのだなぁとしみじみ思いました。

スイッチはプラスチックのこすれる音なのか耳心地の良くない音がしていましたが、ルブを塗ったら落ち着いたカタカタとコトコトの間くらいの打鍵音になりました。

Kailhロープロファイルスイッチshop.yushakobo.jp

スイッチオープナーは Kailh 用のものを持っていなかったので新たに購入しました。Choc の方はこれでは開けられないのでピンセットで爪を持ち上げて開きました。

トラックボールは動作確認をされている PERIPRO-303 を無難に選びました。

pro micro は今まで micro USB のものを使っていましたが、今の時分で micro 見ることも少なくなってきたので type c にしました。

talpkeyboard.net

組み立てについて

はんだ付けはトラックボール用のパーツ分があるので他の一般的な自作キーボードに比べると多少増えますがさして労力は変わりませんでした。

特に深い意味はありませんが、基板が白いことが分かっていたのでソケットを白のものにしてみました。Kailh choc のソケットも白にできたら良かったのですがなさそうだったので致し方なし。ついでにリセットスイッチもボタンが白のものに変えました。

はんだ付けはすぐに終わったのですが、キースイッチをトップ PCB にハメるのにとても時間がかかりました。Gateron のスイッチだと多少力が必要なもののハマるという感じでしたが、Kailh のスイッチはハウジングのサイズが大きいのかどんなに力を入れてもハメることができませんでした。そのため穴を大きくするためにひたすらヤスリで削りました。あんまり削りすぎると今度はゆるゆるになってしまう可能性があるため少し削ってはスイッチをはめてみてを繰り返していたので制作時間にはトータル5.5時間くらい掛かってしまいました。

最近自分で設計したキーボードでもトッププレートを PCB で作りましたが、同様に Kailh のスイッチはハマりづらいという感覚があったので、トッププレートを PCB で作る場合は穴のサイズを小さくし過ぎずに作ると良さそうだなと思いました。

キーマップについて

今まで片手 3x6 + 親指3キーという構成の分割キーボードを愛用してきましたが、今回初めて5列に挑戦してみたのでキーマップを大幅に変更する必要がありました。またトラックボール付きということでクリックなどの操作もキーに割り当てることになり初めての事だらけでキーマップの決定にはなかなか時間がかかりました。

最終的なキーマップはこちら

github.com

キーマップだけの変更だと限界を感じたのでカスタムキーコードをいくつか追加しました。 ちなみに、カスタムキーコードを設定する場合は enum 値の初期値として SAFE_RANGE でなく KEYBALL_SAFE_RANGE を使う必要があります。SAFE_RANGE から数個はすでに使われているので SAFE_RANGE を使ってしまうとそれらと衝突します。

github.com

レイヤー構成としては Default, Lower, Raise, Adjust, Mouse, trackball 感度設定用の6レイヤー構成で落ち着きました。

設定後は新しいキーマップに慣れるために Speed Coder というサイトでタイピング練習しました。

www.speedcoder.net

modifier key の配置

キーマップを考えるにあたって既存の30%キーボードのキーマップを参考にしました。 それらの中にはアルファベットを mod tap にしているものもありましたが、私の設定した限りでは思った通りに動いてくれなかったため(ワンテンポ入力が遅れてしまう)ので、アルファベットと modifier key を同一のキーに割り当てることは諦めました。

mod tap は親指キーのみにし、使用頻度の高い modifier キーとワンタップで使うキーを mod tap に設定しました。 最終的に親指キーは以下の構成で落ち着きました。

modifier or layer tap
GUI Escape
Lower minus
Control Tab
Raise Enter
Shift Space

Enter はデフォルトレイヤーと、Lower 押しながら M の位置の2箇所に設定しました。普通に文章を書くときは Lower - M に割り当てた Enter を使い、他のキーと同時押しの関係でその Enter が打ちづらいときは親指キーに割り当てた Enter を使っています。

マウスレイヤー

指で打つには厳しそうであったトラックボール横の右下のキーはマウス操作のみを行えるレイヤー(以降マウスレイヤーの呼ぶ)への切り替え用のキーとしました。打つときは指ではなく小指の付け根あたりで打つ(チョップする形に近い)ようにすると無理なく打てました。 マウスレイヤーは基本的には右下の切り替えキーを押している間は有効にし離すとデフォルトレイヤーに戻るようにしました。ですがこれだと単にネットサーフィンするときにずっとキーを押していないといけなくなってしまって大変なので、マウスレイヤー内の特定のキーを打つとデフォルトレイヤーがマウスレイヤーに代わり切り替えキーを押していなくてもマウスレイヤーを維持できるようにしました。

キーマップ模索初期段階では切り替えキーを押したら完全にマウスレイヤーに固定されるようにしてみましたが、いざこの設定でプログラミングをしてみるとマウスレイヤーとデフォルトレイヤーの切り替えで頭が混乱したのでやめました。

マウス用のキーコードについては qmk firmware の Doc をみても何がどれに対応しているのかよくわかりませんでしたが、実際に使ってみてわかった範囲で Linux では KC_BTN1 ~ KC_BTN5 は次のような動きになるようです。

key code 対応する操作
KC_BTN1 左クリック
KC_BTN2 右クリック
KC_BTN3 中クリック
KC_BTN4 戻る
KC_BTN5 進む

qmk firmware のキーコードとしてはマウス用のものとして KC_BTN8 まであるようですが、打ってみても何の反応もなくどういう条件でどういう操作になるのか分からなかったのでとりあえず放置しました。

OLED の表示を変更

OLED の表示項目は軽くいじり現在のレイヤー情報を表示できるようにしました。 もともと固定のマウスレイヤーになっているかどうかをわかりやすくするためにレイヤー情報を出すようにしましたが、数ピクセルの文字だとパッと見ではよくわからなかったのでマウスレイヤーのときだけ独自のロゴを表示するようにしました。

ディスプレイいっぱいに Mouse🐁 と表示されるようになったので視認性は格段に上がりました。

OLED へのオリジナルロゴの表示方法ですが、gimp で 128x32 pixel の画像を作成し、QMK logo editor に upload し、Raw のコードを oled_task_user に入れたら簡単にできました。

joric.github.io

テント

分割キーボード界隈ではキーボードの中央をせりあげるテントなるセッティングがあることを知ってはいましたが、それに対応するための専用のプレートだったり、ケースを用意しなければならず導入コストが高く避けていました。しかし、keyball39 は小さいのでスマホタブレットのスタンドでテントできるのでは?と思って試してみました。

懐へのダメージを最小限にするため材料は100均で買ってきました。 タブレットスタンドx2 と滑り止めという超簡易構成です。 タブレットスタンドの面積が小さいので面に乗り切っていない親指キーを打つとキーボードがガタつきますが、雰囲気は一応味わえました。

最初は打てなくはないが平面においたときよりも打ちやすいかと言われると微妙という感想でしたが、親指側を手前に持ってくると打ちやすくなりました。 一方でトラックボールが常に手で触れてしまうようになりました。触れること自体はそんなに苦でありませんが、打っている間にマウスカーソルが動くのが地味に嫌なので、マウスレイヤー以外のときはトラックボールを無効にするように firmware を書き換えました(コード理解しきれずに突貫でやったので微妙に不具合もありますが)。

キーボードが認識されないことへの対処

USB 接続しても入力が全くできないという現象が度々起こりました。入力できないときは決まって両方の OLED に keyball のロゴが表示されました。一方、普通に入力できるときは USB がつながっている方に keyinfo が、もう片方にロゴが表示されました。何度か USB の抜き差しをすると普通に入力できるようになるのですが、macbook 相手だと5分くらい繰り返し抜き差ししても入力できるようにならないという事態に陥りました。

先に結論を言うと config.hSPLIT_USB_TIMEOUT の値を 500 から 2500 まで増やすと動作が安定するようになりました。 Linux マシンだと 1000 まで上げると安定しましたが、macbook だと 2500 まであげないと安定しませんでした。 twitter で検索したら似たような現象に陥っている方(keyball user かは不明)がおり、その方も SPLIT_USB_TIMEOUT の値を増やされたようでした。

原因探索

対処法に至るまでどんなことを試したのかを軽く残しておきます。

keyball39 の左右判定方法

まず、keyball39 の左右判定方法を調べました。私が今まで知っていた左右判定方法は SPLIT_HAND_PIN を使う方法と EEPROM に書き込む方法の2種類でしたが、SPLIT_HAND_PINgrep かけても何も引っかかりませんし、avrdude-split-left などで flash をした記憶もありません。ではどうやっているのだろうと思ったら SPLIT_HAND_MATRIX_GRID というのでコントロールしているようです。 今になって QMK firmware の Doc を見返してみると確かに書いてあるのですが、以前はどういうことなのかよくわからなかったので完全に読み飛ばしていました。

github.com

keyball39 の回路図を見ると row2, col5 のところのダイオードをジャンパーでつなげるという、パット見何をしたいのかよくわからない部分がありますが、ここをジャンパーしたほうは row2, col5 を読むときに常に High、ジャンパーしていない方は Low になっているのでこれで左右を判定しているようです。作るときに LEFT と書いてあるところをジャンパしましたがそれがここに当たります。

検証1: はんだ付けをやり直してみる

動作が不安定になっている原因はこのダイオードのハンダ付けがうまくできていないせいかなと推測し、このダイオードのハンダの付け直しをまずは試してみました。問題はこのダイオードがどこに該当するのかということですが、幸い keyball シリーズは gerber ファイルを公開していただけているのでそれを見て探しました。見た感じでは LEFT と書かれているところの真下にあるダイオードがお目当てのもののようでした。

はんだをやり直してみましたが結果は変わらず不安定なままでした。また、よくよく考えると SPLIT_HAND_MATRIX_GRID は key matrix のなかのものだったらどれでもよく、スイッチを押しっぱなしにしていればジャンパーするのと同じことだと気がついたので他のスイッチに設定して試してみましたがそれでも不安定なままでした。これでどうやらはんだ付けのせいではなさそうだとなりました。

検証2: MASTER_LEFT で固定してしまう

USB をつなぐのは左の方だけと割り切って MASTER_LEFT を設定したら安定するのか試してみました。 コードの変更箇所としては config.h を以下のように変更しました。

# define MASTER_LEFT
// #define SPLIT_HAND_MATRIX_GRID  F6, B5
// #define SPLIT_USB_DETECT
// #define SPLIT_USB_TIMEOUT       500

github.com

これで設定した場合は成功率が100%になりました。人によってはこれで不便を感じる方もいらっしゃるのかもしれませんが、私が持っている分割キーボードの大半はこの設定で動いているので私としてはこれでも特段不便はありませんでした。

とりあえず確実に動く逃げ道は1つできました。

検証3: SPLIT_USB_TIMEOUT の値を大きくする

SPLIT_HAND_MATRIX_GRID で調べていたところ、keyball シリーズのファームウェアを書かれている kaoriya san が SPLIT_USB_TIMEOUT について言及しているつぶやきを発見し、この辺が怪しいのか?となったので試しに SPLIT_USB_TIMEOUT の値を 500 から 1000 まで増やしてみました。すると今まで2回に1回位のペースで失敗していたのがほぼ100%成功するようになりました。一方で macbook への接続となるとまだ不安定でした。2000 まで増やしても不安定で 2500 まで増やすとようやく macbook でも安定するようになりました。

私同様に keyball が認識されないという問題に直面している人を見かけないので、私の環境がおかしいのかもしれませんが、もしなかなか認識されないとなったら上記の方法で解決するやもしれません。