GRIN Type-R、GRIN配列の自作キーボードを組み立てました

昨年暮れにdadittoと迷ってGBしなかった中央部が下に下がって湾曲したキーレイアウトのGRIN Type-Rが少量販売されたので購入、組み立ててみました。

GRIN Type-Rはバーガーマウントの65％メカニカルキーボードでキー配列がGRIN配列(GRIN Layout)というアリス配列を曲線にしたような中心部分が手元に近づいた独特のキー配列で通常のロースタッガードを比べると手首の取り回しが楽で打ちやすいキーボードです。

届いて箱を開けた時の同梱物はこんな感じで非常にシンプルなパーツで構成されています。

デフォルトから変更したところ

マウントプレートが赤だったので、それに合わせてトッププレートに赤いマステを何回か重ねて貼り、スクエアな模様が少し見えるようにしました。

そしてマウントプレートとPCBの間にPORONシートを貼って、反響を抑えています。

スタビライザーはMEKANISKの3uサイズが足りなかったので余っていたものを２つ利用しているのですが、あまり使わない7uのものが余っているのでそれを加工して流用しようか悩んでいます。

タイピング

打鍵音はPORONシートを挟んでいることもあるのか、今まで使ったことのあるサンドイッチ構造のものとは一線を画するぐらいに良い音で、キーのレイアウトも非常に打ちやすいキーボードでした。

キーマップ

今回キーマップはPRK firmwareのファームウェアを使用しているので、パソコンにつなげて表示されるマスストレージ内のkeymap.rbファイルをテキストエディタで修正してキーマップを変更しています。

実際のコードは下記のような設定にしています。

PRKFirmware

kbd = Keyboard.new

kbd.init_pins(
[ 20, 19, 18, 17, 16 ],
[ 8, 7, 6, 2, 3, 4, 5, 10, 15, 14, 13, 12, 11, 9, 21 ]
)

kbd.add_layer :default, %i(
KC_GRAVE 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_BSPC XXXXXXX
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_BSLS KC_BSPC
KC_CAPS KC_A KC_S KC_D KC_F KC_G KC_H KC_J KC_K KC_L KC_SCOLON KC_QUOT XXXXXXX KC_ENT KC_PGUP
KC_LSFT XXXXXXX KC_Z KC_X KC_C KC_V KC_B KC_N KC_M KC_COMM KC_DOT KC_SLSH KC_RSFT XXXXXXX KC_PGDN
KC_LCTL KC_LALT KC_LGUI XXXXXXX LNG2_FUNC KC_SPC KC_SPC KC_SPC LNG1_FUNC KC_RALT KC_RCTL KC_LEFT KC_DOWN KC_UP KC_RGHT
)

kbd.add_layer :func1, %i(
KC_ESC KC_F1 KC_F2 KC_F3 KC_F4 KC_F5 KC_F6 KC_F7 KC_F8 KC_F9 KC_F10 KC_F11 KC_F12 XXXXXXX XXXXXXX
XXXXXXX KC_1 KC_2 KC_3 KC_4 KC_5 KC_6 KC_7 KC_8 KC_9 KC_0 XXXXXXX XXXXXXX XXXXXXX KC_PSCREEN
XXXXXXX KC_MINS KC_EQL KC_LBRC KC_RBRC KC_BSLS XXXXXXX KC_INS KC_HOME KC_PGUP KC_BSPC XXXXXXX XXXXXXX XXXXXXX KC_PAUSE
KC_LSFT XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX KC_DEL KC_END KC_PGDN XXXXXXX XXXXXXX XXXXXXX KC_INS
KC_LCTL KC_LALT KC_LGUI XXXXXXX LNG2_FUNC XXXXXXX XXXXXXX XXXXXXX LNG1_FUNC KC_RALT KC_RCTL KC_HOME KC_PGDN KC_PGUP KC_END
)

kbd.add_layer :func2, %i(
KC_ESC KC_F1 KC_F2 KC_F3 KC_F4 KC_F5 KC_F6 KC_F7 KC_F8 KC_F9 KC_F10 KC_F11 KC_F12 XXXXXXX XXXXXXX
XXXXXXX KC_EXLM KC_AT KC_HASH KC_DLR KC_PERC KC_CIRC KC_AMPR KC_ASTR KC_LPRN KC_RPRN XXXXXXX XXXXXXX XXXXXXX KC_PSCREEN
XXXXXXX KC_UNDS KC_PLUS KC_LCBR KC_RCBR KC_PIPE KC_LEFT KC_DOWN KC_UP KC_RGHT KC_GRV XXXXXXX XXXXXXX XXXXXXX KC_PAUSE
KC_LSFT XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX XXXXXXX KC_DEL KC_END KC_PGDN XXXXXXX XXXXXXX XXXXXXX KC_INS
KC_LCTL KC_LALT KC_LGUI XXXXXXX LNG2_FUNC XXXXXXX XXXXXXX XXXXXXX LNG1_FUNC KC_RALT KC_RCTL KC_HOME KC_PGDN KC_PGUP KC_END
)

kbd.define_mode_key :LNG1_FUNC, [ :KC_LANG1, :func1, 300, nil ]
kbd.define_mode_key :LNG2_FUNC, [ :KC_LANG2, :func2, 300, nil ]

kbd.start!

KMKfirmware

from kb import KMKKeyboard
from kmk.keys import KC
from kmk.modules.layers import Layers

keyboard = KMKKeyboard()
layers = Layers()
keyboard.modules = [layers]

# ------------------User level config variables ---------------------------------------
# keyboard.unicode_mode = UnicodeMode.LINUX
keyboard.tap_time = 250

keyboard.debug_enabled = False

_______ = KC.TRNS
XXXXXXX = KC.NO

# ---------------------- Keymap -------------------------------------------------------

keyboard.keymap = [
[ # Default
KC.GRV, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, KC.MINS, KC.EQL, KC.BSPC, XXXXXXX,
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.BSLS, KC.BSPC,
KC.CAPS, KC.A, KC.S, KC.D, KC.F, KC.G, KC.H, KC.J, KC.K, KC.L, KC.SCOLON, KC.QUOT, XXXXXXX, KC.ENTER, KC.PGUP,
KC.LSFT, XXXXXXX, KC.Z, KC.X, KC.C, KC.V, KC.B, KC.N, KC.M, KC.COMM, KC.DOT, KC.SLSH, KC.RSFT, XXXXXXX, KC.PGDN,
KC.LCTL, KC.LALT, KC.LGUI, XXXXXXX, KC.MO(2), KC.SPC, KC.SPC, KC.SPC, KC.MO(1), KC.RALT, KC.RCTL, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT,
],
[ # Function
KC.ESC, 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.N1, KC.N2, KC.N3, KC.N4, KC.N5, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, _______, _______, _______, KC.PSCREEN,
_______, KC.MINS, KC.EQL, KC.LBRC, KC.RBRC, KC.BSLS, _______, KC.INSERT, KC.HOME, KC.PGUP, KC.BSPC, _______, _______, _______, KC.PAUSE,
KC.LSFT, _______, _______, _______, _______, _______, _______, _______, KC.DEL, KC.END, KC.PGDN, _______, _______, _______, KC.INSERT,
KC.LCTL, KC.LALT, KC.LGUI, _______, _______, _______, _______, _______, _______, KC.RALT, KC.RCTL, KC.HOME, KC.PGDN, KC.PGUP, KC.END,
],
[ # Function
KC.ESC, 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.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, _______, _______, _______, KC.PSCREEN,
_______, KC.UNDS, KC.PLUS, KC.LCBR, KC.RCBR, KC.PIPE, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, KC.GRV, _______, _______, _______, KC.PAUSE,
KC.LSFT, _______, _______, _______, _______, _______, _______, _______, KC.DEL, KC.END, KC.PGDN, _______, _______, _______, KC.INSERT,
KC.LCTL, KC.LALT, KC.LGUI, _______, _______, _______, _______, _______, _______, KC.RALT, KC.RCTL, KC.HOME, KC.PGDN, KC.PGUP, KC.END,
],
]

if __name__ == '__main__':
keyboard.go()

60%キーボードのレイアウトにレイヤーで40％キーボードで使うキーレイアウトをアサインしたような状態にしています。