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