【自作キーボード】OLED表示内容のレシピ&アイディア集

この記事は キーボード #2 Advent Calendar 2021 10日目の記事です。

adventar.org

昨日の記事は、msysyamamotoさんの 2021年の活動振り返り でした。

msysyamamoto.hatenablog.com

キースイッチ沼も深くて楽しいですよね。私のお気に入りはルブったDUROCK L7スイッチです。


自作キーボードといえば、自分好みの配列、自分好みのキースイッチやキーキャップが使えるのが醍醐味ですが、電子工作の技術を活かして、市販のキーボードにはない入出力デバイスを自由に取り付けられるのも大きな特長です。 中でもOLEDは、キーボードに小さなディスプレイを取り付けられるということで、いろいろな情報を表示できそうで夢が広がりますよね!

ですが、OLEDに何を表示させればいいかは中々悩ましいものです。 そこで本記事では、OLEDに表示させるもののネタを可能な限り集めてみました。 一部のネタについてはコード例も載せましたので、よろしければお試しください!

OLEDの有効化方法・表示内容の変更方法

OLEDには実装次第で自由に表示内容を変更できますが、反面その自由度の高さゆえ、現時点ではキーマップなどとは違ってGUIによる設定ができません。 表示内容の変更のためには、自分でQMK Firmwareに実装してビルドする必要があります。 そのため、本記事に書かれている内容を試すためには自分でQMK Firmwareをビルドできる環境が必要です。 まだの方は公式ドキュメントなどを参考に環境を構築してみましょう。

Setting Up Your QMK Environment
QMK 環境の構築

QMK Firmwareのビルド環境が構築できたとして、OLED付きで販売されているキーボードキットであれば、多くの場合はデフォルトでOLEDが光るようになっている(または有効化の方法がビルドガイドに書いてある)と思います。 それ以外の場合は、QMK公式のドキュメントを見て有効化のための設定を書くことになります。

OLED Driver

が、ハードウェアさえ問題なければ、基本的には以下の2ステップで有効化できるはずです。

  • rules.mkの中に、OLED_ENABLE = yesを追加する
  • keymap.cの中に、oled_task_user()関数がなければ追加して、その中にOLEDの表示内容を実装していく

    bool oled_task_user(void) {
        // OLEDに表示する内容を上から実装していく
        oled_write_ln_P(PSTR("Hello, world!"), false);
    
        return false;
    }
    

[f:id:f1p038:20211210000821p:plain:alt=Hello world!]

なお、QMKには時々破壊的変更を伴う更新が入ることがあります。 OLEDに関しても、2021年後半に2つ破壊的変更が入ったため、QMK Firmwareのバージョンが最新でない場合は公式ドキュメント通りに実装してもコンパイルが通らない・通ってもOLEDが光らない場合があります。 特にQMK公式リポジトリではなく、キット作者がForkしたリポジトリを使用している場合、QMK公式に追従しているとは限らないため注意が必要です。

以下が2021年後半にQMK Firmwareに入った破壊的変更です。

  • コンパイルスイッチがOLED_DRIVER_ENABLEからOLED_ENABLEに変わった
  • oled_task_user()関数の戻り値が、voidからboolに変わった

また、OLEDに表示する機能を盛り込んでいくと、次第にファームウェアサイズが肥大化していき、ProMicroの容量と戦う必要が出てきます。 そんなときはLTO(リンク時最適化)を有効にすると、ファームウェアサイズが劇的に軽くなる可能性があります。 rules.mkLTO_ENABLE = yesと書いておきましょう。

レシピ&アイディア集

画像を表示させる

OLEDカスタマイズといえばまずはこれ。 デフォルトファームウェアにオリジナルロゴを設定しているキーボードも多いですね。

OLEDに自分の好きな画像を表示させる方法については、変換サービスも作成されているこちらの記事が分かりやすいです。

HelixのOLED表示を簡単にカスタマイズするサービスを作った - Qiita

なお、OLEDに表示するデータの仕組みについては、この記事でとても詳しく説明されています。 画像だけでなく、フォントを変更したい場合にも参考になると思います。

QMK の OLED 基礎知識 - Qiita

現在のレイヤー [実装例あり]

[f:id:f1p038:20211210002623p:plain]

どのキーも押していなければデフォルトレイヤーと設定している方にとってはそこまで嬉しさはないかもしれませんが、押すたびにレイヤーが切り替わるようにしている方や、私のようにデフォルトレイヤーを切り替えたり、レイヤー切替キー連打でレイヤーロックみたいな機能を実装している方ですと、たまにレイヤー迷子になったときに便利です。

// レイヤーがこのように定義されているものとします
enum layer_names {
    _BASE,
    _RAISE,
    _LOWER,
    _ADJUST
};

void oled_write_layer_state(void) {
    oled_write_P(PSTR("Layer: "), false);
    switch (get_highest_layer(layer_state | default_layer_state)) {
        case _BASE:                               // 各レイヤーで表示する内容を定義
            oled_write_ln_P(PSTR("Base"), false); // レイヤー表示名はお好みで変更してください
            break;
        case _RAISE:
            oled_write_ln_P(PSTR("Raise"), false);
            break;
        case _LOWER:
            oled_write_ln_P(PSTR("Lower"), false);
            break;
        case _ADJUST:
            oled_write_ln_P(PSTR("Adjust"), false);
            break;
        default:
            oled_write_ln_P(PSTR("Undef"), false);
            break;
    }
}

bool oled_task_user(void) {
    oled_write_layer_state();
    return false;
}

NumLock/CapsLock/ScrollLockの状態 [実装例あり]

f:id:f1p038:20211209235843p:plain

市販キーボードではLEDランプで表示されることが多いですが、自作キーボードではOLEDに表示させることができます。

void oled_write_host_led_state(void) {
    const led_t led_state = host_keyboard_led_state();
    oled_write_P(PSTR("NL:"), false);
    oled_write_P(led_state.num_lock ? PSTR("on") : PSTR("- "), false);
    oled_write_P(PSTR(" CL:"), false);
    oled_write_P(led_state.caps_lock ? PSTR("on") : PSTR("- "), false);
    oled_write_P(PSTR(" SL:"), false);
    oled_write_ln_P(led_state.scroll_lock ? PSTR("on") : PSTR("-"), false);
}

bool oled_task_user(void) {
    oled_write_host_led_state();
    return false;
}

打鍵数 [実装例あり]

f:id:f1p038:20211209235855p:plain

キーボードの電源を入れてからの打鍵数を数えて表示させています。 作業中や作業後に確認して、今日はこれだけ頑張ったんだなーと達成感を感じてはいかがでしょうか?

static unsigned int type_count = 0;
void count_type(void) {
    type_count++;
}

// キーを押す・離すタイミングで呼ばれる関数
// 関数自体なければ関数ごと追加、あれば`#ifdef OLED_ENABLE`内だけ追加する
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
#ifdef OLED_ENABLE
    if (record->event.pressed) {
        count_type();
    }
#endif
    return true;
}

void oled_write_type_count(void) {
    static char type_count_str[7];
    oled_write_P(PSTR("Type count: "), false);
    itoa(type_count, type_count_str, 10);
    oled_write_ln(type_count_str, false);
}

bool oled_task_user(void) {
    oled_write_type_count();
    return false;
}

なお、この打鍵数カウントはキーボードの電源を切るたびにリセットされるので、累計打鍵数(このキーボードでどれだけ打鍵したか)は表示できません。 私はまあいいかと割り切っています。

打鍵数をEEPROMに書き込むなどして永続化しておけば累計打鍵数も表示できそうですが、打鍵のたびに書き込んでいてはEEPROMの寿命がすぐ尽きそうなので、永続化のタイミングを考える必要がありそうです。

uptime [実装例あり]

f:id:f1p038:20211209235907p:plain

キーボードの電源を入れてからの時間がtimer_read32()で取得できるので、それを表示しています。

// write given digit, with leading zero if digit < 10
void oled_write_2digit(unsigned int digit) {
    static char buf[6];
    itoa(digit, buf, 10);
    if (digit < 10) {
        oled_write_char('0', false);
    }
    oled_write(buf, false);
}

void oled_write_uptime(void) {
    static uint32_t uptime_s;
    uptime_s = timer_read32() / 1000;
    oled_write_P(PSTR("Uptime "), false);
    // hour
    oled_write_2digit((uptime_s / 3600) % 60);
    oled_write_char(':', false);
    // minutes
    oled_write_2digit((uptime_s / 60) % 60);
    oled_write_char(':', false);
    // seconds
    oled_write_2digit(uptime_s % 60);
    oled_write_char('\n', false);
}

bool oled_task_user(void) {
    oled_write_uptime();
    return false;
}

なお、現在時刻や日付はQMKでは取得できないため表示できません。 RTC(real-time clock)というパーツとバックアップ用電池をキーボードに搭載すれば、キーボードで時計を持てるので時刻を表示することはできます(そこまでしなくてもキーボードが繋がってるPCで時刻は確認できるでしょ、というツッコミが聞こえてきそうですが)。

キッチンタイマー・ストップウォッチ

時間が測れるので、ストップウォッチやタイマーも実装できます。

圧電スピーカーとOLEDが搭載されたキーボードにタイマー機能を実装して、キーボード上でポモドーロテクニックを回せるようにする、というのも面白そうです。

打鍵速度(WPM) [実装例あり]

f:id:f1p038:20211209235927p:plain

QMKの機能で打鍵速度(WPM = words per minutes)が測定できるので、それを表示しています。

docs.qmk.fm

なお、この機能で取得できるWPMは、英単語の平均長さを5文字と仮定して、1分間の打鍵速度を5で割った値となります。 この割る数は変更できるので、1に設定すれば「1分間の打鍵速度」そのものも取れそうですが、取得できるWPMの最大値が255なのですぐにカンストしてしまいます。 「ちゃんと分間打鍵速度を表示したい」という方は、QMK本体の実装に手を入れてみてもいいかもしれません。

  • rules.mk

    WPM_ENABLE = yes
    
  • keymap.c

    void oled_write_wpm(void) {
        static char wpm[5];
        oled_write_P(PSTR("WPM: "), false);
        itoa(get_current_wpm(), wpm, 10);
        oled_write_ln(wpm, false);
    }
    
    bool oled_task_user(void) {
        oled_write_wpm();
        return false;
    }
    

気温・湿度・気圧表示

f:id:f1p038:20211210001424p:plain

電子工作スキルが求められますが、キーボードに環境センサを取り付けて、読みだした値を表示することも可能です。 OLEDはI2Cで接続されているので、例えば気温・湿度・気圧が測れるBME280など、I2Cで接続できるセンサであれば追加でピンを消費せずに実装できて便利です。 もちろん空いているADC対応ピンでアナログ値を読み出したりするのもよさそうです。

私の知る範囲では、らてさん作のPistachioProが、気温・湿度・気圧センサを搭載し、OLEDに表示しています。

booth.pm

デバッグ情報

Corneキーボードのデフォルトファームウェアには、最後に押したキーの内容と位置を表示する機能が実装されています。

github.com

これはキーボードのユーザー向けというよりは、QMKのkeymap.c魔改造したい、C言語でゴリゴリと機能を実装したい人にとってデバッグ用にあると嬉しい機能だと思いました。 押したキーの情報に限らず、キーボード上にデバッグ情報を出してprintデバッグできるのは開発者にとって便利です。

電卓モード

以前「PCに繋いでテンキーとしても使える電卓」が発売されたというニュースを見た記憶がありますが、今も普通に売ってるようですね。

www.amazon.co.jp

自作キーボードでもQMKに実装してあげれば、キーボード内で計算した結果をOLEDに表示する電卓モードが実現できそうです。 さらに計算結果をそのままPCに入力できるようにしても面白いかも。

ゲーム

youtu.be

ボタン、画面、CPUが揃っているので、キーボードは実質携帯ゲーム機。

OLED上でPongやテトリスを遊べるよう実装した例が見つかりました。

その他のアイディア

思いついてしまったけど、現実的に実装できるかどうかも分からないネタを供養します。

シェル

最近のほぼ週刊キーボードニュースで、あったらいいなとコメントされていた気がします。 Raspberry Pi Zeroでキーボードを作れば実現できそう。

REPL

REPL(Read-Eval-Print Loop)とは、プログラムを打ち込んだらその場で実行して結果を表示してくれるツールです。シェルからの連想。 ProMicro + QMK 上で実装するのは容量的にも辛そうですが、Raspberry Pi PicoなどでKMK Firmwareを使用すれば、CircuitPythonのインタプリタが付いてくるので実現できそうです。

PCから受信した情報を表示する

恐らくみんなが欲しがっている機能。 キーボードを接続しているPCから情報が得られれば、表示できる情報がぐっと増えますからね。 PCローカルだけでなくネットの情報も利用できますし。

ただ問題は、どうやってキーボードに情報を伝えるか。 VIAやRemapではRAW HIDを使用してキーマップを送り込んでいるようなので、同じ仕組みでできるような気がしますが、できたとしてもPC側でも送信用ソフトの実装・起動が必要なのでそれなりにハードルは高そうです。 残念ながらアドベントカレンダーの記事には間に合いませんでしたが、ちょっと研究してみたいですね。

終わりに

OLEDに表示できそうな内容を、見つかった & 思いついた限り挙げてみました。 OLED搭載キーボードをお持ちの方は、この記事を参考に気になったネタを表示して遊んでいただけたら嬉しいです。

この記事を書いたキーボード

自設計キーボード yacc46 v1.0

  • キースイッチ: MOMOKA Flamingo Switch (スプリングを MX Progressive 78P/72P/68Pに交換して変荷重にしたもの)
  • キーキャップ: DROP + OBLOTZKY SA OBLIVION V2
  • OLEDの表示内容:
    • QMKのロゴ
    • 現在のレイヤー
    • NumLock/CapsLock/ScrollLockの状態
    • 打鍵数
    • WPM

f:id:f1p038:20211209235942p:plain

自作キーボード沼1年目で触ったキーボードたち

この記事は キーボード #2 Advent Calendar 2020 9日目の記事です。

昨日は id:yskoht さんの Keyboard Layout Editor JSONの使い方 でした。

adventar.org

2020年は私にとって、自作キーボード入沼の年となりました。 それはもう深いところまで沈んでしまい、気がついたらキーボード設計までしてしまいました。

そんな沼に沈むまでの1年間に触ったキーボードを振り返りたいと思います。

ほぼ全編自分語りな上に、無駄に長い記事になってしまいましたので、お時間のあるときにどうぞ。

ErgoDox EZ (2018年10月)

f:id:f1p038:20201207192438j:plain
ErgoDox EZ (Cherry茶軸)

「1年目」と言っておきながらだいぶ過去から始まりますが、 私がキーボードに興味を持ったのは、ErgoDoxをTwitterで見かけたときだったと思います。

それまではデスクトップPCではメンブレンキーボード、ノートPCでは付属キーボードを使っており、特に不満は感じていませんでした。1 ですが、ふと目にした左右に割れてるキーボードの写真に衝撃を受け、またキーマップを自由に変えられることにも強い興味を持ちました。

使ってみたい……!という気持ちと、いきなり3万円以上をキーボードに突っ込むのは怖い、という気持ちの間でだいぶ長いこと悩みましたが、思い切って購入。

しかし結論から言うと、このErgoDox EZはあまり使いこなせませんでした……。

理由としては、

  • 想定以上に大きかった
  • Cherry茶軸を選んでみたが、タクタイル感があまり好きになれなかった
  • 使いやすいキーマップを作れなかった

あたりが挙げられます。

特にキーマップについては、日本語配列として使いたかったものの、当時の私では日本語キーボードの右手側にある多数の記号(|@[]など)をうまく配置できるキーマップを作ることができなかったのが致命的でした。ErgoDoxに関する記事も大多数がUS配列として使うことを前提としていましたからね……

といった感じで、1-2週間くらい触ってみたあとは元のメンブレンキーボードに戻ってしまいました。

Planck EZ (2019年11月)

キースイッチとキーキャップを交換したPlanck EZ

ErgoDox EZ活用に失敗したちょうど1年後、唐突に40%キーボードであるPlanck EZによってキーボード沼へ落ちました。

TwitterかどこかでLet's splitを見かけて、40%キーボード繋がりでPlanckを知ったのだったと思います。

格子状にならんだキーと、数字キーすらないストイックなキー数、それでいてふつうに使えるという噂を聞いて、これまた興味を惹かれて購入。

そしてこちらは、数字キーと記号キーをレイヤーに押し込める方法で、日本語配列でも問題なく使えるキーマップを作ることができました。 ErgoDoxよりはるかにキー数少ないのに……。 キースイッチに選んだCherry黒軸の打鍵感も気に入り、一気に常用できるキーボードとなりました。

ちなみに当時使っていたキーマップはこんな感じ。 現在使っているキーマップはここから、数字を2段目に持ってきたり、Enterを親指に持ってきたりするなど細かい調整を加えていますが、おおよそこの配列がベースとなっています。

f:id:f1p038:20201208005425p:plain
Planck EZで使っていたキーマップ

その後AliExpressでキーキャップとキースイッチを購入し、小指だけ赤軸にして変荷重にしたり、キーキャップを変えたりと、一気にキーボード沼に沈んでいきました。

Chidori (1月)

Chidori
Chidori (Gateron Ink Black/Red, MDA Big Bang)

Let's splitからPlanckを知ったので、Planck EZの次は自作キーボードに手を出したいなと考えていました。

Planck EZで40%キーボードが十分実用できると分かったのでサイズは40%で、かつ分割型のキーボードキットとして、Corne Cherryを作りたいなと思っていました。しかし見つけたときはちょうど品切れで買えず。

買えるタイミングを待っていたのですが、その前に昨年度のアドベントカレンダーka2hiro_ さんのChidori紹介記事 を読み、電子部品むき出しのフォルムに一目惚れしてポチりました。

はんだごてなどの道具も新しく揃えて組み立て。 はんだ付けは大学の実験で少しやったことがある程度でしたが、組み立て自体は特に問題なく完了しました。 その後ファームウェアの書き込みに手間取ったりしましたが、どうにか動作させられたときの感動はひとしおでした。

完成後も、I2Cについて調べてOLEDを追加する改造を加えています。 TRRSジャックからもI2Cが出ているので、さらにRTC、気圧計、CO2センサなどを付けて遊べそうだなあとも考えています。

Corne Chocolate (2月)

Corne Chocolate
Corne Chocolate (Kailh Choc赤軸, 3DプリントキーキャップRSX)

やっぱりCorneが気になるなあというのと、職場でも自作キーボードを使いたいという思いから、Corne Chocolateを組み立てました。

組み立てに関しては、やはりUnderglow/Backlight LEDとして使われているSK6812MINIのはんだ付けが鬼門でした。 というかどこかがはんだ付け不良になっているようで、未だに全部点灯しません。 ま、まあ職場で使うから光らなくてもいいし……

キーキャップは monksoffunkさんの3Dプリントキーキャップを使用。 とても薄く仕上がり、またキーキャップとOLEDカバーがツライチになってとても見栄えがよくなりました。 最近はスイッチの選択肢の多さからCherry MX互換スイッチのキーボードばかり選んでいますが、Chocのこの薄さはいいなあと常々思います。

f:id:f1p038:20201208210131j:plain
横から見たCorne ChocolateとChidori

DUMANG DK6 (3月)

DUMANGで遊んでいたらなんかできてた配列。親指キーの配置がちょっと気に入っている

昨年度のアドベントカレンダーと雷さんの紹介記事 を読んで気になっていたDUMANGキーボードを購入しました。2

思いついたキー配列を気軽に試せて楽しいです。キーマップ設定アプリがUS配列にしか対応しておらず、日本語配列で使うにはちょっと厳しかったり、マクロの設定がQMKほどは自由度がなかったりしますが、そこさえ目をつむれば十分常用できると思います。 しばらくの間配列をいじって遊んでいました。

ちなみに上の写真で試した配列が、後述のyacc46制作のきっかけとなりました。 このDUMANGキーボードはSU120でのプロトタイピングより前の段階で試行錯誤するときにも活用しました。

Kyria (5月)

Kyria (Gateron Ink Silent Black, ENJOYPBT ABS Dolch)

この頃Self-Made Keyboards in JapanのDiscordサーバーに入ったのですが、ROM専として色々と見ていたところで splitkb.comのKyria を見つけて購入しました。

海外ストアからの直接購入3、さらにストアではケースが品切れだったため、公開されているケース図面を使ってアクリル板を近所のファブでレーザーカットしてもらうなど、そこそこ入手までのハードルが高いキットでした。

Corneよりもさらに攻めたColumn-Staggered配列や、親指まわりのキーが多いところが使いやすく、さらに左右にロータリーエンコーダや大画面OLEDを備える楽しさもあり、非常に満足度の高いキーボードでした。 後述のyacc46も、このKyriaからの影響を多大に受けています。

ちなみにこの頃、 Sassa95さん作の理系キーキャップ を購入し、Artisanキーキャップ沼にも足を突っ込みました。 電子部品かわいいです。

さらに、キースイッチのルブにも挑戦しました。 きっかけはKyriaに使用したGateron Ink Silent Blackスイッチで、サイレントスイッチによくあるという軸のカサつきが少し気になったことでしたが、 ルブしたスイッチの感触に慣れてしまった今ではもうルブしていないスイッチでは満足できなくなってしまいました。恐ろしい……

f:id:f1p038:20201208215939j:plain
遊舎工房ルブステーション

Nomu30 (7月)

Nomu30 (Gateron赤軸, DSAキーキャップ)

ちっちゃい!かわいい!

しかし、親指酷使配列・40%に慣れきってしまったため、まだ使いこなせていません。いつかちゃんと使ってみたい。

SU120でプロトタイピング (8月)

f:id:f1p038:20201208002937j:plain
SU120で作ったyacc46プロトタイプRev.1 (MDA ORTHO VoID)

Kyriaの使い勝手がいいので、これと似たキーボードをもう1台組み立てるか、または自分で設計するかして家と職場にそれぞれ置いておきたいなと考える時期がしばらく続いていました。 そんなある日、唐突にキーボード設計したい欲が高まり、1キーごとの基板をビスケットで接続することで自由な配列を作ることができるキーボード基板SU120を入手しました。

キーボード設計のコンセプトとしては、気に入っていたKyriaの代わりとして使える、より自分好みのものを作ろうという考えのもと、

  • 指の可動域に合わせたColumn-Staggered配列
  • 親指キーは指を伸ばさなくても押しやすいようにT字に配置
  • ロータリーエンコーダを左右に1つずつ配置したい
  • 小指の付け根キーが少し気になっていたので試す

といった要件をもとにキー配置を考えました。

まずはSU120基板が届くまでに、DUMANGキーボードでキーを並べてみて検討。 このとき小指列に傾きをつけるアイディアを思いつき、SU120でのプロトタイピングに反映することができました。

SU120基板が届いたら組み立て。 少し凝ったキー配列のためにビスケットで固定する箇所が多く、固定に使用するM1.4ネジが小さいことも合わさり大変でした。 しかし、組み立て後はちゃんとQMKが乗ったキーボードを使いながら自作配列の評価ができ、さらにキー配置の変更もできることで、評価と改良のサイクルを効率よく回していくことができました。

f:id:f1p038:20201208211901j:plain
プロトタイプRev.2。ProMicroの位置を変えて、一体型のようにも使えるようにした。

f:id:f1p038:20201208211955j:plain
プロトタイプRev.3。親指を近づけた。

f:id:f1p038:20201208212049j:plain
プロトタイプRev.4。薬指列も少し傾きをつけ、外側の小指の付け根キーを外して、代わりに中央にArtisan置き場を追加

ちなみに、SU120ではボトムプレートがないため、一般的なサンドイッチケースのキーボードと比べて少し背が低くなります。 これを補正して少しでもサンドイッチケースの使用感に近づけるため、百均のカラーボード(5mm厚)をキーボード下に敷いて高さをかさ増しするという方法を取りました。

この頃、BOXXX KEYCAPさんの All about youth を購入。これをきっかけに、キーボード中央にArtisan置き場を設けました。

yacc46 (10月)

f:id:f1p038:20201208002625j:plain
yacc46 v0.2 (OA Switch, Susuwatari)

SU120で作ったプロトタイプの使用感におおよそ満足したところで、KiCadを使ってキーボード設計に取り掛かりました。

基板に起こす際の追加コンセプトとしては、

  • 持ち運ぶことも考えて、一体型キーボードとして作る
  • 指ごとに傾きをつけつつ、小指列をまっすぐ配置することで、分割キーボードのように肩を開いて打鍵できるようにしつつ、見た目の良さにもこだわる
  • 大画面OLEDを中央に配置
  • なんかカッコ良さそうだったから一体型・ロータリーエンコーダ2基・OLEDを実現するためにはProMicroではピン数が足りなかったため4MCU直付けに挑戦する
  • ついでにUSBにも、使いやすいType-Cを使用

という感じで、初めてのキーボード設計にしては色々と欲張ってみました。

プリント基板設計の経験はなかったため、例に漏れずfoostanさんの『自作キーボード設計入門』でKiCadの使い方を学びました。

booth.pm

しかし今回設計するキーボードはProMicro不使用、MCU直付けのもので、ProMicroに相当する回路も自分で起こす必要がありました。 一応ProMicroの回路図が公開されていたり、キーボード設計先駆者のみなさんがGitHubに公開してくれているKiCadプロジェクトや回路図を参考にすることができましたが、それでもそれぞれ回路設計が違い、どれが正しいのか(あるいは多少設計が違っても動くのか)の判断が難しく、回路設計の段階から苦戦しました。

回路設計後の配線作業も、ベストプラクティスを知らないため大変でした。 まずパーツ配置と基板外形の作成に時間を溶かし、配線が必要な箇所が多くてどこから手をつければいいやら、なんとなくパターンを繋いでいたら配線が横断できない箇所が出てくるやら…… 最終的に完成した基板データを発注した後も、基板が届き、実際に組み立ててみて動くことを確認するまではずっと不安でした。

基板データをELECROWに発注し、部品は遊舎工房や秋月電子・マルツの通販で集め、プレートは近所のFabでアクリルをレーザーカットしてもらうことで準備しました。 そうして集めた部品を組み立て、最終的に完成した自設計キーボードが動いたときの達成感は筆舌に尽くしがたいものでした。

ちなみに最初発注した基板では、OLEDのパターンを裏表逆に配置してしまったためにOLEDを取り付けられませんでした。上の写真は修正後再度発注した基板のものです。

このキーボードには「yacc46」(やっくよんじゅうろく)という名前を付けました。 "Yet Another Complex-Column-Staggered Keyboard"の頭文字を取っています。 指ごとに角度をつけたColumn-Staggered配列ということで"Complex-Column-Staggered"という名前を作ってみましたがちょっと微妙だったかも?まあ「やっく」の語感がいいのでよしとします。

そのうち紹介記事を書いたり、試しに販売したりもしたいです。

この1年間について思い出しながら書いていたら、時刻はアドベントカレンダー担当日前日の23時、文字数は1万字弱にまで膨れ上がりました。長々とすみません。

しかし、今まであまりQiitaなどに記事を書くこともせず、ブログもやってこなかった自分が、アドベントカレンダーに参加して記事を書くまでにのめり込んだ趣味は自作キーボードが初めてです。 ものづくりの楽しさ、普段使いの道具に直結する実用性、様々な方向からの創作と、この沼はとても広く、とても深いものです。 無限にお金と時間が吸われそうで怖くもありますが、それ以上に長く楽しめそうです。

来年ですが、まずはyacc46をよりブラッシュアップしたいと思います。 特にサンドイッチ以外のケースを試してみたいですね。 アクリル積層、3Dプリント、はたまたアルミ削り出し……?


この記事は、yacc46 (OA Switch + 78p/72p/68pスプリング + Krytox GPL 105/205g0, Susuwatari) で書きました。


  1. ただこの時点でも、日本語入力にAZIKを使っていたりと、文字入力についてはちょっと興味はあったと思います。

  2. ちょうどこの頃、遊舎工房ほか数店舗でDUMANGキーボードの販売が行われていましたが、私は買い逃したのでSeeedから買いました。

  3. AliExpress使っていながら何を怖がってるんだって感じですが。

  4. Duplex Matrixを使用することで、ProMicroでもギリギリピン数が足りることが後々わかりました。