分割キーボードを自作した!【mint60】
2024年5月14日火曜日
初めてキーボードを自作し、初めて分割キーボードを使いました。
組み立てるのとキーマップをカスタマイズするのにほんとにめっちゃ時間がかかった!!!!
分割キーボードを知ってから、ずっとほしいって思ってたんですよね。
腕を広げてリラックスした状態で入力できるし、右と左で入力できるキーが決まっているから自然と正しいタイピングができるようになるんじゃないかとか色々想像していました。
それでいざ買おうとすると市販品の分割キーボードはMISTEL BAROCCOというキーボードくらいしかなく、間にマクロキーがあってあまり気に入らなかったんですよね。
あとキーマップのカスタマイズもマクロキーしかできないらしくてあんまり自由じゃないのかなとか。
それで探してみると自作キーボードしか選択肢がなかったというわけです。
じゃあどの自作キーボードにしようかと探していると、sphhというセパレートのHHKBみたいなものを見つけました。
すごいシンプルで一般的な配列に近くて、日本語配列でエンターが大きくて、エンターの右側に特殊キーがなくてスッキリしていていいなと思いました。
それで最初はこのsphhを買うって決めたんですけど、MCUという部品のハンダ付けがどうや
ら難しいらしいと。
はんだ付けなんて中学か高校で少しやったくらいなので自信がないし、数万円もするもので失敗したらどうしようかとめちゃくちゃ不安でした。
とりあえず遊舎工房に行ってみて他にも良さそうなものがないか実際に見てみてから決めようと思い、実際に遊舎工房に行きました。
そしたらsphhはなかったんですが、キーボードがたくさんあって逆に何を買えばいいかわからなくなってしまいました。
まじで何もわからん、何をどのくらい買えばいいのか、どうやって自分にあったキーボードを選べばいいのかわからなくなって、軽く頭がパニック状態になって激しい頭痛に襲われ、一回外に出ましたw
sphhはネットで買えるけれど他に何を買えばいいのか書いてあるけどほんとに理解できているかわからないし、はんだ付けもできるかわからないけれど任せると+8000円もかかりめっちゃ高くなる。
せっかく自作キーボードを作るなら自分ではんだ付けしてみたい気持ちもあるけれど、数万もかけて失敗したくない。
こんな感じで考えがぐるぐる回って混乱していました。
頭を一回落ち着かせて、遊舎小坊入口から入って右側においてある初心者向けっぽいキーボードをもう一度見に行きました。
一般的なキーボードに近い分割キーボードで、ファンクションやエンターの右側などに余計なキーがないもの。方向キーはよく使うので右下にあるもの、とかそんな感じでキーボードを絞っていくと、あるキーボードにたどり着きました。
それがmint60です!
すごい前置きが長くなっちゃったんですけど、それだけ悩んで選んだってことを伝えたいのと、mint60のタイピングに慣れようと冗長に書いているっていうのもあります()
min60はネットで調べると作っている人が結構多いメジャーなもので、失敗談とかはんだ付けの動画など情報量が多く、初心者の自分にちょうどよいと感じました。
US配列でちょっと打ちにくいかなとも思ったんですが、US配列を使ってみたいという気持ちもあったので買おうと決めました。
そして遊舎工房内で買おうとしたら、残り一個のmint60がある男の子にレジに持っていかれる瞬間を目撃してしまいました。
めっちゃ悩んで買おうと決めた瞬間になくなったのでその日はものすごい疲れました。
逆に言えばものすごい人気のキーボードのため、より魅力的に感じて欲しくなりました。
キーキャップやキースイッチはどれにしようかと調べていたのですが、キーキャップは欲しいものが見つからないし、キースイッチはよくわかんないしタクタイルなら何でもいい!
もう考えるのも疲れていて、とりあえず早く解体気持ちでいっぱいでした。
調べてみるとmint60はキーキャップやキースイッチ、その他部品がまとまったスターターキットがあるじゃないですか。
じゃあそれでいいじゃん!と思い、lilakeyというサイトで購入しました。
それで組み立てたものがこちらです。
遊舎工房に行ったのが5/2、lilakeyで注文したのが5/3、届いたのが5/7、組み立て完成したのが5/12、キーマップのカスタマイズが終わったのが5/14。
買おうと思ってから完成まで2週間弱もかかりました。
特に組み立ては大変でした。
https://lilakey.com/blogs/docs/how-to-build-mint60-01
このサイトを見ながら組み立てるのですが、超初心者の自分には「あれ?個々のはんだの説明ちょっと飛ばされてない?」とか、「細かく書いてないからこれで本当に合ってるのか不安」みたいな感じで結構難しかったです。
まあなんとかなるレベルではあったんですが。
はんだ付けも大変でしたが、何十回、何百回もはんだ付けしてると流石に慣れてきました。
それより大変だったのは導通です。
キースイッチとpromicroをはんだ付けした時点でとりあえずキーが反応するのか確かめました。
ファームウェアを両方に書き込んで、TRRSケーブルで繋いでusbでPCに繋いでキーを押してみる。。
usbを繋いでいない右側が反応しない…
まじか。どこのはんだが悪かったんだといろいろやり直しました。
ハンダ吸い取り線で穴にめっちゃ押し付けてキースイッチを取り、色々試したんですがどうしても反応しない。
右側単体をusbでつなぐと左側のキーボードとして反応はする。
じゃあTRRSケーブルやジャックの問題だろうとはんだをもりもりしまくる。
でも直らない。
この時間が一番苦痛でした。
原因がわからずとりあえずはんだ付けし直したり、ファームウェアの書き込みが上手く行ってないかもしれないから書き込み直したり、promicroによってはどちらもusbを接続している認識になってしまうからqmk firmwareで#defineの部分を書き足してみたり・・・
それでも直らない。これは原因をはっきりさせるしかない!
そう思ってテスターをamazonランキング一位の1400円と安いものを買いました。
それでTRRTS周りの導通を調べてみると…
TRRSジャックのTIPの部分が導通していない!!
金属板が内側に曲がっていて、端子と接触していないのが原因でした。
ホームセンターで接点賦活剤を買っても、針で端子に近づく方向に曲げようとしても直らない。
じゃあジャックを買うしかないのかと思い、どうせ買うなら思いつきで色々試そうと思いました。
そこで端子に触れないならはんだ盛って端子に触れるようにすればいいじゃん!とやってみました。
直りました。
tipの部分は一番奥で、奥の穴からはんだしやすかったんですよね。
それで導通して、台を作ってキーキャップをはめて完成しました!!!
長かった。
仕事帰りの数時間をすべて費やしてなんとか完成させられました。
そして次はキーマップのカスタマイズ。
まあ一般的なキーボードに近いしそんなにカスタマイズするところはないし、すぐ終わるでしょ、そう思っていました。
しかしそううまくは行きませんでした。
mint60はUS配列のため、日本語配列と認識されるとshift押しながら入力できる記号が一致しないんですよね。
かといってOSの設定を変えるとノートpcの記号の入力が変になる?
じゃあqmk firmwareでカスタマイズすればいいんだ。
ネットで調べるとすでにやっている人がおり、US配列キーボードを用いてosは日本語配列設定のままUS配列の記号を入力するコードを書いてくださっている!
https://github.com/koktoh/jtu_custom_keycodes/tree/master/default
最初はqmk firmwareの使い方がわからず、なんとなくコンパイルしてtoolboxの方で書き込みをしていました。
しかしどうしても反映されない。
そこで
https://docs.qmk.fm/#/ja/keycodes
このチュートリアルをじっくり読みました。
qmk msysのダウンロードやインストールも何故かものすごく時間がかかった気がしますが、まあなんか色々やってできました。
キーマップはこんな感じです。
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, JU_2, KC_3, KC_4, KC_5, JU_6, JU_7, JU_8, JU_9, JU_0, JU_MINS, JU_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JU_LBRC, JU_RBRC, JU_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JU_SCLN, JU_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JU_GRV, KC_UP, KC_RSFT,
KC_LCTL, KC_LALT, KC_LWIN, KC_INT5, KC_SPC, KC_SPC, KC_INT4, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
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_DEL,
RGB_TOG, RGB_M_SW,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_HOME), XXXXXXX,
_______, _______, _______, XXXXXXX, XXXXXXX, KC_0, KC_INT2, _______, KC_HOME, C(KC_END), KC_END
)
};
とりあえずレイヤーは2つから始めてみて、増やしたくなったら増やそうと思います。
変換や無変換はKC_HENKではエラーが出てKC_INT4にしなくちゃいけなかったり、音量調節はrules.mkを少し書き換えないといけなかったり調べるのに時間がかかりました。
ものすごい時間と手間をかけましたが、その分このキーボードに愛着が湧いたような気がします。
まだスタビライザーがカチャカチャうるさかったり、コードが短かったりするので改善したいことが残っているので、これからやっていこうと思います。
ちなみにキースイッチはgateron silent brownです。
(普通の茶軸が売り切れで+2000円課金するしかなかった。)
ledはキーキャップやキースイッチ、黒いアクリル板が透過しにくいためか全然光が見えない・・
矢印キーをいれるために右shiftの長さが犠牲になっているためなれなくてはならない。
もちろんこの文章はmint60で入力しました!!!
qmkのメモ書き
//コンパイルと書き込みをするキーボードとキーマップを指定しておく
qmk config user.keyboard=mint60
qmk config user.keymap=キーマップにつけた名前
//指定しておくと下記のように簡単に書ける
qmk compile
qmk flash
//指定しなくても下記のように実行できる
qmk compile -kb mint60 -km キーマップにつけた名前
qmk flash -kb mint60 -km キーマップにつけた名前
あとコードも一応
※長押しに対応してなかったので新しくコードを書き換えました。
※※結局このコードはやめました。長押しに対応できるキーもあるのですが、どうしても長押しに対応できないキーもあったので微妙だったんですよね。
やっぱりUS配列とJIS配列の壁は高いですね。
けれども解決できました。
それはAX配列です。
別の記事としてまとめておこうと思います。
#include QMK_KEYBOARD_H
#define SPLIT_USB_DETECT
//US layout in Japanese keyboard setting, JU
//https://github.com/koktoh/jtu_custom_keycodes/tree/master/default
//https://docs.qmk.fm/#/ja/keycodes
enum custom_keycodes {
RGBRST = SAFE_RANGE,
JU_2,
JU_6,
JU_7,
JU_8,
JU_9,
JU_0,
JU_MINS,
JU_EQL,
JU_LBRC,
JU_RBRC,
JU_BSLS,
JU_SCLN,
JU_QUOT,
JU_GRV,
JU_CAPS
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, JU_2, KC_3, KC_4, KC_5, JU_6, JU_7, JU_8, JU_9, JU_0, JU_MINS, JU_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JU_LBRC, JU_RBRC, JU_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JU_SCLN, JU_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JU_GRV, KC_UP, KC_RSFT,
KC_LCTL, KC_LALT, KC_LWIN, KC_INT5, KC_SPC, KC_SPC, KC_INT4, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
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_DEL,
RGB_TOG, RGB_M_SW,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_HOME), XXXXXXX,
_______, _______, _______, XXXXXXX, XXXXXXX, KC_0, KC_INT2, _______, KC_HOME, C(KC_END), KC_END
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static bool lshift = false;//ju
static bool rshift = false;//ju
switch (keycode) {
case RGBRST:
#ifdef RGBLIGHT_ENABLE
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
}
#endif
break;
//JU
case JU_2:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LBRC);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_2);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_LBRC);
} else {
unregister_code(KC_2);
}
}
return false;
case JU_6:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_EQL);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_6);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_EQL);
} else {
unregister_code(KC_6);
}
}
return false;
case JU_7:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_6);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_7);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_6);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_7);
}
}
return false;
case JU_8:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_QUOT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_8);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_QUOT);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_8);
}
}
return false;
case JU_9:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_8);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_9);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_8);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_9);
}
}
return false;
case JU_0:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_9);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_0);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_9);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_0);
}
}
return false;
case JU_MINS:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_INT1);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_MINS);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_INT1);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_MINS);
}
}
return false;
case JU_EQL:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_SCLN);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_MINS);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_SCLN);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_MINS);
unregister_code(KC_LSFT);
}
}
return false;
case JU_LBRC:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_RBRC);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_RBRC);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_RBRC);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_RBRC);
}
}
return false;
case JU_RBRC:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_NUHS);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_NUHS);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_NUHS);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_NUHS);
}
}
return false;
case JU_BSLS:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_INT3);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_INT1);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_INT3);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_INT1);
}
}
return false;
case JU_SCLN:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_QUOT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_SCLN);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_QUOT);
} else {
unregister_code(KC_SCLN);
}
}
return false;
case JU_QUOT:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_2);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_7);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_2);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_7);
unregister_code(KC_LSFT);
}
}
return false;
case JU_GRV:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_EQL);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_LBRC);
}
} else {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
unregister_code(KC_EQL);
unregister_code(KC_LSFT);
} else {
unregister_code(KC_LBRC);
unregister_code(KC_LSFT);
}
}
return false;
case JU_CAPS:
if (record->event.pressed) {
register_code(KC_LSFT);
register_code(KC_CAPS);
}else{
unregister_code(KC_CAPS);
unregister_code(KC_LSFT);
}
return false;
}
return true;
}
古い方。長押しに対応してないやつ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
#include QMK_KEYBOARD_H
#define SPLIT_USB_DETECT
//US layout in Japanese keyboard setting, JU
//https://github.com/koktoh/jtu_custom_keycodes/tree/master/default
//https://docs.qmk.fm/#/ja/keycodes
enum custom_keycodes {
RGBRST = SAFE_RANGE,
JU_2,
JU_6,
JU_7,
JU_8,
JU_9,
JU_0,
JU_MINS,
JU_EQL,
JU_LBRC,
JU_RBRC,
JU_BSLS,
JU_SCLN,
JU_QUOT,
JU_GRV,
JU_CAPS
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, JU_2, KC_3, KC_4, KC_5, JU_6, JU_7, JU_8, JU_9, JU_0, JU_MINS, JU_EQL, KC_BSPC,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JU_LBRC, JU_RBRC, JU_BSLS,
MO(1), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, JU_SCLN, JU_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, JU_GRV, KC_UP, KC_RSFT,
KC_LCTL, KC_LALT, KC_LWIN, KC_INT5, KC_SPC, KC_SPC, KC_INT4, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
),
[1] = LAYOUT(
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_DEL,
RGB_TOG, RGB_M_SW,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_7, KC_8, KC_9, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_4, KC_5, KC_6, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
_______, XXXXXXX, XXXXXXX, KC_MUTE, KC_VOLD, KC_VOLU, KC_1, KC_2, KC_3, XXXXXXX, XXXXXXX, XXXXXXX, C(KC_HOME), XXXXXXX,
_______, _______, _______, XXXXXXX, XXXXXXX, KC_0, KC_INT2, _______, KC_HOME, C(KC_END), KC_END
)
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
static bool lshift = false;//ju
static bool rshift = false;//ju
switch (keycode) {
case RGBRST:
#ifdef RGBLIGHT_ENABLE
if (record->event.pressed) {
eeconfig_update_rgblight_default();
rgblight_enable();
}
#endif
break;
//JU
case JU_2:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LBRC);
unregister_code(KC_LBRC);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_2);
unregister_code(KC_2);
}
}
return false;
case JU_6:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_EQL);
unregister_code(KC_EQL);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_6);
unregister_code(KC_6);
}
}
return false;
case JU_7:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_6);
unregister_code(KC_6);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_7);
unregister_code(KC_7);
}
}
return false;
case JU_8:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_QUOT);
unregister_code(KC_QUOT);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_8);
unregister_code(KC_8);
}
}
return false;
case JU_9:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_8);
unregister_code(KC_8);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_9);
unregister_code(KC_9);
}
}
return false;
case JU_0:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_9);
unregister_code(KC_9);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_0);
unregister_code(KC_0);
}
}
return false;
case JU_MINS:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_INT1);
unregister_code(KC_INT1);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_MINS);
unregister_code(KC_MINS);
}
}
return false;
case JU_EQL:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_SCLN);
unregister_code(KC_SCLN);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_MINS);
unregister_code(KC_MINS);
unregister_code(KC_LSFT);
}
}
return false;
case JU_LBRC:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_RBRC);
unregister_code(KC_RBRC);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_RBRC);
unregister_code(KC_RBRC);
}
}
return false;
case JU_RBRC:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_NUHS);
unregister_code(KC_NUHS);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_NUHS);
unregister_code(KC_NUHS);
}
}
return false;
case JU_BSLS:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_INT3);
unregister_code(KC_INT3);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_INT1);
unregister_code(KC_INT1);
}
}
return false;
case JU_SCLN:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_QUOT);
unregister_code(KC_QUOT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_SCLN);
unregister_code(KC_SCLN);
}
}
return false;
case JU_QUOT:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_2);
unregister_code(KC_2);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_7);
unregister_code(KC_7);
unregister_code(KC_LSFT);
}
}
return false;
case JU_GRV:
if (record->event.pressed) {
lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
rshift = keyboard_report->mods & MOD_BIT(KC_RSFT);
if (lshift || rshift) {
if (lshift) unregister_code(KC_LSFT);
if (rshift) unregister_code(KC_RSFT);
register_code(KC_LSFT);
register_code(KC_EQL);
unregister_code(KC_EQL);
unregister_code(KC_LSFT);
if (lshift) register_code(KC_LSFT);
if (rshift) register_code(KC_RSFT);
} else {
register_code(KC_LSFT);
register_code(KC_LBRC);
unregister_code(KC_LBRC);
unregister_code(KC_LSFT);
}
}
return false;
case JU_CAPS:
if (record->event.pressed) {
register_code(KC_LSFT);
register_code(KC_CAPS);
unregister_code(KC_CAPS);
unregister_code(KC_LSFT);
}
return false;
}
return true;
}
コメント
0 件のコメント :
コメントを投稿