こんにちは。アスビーです。
今回は前回に引き続き、Keyball61を使っていて得た気づきや注意点を書いていきます。
今回はファームウェアからキー配置を変えた際、私が困ったことや気づきを書きます。
ファームウェアからキー配置を変更することによって、REMAPだけでは実現できないキー配置を作成することができます。
前回はこちら:Keyball61を作ったら最高だったという話。
ファームウェア作成、書き換え
基本的なやり方は他のサイトを参照してください。ここでは、大まかなやり方と私が困ったことについて書きます。
やり方はここがすごく参考になりました。
keyballのための はじめてのQMK firmware環境構築 Windows編
keyballのための はじめてのQMK firmware キーマップ作成編
(初心者編)自作キーボードにファームウェアを書き込む
やることは大まかにこんな感じ。
1.QMK MSYS、QMK Toolboxを用意する。
2.キーマップを変更する。
3.HEXファイルを生成する。(QMK MSYSを使用。)私はここで困った。
4.ファームウェアを書き込む。(QMK Toolboxを使用。)
割とやること自体は簡単。
QMK ToolBoxじゃなくてもファームウェア書き込みできるみたいですけど、ブラウザだとHEXファイルアップロードする必要があるのに対して、こっちだと作成したHEXファイルのアドレスだけ入れておけばリセットボタン押すだけでファームウェア書き換え出来て便利でした。ファームウェアからカスタムしたい人は試行錯誤すると思うので、こっちのほうがいい気がします。
困ったこと:キーマップが変更されない。
上記3の手順で、変更したキーマップが反映されず困りました。
上の解説記事では、変更したキーマップより下記コマンドでHEXファイルを生成するのですが、うまく動作せず、デフォルトのファームウェアしか生成されませんでした。
make keyball/keyball61:via
コマンドはviaファイルにあるキーマップをもとにHEXファイルを生成するものなのですが、私の環境ではうまく動作せず、デフォルトのファームウェアしか生成されませんでした。
その後、いろいろ試した結果、デフォルトファイルにあるキーマップを変更し、それをもとにHEXファイルを生成することで、変更したキーマップが反映されるようになりました。なんで。
下記コマンドで生成してます。
make keyball/keyball61:default
なので管理が少し面倒で、一回一回バックアップを残して作業するようにしています。
プログラミング
基本的にいじるのはkeymap.cファイルで、”uint16_t PROGMEM keymaps”内に書かれているのがキー配置です。ファームウェアから変更するとREMAPは使えないので一つ一つ変えていく必要があります。
逆にこのキーマップファイルを持っておけばPCが変わっても、キーボールのProMicroが壊れても同じ状態に復元できるようになります。
QMKファームウェアでは、keymap.cファイル内で、”process_record_user”関数を使用することでオリジナルのキーを作成することができます。C言語は書いたことはありませんでしたが、フィーリングでなんとかなったので、分かったことや気づきを書いておきます。詳しい書き方は調べてください。
- この関数はどのキーが押された場合でも呼び出される。また、”process_record_user”関数はキーを離した場合にも呼び出される。
- 宣言した変数名を持つキーが押された場合、そのcaseに入り処理を行う。
- “record->event.pressed”をif文に使用することで、押下時はtrue、解放時はfalseを返し、分岐できる。
- “tap_code()”関数でボタン押下処理ができる。
- “record->event.time”を使用することでダブルタップやタップで動作を切り替えるなどのことを実装できる。具体的な使用例は下記。ちなみに中身は調べたけど何が入ってるかわからん。押下のタイムスタンプだけど形式がわからない。”TIMER_DIFF_16()”っていう関数で比較できるらしい。
enum my_keycodes {
//オリジナルのキーを定義。
TG_LAYER
};
static bool flag = false;//ダブルタップしたかどうかの判定。
static uint16_t start = 0; //ボタンを押すまたは離したときの時間を記録する。
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
//ダブルタップならファンクションレイヤー、タップならスクロールレイヤー。
case TG_LAYER:
if(record->event.pressed) {
//押されたのが二回目かつ二回目のタップが規定値よりも短ければ実行。
if(start > 0 && TIMER_DIFF_16(record->event.time, start) <= TAPPING_TERM * 0.8){
layer_on(1);
flag = true;
} else {
layer_on(3);
start = record->event.time;
}
} else {
//レイヤーはlayer_offで元に戻す必要があるから、それぞれ戻してる。
if (flag) {
layer_off(1);
flag = false;
} else {
layer_off(3);
}
}
return false;
break;
}
return true;
}
参考にしたサイトは以下。
二つ目のホールド中だけかな入力できる奴はかなり便利でした。私はこれのためにファームウェアからのキー変更をしました。また、三つ目のダブルタップについてもレイヤー変更キーの配置に困ってたので参考になりました。上のコードはこれです。カスみたいな変数名つけてるのは許して。割とフィーリングで書いてるからもし危なかったら教えてちょ。
QMKキーリスト
QMK で かなキー を Hold している間だけローマ字入力になるようにしてみる
QMK Firmware で1つのキーに Hold/Double Tap を割り当てる方法
あ、ちなみに、QMKのキーには「半角全角キー」ないっぽいです。いくつかそれっぽいネットの記事はありましたが、私のキーボードでは動いてくれませんでした。なのでREMAP使えなくなるとこのキーが使えなくなります。
感想
これできるようになると可能性が無限大になります。
まじで超便利になる。特にダブルタップは押しやすいキーに2種類のキーを設定できるから、実質押しやすいキーが2つになる。親指のキーでレイヤー変更したいからね。
前はファンクションキーが配置されているファンクションレイヤーをWINキーの左に配置してホールドでレイヤー移動にしていたけれど、クッソ押しづらかった。元からスクロールレイヤーに指定していた左手親指の一番左のキーにダブルタップでファンクションレイヤーキーを追加したらすんごい押しやすい。
現在は入れるものなくてALT+←を入れてブラウザバックできるようにしてる。♪の上にあった半角全角キーもなくしてALT+Printscreen入れてる。
他にもいろいろマクロとかも組めそうだから、まじでわくわくすっぞ。Keyballの可能性を探っている方はぜひ。
では。