はじめての自作キーボード、Meishi。
作って満足してたものの、そもそもはパスワード入力用のキーにしたかったんですよ。会社のパスワード、定期更新を強制される上に長文かつ頻繁に入力機会があるんですよね。。。
それをワンタッチで入力できれば素敵じゃないですか。
そんなわけで、今回はMeishiのキーに文字列を割り当てたときのメモをつらつら書いていきます。
※今回のようにキーにパスワードやクレジット情報など、重要な文字列を入れることにはリスクがあります。キーにアクセスできる人なら誰でも、それらの情報にアクセスできるからです。その点を認識した上で、Macrosをご利用ください。
Macrosを使ってみよう
自作キーボードには、QMK Firmwareというオープンソースのファームウェアがよく使われています。Meishiも然りです。
QMK FirmwareのFeaturesを読んでみると、Macrosの項に「1回のキータッチで複数の司令を送る」的なことが書かれています。1つのキーで文字列を入力したいという、僕の要望にピッタリです。
keymap.cの変更
Macrosのページを読みながら、文字列入力の実装をしていきます。
キーの割当を変えるには、keymap.c
を編集します。keymap.c
は下記フォルダに格納されています。
qmk_firmware>keyboards>meishi>default>keymap.c
Meishiの左2つのキーを変更してみるべく、keymap.c
を下記のように変更します。
#include QMK_KEYBOARD_H //Added enum custom_keycodes { COMNUM = SAFE_RANGE, COMPASS }; //Changed const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ COMNUM, COMPASS, LCTL(KC_C), LCTL(KC_V) \ ), }; const uint16_t PROGMEM fn_actions[] = { }; void matrix_init_user(void) { } void matrix_scan_user(void) { } //Changed bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch(keycode){ case COMNUM: if(record->event.pressed){ //pressed SEND_STRING("364364"); } else { //released } break; case COMPASS: if(record->event.pressed){ //pressed SEND_STRING("daishikyuimasugu"); }else{ //released } break; } return true; } void led_set_user(uint8_t usb_led) { }
//Addedの箇所がデフォルトから追加した箇所、//Changedの箇所は、既存の関数や変数から変更した箇所です。
enum
enum custom_keycodes { COMNUM = SAFE_RANGE, COMPASS };
最初に指定しているSAFE_RANGE
はキーコード定義の最後に宣言されているものです。最初にこの値を定義することで、カスタムキーコードが他のものと被らないようになります。キーをカスタムする際の、毎度のお作法のようです。
const uint16_t PROGMEM keymaps...
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [0] = LAYOUT( /* Base */ COMNUM, COMPASS, LCTL(KC_C), LCTL(KC_V) \ ), };
これはキーの配列ですね。enumで定義した2つの変数を割り当てます。後ろ2つはデフォルトのままで、それぞれCtrl+C, Ctrl+Vが割り当てられています。
process_record_user
bool process_record_user(uint16_t keycode, keyrecord_t *record) { switch(keycode){ case COMNUM: if(record->event.pressed){ //pressed SEND_STRING("364364"); } else { //released } break; case COMPASS: if(record->event.pressed){ //pressed SEND_STRING("daishikyuimasugu"); }else{ //released } break; }
キーが押されたときのイベントです。
keycode
の中身に従って、switchで処理を決めていきます。
文字列を入力したい場合はSEND_STRING("文字列")
です。
今回は押されたときの処理しかかいていません。//releasedの箇所に処理を書けば、キーが離れたときの挙動も定義することができます。
Meishiを接続して書き込み
ターミナルを起動しqmk_firmwareフォルダまで移動し、下記コマンドでMeishiにビルドして書き込みます。
make meishi:default:avrdude
途中、案内に従いリセットボタンを押してしばらくしたら、Meishiマクロキーボードの出来上がりです。
結果
無事に文字列の入力ができました。一番左のキーをおすと「364364」、二番目のキーをおすと「daishikyuimasugu」が入力されます。
会社でも無事に入力できました。最初のログイン画面から使えるのは、良いですね。今までも別なマクロキーボードは使っていたのですが、プロファイル読み込みが立ち上がり以降になる関係上、最初のログインパスは手打ちするしかなかったんですよね。
市販のマクロキーボードより小さくなってデスクも広く使えるし、Meishi最高ー!
参考
meishi キット | 遊舎工房
meishiキットの購入先、はじめての1台におすすめです
QMK Firmware
他に割り当てられるキーの情報
Meishi keyboard 組み立て方ガイド - たのしい人生
Meishi作成者様による組み立て方ガイド
enumって何だよ - Qiita
enumよく分からなかったので
QMK : キーマップのカスタマイズ
さらなるカスタマイズを目指して、参考になるページまとめ
こんな記事も書いています
temcee.hatenablog.com
Meishiを実用化したことで、この大きなマクロキーボードはそっとデスクの下で眠りにつきました。