34キーメカニカルキーボードを自作した

片手分で 横 98.2 mm、縦 85.7 mm という小さめの34キーの分割キーボードを作ってみました。マイコンを基板裏に隠すようにしたので表から見た姿はだいぶスッキリとしました。

以前作成したキーボードとの比較

なぜ作ったか

今まで片手5列のキーボードをいくつか作ってきましたが、全体のキー数が減ってくるとキーの横に配置したマイコンの存在感が大きくなり5列の割に横幅が大きいと感じるようになってきました。

マイコンをキーの横に置く例

大きいと感じつつも親指キーを私好みに配置をすると横幅が出てしまい、マイコンを表面に配置しようがしまいが横幅に影響は与えなかったので今まではキー横に配置してきました。 ですが、Keyball39 を使用するようになって今まで3つあった右手の親指キーが2つになり、また左右非対称だと気持ち悪かったので左手の親指キーも2つだけを有効にするというキーマップに移行したことで親指キー由来の横幅問題は解消できそうだったので、横幅がほぼキー5個分となるようなキーボードを作ってみることにしました。

横幅重視で設計した代償としてキーボードの高さは犠牲にしました。私は使用していないキーボードのマイコンは基本的に外して、使用するもののみにマイコンを取り付けるようにしているのでピンソケットは必須でまずその分で高さがかさみます。さらに最近使っている磁石式の USB Type C のケーブルの接続部が直径 8.5 mm ほどの円形でマイコンを基板裏に隠すと決めた時点で相当な厚さになることは確定しました。最終的にメインの PCB とボトムプレートの間には 10 mm のスペーサーを挟んでいます。

フラットにおいている場合この高さはとても気になると思いますが、私はテンティングの角度を70度にして使っており、70度だと傾いているというよりほぼ立っているので、腕を横に開けば対応できたため高さに関しては設計段階から特に低く作ろうなどとは考えていませんでした。

スイッチのホットスワップ

マイコンを表面に出さないキーボードは Let's Split のようにマイコンボードを基板裏に配置してマイコンボードのピンの内側にスイッチを配置するか、MCU 直付けにするかの2パターンに分類されると思います。私は MCU 直付けなどという技術は持ち合わせていないのでマイコンボードを愚直に基板裏に配置する方法を取ることにしました。

スイッチはホットスワップにしたかったのですが、マイコンボードを基板裏に配置するキーボードでスイッチをホットスワップにしているものはなかなか見つけることが出来ませんでした。 手元で実物を使って合わせてみる限りいけそうな気がしたものの自信が持てず似たようなことを考えている人はいないかなと探していたところドンピシャのことをやっている方を見つけ事なきを得ました。

設計しているときはマイコンのピンとスイッチが干渉しないことだけを考えていて、スイッチソケットとピンソケットの干渉を考慮しておらず、基板にパーツを合わせてみる段になってようやく干渉することに気づきました。 幸い細身のピンソケットを使うことで干渉問題は解決しました。 Kailh Mid-height のようなハウジングサイズが小さいものだったらもうすこし余裕を持って作れると思いますが、普通の CherryMX 互換のスイッチだとなかなかシビアな間隔です。

GND ベタ

ノイズ対策になるらしいと聞いて今まで GND ベタを入れてきましたが、静電容量式ならまだしもメカニカルキーボードに GND ベタは果たして必要なのか?と前々から疑問に思っていたので今回は GND ベタなしで作ってみました。

今のところ入力が荒ぶるという現象も起こっていないので、メカニカルキーボードであれば GND ベタはなくてもよいかなというのが個人的な感想です。

XIAO RP2040

今まで作ってきたキーボードは ProMicro を使ってきましたが、今回はじめて XIAO RP2040 で作ってみました。 私が作るキーボードのキー数だと XIAO RP2040 のピン数で十分ということと USB Type C なのに安い(秋月電子で私が購入したときは750円だった。2022/12/25 時点では830円)ので今後は XIAO RP2040 を基本にキーボードを作っていきたいと思ったのが主な理由です。

Firmware は QMK と KMK で書いてみてどちらでも使えることを確認しました。KMK で本格的なキーボードの Firmware を書くのは初めてでしたが直感的でとても書きやすいと思いました。欠点としては Python なのでミスした場合ランタイムで落ちるのが面倒というところでしょうか。何度かプログラムの書き込みができなくなってその度に全データを消してました。

おわり

マイコンを基板裏に配置したり、GNDベタやめてみたり、XIAO RP2040 を使ってみたりとやってみたかったことを一挙に試すことができたなかなか面白いキーボード作成でした。

ちなみにキーマップはこんな感じです

_lower = 1
_raise = 2
_adjust = 3

EscGUI = KC.MT(KC.ESC, KC.RGUI)
LowMins = KC.LT(_lower, KC.MINS)
AdjEnt = KC.LT(_adjust, KC.ENT)
AdjMins = KC.LT(_adjust, KC.MINS)
RaiEnt = KC.LT(_raise, KC.ENT)
Sands = KC.MT(KC.SPC, KC.RSFT)

keyboard.keymap = [
    # default layer
    [
        KC.QUOT, KC.COMM, KC.DOT , KC.P   , KC.Y   ,  KC.F   , KC.G   , KC.C   , KC.R   , KC.L   ,
        KC.A   , KC.O   , KC.E   , KC.U   , KC.I   ,  KC.D   , KC.H   , KC.T   , KC.N   , KC.S   ,
        KC.SLSH, KC.Q   , KC.J   , KC.K   , KC.X   ,  KC.B   , KC.M   , KC.W   , KC.V   , KC.Z   ,
                          KC.NO  , EscGUI , LowMins,  RaiEnt , Sands  , KC.NO
    ],
    # lower
    [
        KC.QUOT, KC.COMM, KC.DOT , KC.P   , KC.Y   ,  KC.CIRC, KC.AMPR, KC.UP  , KC.LPRN, KC.RPRN,
        KC.A   , KC.O   , KC.E   , KC.U   , KC.I   ,  KC.HOME, KC.LEFT, KC.DOWN, KC.RIGHT, KC.BSPC,
        KC.SLSH, KC.Q   , KC.J   , KC.K   , KC.X   ,  KC.END , KC.ENT , KC.LBRC, KC.RBRC , KC.DEL ,
                          KC.NO  , EscGUI , LowMins,  AdjEnt , Sands  , KC.NO
    ],
    # raise
    [
        KC.N1  , KC.N2  , KC.N3  , KC.N4  , KC.N5  ,  KC.LBRC, KC.RBRC, KC.TAB , KC.SLSH, KC.QUES,
        KC.N6  , KC.N7  , KC.N8  , KC.N9  , KC.N0  ,  KC.PIPE, KC.BSLS, KC.GRV , KC.EQL , KC.RSFT,
        KC.LCTL, KC.LSFT, KC.J   , KC.K   , KC.X   ,  KC.ENT , KC.PLUS, KC.TILD, KC.NO  , KC.RSFT,
                          KC.NO  , EscGUI , AdjMins,  AdjEnt , Sands  , KC.NO
    ],
    # adjust
    [
        KC.EXLM, KC.AT  , KC.HASH, KC.DLR , KC.PERC,  KC.CIRC, KC.AMPR, KC.ASTR, KC.LBRC, KC.RBRC,
        KC.NO  , KC.NO  , KC.NO  , KC.NO  , KC.NO  ,  KC.PIPE, KC.BSLS, KC.GRV , KC.LCBR, KC.RCBR,
        KC.F1  , KC.F2  , KC.F3  , KC.F4  , KC.F5  ,  KC.F6  , KC.F7  , KC.F8  , KC.F9  , KC.F10 ,
                          KC.NO  , EscGUI , AdjMins,  AdjEnt , Sands  , KC.NO
    ],
]

KiCad6 で円形禁止領域を作成する

GND ベタをつけない領域を円形に作りたいと思って keepout.py を試そうとしたものの、このスクリプトは KiCad4 用で KiCad6 で動くようにする方法が皆目わからなかったので代わりに行った方法のメモ


禁止領域を作りたいレイヤー(ここでは B.Cu)で円を描く


Create from Selection -> Create Rule Area from Selection


Keep out copper fill 以外のチェックを外す


始めに書いた円を消して作成されたルールエリアだけにする


ゾーンの塗りつぶしをすると禁止領域が円形になっていることが確認できる


静電容量式キーボードを作るときは全スイッチ分この円形禁止領域を作ったりしますが、さすがに人力でやるのは面倒なので私の場合はフットプリントの時点で禁止領域を入れています。(古い KiCad だとフットプリントに禁止領域を保存できなかったらしい)

静電容量無接点方式キーボード基板をリバーシブルで作ってみた

今回 PCBWay さんの支援で、キーボード用の基板を作っていただきました。Thank you, PCBWay!

今回作った基板は前回作った静電容量式分割キーボードとほぼ同じです。変更点として前回は左右の基板を別々に設計しましたが、今回はリバーシブルで作りました。

goropikari.hatenablog.com

自作メカニカルキーボードだと基板をリバーシブルにしているものを比較的見かけますが(最近は減っている?)静電容量式でリバーシブルを採用しているものは私の知る限り静電容量 Helix だけです。 静電容量式自作キーボードでリバーシブルがあまり採用されない理由は、REALFORCE の検出電極パッドの裏側は GND ベタが抜かれた状態になっているのでそれを模倣するとリバーシブルにそもそも出来ないからというのが主な理由なのかなと推測します。 前回は多数派に倣って基板を作りましたが、私のような販売しないで個人で楽しんでいる場合だとリバーシブルで作ったほうがコスト削減できるので、今回はリバーシブルを試してみました。

基板作成

カニカルキーボードの基板をリバーシブルで作ったときは人力で配線するのは無理だと早々に悟り freerouting に任せましたが、静電容量式だとリバーシブルでも左右別々に作った場合でも配線はほぼ変わらないようにできるため存外簡単でした。

sekigon-gonnoc san の footprint を元に改造しました

こちらが今回実際に使った電極パッドの footprint ですが、両面のパッドを鏡像関係にして、あとはビアを打って両面のパッドを繋げばスイッチ側のリバーシブル対応は完了します。メカニカルだとリバーシブルにするとスイッチ側の配線の数が増えますが、静電容量式の場合はリバーシブルでもそうでなくても配線を全く同じにすることが出来ます。メカニカルと違ってスイッチ側にハンダ付けする箇所が全く無いという静電容量式の特徴が生きた感じですね(LED を配置している場合はその限りではありません)。

発注

今回初めて PCBWay を使いましたが、ページが日本語対応になっているため基板発注が初でもあまり気負いせずに発注できそうと思いました。 基板に関するエンジニアとのやり取りは英語でやるので完全に日本語対応というわけではないようですが入口が日本語というだけでもだいぶ心理的ハードルが下がるように思います。 (2022/12/7 訂正 PCBWay の方によると日本語のカスタマーサービスあるから日本語でも対応していただけるようです) ちなみにアカウントページでの表示言語設定項目はおそらくどこにもないのですが、ドメイン.jp から .com に修正したら英語表示になりました。ちょいちょい日本語が怪しいところがあるのでそういうときは英語にして読むと良いと思います。

発注は「クイックオーダー基板」というのを選ぶと gerber をアップロードするところが現れ、アップロードすると 3D ビューアーで確認できたり、基板サイズのところを自動的に埋めてくれたりといい感じに注文に必要な準備が整いました。私は過去にアップロードする gerber を間違えるという失敗経験があるので正式な発注前にビューアーで確認できるのは便利ですね。

デフォルトのページ

「クイックオーダー基板」を選択したら出るページ

今回は基板の色を黒にし製造番号を消すオプションをつけてあとはデフォルトのままで注文しました。 JLCPCB だとトッププレートのように穴が多いもの注文すると追加料金取られますが、PCBWay ではそのようなことなく注文したときのままの値段でいけました。

途中、エンジニアからの質問に答えつつ、発注から1週間ほどで日本には届きました。ですがそこからの配達途中でトラブルがあって私のもとに届くまでに更に3日掛かりました。輸入はこういうこともあるので時間に余裕をもって発注しましょう。

基板

外観

パット見の仕上がりは特に問題なしです。トッププレートへのスイッチのハマり具合もきつすぎるということもなくちょうどよい穴の大きさに仕上がっていました。

問題点

トッププレートが若干反っていてそこは気になりました。私のキーボードは小さいのでネジ止めで矯正可能な範疇でありますがより横幅のあるキーボードのトッププレートを PCB で作る場合は注意が必要かもしれません。

レジストの色を今回は普通の「黒」を選びましたがこれは失敗だったなと思いました。指紋や基板同士が擦れてできた傷がそこそこ目につきます。 実際には注文していないのであくまで想像になってしまいますが「黒(つや消し)」を選んだほうが指紋などが目立ちにくいのではないかなと思います。ただし、「黒(つや消し)」は基板の製造価格が上がるので無難に「白」あたりを選ぶのが一番幸せかもしれません。

組み立て

前回は NIZ のスイッチを使いましたが今回は BTO のスイッチにしてみました。BTO のスイッチを選んだ場合の欠点としてハウジングサイズが大きいため、スイッチを 19.05 mm ピッチで配置していた場合、スイッチの隙間に M2 スペーサーを入れることが出来ません。 私のようにサンドイッチマウント方式で作成していてスイッチの間に M2 スペーサーを通したい場合はハウジングをヤスリで削る必要があります。

今回 BTO で組んでみて気付いたもう一つの欠点として、BTO のスイッチはトッププレートの穴のサイズに対してかなりシビアだと感じました。下の写真の赤矢印方向に力が加わるとプランジャーの動きが顕著に悪くなります。この部分に爪があることも相まって赤矢印方向に力が掛かりやすくスムーズにプランジャーが動くようになるまでひたすらトッププレートの穴をヤスリで削って拡張する作業を余儀なくされ苦労しました。 緑の矢印方向に力を加えた場合は動きが悪くなることもないので不思議なものです。

打鍵感としては NIZ も BTO もさして変わらない気がするので、組むときの面倒さを考えてしまうと今後は NIZ を選ぶかなぁといったところです。まぁ NIZ は NIZ で遊舎工房から購入した場合は30個単位で買わないといけないので40%前後のキーボードを作る場合は無駄が多く出て困るのですが。。。

そんなこんなでリバーシブル基板版の「小石」が完成しました。

前回のような TRRS ジャックの向きが逆だったというレベルの失敗はありませんでしたが、組み立てていたらちょこちょこ設計ミスに気づきました。最大の失敗としては右の静電容量スキャンモジュールの向きが想定と180度違っていました。リバーシブルで設計するとパーツの向きで頭がこんがらがってしまうのが難しいところですね。

気になる動作の方ですが荒ぶることもなく普通に使えました。リバーシブル基板でも問題ないということを身をもって体験できたので、今後は状況に応じてリバーシブルで作るか否かを選択して作っていきたいと思います。

2022/12/20 追記 軽く触った程度ではあまり感じませんでしたが、ノイズのせいか入力があらぶることが多々起こりました。

2022/12/29 追記 左右で検出される電圧値が全然違うことがわかった。左右の別の閾値を設定したら入力が改善した

静電容量無接点方式分割キーボードを自作した

9月半ば頃に今は静電容量無接点方式(以降 静電容量式 と略す)のキーボードも自作できる時代なのだと知り、そこから自分でも作ってみようとちょこちょこ進めていましたが、ようやく完成させることが出来ました! ちなみにキーボード名は「小石」(英名: miniEC)です。

私の場合、自作キーボードはキットで組み立てたことはあるけど基板の設計からはやったことがないという状態からのスタートでしたが、先人たちの情報のおかげで思い立ってから2ヶ月ほどで完成させることが出来ました。

この記事ではこの2ヶ月どんなことをやって静電容量式キーボードを作れるまでに至ったのかを紹介します。

自作するまでにやったこと

ざっくりとやったことを時系列で並べると以下のような手順を踏みました。

キーボード関連の同人誌を読む

まずは「真の静電容量キーボードを作る本」を読みました。これを読めば静電容量式キーボードを作るときはどんな回路が必要で、どんな firmware を書く必要があるのかわかります。理論のようなハイレイヤーの話が主なので基板の設計をしたことないという場合でも安心して読めます。代わりに高校物理程度の知識はないとおそらく数式追うのが辛いと思うので適宜復習を推奨します。

次に「自作キーボード設計入門」「自作キーボード設計入門2」を読む & 実際に手を動かして KiCad の使い方と QMK Firmware の書き方を学びました。これらの本はメカニカルキーボードの話ですが、メカニカルは動作原理が単純で firmware も書きやすいのではじめの一歩としては丁度よかったです。ただし、これらの本は出版から歳月が経って本の中で使われているソフトウェアのバージョンも上がって本のままでは動かないのでそこは適宜修正する必要があります。幸いメカニカルは作っている人が多く情報も多いので特段困らないと思います。

最後に「静電容量式自作キーボード設計資料」ですが、こちらは他と比べると難しいと感じました。実際に静電容量式キーボードを作る段になってようやく内容が分かってきたという感じだったので初期段階から理解する必要はないと思いますが、とりあえず設計するときには注意を払わなければならない点があるのだなということを頭の片隅に置きましょう。

静電容量 Helix を作る

いくら作り方を学んだところで実物はそうそう思い通りに動いてくれるものではありません。特に静電容量式キーボードの場合、ノイズのせいで入力がうまくいかないという話を見かけますが、実際問題ノイズでどれだけ入力がブレるのかは実物を触らないことには想像できません。 ということで、勉強教材として静電容量 Helix を買って作りました。

goropikari.hatenablog.com

実際に作ってみて以下の気づきを得ました

  • コニックリングが検出用電極パッドからずれると顕著に入力精度が下がる
  • プレート固定用のネジの締め具合で入力精度が変わる
  • 検出用電極パッドは指で触っても反応する
  • 打鍵感向上させるためにはハウジングの固定が大事
  • 私がはんだ付けできる表面実装パーツの最小は 1N4148W のサイズが限界

この中で個人的に一番大事だと思っているのはコニックリングの位置でこれをいかに中心からずらさないかが入力精度に一番効いてくる感じがします。ネジの締め具合で精度が変わったのもおそらくコニックリングの位置がずれたからだと思います。

ちなみにこの頃に Froggy の存在を知り私の中のキーボード観が大きく変わりました。キーボードにトラックボールついたやついいなぁなどと思っていましたが、そもそも片手でキーボード打てば逆の手でマウス使えるじゃん、天才か!? と思いました。生まれてこの方キーボードは両手で打つものだと刷り込まれていましたが、別に両手で打たなければならないなんて決まってないんだ!片手打ちに限らずキーボードはもっと自由でいいんだ!と思い始めたのがこの頃です。よくよく考えてみると人によって手の大きさ、指の可動域は違うのだから個々人にあったキーボードをオーダーメイドするサービスがあってもおかしくないと思うのですが、今の所そのようなサービスは聞いたことがないので不思議なものです。また Froggy 考案者のたくま氏のブログのコメントをみて、世の中には片手しか使えない方もいるのだから片手キーボード分野はもっと発展してもおかしくないし、自作キーボードは配列からキーマップまでなんでもありの世界なので自作キーボード界隈はハンディキャップがある方々の 力になれる存在なのではないかなと思い始めました。

hum-id.jp

カニカルキーボードを基板から設計して作る

カッコつけて(?)初キーボード設計から静電容量式を作るというチャレンジをしようかと一瞬考えましたが、まずは情報も多く簡単そうなメカニカルキーボードを設計して基板発注までの流れを練習しました。

goropikari.hatenablog.com

決して自分にとってベストな配列ではありませんでしたが、不思議なもので自分が設計したということもあってとても可愛く見えました。

1, 2週間は作ったキーボードをメインに使っていましたが、そのあと keyball39 を作ってメインはそちらに移りました。keyball39 を使う前までは片手3x6+親指3キーがベストと思っていましたが、keyball39 のおかげで6列目はなくても特段困らないということに気付かされたので作成する静電容量式キーボードも5列で作ることに決めました。このあとキーマップについて更に考え、親指キーは2つあれば十分だと気づきましたが、回路のバランス的に3つあったほうがきれいになる(3x6のキーボードとみなすことができる)ので親指キーは3つのままでいくことにしました。

goropikari.hatenablog.com

ブレッドボードで実験

Designing a custom Topre board - deskthority にブレッドボードで実験している写真があってこれはいいなと思ったので真似することにしました。 静電容量スイッチスキャンモジュールの使い方もよくわかっていなかったのでこの段階で実際に動かしつつ確認しました。

Designing a custom Topre board - deskthority より

参考元のように1スイッチ分の検出用電極だけ入った基板を作ろうかと思いましたが、どうせならキーマトリックスで実験できるようにしようと思ったので 2x2 で作りました。

静電容量スイッチスキャン用モジュールの参考コードは今の QMK Firmware だと動かないところがありましたが、出てくるエラーを地道に修正したら無事に動きました。

github.com

静電容量式キーボードを設計する

あとはそれまでの知識を総動員してひたすら基板を作っていきました。

配線

配線の仕方一つでノイズがでる怖い世界らしいので、既存の静電容量式キーボードの配線の仕方をよく参照しました。静電容量 Helix の基板データ、「静電容量式自作キーボード設計資料」についてくる CorneEC の基板データ、あとは Cipulot さんという方が静電容量式のキーボードをよく設計されていてデータを GitHub で公開されているのでそれらを参考にしていました。静電容量式キーボードの場合 freerouting 等使わずみんな人力で配線していると思いますが、実際のところ自動で引いた配線でどれだけノイズが出るのかは怖いものみたさで試してみたい気はします。

スイッチ

静電容量式スイッチとしては Niz or BTO のどちらかを選ぶ1ことになりますがハウジングのサイズがそれぞれ異なります。それぞれ用のトッププレートを作ってみましたが結果的に言うと BTO 用のもので Niz のスイッチもブレずに固定できました。

自作スキャンモジュール

この頃、静電容量スイッチスキャン用モジュールが品切れでもう再販されないかなぁと思っていたので互換回路を作ったりもしました。このあとすぐに在庫が復活しましたが、PCBA のやり方を覚えることが出来、回路的にも一応動くものが作れたので自分の技術の幅は広がりました。

完成

そんなこんなで晴れて静電容量式キーボードが出来上がりました!(右手用基板の TRRS ジャックの向きは間違えた)。 色が白いのは HHKB 雪モデルに影響された結果です。promicro の存在が浮いていますが promicro カバーを白色で作れば良いかなぁと思っています。

今後

とりあえず TRRS ジャックの向き間違えた右手用基板は修正しようと思います。 需要があるなら今回作ったキーボードのキット化して販売することも考えるかも? 36キー/格子配列/静電容量式の組み合わせはニッチ過ぎるのでおそらく売れないと思いますが。

静電容量式キーボードを作るという目標は達成して静電容量式キーボード作りたい欲は落ちついたので、次作るキーボードは気をはらずに作れるメカニカルで作ると思います。今作りたいものとしてはマイコンを基板の裏に隠してついでに親指キーを片手2キーにして全体34キーのキーボードを作ろうと思っています。ちっちゃくて可愛いキーボードになる予感。

keyball39 を静電容量式化することも考えていましたが、L字コンスルーが手に入らないので今の所保留です。コンスルーを手に入れるか、ヨーキースさんがトラックボール読み取り基板を再販されたらまた考えます。

追記 2022/12/8 間抜けに飛び出ていた右の TRRS ジャック直った

追記 2023/7/1 キット化し販売を開始しました

pikarikbd.booth.pm


  1. REALFORCE 分解してパーツ取りという選択肢もあることにはある

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