はじめに

最初の完成後にごちゃごちゃいじり回した記録です。最後の完成はあるのか無いのか。

半田付け不良

キーボードを今回作ったやつに換えて4日後、PC起動後のログインパスワード入力でトラブルが発生しました。何度打っても失敗してばかりです。

数字でつまずいている感じだったので、テンキーで打ってもみましたが、これもどうもおかしい。それよりNumLockのインジケータLEDが効かないので、テンキーが使えるのかどうかも判らないという。起動時にNumLockがONになるよう、UEFIで設定していますが、ログインパスワード入力時はOFFになっていたような……。

無事ログインできた後すぐに終了し、キーボードのネジを外して中を開き、半田付けを確認しました。数字キーとテンキー、それぞれ違う数字2個のキースイッチのコネクタと線が、ポロリと外れました。

半田付けをやり直し、しつこく確認。その後はトラブルもなく使えています。

ATOKの設定変更

論理配列がQWERTYから独自配列になったので、いつも使っている日本語IME「ATOK2017」の設定も変更します。

ATOKのプロパティ(環境設定)から設定

キーカスタマイズ

デフォルトだと、ひらがな(後)変換やカタカナ(後)変換は、CTRLUCTRLIに割り当てられています。QWERTY配列では横に並びますが、うちのは独自配列なので、そのままだとあちこちに飛ぶことになります。

うちので横に並ぶように書き換えるのですが、キー配列を頻繁に変えるので、面倒になって止めました。今は、別レイヤーにひらがな(後)変換のF6、カタカナ(後)変換のF7等を指定しています。ただ、6月24日以降はキー配列が変わっていないので、ATOKでも指定しておこうかなと思っています。

キーカスタマイズ、キーに機能を割り当てたりするのですが、機能の意味がよくわからないものが多いです。ヘルプにもマニュアルにもそこまで詳しいことは書かれておらず。あと操作方法がちょっと古い気がする、というのは最初に使ったATOK2008から感じておりました。

ATOKキーカスタマイズ・イマイチなのでぼかしている

ローマ字カスタマイズ

QWERTY配列キーボードを使っていたときも、「ん」をXで打つなど、いろいろ手を加えていました。今回はさらにカスタマイズをしてみました。

6月22日くらいの状態

「きゃ」「しょ」といった拗音は、多くは子音+YもしくはH+母音で打っていました。これを、子音+右側最上段の数字という2つのキーで打てるよう、設定してみました。

012はよく使う「ゃ」「ゅ」「ょ」が、W状に並ぶ37は「ぁ」~「ぉ」がつく文字が出るようにします。

ローマ字カスタマイズ

ATOKのローマ字カスタマイズで、追加から設定を足していきます。

上記の画像はz+数字の例です。「じゃ」「じゅ」「じょ」等は本来Jを使うところですが、遠い位置にしたため、近くにあるZに割り当てました。「z3」「z5」「z7」の設定がありませんが、「じぁ」「じぅ」「じぉ」という文字はたぶん使わないので省いています。

t+数字はかなりごちゃごちゃしてしまいました。

2020年07月02日追記。数字キーの並びを変更したため、文字の割り当ても変更しました。

t1         ちゃ
t2         ちゅ
t0         ちょ
t3         つぁ
t4         てぃ
t5         とぅ
t6         ちぇ
t7         つぉ

この辺は、使用頻度で決めています。t4は「たぃ」「ちぃ」「つぃ」「てぃ」「とぃ」がありますが、使ったことがあるのは「つぃ」「てぃ」の二つ。「てぃ」はセキュリティやフロンティア、アトランティスなどいろいろ使っているのに対し、「つぃ」はツィオルコフスキーしか使っていませんでした。よって、「てぃ」に決定。

ローマ字カスタマイズの設定のテキスト出力をリンクしておきます。元の文字コードはシフトJISですが、UTF-8に変換しています。→ローマ字カスタマイズの設定

辞書カスタマイズ

これはQWERTY配列キーボードを使っていた頃からの話なのですが、矢印記号を出すのにQを使っています。

右や上と行った方角+Qで打てるよう、オリジナル辞書に設定しています。MIGIQで「→」、UEQで「↑」。

今回キーボードを作る際、Qは母音側で使用頻度がやや低いところに配置しています。

インジケータLED

NumLockCAPSLock、おまけでScrollLockのインジケータLEDが点灯すればいいなあと思っていました。

とりあえず、コントローラのWhat's Next Pinkのピン出力の設定や配線など、ハードウェアの方は作っておきました。問題はソフトウェアの方です。

最初、Keyboard Firmware Builderでファームウェアを作ったときは、LED関係っぽいコードがありました。QMKのデータに変換した際、消されていたのですが、付け足しておきました。ビルドも、このコードによるエラーはなく、書き込みもできましたが、LEDは反応しませんでした。

自作キーボード系のネタは、ブログやTwitterなどチェックしていましたが、装飾用のLEDの話は多いものの、インジケータLEDの話はなかなか見つかりません。QMK Firmwareのkeyboards以下にある膨大な人様の設定を参考にしようかと思いましたが、さっぱり判りません。

どうしたものかと思っていたところ、2020年6月2日だったか3日だったかに、次のツイートを発見。

Pro MicroのLEDをCAPSロック等のステータス表示に使うのはこんな感じかと思います

#自作キーボード

github.com/MakotoKurauchi…

東京ばなないんさんの2020年6月2日のツイートより

ということで、うちの環境に合うよう、keymap.cを書き換えてみました。プログラムのことは判りませんが、とりあえずやってみようと。

#include QMK_KEYBOARD_H
#include "keymap_jp.h"

#define MICRO_LED_NUM D6
#define MICRO_LED_CAP B7
#define MICRO_LED_KNA B6

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
//(キーマップ略)
    ),

};
void matrix_init_user(void) {
  setPinOutput(MICRO_LED_NUM);
  setPinOutput(MICRO_LED_CAP);
  setPinOutput(MICRO_LED_KNA);
}

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinLow(MICRO_LED_NUM);
  } else {
    writePinHigh(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinLow(MICRO_LED_CAP);
  } else {
    writePinHigh(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_KANA)) {
    writePinLow(MICRO_LED_KNA);
  } else {
    writePinHigh(MICRO_LED_KNA);
  }
}

当のkeymap.cはもうないので、今のを一部書き換えて再現

念のため切っていた配線をつなぎ直し、ビルドして書き込むと……、LEDが点灯しました。感激です。ついに点灯しました。しかし何かおかしい。点灯と消灯が逆になってるわこれ。

本当なら、NumLockのLEDが点灯し、CAPSLockとカナキーのは消灯しているはずです。逆になってます。ためしにテンキーを打ってみますが、やはり逆です。

これは弱ったと頭を抱えながらコードをみていると、「Low」「High」という単語が目に入りました。

これ……、逆にしたら点灯パターンも逆になるんと違うやろか。

ということで書き換え。

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinHigh(MICRO_LED_NUM);
  } else {
    writePinLow(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinHigh(MICRO_LED_CAP);
  } else {
    writePinLow(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_KANA)) {
    writePinHigh(MICRO_LED_KNA);
  } else {
    writePinLow(MICRO_LED_KNA);
  }
}

現在の様子(該当部のみ)

LEDが点灯しました。感激です。ついに点灯しました。しかも思っていたとおりのパターンで。これでテンキーが生きているか死んでるか一目でわかるようになりました。情報を公開&紹介してくださった方々に感謝です。

この後、リンク先のコードがシンプルになっていました。ためしに新しい方で書き換えたところ、最初のように点灯が逆パターンになります。シンプル版では「Low」「High」という単語はなく、どう変えればいいか判らないです。前のを知ることができたのは運がよかったのか。

といいますか、そもそも何で点灯が逆になるのかなってのがあるんですが、私には判らないので考えないことにします。私の方で、何か大切なことをやってないから、というのが一番ありそうなのですが。

ただこの時点では、キーに反応するのはNumLockのLEDだけで、CAPSLockとカナキー(その後ScrollLockに変更)のはダメでした。その後ScrollLockのLEDが反応するようになりましたが、#include "led.h"の一行を加えたからかもしれませんし、違うかもしれません。ということで2020年6月28日現在、CAPSLockのLED以外は言うことを聞いてくれるようになりました。

2020年07月03日追記。CAPSLockのLEDにつながる線が外れていたのを発見。半田付けをやり直したところ、SHIFTCAPSLockで点灯と消灯を確認しました。情けなさ過ぎ。

ATOKだとCAPSLock単体で英語入力モードのトグルスイッチになるので、シフトキー無しでも点灯してくれるとうれしいのですが、そういかないのは仕方ないところでしょうか。

とりあえず、うちの環境では3個のインジケータLEDが動くようになりました。

キーマップ変更

この辺は、以下のサイトを始め、様々なサイトを参考にしています。

最初

2020年5月30日(最初)の配置

最初はレイヤーもなく、あっさりした感じでした。母音が左で子音が右の交互打鍵。

実際に使い出すと、物理配置でも論理配置でも使いにくい点が見つかります。押しにくいとか、打鍵の流れが悪いとか。

物理配置の大規模な変更は難しいですが、論理配置ならいろいろ変更できます。ということで、ほぼ毎日キーマップを変更していました。リセットスイッチを表に出していないため、変更するたびに筐体をバラさないといけないのは面倒です。

二週間後にレイヤーを導入したことで、押しにくかった4つのキーを止め、外のキーにまとめました。上記の画像、親指先端のALT無変換、最下段端のCAPSとテンキーのピリオド(p.)が、止めたキーです。

#include QMK_KEYBOARD_H
#include "keymap_jp.h"

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [0] = LAYOUT(
        JP_MHEN, JP_KANA, JP_HENK, KC_ENT,  KC_BSPC, KC_DEL,  KC_PDOT, KC_M,    KC_LEFT, KC_RGHT,
        JP_ZKHK, KC_COMM, KC_DOT,  KC_Y,    KC_R,    KC_N,    KC_G,    KC_P,    JP_CIRC, KC_J,
        KC_ESC,  KC_F,    KC_Z,    KC_K,    KC_T,    KC_H,    KC_B,    JP_AT,   JP_UNDS, KC_9,
        KC_L,    KC_W,    KC_D,    KC_S,    KC_8,    KC_F8,   KC_F7,   KC_F6,   KC_F9,   KC_F10,
        KC_P0,   KC_PCMM, KC_PDOT, KC_PPLS, KC_PMNS, KC_PAST, KC_PSLS, KC_F12,  KC_NLCK,  KC_F4,
        KC_P1,   KC_P2,   KC_P3,   KC_P6,   KC_P9,   KC_F5,   KC_F3,   KC_F2,   KC_F1,   KC_MUTE,
        KC_P4,   KC_P5,   KC_P8,   KC_P7,   KC_0,    KC_1,    KC_2,    KC_3,    KC_5,    KC_PSCR,
        KC_BSLS, KC_MINS, KC_I,    KC_E,    KC_X,    KC_4,    KC_C,    KC_V,    KC_7,    KC_6,
        KC_PGUP, JP_RBRC, JP_LBRC, KC_A,    KC_U,    KC_O,    KC_DOWN, KC_UP,   KC_SLSH, KC_Q,
        KC_PGDN, JP_SCLN, JP_COLN, KC_SPC,  KC_CAPS, KC_HOME, KC_END,           KC_TAB,  KC_LALT,
        KC_LCTL,          KC_LSFT
    ),

};

5月30日頃のkeymap.c(冒頭のコメント略)

2020年6月24日~月末

2020年6月24日~月末の配置

三週間後には、どうも違和感があったので、左右のキーを入れ替えました。子音が左で母音が右。キー配置を最初から覚え直しです。

最下段端のCAPSとテンキーのピリオド(p.)に使っていたキーを復活させ、別のキーを割り当てました。Windowsのショートカットキーで、コピーとペースト、アンドゥとリドゥです。

テンキーにはカンマを割り当てていましたが、うまくいかないので止め。ピリオドに変更し、今までピリオドだったキーにはエンターを割り当てました。この方が使い勝手がいい感じです。

赤文字は別レイヤーで、真ん中下の「OPT.1」「OPT.2」がレイヤーの切り替えキーです。レイヤーは一つなので、どちらも同じレイヤーになります。単独で押せば「英数」「無変換」になります。

右側真ん中あたりの別レイヤーファンクションキーは、ATOKの日英変換や、ひらがなカタカナ変換に使います。

F11の別レイヤーにScrollLockを当てましたが、単にインジケータLEDのテスト目的です。

左上のサーカムフレックス^は、チルダがでるようにし、サーカムフレックス自体は別レイヤーにしました。テキストで数式を書くときのべき乗記号でしか使った事がないので。

#include QMK_KEYBOARD_H
#include "keymap_jp.h"
#include "led.h"

// LED Number
#define MICRO_LED_NUM D6
#define MICRO_LED_CAP B7
#define MICRO_LED_SCR B6

// custom keycode
#define OPT1    LT(_LY1, JP_EISU)
#define OPT2    LT(_LY1, JP_MHEN)
#define OPTC    LCTL(KC_C)
#define OPTV    LCTL(KC_V)
#define OPTZ    LCTL(KC_Z)
#define OPTY    LCTL(KC_Y)

// Layer number
#define _LY0 0
#define _LY1 1

enum custom_keycodes {
  LY0 = SAFE_RANGE,
  LY1,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [_LY0] = LAYOUT(
        XXXXXXX,    OPT2, JP_HENK,  KC_ENT,  KC_TAB,  KC_DEL,    OPTZ,   JP_Q,  KC_LEFT, KC_RGHT,
        JP_ZKHK,  JP_YEN, JP_SLSH, JP_COMM,  JP_DOT,    JP_E,    JP_X,    JP_6,    JP_7,    JP_5,
         KC_ESC, JP_LBRC, JP_RBRC,    JP_A,    JP_I,    JP_O,    JP_4,    JP_3,    JP_2,    JP_1,
          JP_AT, JP_UNDS,  KC_SPC,    JP_U,    JP_0,   KC_F8,   KC_F7,   KC_F6,   KC_F9,  KC_F10,
          KC_P0, KC_PDOT, KC_PENT, KC_PPLS, KC_PMNS, KC_PAST, KC_PSLS,  KC_F12,  KC_F11,   KC_F4,
          KC_P1,   KC_P2,   KC_P3,   KC_P6,   KC_P9,   KC_F5,   KC_F3,   KC_F2,   KC_F1, KC_MUTE,
          KC_P4,   KC_P5,   KC_P8,   KC_P7,    JP_9,    JP_8, JP_MINS, JP_TILD,    JP_J, KC_PSCR,
           JP_W,    JP_G,    JP_R,    JP_M,    JP_N,    JP_P,    JP_H,    JP_C,    JP_V,    JP_L,
        KC_PGUP,    JP_Y,    JP_D,    JP_K,    JP_T,    JP_S,   KC_UP, KC_DOWN,    JP_F, JP_SCLN,
        KC_PGDN,    JP_B,    JP_Z, JP_COLN,    OPTC, KC_LALT, KC_BSPC,             OPT1, XXXXXXX,
        KC_LCTL,          KC_LSFT
    ),

    [_LY1] = LAYOUT(
        XXXXXXX, _______, XXXXXXX, XXXXXXX, KC_PDOT,  XXXXXXX,    OPTY, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,    KC_F9,  KC_F10, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX,   KC_F6,   KC_F7,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
          KC_F2,   KC_F3,   KC_F4, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, KC_SLCK, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_NLCK,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, JP_CIRC, XXXXXXX, XXXXXXX,
        XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
        KC_HOME, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,  XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
         KC_END, XXXXXXX, XXXXXXX, XXXXXXX,    OPTV,  XXXXXXX, XXXXXXX,          _______, XXXXXXX,
        XXXXXXX,          XXXXXXX
    ),

};

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  return true;
}

void matrix_init_user(void) {
  setPinOutput(MICRO_LED_NUM);
  setPinOutput(MICRO_LED_CAP);
  setPinOutput(MICRO_LED_SCR);
}

void led_set_user(uint8_t usb_led) {
  if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
    writePinHigh(MICRO_LED_NUM);
  } else {
    writePinLow(MICRO_LED_NUM);
  }
  if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
    writePinHigh(MICRO_LED_CAP);
  } else {
    writePinLow(MICRO_LED_CAP);
  }
  if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
    writePinHigh(MICRO_LED_SCR);
  } else {
    writePinLow(MICRO_LED_SCR);
  }
}

6月24日以降のkeymap.c

見よう見まねで、なんとかここまでできました。あとはキーキャップの作り直しですが、入力速度も上げないといけません。

文書更新履歴

2020年07月02日
「ローマ字カスタマイズ」に追記。
2020年06月28日
このページを公開。