FalbaTech製ErgoDoxを使ってみた

ergodox_ogp_v3

この記事はEureka Advent Calendar 2016 4日目の記事です。

前回は木村さんのCarthageのcopy-frameworkをスキップして開発時のビルドを高速化するでした!


こんにちは、pairs開発メンバーの竹内です!

前回まで技術寄りの話を書いていた僕ですが、今回は少し方向性を変えまして自分の使っている作業環境の一部である”ErgoDox”と呼ばれるキーボードについて語ろうと思います。

tl;dr

  • ErgoDoxで肩こりが治った
  • FalbaTechからオレオレErgoDoxを購入できて最高だった
  • キー配列もDockerfileでらくらく変更できた

What’s ErgoDox

ErgoDoxとは、Dox氏(Dominic Beauchamp氏)らによって作られた、DIYキーボードのための設計図・ファームウェアなどをまとめたものの総称です。
 
人間工学という意味の”Ergonomics”と、作者の名前をくっつけた”ErgoDox”という名前を冠している通り、使っていて疲れにくく、楽な姿勢で使用できる素敵なキーボードです。大体以下のような3つの特徴があります。

#1 左手用と右手用とでキーボードが別れるセパレート式になっている

ErgoDoxは左手用・右手用の2つのキーボードをケーブルで繋いだ形を取っています。ケーブルの届く範囲内であれば左右のキーボードの位置を調整することができるため、胸を張った楽な姿勢のままタイピングが可能です。

#2 独特のキー配列

ergodox_keylayout

ErgoDoxは、親指の真下にあたる位置に6つのキーを持つ特徴的なキー配列をしています。この親指のキーに最も使用頻度の高いキー(EmacsユーザーであればCtrlキー、XmonadユーザーならばMetaキーなど)を配置することで、小指が頸髄炎になることもなく骨の太い親指の仕事を増やして指全体に負荷を上手く分散できる作りとなっています。

#3 オープンソース

ErgoDox自体が他のオープンソースコンテンツであるkey64の改良型であるように、ErgoDoxもファームウェア及びハードウェアの設計図が公開されているプロジェクトです。
 
キー配列の変更やマクロの設定、もしくは新たな機能を追加したくなったら、GitHubで公開されているファームウェアをforkしてしまえば大抵のカスタマイズはできてしまいます。

ErgoDoxを手に入れるまで ~FalbaTech編~

ErgoDoxは完成品や必要なパーツを全てまとめたキットとしても販売されており、以下の海外のサイトなどから取り寄せることで入手することができます。

サイト名 URL 備考
ErgoDox EZ https://ergodox-ez.com/ ErgoDoxの完成品である”ErgoDox EZ”を製造・販売するウェブサイト FalbaTechのものよりも品質が良いらしく、最も人気があるように思えます。
FalbaTech http://falbatech.pl/ ErgoDoxのPCB基盤・ケース等の販売や組み立てサービスまで行っているポーランドのウェブサイト 完成品のErgoDox EZよりも品質が落ちると聞きますが、自分の好みに合わせてパーツを組み合わせできます。
MassDrop https://www.massdrop.com/ ErgoDoxの組み立てキット”Infinity ErgoDox”が販売されている共同購入サイト 組み立てキットですが、液晶モジュールの付いた独特なモデルを購入できます。

この中ではErgoDox EZがもっとも入手しやすく人気のようですが、ここでは一例として僕が利用したFalbaTechでの購入方法について書こうと思います:)

falba_tech

FalbaTechでは、複数の中から自分好みのケース・電子パーツ・キースイッチ・収納用ポーチ等を選択した上で、組み立てを依頼することができます。
 
例えば、自分の選んだ通りにパーツを組むとすると以下のような形になります。

パーツ名 価格 備考
Ergodox Acrylic Standard Case – Carbon Foil 40.00€ カーボンケース
SMD DIode 15.00€ 表面実装用ダイオードやケーブル等の電子パーツキット
Teensy 2.0 USB Development Board 22.00€ Arduino互換マイコンボード
ErgoDox PCB Set – New quality 25.00€ PCB基盤 x2(左右用)
Acrylic Plate Standard or Fullhand (Cherry MX, Gateron, Greetech) 76-Key – Acrylic Only 15.00€ キースイッチを固定するアクリル製プレート
Greetech MX – Red 80 pcs 44.50€ 赤軸キースイッチ80ピース(76ピースが売り切れていたため80ピースで購入、余りのキースイッチは袋に梱包されて送られて来ます)
Full assembly of a keyboard – Service 25.50€ 組み立てオーダー
Alicante Light Grey (with Drawstring Closure) 16.00€ 収納用ポーチ
送料 80.00€
合計 283.0€

この表を見ると分かる通り、キースイッチに被せるキートップは別売り1なので、スイッチの規格(Cherry MX)に合った規格のキートップを別で購入する必要があります。

 
Cherry MX準拠のキートップは日本国内の通販でも購入できますが、ErgoDoxでは通常のキーボードではあまり見られない1.5xサイズのキートップが多数必要になります。これに関しては1.5xサイズのキートップを単品で必要なだけ買うと言った方法もありますが、こちらのサイトErgodox Modifier Setでいっぺんに揃うので確実です。
 
ちなみにですが、配達業者でUSPSを選ぶと荷物追跡がカオスなことになったり配送に2週間ぐらいかかるので、直ぐに受け取りたかったり確実に受け取りたいのであれば他の配達業者を選ぶ方が良いでしょう。

ErgoDoxキー配列をカスタマイズする

ErgoDoxが自宅に届き、いざ使ってみるとびっくりするほどにキー配列が分からず、キーを見ながらタイピングすることもままなりませんでした。
 
特に、FalbaTechから送られて来た直後のErgoDoxのキー配列は一般的なErgoDox EZの配列とも異なるものなので、すぐに自分好みの配列に変更することをオススメします。自分でキー配列を変更すると頭に残り、キー配列も覚えられて一石二鳥です!
 
以下で、簡単にErgoDoxのキー配列を変更する方法を書いておきます。

キー配列を書き換える

ErgoDoxの大本のファームウェアはこちらのbenblazak/ergodox-firmwareで公開されているものですが、一般的によく使用されていて、ドキュメントも整備されているqmk_firmwareのファームウェアを使用しましょう。
 
まずは、自分のPCにファームウェアをcloneします。

mkdir ~/keyboard && cd ~/keyboard
git clone git@github.com:jackhumbert/qmk_firmware.git

ErgoDox向けのキーマップはqmk_firmware/keyboards/ergodox/keymaps以下に配置されているので、defaultフォルダをコピーして自分用のキーマップフォルダを用意しましょう。

cd qmk_firmware/keyboards/ergodox/keymaps
cp -r default my-keymap

自分用のフォルダを用意して、qmk_firmware/keyboards/ergodox/my-keymap/keymap.cを編集すればキーマップが変更できてしまいます!

vim my-keymap/keymp.c

試しに、Aキーの左側にあるキーをCtrlキーにアサインしてみましょう。

以下のようなコードが見つかるはずです。

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Keymap 0: Basic layer
 *
 * ,--------------------------------------------------.           ,--------------------------------------------------.
 * |   =    |   1  |   2  |   3  |   4  |   5  | LEFT |           | RIGHT|   6  |   7  |   8  |   9  |   0  |   -    |
 * |--------+------+------+------+------+-------------|           |------+------+------+------+------+------+--------|
 * | Del    |   Q  |   W  |   E  |   R  |   T  |  L1  |           |  L1  |   Y  |   U  |   I  |   O  |   P  |   \    |
 * |--------+------+------+------+------+------|      |           |      |------+------+------+------+------+--------|
 * | BkSp   |   A  |   S  |   D  |   F  |   G  |------|           |------|   H  |   J  |   K  |   L  |; / L2|' / Cmd |
 * |--------+------+------+------+------+------| Hyper|           | Meh  |------+------+------+------+------+--------|
 * | LShift |Z/Ctrl|   X  |   C  |   V  |   B  |      |           |      |   N  |   M  |   ,  |   .  |//Ctrl| RShift |
 * `--------+------+------+------+------+-------------'           `-------------+------+------+------+------+--------'
 *   |Grv/L1|  '"  |AltShf| Left | Right|                                       |  Up  | Down |   [  |   ]  | ~L1  |
 *   `----------------------------------'                                       `----------------------------------'
 *                                        ,-------------.       ,-------------.
 *                                        | App  | LGui |       | Alt  |Ctrl/Esc|
 *                                 ,------|------|------|       |------+--------+------.
 *                                 |      |      | Home |       | PgUp |        |      |
 *                                 | Space|Backsp|------|       |------|  Tab   |Enter |
 *                                 |      |ace   | End  |       | PgDn |        |      |
 *                                 `--------------------'       `----------------------'
 */
// If it accepts an argument (i.e, is a function), it doesn't need KC_.
// Otherwise, it needs KC_*
[BASE] = KEYMAP(  // layer 0 : default
        // left hand
        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
        KC_BSPC,        KC_A,         KC_S,   KC_D,   KC_F,   KC_G,
        KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
                                              ALT_T(KC_APP),  KC_LGUI,
                                                              KC_HOME,
                                               KC_SPC,KC_BSPC,KC_END,
        // right hand
        KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
        TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
                     KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
        MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
                             KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
        KC_LALT,        CTL_T(KC_ESC),
        KC_PGUP,
        KC_PGDN,KC_TAB, KC_ENT
    ),

ErgoDoxはキーマップをレイヤーと呼ばれる単位で切り替えられるようになっていて、このコードの一行目に見えるkeymaps配列に全てのレイヤーが格納されています。
 
標準のキーマップではBASESYMBOLMEDIAの3つのレイヤーがありますが、ほとんどのキーはBASEレイヤーを元に共有されているので、今回変更するキーはBASEレイヤーの変更だけで済ませることができます。
 
さて、コメントアウトされたアスキーアートによると、Aキーの左にあるキーはBkSp(BackSpace)キーに割り当てられているようなので、アスキーアートとコードを照らし合わせて目当てのキーを変更しましょう。

[BASE] = KEYMAP(  // layer 0 : default
        // left hand
        KC_EQL,         KC_1,         KC_2,   KC_3,   KC_4,   KC_5,   KC_LEFT,
        KC_DELT,        KC_Q,         KC_W,   KC_E,   KC_R,   KC_T,   TG(SYMB),
        KC_LCTRL,       KC_A,         KC_S,   KC_D,   KC_F,   KC_G,                  // ←この行のKC_BSPCをKC_LCTRLへ変更
        KC_LSFT,        CTL_T(KC_Z),  KC_X,   KC_C,   KC_V,   KC_B,   ALL_T(KC_NO),
        LT(SYMB,KC_GRV),KC_QUOT,      LALT(KC_LSFT),  KC_LEFT,KC_RGHT,
                                              ALT_T(KC_APP),  KC_LGUI,
                                                              KC_HOME,
                                               KC_SPC,KC_BSPC,KC_END,
        // right hand
        KC_RGHT,     KC_6,   KC_7,   KC_8,   KC_9,   KC_0,             KC_MINS,
        TG(SYMB),    KC_Y,   KC_U,   KC_I,   KC_O,   KC_P,             KC_BSLS,
                     KC_H,   KC_J,   KC_K,   KC_L,   LT(MDIA, KC_SCLN),GUI_T(KC_QUOT),
        MEH_T(KC_NO),KC_N,   KC_M,   KC_COMM,KC_DOT, CTL_T(KC_SLSH),   KC_RSFT,
                             KC_UP,  KC_DOWN,KC_LBRC,KC_RBRC,          KC_FN1,
        KC_LALT,        CTL_T(KC_ESC),
        KC_PGUP,
        KC_PGDN,KC_TAB, KC_ENT
    ),

ErgoDoxに書き込む

キーバインドの変更ができたら、ErgoDoxに書き込む前にコンパイルします。自分でビルド環境を用意するのは大変ですが、Dockerコンテナが用意されているのでこれを使ってビルドしてしまうとラクチンです!

cd ~/keyboard/qmk_firmware
docker run -e keymap=my-keymap -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw jackhumbert/qmk_firmware

qmk_firmwareフォルダ直下にergodox_ez_my-keymap.hexファイルが生成されていればビルドは成功しています。
 
続けてこのファイルをErgoDoxへ書き込みますが、その前に書き込みに必要なTeensy-Loaderをインストールする必要があります。
 
こちらのThe Teensy Loader Applicationから自分の環境に合ったものをインストールして立ち上げると、以下の画面が現れます。

teensy_loader

画面の指示に有るように、書き込む前にErgoDoxに使われているTeensyのボタンを押す必要があります。選択したケースにもよりますが、大体写真の位置に穴が空いているので楊枝などで押してしまえばOKです。

ergodox_reboot_button

ボタンを押したら、後はTeensy-LoaderのAUTOボタンを押せば書き込みが完了し、ErgoDoxが再起動されます。変更したキーが反映されていれば、書き込み完了です;)


以上でBackSpaceキーをCtrlキーに変更する手順を紹介しましたが、他のキーを変更する場合などは公式のREADMEを読むか、ReSTARTRさんのErgoDoxのキーマップをいじる時に見るチートシートがよくまとまっていて役に立つかと思います。
 
一度書き込めれば、後は使う→気に入らない配列が見つかる→直すの繰り返しでどんどん改良していけるので、自分の理想のキー配列を求めて変更して行きましょう!
 
また、まだまだ使用を始めてから日が浅いので洗礼されたキー配置とは言い難いですが、こちらに僕のキー配列を置いておきますので参考にしてください🙇
 
最後に、2週間ほどErgoDoxを使って得た所感を語ろうかと思います。

ErgoDoxに関する所感

僕が使ってきた上でのErgoDoxの良い部分・気に入らない部分としては、大体以下の点があります。

良い点

  • 使い始める前と比べるとかなり肩こりが改善され、マッサージチェアなどを使うことがなくなった(前は3日に一回程度使用しないとバッキバキの状態でした…)
  • アイデア次第でキー配列をどんどん改良できるので、長い間使っていたUS配列を見つめ直す良い機会になった
  • 自分好みのデザインのキーボードを購入できるので、コーディングが更に楽しくなった

悪い点

  • ErgoDoxに慣れれば慣れるほど他のキーボードに不慣れになり、常にErgoDoxを持ち運ばなければならなくなった(写真は登壇時の様子)
    ergodox_presentation
  • 前に使っていたHHKB Professional BTと比べると、どうしても打鍵感に不満が残る

良い点のなかでも肩こりが減ったことによる恩恵が特に大きく、一日中キーボードを打って生活していても肩こりが気にならなくなったのは本当に素晴らしいの一言です。もともと運動不足気味なので何か定期的に運動しないと治らないかも…と考えていましたが、お陰で更にインドアの道を進めそうです(?)
 
打鍵感については、いつかこちらの記事のようにHHKBと同じスイッチにできれば最高ですが、ハードウェアには疎いのでかなり先になってしまいそうです☻


というところで、明日はAnalyzeチームの鉄本さんの記事です!お楽しみに!

Thanks

登壇中の写真は、Advent Calendar1日目のエウレカに転職してみたぞ!を担当していた弊社撮影スタッフの加我が撮影してくれました;)


  1. 購入当初は扱われていませんでしたが、執筆時(2016/12/04)には黒色のキートップ一種類を選択できるようになっていました。 
  • このエントリーをはてなブックマークに追加

エウレカでは、一緒に働いていただける方を絶賛募集中です。募集中の職種はこちらからご確認ください!皆様のエントリーをお待ちしております!

Recommend

Go言語のベンチマークでパフォーマンス測定

pairsの検索にElasticsearchを使ってみた。