QMK Firmwareを使えるようになる。

自作キーボード

実行環境を整える。

インストール

QMK MSYS
以降はQMK MSYSを起動して行う。

セットアップ

# デフォルトでは C://User/User名/qmk_firmwareに展開される。
# 以降 PATH = このパスとする。
qmk setup
# ディレクトリを指定する場合
qmk setup -H <path>

# 最新にしておく
git pull
# ?
# qmk git-submodule

新しいキーボードを作成する。

pro micro のマイクロコントローラーはATmega32U4である。

qmk new-keyboard

# 入力
> keyboard Name   : test_a
> github username : test_b
> real name       : test_c
> Pick Base Layout:  none of the above
> MCU             : ATmega32U4 ( pro micro )


# keyboard Name   : github_name/プロジェクトネームと入力した方がよさそうだ。

PATH/keyboardsにtest_aディレクトリが生成される。

+---keyboards
    \---test_a
        |   config.h
        |   info.json
        |   readme.md
        |   rules.mk
        |
        \---keymaps
            \---default
                    keymap.c

各種内容を確認

config.h

// Copyright 2024 test_c (@test_b)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

/*
 * Feature disable options
 *  These options are also useful to firmware size reduction.
 */

/* disable debug print */
//#define NO_DEBUG

/* disable print */
//#define NO_PRINT

/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT


info.json

下記この項目を編集する必要がある。

  • vid
    ベンダー番号を決めて使用する。
    QMKでは割と適当に指定しているようだ。
    Configuring QMK | VIA
    >> Q: Wouldn’t it be better if all VIA compatible keyboards used the same vendor/product IDs (perhaps an officially licenced one) and then VIA queries to get the device identity?
    >> A: Yes, it would be slightly better, but this method continues QMK’s unofficial use of arbitrary vendor/product IDs and doesn’t introduce another unique ID.

  • pid
    自分の他製品と競合しない番号を指定する。

  • diode_direction
    基板のダイオードの方向を指定する。

  • features
    rules.mkでも指定できる内容だが、info.jsonが優先されるようだ?
    競合する設定があればコンパイルするときにWARRNIGが出た。

  • matrix_pins
    基板に接続しているピンのポート名を先頭からPを取り除いて指定する。
    参考 / pro microのデータシート
    Datasheet

  • layouts/配列名/layout
    keyboard.cのconst uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS]で定義した配列名を使用し、基板の座標を指定する。

{
    "manufacturer": "test_c",
    "keyboard_name": "test_a",
    "maintainer": "test_b",
    "bootloader": "atmel-dfu",
    "diode_direction": "COL2ROW",
    "features": {
        "bootmagic": true,
        "command": false,
        "console": false,
        "extrakey": true,
        "mousekey": true,
        "nkro": true
    },
    "matrix_pins": {
        "cols": ["C2", "C2", "C2", "C2"],
        "rows": ["D1", "D1", "D1", "D1"]
    },
    "processor": "atmega32u4",
    "url": "",
    "usb": {
        "device_version": "1.0.0",
        "pid": "0x0000",
        "vid": "0xFEED"
    },
    "layouts": {
        "LAYOUT_ortho_4x4": {
            "layout": [
                {"matrix": [0, 0], "x": 0, "y": 0},
                {"matrix": [0, 1], "x": 1, "y": 0},
                {"matrix": [0, 2], "x": 2, "y": 0},
                {"matrix": [0, 3], "x": 3, "y": 0},
                {"matrix": [1, 0], "x": 0, "y": 1},
                {"matrix": [1, 1], "x": 1, "y": 1},
                {"matrix": [1, 2], "x": 2, "y": 1},
                {"matrix": [1, 3], "x": 3, "y": 1},
                {"matrix": [2, 0], "x": 0, "y": 2},
                {"matrix": [2, 1], "x": 1, "y": 2},
                {"matrix": [2, 2], "x": 2, "y": 2},
                {"matrix": [2, 3], "x": 3, "y": 2},
                {"matrix": [3, 0], "x": 0, "y": 3},
                {"matrix": [3, 1], "x": 1, "y": 3},
                {"matrix": [3, 2], "x": 2, "y": 3},
                {"matrix": [3, 3], "x": 3, "y": 3}
            ]
        }
    }
}


readmd.md

# test_a

![test_a](imgur.com image replace me!)

*A short description of the keyboard/project*

* Keyboard Maintainer: [test_c](https://github.com/test_b)
* Hardware Supported: *The PCBs, controllers supported*
* Hardware Availability: *Links to where you can find this hardware*

Make example for this keyboard (after setting up your build environment):

    make test_a:default

Flashing example for this keyboard:

    make test_a:default:flash

See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

## Bootloader

Enter the bootloader in 3 ways:

* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available


rules.mk

# This file intentionally left blank


keyboard.c

レイヤーと座標に対してのキーマップを指定する。
LAYOUT_ortho_4x4はinfo.jsonで指定したもの。

// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later

#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /*
     * ┌───┬───┬───┬───┐
     * │ 7 │ 8 │ 9 │ / │
     * ├───┼───┼───┼───┤
     * │ 4 │ 5 │ 6 │ * │
     * ├───┼───┼───┼───┤
     * │ 1 │ 2 │ 3 │ - │
     * ├───┼───┼───┼───┤
     * │ 0 │ . │Ent│ + │
     * └───┴───┴───┴───┘
     */
    [0] = LAYOUT_ortho_4x4(
        KC_P7,   KC_P8,   KC_P9,   KC_PSLS,
        KC_P4,   KC_P5,   KC_P6,   KC_PAST,
        KC_P1,   KC_P2,   KC_P3,   KC_PMNS,
        KC_P0,   KC_PDOT, KC_PENT, KC_PPLS
    )
};

コンパイルしてhexファイルを作る。

作成されるディレクトリは PATH/keyboard名_keymap名.hexに作成された。

qmk compile -kb <キーボード名> -km <キーマップ名>
qmk compile -kb test_a -km default

hexファイルを書き込む

これ、windows環境では出来なかった気がする。
qmk toolboxで書き込んだ。
Releases · qmk/qmk_toolbox · GitHub

qmk flash

Via対応したkeymapを作る。

test_aに対して、via対応のmapを作成してみる。

# qmk new-keymap -kb `<keyboard-name>` -km `<map-name>`
qmk new-keymap -kb test_a -km via

この時作成されるvia/keymap.cは、default/keymap.cのコピーのようだ。

\---keymaps
    +---default
    |       keymap.c
    |
    \---via
            keymap.c

新しくvia用のrules.mkを作成する。

    \---via
            keymap.c
            rules.mk
VIA_ENABLE = yes

remap用のjsonファイルを適当な名前で作成する。

今回はvia.jsonという名前で作成した。
VenderIDとproductIdはinfo.jsonで書き込んだ内容を書く。
matrixにcolsとrowsの数を入力する。
Keyboard Layout Editorで配置してRaw dataの内容をConvert KLE raw to QMK info.json | QMK Firmwareでconvertするのが主流のようだが、ほどほどに参考にして適当に書くなどした。

{
    "name": "test_a",
    "vendorId" : "0x326F",
    "productId": "0x0005",
    "menus": [],
    "keycodes": [],
    "matrix": { "cols": 2, "rows": 2 },
    "layouts": {
    // [{GUI座標情報} , "matrix座標" ]
        "keymap": [
            [{"x":1}        ,"0,0"  ,               "0,1"],
            [{"h":0.75}     ,"1,0"] ,    [{"x":2} , "1,1"]
        ]
    }
}

remapで書き込む

接続時に先ほど作ったvia.jsonをD&Dすることで問題なく書き込めた。
想定通りに動かないときは、chromeの検証機能を使ってエラーを見た方が良い。
Remap

左右分割キーボードを作るには。

分割キーボードの接続

今回はRX同士を接続した。
‘serial’ Driver | QMK Firmware

rules.mk

左右分割を有効化。

SPLIT_KEYBOARD = yes

config.h

基板の左右を判定する手段として、どちらかのピンがtrueになっているかで判定する方法がある。
今回は常にUSBが左側なのでこのようにした。
Split Keyboard | QMK Firmware

#pragma once
// 通信に使うピンを指定する。
#define SOFT_SERIAL_PIN D2

// USBが常に左側に接続されるものとする。
#define MASTER_LEFT

info.json

SPLIT_KEYBOARDを有効にした場合、rows相当のmatrix座標が2倍になり、その増えた分が反対側のキー配置になる。

    "matrix_pins": {
        "cols": [ "F4", "F5", "F6", "F7", "B1", "B3" ],
        "rows": [ "D4", "C6", "D7", "E6" ]
    },
    "layouts": {
        "LAYOUT": {
            "layout": [

                {"matrix": [0, 0] , "x": 0 , "y": 0},
                {"matrix": [0, 1] , "x": 1 , "y": 0},
                {"matrix": [0, 2] , "x": 2 , "y": 0},
                {"matrix": [0, 3] , "x": 3 , "y": 0},
                {"matrix": [0, 4] , "x": 4 , "y": 0},
                {"matrix": [0, 5] , "x": 5 , "y": 0},

                {"matrix": [4, 0] , "x": 6 , "y": 4},
                {"matrix": [4, 1] , "x": 7 , "y": 4},
                {"matrix": [4, 2] , "x": 8 , "y": 4},
                {"matrix": [4, 3] , "x": 9 , "y": 4},
                {"matrix": [4, 4] , "x": 10, "y": 4},
                {"matrix": [4, 5] , "x": 11, "y": 4},

                {"matrix": [1, 0] , "x": 0 , "y": 1},
                {"matrix": [1, 1] , "x": 1 , "y": 1},
                {"matrix": [1, 2] , "x": 2 , "y": 1},
                {"matrix": [1, 3] , "x": 3 , "y": 1},
                {"matrix": [1, 4] , "x": 4 , "y": 1},
                {"matrix": [1, 5] , "x": 5 , "y": 1},

                {"matrix": [5, 0] , "x": 6 , "y": 5},
                {"matrix": [5, 1] , "x": 7 , "y": 5},
                {"matrix": [5, 2] , "x": 8 , "y": 5},
                {"matrix": [5, 3] , "x": 9 , "y": 5},
                {"matrix": [5, 4] , "x": 10, "y": 5},
                {"matrix": [5, 5] , "x": 11, "y": 5},


                {"matrix": [2, 0] , "x": 0 , "y": 2},
                {"matrix": [2, 1] , "x": 1 , "y": 2},
                {"matrix": [2, 2] , "x": 2 , "y": 2},
                {"matrix": [2, 3] , "x": 3 , "y": 2},
                {"matrix": [2, 4] , "x": 4 , "y": 2},
                {"matrix": [2, 5] , "x": 5 , "y": 2},

                {"matrix": [6, 0] , "x": 6 , "y": 6},
                {"matrix": [6, 1] , "x": 7 , "y": 6},
                {"matrix": [6, 2] , "x": 8 , "y": 6},
                {"matrix": [6, 3] , "x": 9 , "y": 6},
                {"matrix": [6, 4] , "x": 10, "y": 6},
                {"matrix": [6, 5] , "x": 11, "y": 6},

                {"matrix": [3, 0] , "x": 2 , "y": 3},
                {"matrix": [3, 1] , "x": 3 , "y": 3},
                {"matrix": [3, 2] , "x": 4 , "y": 3},
                {"matrix": [3, 3] , "x": 5 , "y": 3},

                {"matrix": [7, 0] , "x": 6 , "y": 7},
                {"matrix": [7, 1] , "x": 7 , "y": 7},
                {"matrix": [7, 2] , "x": 8 , "y": 7},
                {"matrix": [7, 3] , "x": 9 , "y": 7}

            ]
        }
    }

その他

注意事項

info.jsonとrules.mkでは重複した設定項目が存在する。
この辺の設定は統合しようという動きがあるっぽい?

"split": {
    "enabled": true
},
SPLIT_KEYBOARD = yes

参考

The QMK Tutorial | QMK Firmware
Quantum Mechanical Keyboard Firmware | QMK Firmware
GitHub – qmk/qmk_firmware: Open-source keyboard firmware for Atmel AVR and Arm USB families
config.h/rules.mkの設定関係。
qmk_firmware/docs/config_options.md at master · qmk/qmk_firmware · GitHub
QMKのキーコード
Basic Keycodes | QMK Firmware
Basic Keycodesの中にメディア関係もある。
Mouse keys | QMK Firmware
info.jsonのオプション一覧
qmk_firmware/docs/reference_info_json.md at master · qmk/qmk_firmware · GitHub
キー入力周りの設定
Tap-Hold Configuration Options | QMK Firmware

キーコードまとめ :: ErgoDox | Refills