QMK (4) – キーマップ改善

Date: 2022/03/15 (initial publish), 2022/09/10 (last update)

Source: jp/note-00047.md

Previous Post Top Next Post

TOC

キーマップ改善の方針 (タップとホールドの有効利用)

QMKを使うcgc56やcgg56というQMKを利用したキーボード等を使って、色々試して気づいたり考えたことを以下に記します。

QMKではタップとホールドで出力キーが違う設定できますが、タップの入力文字の連続入力がカチカチ連打だと大変な気がしていました。

実際には、一度タップ直後の再タップ時にホールドするとタップに対応する文字の長押しになるようで、OS側が連打処理してくれ使い勝手良好です。

あまり複雑なキー動作の多重化は混乱を招き使い勝手が悪くなるのですべきでは無いですが、タップとホールドを上手に使えば悪くない感じです。

キーマップ

最初にトライしたレイヤー移動とモード変更機能のすべてを親指のキーに任せるアプローチには無理がありました。

キーマップ osamu

そこで30%キーボード系のferrisのキーマップをヒントにし、「基本的に使う部分」を、左5x3_2キーと右5x3_2キーと限定し、親指はレイヤー移動のみにしたキーマップを組むのがフィジカルストレス低減によさそうです。

 │***│ Q │ W │ E │ R │ T │***│***│ Y │ U │ I │ O │ P │***│
 │***│lsA│lcS│laD│lgF│raG│***│***│raH│lgJ│laK│lcL│ls;│***│
 │***│ Z │ X │ C │ V │ B │***│***│ N │ M │ , │ . │ / │***│
 │***│***│***│***│Es3│Sp1│***│***│Sp2│En4│***│***│***│***│

ここのポイントは、人差し指〜小指のホームポジションのA行のキーに関して、通常の文字キー入力とモードキー(LSFT, LCTL, LALT, LGUI, RALT)入力を、MT()機能をタップとホールドで使い分け、両方ができるようにしています。このおかげで、アクセスのよい自然なポジションでタイプできます。

これで端のキー(特に下の角のキー)を基本使わ無くてもよくなるので、Alice配列にしなくとも、手首へのストレスが下げられています。

一番下の4つの親指キーは、LT()機能を使って、4つあるTEMPORARY LAYER選択操作に加え、12までのよくアクセスする非アルファベットキーの入力ができるようにしています。

Retro ShiftAuto Shiftを有効にしていません。

Retro Tappingも有効にしていません。これは副作用がきつい。

あとで気づいたのですが、A guide to home row modsはこの手の設定が上手く説明されていました。

Thumb(親指)キーで押している際に1時的に有効化する一時レイヤーは実質2つで、横3列の30物理キーで90のキーがカバーできます。MT()機能を上手につかえばThumbキーは2つでもレイヤー実現に充分です。ただ、押しやすさと、LT()に加えMT()まで使うのを避けるために、各レイヤーを左右別にして4レイヤーとして打ちやすくレスポンスよくしています。

上記で触れた1時レイヤー以外に、レイヤー移動後固定される固定レイヤーが4つあり、カーソル・テンキー・マウスキー・キーボード自体の設定レイヤーとなります。

上記では分かり易い様に、cgc56上の「基本的に使う部分」以外のキーの説明を省略しました。もちろんこれらも使えるようになっています。

こうしてできたキーマップの詳細の最新の状況は、私の以下のQMKソースを参照:

これらは通常キーボードからの移行によく配慮されていてなかなか良い感じです。ただほとんど使わないキーがある一方で、特に片手マウスでのカーソール関連への少々アクセスが面倒でした。

キーマップ wide

そこで、上記のデーターはそのままで、別に左右のアルファベットの間隔を更に広げ、カーソールキーに真ん中で直接アクセスできるようにし簡素化を考えました。

キーマップwideを用意しました。

cgc56:wide BL1, FL2/FL3 in QWERTY)

キーマップ中の左上文字がFn1~F4の何れも押さない場合、右下文字がFn1かF2のいずれかが押された場合に入力されます。

キーマップ mini

その後wideを使ってみて、ちょっと真ん中のキーにアクセスしにくいのが気になりました。

レイヤー数を減らしたかったので、更に簡素化したキーマップminiを用意しました。

cgc56:mini BL1, FL2/FL3 in QWERTY)

30%系のキーマップはとにかくホームからほとんど手が動かないので悪くないです。ただ、タップをする際にはキーを意識的に離す必要があります。

(FnレイヤーでのMODEキーが交差打鍵必須の時には、片手打ち不可の問題がありましたが、FnレイヤーもMOD-TAP化したので、その問題はほぼ解消しました。)

キーマップ micro

その後miniを使ってみて、普通のキーボードに戻った際にリターン等で違和感がありました。

全ての指のポジション移動量を1U以下に押さえて、普通のキーボードに近いキーマップmicroを用意しました。

cgc56:micro BL1, FL2/FL3)

小指は使いますが、普通のキーボードとの親和性も良い感じのキーマップになりました。

CORNEタイプやHELIXタイプの分割キーボードとの親和性も良い感じのキーマップです。

「QWFRTY」配列は、普通のキーボードに戻った際の違和感がありメリットを感じなかったので、「QWFRTY」配列レイヤーは削除しました。

これで、メンタルストレスは総合的に一番なく、また指への物理負担もないレイアウトができたかなと思いました。

キーマップ pico

後述の方法で普通のノートパソコンでほぼ一緒のキー配置を考えるのにはスペース付近のキー使用がいまいちです。

そこで全ての指のポジション移動量を1U以下に押さえて、親指は左右にも動かさないスペースのみのキーマップpicoを用意しました。

ポイントは、「V」キーをLTに使って、カーソールレイヤーにアクセスするようにしたことです。

cgc56:pico BL1, FL1/FL2)

かなりすっきりしました。

気づいたこと

キーキャップ

ortholinear系はシンプルなDSAのキーキャップの方がISOのキーキャップより似合う気がします。

親指のホームポジションはキーキャップの角を丸めるといい感じになっています。

「Shift」「Ctrl」「Alt」「Gui」キーのホームポジションキー等による兼用化

Mod-Tapを使うことで、「Shift」「Ctrl」「Alt」「Gui」キーのホームポジションによる兼用化がされ、無理に指を開ける指の動きがなくなりとても快適です。

さらに、右手にマウスだと「Ctrl-X」「Ctrl-C」「Ctrl-V」「ZZ」は左手操作だけでは難しかったので、Mod-Tapによる「SHIFT」「CONTROL」へのアクセスをホームポジション以外にキーボードの両端にも追加しています。(右端は、追加のレイヤー切り替えに使うのも考えられますが…)

設定されるキーに専用のMODEキーがなくなるので、その余裕をカーソールなどに使えるメリットもあります。LapTop PCのキーボードで使えるキー(TKLキーボード上のキーから、PauseとScrlLockを除く)だと、2レイヤー構成の42キーだけでアクセスを構成できます。

ちなみに、「Ctrl-X」「Ctrl-C」「Ctrl-V」を「x」「c」「v」の長押しで入力する手もあるようですが、これは導入しませんでした。

キー入力とTAPPING_TERM

普通にキー入力する際には、キー入力を意識的に短くタップするように慣れる必要があります。最初は一生懸命押しているキーが入力されていないのか悩ましかったです。力を入れるとキーを離すのが遅くなり、結果的にホールドと判定されてました。

TAPPING_TERM_PER_KEYを有効にし、親指によるLAYER切り替えキーは基本TAPPING_TERMの75%の早めに、小指などの動きが悪い一部キーは基本TAPPING_TERMの200%の遅めになるように設定しました。

全体のタイミング調整はconfig.hTAPPING_TERMだけでできます。config.h中のTAPPING_TERMは標準と同じ200と設定しています。

ホームポジションMOD用のパラメーター

デフォルトのMOD-TAP設定ではHOLD優先が有り、「as」等の隣のキーを早く舐めるように連続して打つと「S」となったりして違和感があります。 config.hを以下の設定にして解決しました。

/* Select MOD TAP to behave like default LAYER TAP (non-default) */
/* This is needed for home position mod keymaps */
#define IGNORE_MOD_TAP_INTERRUPT
/* Both LAYER TAP and MOD TAP can be rolling-pressed within TAPPING_TERM */
/* This is optional to accommodate the fast typer */
/* This is enabled by default if TAPPING_TERM >= 500 */
#define PERMISSIVE_HOLD

タッピング関係は、Tap-Hold Configuration Optionsの時間図をよく読む必要があります。

縦スタガート

確かに指は長さが違うので、縦スタガート設計に興味がありました。

胸の前に自然に手を持ってきて手首に一番ストレスが無いようにキーボード上に置くと、実際にキーボードを押す際の自然なホームポジションは一直線でした。

実際小指を置くキーの位置を1つ下げて試すと、すべての手の指はまっすぐ前に向くのですが手首が内側になり無理がかかり不快でした。

左右の手の間隔が30cm以下となる一体型キーボードだと手首が外側にくるので、一体型のortholinear系では縦スタガートは使いにくそうです。(「ハ」の字にすれば良いのかもしれませんが)

スプリットキーボードではキーボードの置く位置や角度が自由なので、縦スタガートでも良いのでしょうが、その導入は必須要件では無い気がします。

実際、ポピュラーな縦スタガートデザインの縦ズレ量を隣の列との差で見ると意外と少なく、最近のCorne等が隣との差がキーボードピッチの19mm単位(?)で1/8U-1/8U-CTR-1/8U-1/4U-0、少し古いErgodoxは1.27ピッチ(?)で0-1-1-CTR-1-2-0なので更に少ない感じでした。どうも1/4U-1/2U等という大きな縦ズレ量は少数派のようです。

直接入力キー

Thinkpad T14は、MENU-key(KC_APP)を無くして、PrtScrを押しやすいところにFnキー併用無しで入力できるように置きました。

この発想の延長上で考えて、PrtScrとMUTEのキーを押しやすい直接入力キーのところに置きます。

ソケットとLED配置

LEDの光が通る穴は、基本的にスイッチの端子ピンと反対側にある。

普通のCherryタイプ用とLPタイプ用の両方のソケットを装着可能にする共用PCBは、スイッチの端子ピンのソケットを反転して配置することで設計可能です。

ただしPCBの穴に埋め込まれたSK6812MINI-EのRGB光を使うPCBだと、いすれかのタイプを選ぶ必要があります。

ダイオード

black pill等だと片側6x3_3キー構成のスプリットキーボードまではNKROのPCB設計がダイオード無しで可能ですが、ダイオード無しだとOLEDや他の拡張しようと思っても対応できなくなります。

でもnanoの片側6x3_1キー構成とするとかなり現実味が出ます。

choc v1

Kailhの正規店以外では見かけなくなってきている。遊舎工房が、意外とリーゾナブル。

LowProfileのキースイッチは、1350 タイプが標準で、使うならこれが好ましそう。

最近のより薄いという1232 タイプは、PCBに角型の大きい穴が必要で既存のPCBと互換性が無いので要注意。

メモリー使用量

私のキーボードは、128KBのメモリー量のAT90USB1286で余裕があるので、メモリー使用量に配慮せず各種機能を有効にしても、使用量40%程度なので特に問題ありません。

ただ、32KBしかメモリー量のないATmega32u4を使う普通のPromicroだと、メモリー使用量の制約に配慮が必要ですね。

今後のMCUプラットフォーム候補

今後遊ぶには、メモリー量に余裕があるARM系のボードがよさそうです。

Proton-C以外のARM系ボードでは、USB経由のDFUでファームウエアーを書き換えるには、「BOOT0-push」「RESET-push」「RESET-release」「BOOT0-releas」と操作するので、ボード上の2つのPUSHボタンへのアクセスが必要。 代替策は、SWD経由アクセス。

Previous Post Top Next Post