自作キーボードのOLEDに表示させたいこと
生きることにこだわりを。魚住惇です。
全高情研の分科会発表に採択された教員が取り組む「資料集原稿提出」に追われています。原稿のためのWordファイルのテンプレートがあるわけですが、僕はいきなりそのファイルに書くのではなく、Obsidianに一度書いて、それをコピペするようにしています。誰しもお気に入りのエディタというものがあるようで、僕は現在もObsidianを使うようにしています。こちらの原稿はあまり困ることはありませんでした。内容は「じょうほうらいふ」という情報Ⅰの学習サイトの機能紹介が主な内容なので、語りたいことが多くてむしろ書いた内容をかなり消しました。
それに、原稿の中に画面のスクリーンショットを随時入れるだけで結構な面積を占有するので、個人的には資料原稿のテンプレートのままだと全然ページが足りません。うーむこれは語りたいことを存分に語る場所がなくて困っている状態でしょうか。個人的にはこのnewsletterで何を書こうかと考えている方が、割と時間がかかったりもしています。どんな内容だったら読んでくださる方に何か残るものを提供できるのか、書いていながらそればかり考えています。
今回もちょっとしたこだわりに、お付き合いください。
キーの数が少ないキーボードこそOLEDに情報が欲しい
先日、Keychronというメーカーがギズモードとコラボして、Keychron Orca echoという左右分割型のトラックボール付キーボードを発表しました。
個人的には、なしですこれは。トラックボールの大きさが19mmとかなり小さい上に、キーの列が小指列よりも右側にもあるのが理由です。
僕自身も左右分割キーボードを数多く試してきました。最初はHHKBの見た目のまま中央で分割したものを使っていました。ところが分割されたキーボードを使っていくうちに、使っていて思いつくことがいくつも出てきました。右手側の端にあるEnterキーが途端に遠く感じるのです。HHKBではそれほど遠いと思ったこともなく、むしろUS配列でスリムに感じるあのEnterキーがですよ。それが分割キーボードを使うと遠いなと思うのです。Enterキーが遠いということは、小指すらQ列やP列から動かしたくないということを意味します。なので、Shiftキーなども別の場所に割り当てる必要が出てくるわけです。
ではEnterキーはどこに割り当てるのか。それはもう親指で押すキーです。自分の場合はEnterとBSをそれぞれ右の親指で押すキーに割り当てています。Keyballのデフォルトキーマップだと逆なんですが、僕はEnterが左の方が安心します。
そして、前々回の配信では、Shiftキーの扱いやタップとホールドについてお話しました。あれから2週間経ったわけですが、おかげ様でこの問題も解決しつつあります。これくらいの設定だったら自分の普段通りの感覚で入力が続けられる。そんな設定値を見つけていく生活が楽しいんですよね。
それでも人間というのは欲深いもので、それなら今現在のキーボードの設定がどんな内容になっているのか。特定のキーを押している今がどんな状態にあるのか。Ctrlキーを押し続けているのかそれとも特定のレイヤーに切り替わっているのか。それを目で確認出来たら良いなと思ったのです。HHKBだったらFnキーを押したときにだけレイヤーが変わり、ファンクションキーなどを入力していました。Fnを押したか押していないかの2通りです。でもキーの数が少なければ少ないほど、多くのレイヤーを切り替えながら入力します。
先ほど貼り付けた画像には、Keyballにレイヤーが0から6まで設定できるような画面が見えています。実質的には5までしか使っていないので、すでにレイヤー0から5までの6枚を使っています。1が自動マウスレイヤーなのでデフォルトのレイヤーにはレイヤー1に移動するためのキーが設定されていません。なので設定してあるのはレイヤー2~5までです。
これだけレイヤーがあるとどうしても気になってくるのが、今この瞬間にどのレイヤーに切り替わっているのかということ。デフォルトのレイヤーにいるのか、自動マウスレイヤーにいるのか、はたまた他のレイヤーに切り替わっているのか。キー操作で切り替えるので、例えばレイヤーを切り替えるキーを押していたらそのレイヤーに切り替わっているのはそれはそうなんですが、実際に本当にそのレイヤーに切り替わっているのかどうかが気になるわけです。
そこで頼りになるのがOLEDというKeyball本体に接続されている小型のディスプレイの存在です。自作キーボードが出始めた頃から特に左右分割タイプに搭載されていました。ここにどんな情報を表示するのかが1つのテーマだったのです。ちなみにKeyballでは左右のうちケーブルが刺さっている方には認識中のキーコードや選択中のレイヤーの数値やトラックボールの座標などが表示されていました。でもケーブルが刺さっていない方のOLEDにはKeyballのロゴマークが表示されているだけだったんですよね。これはこれでキーボードを彩る要素の1つになってくれていたと言われたらそれまでなんですが、ちょっと勿体無いなと思ったんですよ。
というわけなので、今回はこのOLEDに表示する内容をカスタマイズしてみました。
可変TAPPING_TERM
前々回の配信で「#define TAPPING_TERM 200」をファームウェアに追加したと書きました。この数値は200ミリ秒間押し続けたら、そのキーをホールド扱いにするという意味を表します。これのおかげで、高速タイプ時にもキーを押した瞬間にShiftキーなどが押された状態になってしまう問題を解決できていました。
しかし次に気になってくるのが、その数値が200msがちょうど良いのか?という問題です。それにこの数値を調整しようとなるとファームウェアをいちいち書き換えなければならないため、あれこれと沼っている最中にはQMKファームウェアを書き込む頻度が高いため、キーボードとしてちゃんと使い込むことができません。
そこで調べてみて分かったのが、rules.mkに「DYNAMIC_TAPPING_TERM_ENABLE = yes」と書いておけば、どうやらキー操作でこの200msの数値が微調整できるらしいということでした。これが実現できれば調整するたびにQMKファームウェアを書き込む作業がなくなります。早速試してみることにしました。
とはいえこれはこれで問題があって。デフォルトが200msなのは確定なんですが、そこから微調整してみたときに、今現在の設定値がどれくらいの数値なのかが全くわかりませんでした。キー操作でできるのは200msの数値を5msずつ上下することです。まぁそれができるだけでもありがたいといえばありがたいわけですが、個人的には「おお、これがちょうど良いじゃん」と思ったタイミングでそれが何msなのかが知りたかったのです。
しかもこれがまた厄介で、ShiftキーやCtrlキーなどをホールドとして割り当てていると、どうも自分の場合はそれらのキーごとにTAPPING_TERMの感覚が違うんですよね。例えば、Shiftキーなどはただ単に大文字で入力したいだけなので割と高速タイプできていて、Ctrlキーを組み合わせる際はショートカットキーとして組み合わせたいので、多少時間がかかるという感じです。
これはかなりの沼だなと思いました。一応QMKにはこうしたMODキーごとのTAPPING_TERMを変更できるようなのですが、果たして自分の好みの秒数がキーごとにどれくらいなのかは、色々と試行錯誤してみないとわかりません。それにその秒数だって、調整をしている最中には現在の数値がいくつなのかを把握できないと、「○○○msに設定した、もっと早いといいなと思った」をやる度に何らかの方法でその設定値を知る必要が出てきます。
少し調べてみると、一応QMKにはコンソール出力ができるらしくて、どうやらキーボードが接続されているPC側のターミナルの画面でそれらの値を表示できるそうでした。ただそんなことをやっているよりも、ここまで色々と調べたり試行錯誤していくうちに「いやいやそれなら、キーボード本体に備え付けられているOLEDに表示させたら良いじゃん。ずっとロゴマークを表示させている場合じゃないって。」と思うようになりました。
結果どうなったのかというと、OLEDに現在のTAPPING_TERMを表示させることに成功しました。これには2つ頑張ったことがあって、1つは左右分割型だとOLEDもProMicroも左右に1つずつある件。ケーブルを接続している側の値を取得してから、それを反対側のOLEDに表示するという流れをプログラムしなければなりませんでした。もう1つは、このTAPPING_TERMの値が実はキーボードのどこにも保存されず、USBケーブルを抜き挿ししたらデフォルトとして設定した200msに戻ってしまう問題の解決でした。
これがどちらも厄介でね。結局TAPPING_TERMの値も左右どちらのProMicroにも書き込まれているので、OLEDにどちらの値が表示されているのか分かるように表示を工夫しました。これができてない時は、調整するキーを押してもOLED上に表示されている数値が変化しなかったり、変化したとしても実際の動作に影響してくれなかったりしました。特にケーブルを接続していない側のOLEDに表示させようとしたのも問題を複雑にしていた原因でした。これについては試行錯誤の末、解決済みです。
もう片方のTAPPING_TERMをEEPROMに保存して、キーボードを別のパソコンに接続した時も設定値が残っていて欲しいという問題について。これはキーボードの動作そのものを変更する必要がありました。設定値を変更できて、キーボードに電気が流れている時はそれが維持される。これはProMicro内のメモリに変更された設定値が記録されているときの挙動です。でもこのままだとメモリは電源オフ時に値がなくなってしまうため、メモリ上の値が変わったら即座に保存される仕組みを用意する必要がありました。じゃないとケーブルが抜かれた瞬間に設定値が吹っ飛びますから。
それだけではありません。設定を保存したならキーボードにケーブルを接続した際にその値を読みにいく仕組みも必要です。もっと詳しく言うと、設定値が保存されているならその設定値を読み込み、設定値が保存されていないなら、デフォルトの値である200msを読む必要があるわけです。これはQMKの起動プロセスには最初からは実装されていなかった動きなので、それも改めてプログラムを修正する必要がありました。
ここまでやっているともっと要望が出てくるもので。それなら現在選択されているレイヤーの数値だったり、CtrlやShiftなどのホールド中のキーなどを大きく表示したいなと思えてきました。この辺りはQMKも事細かに設定ができるようで、AltキーやWinキーなども含めてModifier Keysという名前で扱い、しかも今この瞬間にどのModifier Keysが押されている状態なのかも取得できるようでした。じゃあ話は簡単で、その情報をOLEDに表示すれば、「ちゃんと今、Ctrlキーが押された状態かな?」という疑問・不安も解消できることがわかりました。
OLEDの表示で自作キーボードがもっと楽しくなった
実際に見てもらった方が早いですね。こちらが現在のOLEDの表示内容です。まず、Keyballのデフォルトだと横向きに表示していたので、縦方向に向きを変えました。こっちの方が見やすいです。左側にはTAPの秒数やModifier Keys関係の情報、右側にはキーコードやトラックボールの座標のほかに、レイヤー情報などを表示させています。右側の内容はKeyballデフォルトからそこまで変化していません。
ただし縦方向に表示方向を直した際に半分よりも下の領域が空いたので、そこに大きな数字やアルファベットを表示してみたいと思いました。その結果が写真にある表示です。左側はアルファベットのSが表示されていて、Shiftキーが押されている状態を表しています。右側はレイヤー2に切り替わっている状態を表示してくれています。上半分みたいに普通に文字を文字として表示してしまうと、遠目からだと認識しづらいんですよね。これくらい大きな文字や数字なら、かろうじて視界にキーボードが入った時でも判別できます。左側は少なくともキーが押されて反応しているな、くらいの認識ができます。
昔、自作キーボードという存在に出会った時、このOLEDというディスプレイに何を表示させるのか本当に疑問でした。いやいや、キーボードでしょ?そんな表示させたい内容とかある?ゲームとかをプレイするのか?ちょっと自分にはこれを活かせるアイデアが出てこないわ。なーんてことを思っていたんですよ。そのことは今でもはっきり覚えています。
しかし実際に自作キーボードを、特にキーの数が少ないキーボードを使ってみると、この小さなディスプレイがキーボード全体の使い勝手を左右する重要な部品として機能してくれます。このOLEDの表示内容も含めて、キーボードなんだ。この表示はおまけじゃないんだ。キーボードを快適に使うためにはこれが必須なんだ。Claude Codeを使ってプログラムをどんどん書き換えてもらって機能を増やしていくと、もうそんな感情にまで到達しました。
かつて押し入れに眠らせていたキーボードが息を吹き返し、自分が本当に使いやすいなと思えるレベルにまで育ってくれました。いや、キーボードって育つんか。自分でもこの表現に笑ってしまいそうです。そうか。キーボードも育てるものなんですね。バイブコーディングは本当にすごいや。自分が欲しいなと思えるプログラムをAIが書いてくれる。自分みたいに「これがやりたいんじゃ!」と強く思い、「これをこうしたらできるはずなんじゃ!」という技術的推測がある程度やれそうな感じだと、具体的な指示をしながらコードを書かせられます。
最近、Claude Codeの上限が更に緩和されて、ウハウハしてます。今日も楽しいです。
今回のnewsletterは以上となります。
「いいね」を押していただけるとうれしいです。内容に関するご意見ご感想がありましたら、「#こだわりらいふ」をつけたツイートや、Substack内のコメントまでお願いします。










