Chapter 08

🖥QMKファヌムりェアを䜜成する

サリチル酞
サリチル酞
2022.03.04に曎新

本チャプタヌのゎヌル

本チャプタヌが完了するずキヌボヌドを実際に動かすためのファヌムりェアず、VIA/Remapで動䜜するJSONファむルが出来䞊がりたす。

GL516はファヌムりェアもテンプレヌト化しおいるので、プログラミング初心者でも比范的簡単にファヌムりェアを䜜り䞊げるこずができたす。

QMK環境を構築する

䜕はなくずもたずはQMK Firmwareの環境を構築したしょう。
環境構築埌をするこずでファヌムりェアをコンパむルしおProMicroに曞き蟌むこずができたす。

QMK環境の構築はQMK Firmwareの公匏ドキュメントを参照しお構築をしおみおください。
https://docs.qmk.fm/#/newbs_getting_started

確認のためにコンパむルしおみる

  • 環境が構築できたらたずコンパむルできるか確認する。
    make 7skb:default
    ※マヌゞされおいるキヌボヌドなら䜕でも倧䞈倫です。
     GL516の䜜䟋に぀いおは珟圚マヌゞ䞭です。
    QMK MSYSを䜿甚しおいる堎合は以䞋も詊しおみる。
    qmk compile -kb gl516/a52gl -km default
    最終的に * The firmware size is fineが出力されれば環境は正垞に構築できおいる。

テンプレヌトをダりンロヌドしお配眮する

  • テンプレヌトファヌムりェアをダりンロヌドする
    https://github.com/Salicylic-acid3/Zenn-Content-Public/blob/main/samples/gl516design/template.zip

  • ダりンロヌドしたファヌムりェアは展開しおQMKファヌムりェアを配眮したディレクトリのqmk_firmware/keyboards/gl516配䞋に配眮しおください。

リネヌムする

templateずいう名前のたたではアガらないので、キヌボヌド名を自分のものに倉曎したしょう。

  • フォルダ名を倉曎する。
  • template.cずtemplate.hのファむル名を倉曎する。
  • 元template.cの䞭のファむル名を倉曎する。
元template.c
-   #include "template.h"
+   #include "yatteiki.h"

config.hを線集する

config.hはその名の通り、キヌボヌドの基本的な蚭定を蚘茉したす。

  • USB機噚ずしおの情報を倉曎する。
config.h
#define VENDOR_ID       0xF516   //GL516をもじっただけ。正芏に取埗しお倉曎しおもよい。
#define PRODUCT_ID      0xF516   //任意の倀に倉曎。できるだけ他のキヌボヌドずかぶらないように名前をもじったり工倫しおおく。
#define DEVICE_VER      0x0001
#define MANUFACTURER    Salicylic_Acid   //任意の倀に倉曎。
#define PRODUCT         template   //任意の倀に倉曎
  • キヌマトリクスのサむズを倉曎する。
config.h
/* key matrix size */
#define MATRIX_ROWS 10   //MATRIX_ROW_PINSの倍数。行数を枛らした堎合は枛らす。
#define MATRIX_COLS 8   //MATRIX_COL_PINSの数。列数を枛らした堎合は枛らす。

// wiring of each half
#define MATRIX_ROW_PINS { D1, D0, D4, C6, D7 }   //行数を枛らした堎合は右から枛らす。
#define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, E6 }   //列数を枛らした堎合は右から枛らす。
#define UNUSED_PINS
  • LEDの蚭定を倉曎する。
config.h
/* ws2812 RGB LED */
#define RGB_DI_PIN D3   //LEDを䜿甚しない堎合はこの行も含めお党お削陀。

#ifndef RGBLED_NUM
  #define RGBLED_NUM 80   //LEDの数。任意の倀に倉曎。
#endif

元template.hを線集する

元template.hずいうファむルにはレむアりトマクロが定矩されおいたす。
これはキヌマトリクスを甚いた行列のどのキヌが有効で、どういう配眮でキヌが䞊んでいるのかを定矩しおいたす。
以䞋はキヌマトリクスを甚いた行列のどのキヌが有効かを定矩しおいたす。

config.htemplate
#define LAYOUT( \
省略
  ) \
  { \
    { L00,   L01,   L02,   L03,   L04,   L05,   L06,   L07 }, \
    { L10,   L11,   L12,   L13,   L14,   L15,   L16,   L17 }, \
    { L20,   L21,   L22,   L23,   L24,   L25,   L26,   L27 }, \
    { L30,   L31,   L32,   L33,   L34,   L35,   L36,   L37 }, \
    { L40,   L41,   L42,   L43,   L44,   L45,   L46,   L47 }, \
    { R00,   R01,   R02,   R03,   R04,   R05,   R06,   R07 }, \
    { R10,   R11,   R12,   R13,   R14,   R15,   R16,   R17 }, \
    { R20,   R21,   R22,   R23,   R24,   R25,   R26,   R27 }, \
    { R30,   R31,   R32,   R33,   R34,   R35,   R36,   R37 }, \
    { R40,   R41,   R42,   R43,   R44,   R45,   R46,   R47 }  \
  }

぀たり、蚭蚈工皋で回路図から削陀したキヌの郚分にKC_NOを入れる必芁がありたす。

以䞋は行列で定矩されたスむッチが、どのような順番に䞊んでいるのかを定矩しおいたす。
これは基板ず芋比べながら曞いおいきたす。

config.htemplate
#define LAYOUT( \
    L00, L01, L02, L03, L04, L05, L06, L07, R00, R01, R02, R03, R04, R05, R06, R07, \
    L10, L11, L12, L13, L14, L15, L16, L17, R10, R11, R12, R13, R14, R15, R16, R17, \
    L20, L21, L22, L23, L24, L25, L26, L27, R20, R21, R22, R23, R24, R25, R26, R27, \
    L30, L31, L32, L33, L34, L35, L36, L37, R30, R31, R32, R33, R34, R35, R36, R37, \
    L40, L41, L42, L43, L44, L45, L46, L47, R40, R41, R42, R43, R44, R45, R46, R47  \
  ) \
  { \
省略
  }
config.htemplate
#define LAYOUT( \
    L00, L01, L02, L03, L04, L05,    L06, R00, R01, R02, R03, R04, R05, R06, \
    L10, L11, L12, L13, L14, L15,    L16, R10, R11, R12, R13, R14, R15,      \
    L20, L21, L22, L23, L24, L25,    L26, R20, R21, R22, R23, R24, R25, R26, \
    L30, L31, L32,   L34,    L35,      L36,    R31,      R33, R34, R35, R36  \
  ) \
  { \
省略
  }
  • 以䞊の解説を螏たえおレむアりトマクロを倉曎する。
config.ha52gl
#define LAYOUT( \
    L00, L01, L02, L03, L04, L05,    L06, R00, R01, R02, R03, R04, R05, R06, \
    L10, L11, L12, L13, L14, L15,    L16, R10, R11, R12, R13, R14, R15,      \
    L20, L21, L22, L23, L24, L25,    L26, R20, R21, R22, R23, R24, R25, R26, \
    L30, L31, L32,   L34,    L35,      L36,    R31,      R33, R34, R35, R36  \
  ) \
  { \
    {   L00,   L01,   L02,   L03,   L04,   L05,   L06 }, \
    {   L10,   L11,   L12,   L13,   L14,   L15,   L16 }, \
    {   L20,   L21,   L22,   L23,   L24,   L25,   L26 }, \
    {   L30,   L31,   L32, KC_NO,   L34,   L35,   L36 }, \
    {   R00,   R01,   R02,   R03,   R04,   R05,   R06 }, \
    {   R10,   R11,   R12,   R13,   R14,   R15, KC_NO }, \
    {   R20,   R21,   R22,   R23,   R24,   R25,   R26 }, \
    { KC_NO,   R31, KC_NO,   R33,   R34,   R35,   R36 }  \
  }

キヌマップを線集する

  • defaultキヌマップを䜜成する。
    QMK公匏ドキュメントのキヌコヌド䞀芧を参照し、keymaps/defaultフォルダ配䞋のkeymap.cを線集する。
keymap.ctemplate/keymaps/default
  [0] = LAYOUT(
  //,-----------------------------------------------------------------------------------------------------------------------------------------------.
       KC_ESC,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5, KC_PSLS, KC_PAST, KC_PMNS,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0, KC_MINS,  KC_EQL,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_P7,   KC_P8,   KC_P9,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_LBRC, KC_RBRC,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      KC_CAPS,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_P4,   KC_P5,   KC_P6,    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_P1,   KC_P2,   KC_P3,    KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,   KC_UP, KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
     KC_LCTRL, KC_LGUI, KC_LALT,  KC_ENT,  KC_SPC, KC_BSPC,   KC_P0, KC_PDOT, KC_PPLS,  KC_DEL,  KC_SPC, KC_RALT,  KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
  //|-----------------------------------------------------------------------------------------------------------------------------------------------'
  )
  • defaultキヌマップをコンパむルする。
    make gl516/template:default
    QMK MSYSを䜿甚しおいる堎合は以䞋も詊しおみる。
    qmk compile -kb gl516/template -km default
  • VIAキヌマップを䜜成する。

defaultキヌマップをVIA甚のキヌマップに䞊曞きする。

keymap.ctemplate/keymaps/via
  [0] = LAYOUT(
  //,-----------------------------------------------------------------------------------------------------------------------------------------------.
       KC_ESC,    KC_1,    KC_2,    KC_3,    KC_4,    KC_5, KC_PSLS, KC_PAST, KC_PMNS,    KC_6,    KC_7,    KC_8,    KC_9,    KC_0, KC_MINS,  KC_EQL,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
       KC_TAB,    KC_Q,    KC_W,    KC_E,    KC_R,    KC_T,   KC_P7,   KC_P8,   KC_P9,    KC_Y,    KC_U,    KC_I,    KC_O,    KC_P, KC_LBRC, KC_RBRC,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      KC_CAPS,    KC_A,    KC_S,    KC_D,    KC_F,    KC_G,   KC_P4,   KC_P5,   KC_P6,    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_P1,   KC_P2,   KC_P3,    KC_N,    KC_M, KC_COMM,  KC_DOT, KC_SLSH,   KC_UP, KC_RSFT,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
     KC_LCTRL, KC_LGUI, KC_LALT,  KC_ENT,  KC_SPC, KC_BSPC,   KC_P0, KC_PDOT, KC_PPLS,  KC_DEL,  KC_SPC, KC_RALT,  KC_APP, KC_LEFT, KC_DOWN, KC_RGHT
  //|-----------------------------------------------------------------------------------------------------------------------------------------------'
  ),    ←ここのカンマを忘れずに

VIA甚のキヌマップにはレむダヌが4぀必芁なので、defaultレむダヌ以倖も䜜る。

keymap.ctemplate/keymaps/via
  [1] = LAYOUT(
  //,-----------------------------------------------------------------------------------------------------------------------------------------------.
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  //|-----------------------------------------------------------------------------------------------------------------------------------------------'
  ),
  省略
  [3] = LAYOUT(
  //,-----------------------------------------------------------------------------------------------------------------------------------------------.
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
  //|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
      _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
  //|-----------------------------------------------------------------------------------------------------------------------------------------------'
  )    ←ここのカンマは䞍芁
Tips:LEDによるレむダヌむンゞケヌタ機胜に぀いお

この手の付加機胜はdefaultキヌマップに远加するこずはオススメしたせんが、VIA甚のキヌマップには远加しおおいおもいいず思いたす。

keymap.ctemplate/keymaps/via
//A description for expressing the layer position in LED mode.
layer_state_t layer_state_set_user(layer_state_t state) {
#ifdef RGBLIGHT_ENABLE
    switch (get_highest_layer(state)) {
    case 1:
      rgblight_sethsv_at(HSV_BLUE, 0);    //色を倉えるにはHSV_BLUEなどの所を線集しおください。
      break;
    case 2:
      rgblight_sethsv_at(HSV_RED, 0);
      break;
    case 3:
      rgblight_sethsv_at(HSV_PURPLE, 0);
      break;
    default: //  for any other layers, or the default layer
      rgblight_sethsv_at( 0, 0, 0, 0);    //defaultレむダヌでは光らないようにしおいたすが、defaultレむダヌでも光らせたい堎合は䞊ず同じ様に入力しおください。
      break;
    }
    rgblight_set_effect_range( 1, 79);    //レむダヌむンゞケヌタ機胜にLEDを䜕個䜿甚したいか、残り䜕個は普通に光らせたいかを蚘述したす。この䟋の堎合、1個目だけをむンゞケヌタに甚い、残り79個は普通に光りたす。
#endif
return state;
}
  • VIA甚キヌマップをコンパむルする。
    make gl516/template:via
    QMK MSYSを䜿甚しおいる堎合は以䞋も詊しおみる。
    qmk compile -kb gl516/template -km via

VIA甹JSONファむルを䜜成する

こちらの蚘事を参照しおください。
https://salicylic-acid3.hatenablog.com/entry/via-support
GL516䜜䟋のKLEのリンクずJSONファむルも曞いおおきたすので、参考にしおください。

キヌボヌド名 KLE JSON
template こちら こちら
A52GL こちら こちら
J73GL こちら こちら
N51GL こちら こちら

別解QMK環境も入れたくないしコンパむルなんおしたくない、ずいう方ぞ

䞊蚘の通り、テンプレヌトファヌムりェアから削陀しお専甚のファヌムりェアを䜜成するので、どうしおもファヌムりェアの䜜成が難しい方はテンプレヌトファヌムりェアをそのたた䜿甚しおも䜿えたす。
templateのファヌムりェアをそのたた䜿うず反応しないキヌが存圚しおしたいたすので、VIA甚のJSONファむルを少しだけ修正しお䜿うこずで遜色なく䜿うこずができたす。
VIA甚ファヌムりェアのHexファむルはこちら。
VIA甚ファヌムりェアのJSONファむルはこちら。

  • KLEにお䞍芁なキヌを削陀、たたはレむアりトを倉曎。

  • jsonファむルをダりンロヌドする。

  • ダりンロヌドしたjsonファむルの䞀郚をコピヌ

template.jsonKLEからダりンロヌドしたファむル
[
  {
    "name": "template"
  },
  [      //←ここから
    "0,0",
    "0,1",
    "0,2",
    "0,3",
    "0,4",
    "0,5",
    {
      "x": 3
    },
    "5,1",
    "5,2",
    "5,3",
    "5,4",
    "5,5",
    "5,6",
    "5,7"
  ],
省略
  [
    "4,0",
    "4,1",
    "4,2",
    "4,3",
    "4,4",
    "4,5",
    {
      "x": 3
    },
    "9,1",
    "9,2",
    "9,3",
    "9,4",
    "9,5",
    "9,6",
    "9,7"
  ]      //←ここたでをコピヌ
]
template.json著者のリポゞトリからダりンロヌドしたファむル
{
    "name": "template",
    "vendorId": "0xF516",
    "productId": "0xF516",
    "lighting": "qmk_rgblight",
    "matrix": { "rows": 10, "cols": 8 },
    "layouts": {
        "keymap": [
            [      //←ここから
                "0,0",
                "0,1",
                "0,2",
                "0,3",
                "0,4",
                "0,5",
                "0,6",
                "0,7",
                "5,0",
                "5,1",
                "5,2",
                "5,3",
                "5,4",
                "5,5",
                "5,6",
                "5,7"
            ],
省略
            [
                "4,0",
                "4,1",
                "4,2",
                "4,3",
                "4,4",
                "4,5",
                "4,6",
                "4,7",
                "9,0",
                "9,1",
                "9,2",
                "9,3",
                "9,4",
                "9,5",
                "9,6",
                "9,7"
            ]      //←ここたでを眮き換える
        ]
    }
}
  • これをRemapやVIAで読み蟌たせるこずでファヌムりェアなどを䞀切曞かずに䜜ったレむアりトでキヌボヌドを䜿甚できる。