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

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

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

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

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

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

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

スタビライザーはMEKANISKの3uサイズが足りなかったので余っていたものを2つ利用しているのですが、あまり使わない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%キーボードで使うキーレイアウトをアサインしたような状態にしています。