Respect Blog リスペクトブログ

マーケティング・コンサルティング・サイト制作
ITベンチャー企業の社員がノウハウや
仕事の試みを毎週綴ります

最高のキーボードを更に最高にしてみる話

こんにちは、以前のブログ記事、「社内コミュニティ?「隠れ家カフェ3110」のロゴデザインをしてみた」で紹介されたカフェを運営しているエンジニアリング部システムマネジメント課の3110です。

 

突然ですが、キーボードってこだわってますか?

僕はこだわっています。こだわりが過ぎてキーボードのキットを買って作ったり、既成品を改造したりするまでになってしまいました。

今回は現時点でメインで使っているキーボードを更に良くするために試行錯誤した記録を書きなぐってみたいと思います。

 

 

道具としてのキーボード

キーボードはPCと人間をつなぐインターフェイスの一つです。

人によってキーボードに触れる時間は千差万別ですが、Webプログラマである僕の場合、オンオフ問わずかなりの時間触る道具です。

こだわりの無い人もいると思いますが、個人的には使うキーボードでテンション変わったりするのでこだわっています。

海外のキーボード沼の中の人たちは自身の最高のキーボード見つけることを”end game”っていうらしいです。

今回は今使っているキーボードの不満点を解消して、”end game”を目指していきたいと思います。

 

【注意】

これから紹介するパーツの購入・改造などを行う場合は自己責任でお願いいたします。

販売サイトでのトラブル及び改造によるキーボードの不具合などについて、弊社では一切の責任を負いません。

 

個人的最高のキーボード

今現在メインで使っているキーボードはHHKB Professional2 墨です。

結構有名な静電容量無接点方式コンパクトキーボードの一つですね。

PFUが販売していますがスイッチ部分などはRealforceでお馴染みの東プレ製です。

最近流行していることもあり、自作キーボード(helix / TEX Yoda IIなど)を作ったりしたのですが、Cherry系のスイッチと比べるとやっぱり静電容量無接点のキータッチが好きで戻ってきてしまいます。

 

そんなHHKBのメリット・デメリットをまとめてみます。

 

メリット

DIPスイッチ

HHKBはDIPスイッチを切り替えることでWindowsとMacの両方で使えます。

社内の開発環境はWindowsなのですが、家ではMacがメインなので同じキー配列のキーボードを双方で使えるかどうかは重要です。

 

コンパクト

筐体がコンパクトなのでマウスまでの距離が短く、腕の移動が少なくてすむので疲れにくいです。

また、比較的軽いので持ち運べます。

 

静電容量無接点キー

一般的なキーボードのキースイッチは構造に差はあるものの、基本的には電極端子の接触によりスイッチングを行う方式が多いです。

静電容量無接点方式に電極はなく、キーの下にある円錐バネが押し下げられることによる電荷の容量変化を元にスイッチングを行うため、チャタリングが起きにくく高寿命という特徴があります。

また、コトコトという独特のタイプ音や打鍵感が病みつきになります。

 

デメリット

基本的には大満足のキーボードなのですが、少しだけ不満なところもあります。

 

DIPスイッチ

まず、DIPスイッチによるキー入れ替え。

メリットに書いたようにこれがないと困るんですがWindowsとMacを行ったり来たりするときに都度切り替えるのは地味に面倒です。

DIPスイッチは小さくて結構数もあるので、どれをONにしてどれをOFFにするのかを調整するのがだんだん面倒になってきます。

 

Type-Sがない

HHKB Professional2 にはType-Sという上位機種が存在します。

これは打鍵音を静かにするために緩衝材が追加されており、キーストロークも0.2mm従来のものより短くなっています。

そのため高速打鍵と静音が売りの機種なのですが、色が白しか無いんです。

HHKBの白は経年劣化で色が黄色くなってきます。

それが嫌で墨にしたのですが墨にはType-Sがない…

 

押下圧

HHKBの押下圧は45gとなっているのですが、同じ押下圧のRealforce hi-pro 104のほうが軽く感じます。

hi-proの場合キーキャップが大きめなので、キーキャップ自身の重さで若干軽く感じるのかもしれませんが個人的にはもう少し軽いと嬉しい…

 

HappyHackingできない

HappyHackingKeyboardという名前なのですが、キーボード自体はあまりHackingできません。

DIPスイッチでのキー入れ替えも限定的ですし、キーキャップもCherryに代表されるメカニカルキースイッチ用のものとは互換性がなく選択肢がほぼ無いです。

昨今の自作キーボードブームでPro Microをコントローラーにしているキーボードなんかを見るとキー配列を自分でいじくり回せます。

 

羨ましい…

 

なんとかならないか調べる

これらの問題を解消できればかなり満足度の高いキーボードができそうです。

HHKBを改造できないかいろいろ調べた結果、今回は下記を使って改造していくことにします。

 

HHKB alt Controller

まずHHKBをHappyにHackingできるようにするコントローラーです。

 

HHKB alt Controller

これは公式のコントローラーではできなかったキー配列のカスタマイズを可能にするサードパーティ製コントローラーです。

 

個人の方が開発・販売しているものでBluetooth版とUSB版があるのですが、個人的にBluetoothのキーボードがあまり好きではないのでUSB版を買うことにしました。

通販サイトのようなものはないので作者の方にコントローラーがほしい旨とコントローラータイプ・PayPalアカウントをメールするとPayPalに請求が来るので支払いをします。

PayPalの住所宛に送ってくれるので住所に間違いがないかどうかよく確認してください。

 

押下圧・Type-S化

静電容量無接点方式の押下圧は円錐バネの硬さとそれを覆うラバーカップの硬さで決まります。

 

HHKBは45g固定ですがRealforceだと30g・45g・55gとバリエーションがあります。

好みの重さのRealforceをばらしてバネとラバーカップを移植することも可能ですが、Realforceはかなり高額です。改造のために部品取り用にするのは気が引けます…

ということでこれもサードパーティに頼ります。

 

KYECLACK

ここでサードパーティ製のラバーカップを購入できます。

今回は45gよりも軽くしたかったので35g(BKE Redux Ultra Light)のものを選びました。

 

Type-S化については様々な手法が編み出されており、よく見かけるのが歯科用顎間ゴムを利用する方法でした。

ただ、公式のType-Sだとキーストロークが0.2mmだけ短くなっています。顎間ゴムを使うと結構キーストロークが変わってしまいそう…という懸念があり0.2mmの緩衝材買って切り出すかどうか考えていましたが先程のサイトでどうやらシートを切り出したタイプの静音化パーツも売っている…しかもラバーカップとセットで…

ということでセットになっているものを購入しました。

 

BKE Redux Topre Domes

こちらのページの “BKE Redux Ultra Light 70 Domes w/ Silencing Rings”が35gのラバーカップと静音化パーツのセットです。

 

これで現状不満に思っていた部分の解消ができそうです。

 

USBケーブル

海外のユーザーの写真やら動画やらを見ていると、おしゃれなUSBケーブル使ってたりして羨ましかったので探してみると、ケーブルをオーダーできるサイトを見つけました。

Pexon PCs

ケーブルの色やカールの有無、端子の種類などもカスタムできるようなのでキーボードに限らずオリジナルなUSBケーブルを探している方はオーダーしてみるといいかもしれません。

 

改造手順

コントローラーは割と早く届いたのですが、ラバーカップのほうが到着まで2週間位かかりました。サンフランシスコあたりで結構長いことウロウロしてたみたいです。

 

とりあえず到着したパーツたちがこちら。

こんな感じの梱包でした。

 

ラバーカップの方はサイズが大きすぎたのか折り畳まれていました。

 

コントローラーはこんな感じ。

コントローラーの換装は既存のものと差し替えるだけで簡単なので、先に静音化の方から進めていきます。

 

静音化

静音化するにはキーの軸を外すところまで分解する必要があるので、はずせるパーツを外していきます。

本体裏のネジを3箇所外します。

 

外すとコントローラーからカラフルなケーブルが伸びているのでソケットから引っこ抜きます。

これが結構きつい場合があるのでラジオペンチなどを使って抜くといいと思います。

 

そしてキーキャップを外していきます。

各列ごとにキーの形が違うため間違いなく戻せるように最低限列ごとにまとめて並べておきます。

 

ひっくり返して基盤を止めているネジを外していきます。

 

外すとこんな感じになります。

 

キーの軸を外していきます。

外すところの写真撮り忘れましたが、表からちょっと力を入れて押すと外れます。

このとき少し部品が欠けるのですが回避方法はありません。特に動作に不具合が出るところではないので心配しなくても大丈夫です。

軸を外したらピンセット使ってゴムシートを貼っていきます。

 

こいつがゴムシート。

裏側が白くなっているのは両面テープの剥離シートが貼ってあるためです。

 

一つ一つ剥離シートを剥がして貼っていきます。

貼り付ける場所に指が届かないのでピンセットが必須です。

 

普段全く肩こりを感じたことはないのですが、この作業で肩と首に痛みを感じ、これが肩こりなのか…と思いつつシートの貼り付けを進めました。

貼り付け終わったらキーの軸を戻します。

 

押下圧変更

ラバーカップを既存のものと置き換えていきます。

既存のラバーカップはいくつかまとまったシートになっていて、基盤に張り付いている場合があるのでそれを一旦剥がします。

これが円錐ばね。

失くすと大惨事なのでなくさないように注意しながら作業してください。

 

そして買ったサードパーティ製のラバーカップを置いていくのですが、このときなるべくシートが曲がってないものを選んで置いていきます。

海外から送られてくるときに包装が折り曲げられていたので、変な癖がついてるシートがありました。

また、シート同士が重なると動作不良の原因になるので、重ならないように注意しながら作業を進めます。

ラバーカップの中に円錐ばねを入れるのをお忘れなく。

右側が純正で左側がサードパーティ製のものです。

これを一つ一つ並べていきます。

 

できた…

 

シートが重ならないように注意しつつ基盤をネジ止めしていきます。

ここで一度オリジナルのコントローラーにつないで動作確認をしてください。

 

もし、入力できないキーがある場合は、ラバーカップと円錐ゴムの位置がずれている可能性があるので、もう一度分解して位置の調整が必要です。

僕はかなりここ苦戦しました…

 

コントローラー換装

すべてのキーが正常に入力できることが確認できたら、コントローラーの差し替えを行います。

これは虹色のケーブルを刺すだけで完了します。

そしてここでもコントローラーが正常に動いているかどうか確認するために、一旦USBでつないで正しく入力できるか確認してください。

 

正常に入力できることが確認できたら組み直して改造は終了です。

お疲れ様でした。

 

ちなみにここまで4時間かかりました。

 

USBハブの機能はなくなるため、USBポート部分はただの穴になっちゃいます。

気になる方は有志の方が作ってくれたキャップデータがあるので、3Dプリントすると幸せになれるかと思います。

egladman/hhkb-usb-cover

 

キーマップを変更する

ハードウェア部分の改造は完了しました。

しかし、キーマップはまだデフォルトのままです。キーマップを自分で好きなように変更できる環境になったので早速こちらもカスタマイズしていきます。

 

Quantum Mechanical Keyboard Firmware

HHKB alt Controllerの作者の方がキーボードの汎用ファームウェア(TMK Keyboard Firmware Collection)を開発してくれており、そちらを使うのが標準なのですが今回はこのファームウェアを元に発展させたQuantum Mechanical Keyboard Firmware (QMK)というファームウェアを使ってキーマップを変更していきます。

 

なぜ標準でないファームウェアを使うのかというと、helixを作ったときにすでにビルド環

境があったためそのまま使えたという理由からです。

 

Alternative Controller for HHKBのススメ

こちらの記事にかなり詳しい解説があるので、この記事ではファームウェアビルドの環境構築や実際のビルド方法などの解説は省きます。

 

ただ、現在のバージョンのQMKでファームウェア書き込みの際のコマンドが変更になっているようなので注意してください。

https://docs.qmk.fm/#/newbs_flashing?id=dfu

 

make <yourkeyboard>:<yourkeymap>:dfu

 

区切り文字が”:”に変更になってました。

 

現状のキーマップ

/*  -*-  eval: (turn-on-orgtbl); -*-
 * default HHKB Layout
 */
#include QMK_KEYBOARD_H
 
#define MAC 0
#define WIN 1
#define HHKB 2
 
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    
    /* BASE Level: Default Layer
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Esc   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | -     | =   | \     | ` |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Tab   | Q | W | E | R | T | Y | U | I | O | P | [     | ]   | Backs |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Cont  | A | S | D | F | G | H | J | K | L | ; | '     | Ent |       |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 |       |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     
     |------+------+-----------------------+------+------|
     | LAlt | LGUI | ******* Space ******* | RGUI | RAlt |
     |------+------+-----------------------+------+------|
     */
    
    [MAC] = LAYOUT( //  default layer
                    KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
                    KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
                    KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
                    KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB),
                    KC_LALT, LGUI_T(KC_LANG2), /*        */ KC_SPC, RGUI_T(KC_LANG1), KC_RALT),
    
    /* Layer WIN: Windows mode
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Esc   | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | -     | =   | \     | ` |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Tab   | Q | W | E | R | T | Y | U | I | O | P | [     | ]   | Backs |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Cont  | A | S | D | F | G | H | J | K | L | ; | '     | Ent |       |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     | Shift | Z | X | C | V | B | N | M | , | . | / | Shift | Fn0 |       |   |
     |-------+---+---+---+---+---+---+---+---+---+---+-------+-----+-------+---|
     
     |------+------+-----------------------+------+------|
     | LGUI | LAlt | ******* Space ******* | RAlt | RGUI |
     |------+------+-----------------------+------+------|
     */
    
    [WIN] = LAYOUT( //  Windows layer
                    KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_GRV,
                    KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC,
                    KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
                    KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(HHKB),
                    KC_LGUI, KC_LALT, /*        */ KC_SPC, KC_RALT, KC_RGUI),
    
    /* Layer HHKB: HHKB mode (HHKB Fn)
     |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
     | Pwr  | F1  | F2  | F3  | F4 | F5 | F6 | F7 | F8  | F9  | F10 | F11 | F12   | Ins   | Del |
     |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
     | Caps |     |     |     |    |    |    |    | Psc | Slk | Pus | Up  |       | Backs |     |
     |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
     |      | VoD | VoU | Mut |    |    | *  | /  | Hom | PgU | Lef | Rig | Enter |       |     |
     |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
     |      |     |     |     |    |    | +  | -  | End | PgD | Dow |     |       |       |     |
     |------+-----+-----+-----+----+----+----+----+-----+-----+-----+-----+-------+-------+-----|
     
     |------+------+----------------------+------+------+
     | **** | **** | ******************** | **** | **** |
     |------+------+----------------------+------+------+
     
     */
    
    [HHKB] = LAYOUT(
                    KC_PWR, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL,
                    KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, KC_TRNS, KC_BSPC,
                    KC_TRNS, KC_VOLD, KC_VOLU, KC_MUTE, KC_TRNS, KC_TRNS, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, KC_PENT,
                    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, KC_TRNS, KC_TRNS,
                    KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)};
 
const uint16_t PROGMEM fn_actions[] = {
    
};
 
const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
{
    // MACRODOWN only works in this function
    switch (id)
    {
        case 0:
            if (record->event.pressed)
            {
                register_code(KC_RSFT);
            }
            else
            {
                unregister_code(KC_RSFT);
            }
            break;
    }
    return MACRO_NONE;
};

 

まとめ

実際に改造したHHKBを使ってこの記事を書きました。

 

押下圧はセブンATMのテンキーより少し重いくらいになり、打鍵音も前ほどうるさくなくなりました。シリコンスプレーを軸に吹き付けると更に静かになりますが、これをするかどうかはお好みで。

 

不満に思っていた部分はほぼ解消できたので、だいぶ”end game”に近い物になったのではないかと思います。

自作キーボードほどの自由度はありませんが、その気になれば既成品でもいろいろ手を加えることができます。

既成品だからと諦めないで思い切って改造して、自分好みのキーボードにしてみるのもいいのではないでしょうか。