2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Alt ControllerでHHKB JPをJIS設定のままUS配列で使う

Last updated at Posted at 2020-02-11

はじめに

本記事はHappy Hacking Keyboard Professional JP (日本語配列) PD-KB420Bに、HHKB Alt Controllerを換装し、QMKを使ってJIS設定のままUS配列で使う方法のメモです。ちなみに、USキーボードを使わないのは、英数(無変換)かな(変換)が捨てがたいからです。

すでにAlt Controllerは換装済みとします。Alt Controllerについては、Alternative Controller for HHKBのススメが詳しいです。

QMKの準備

Getting Started - QMK Firmwareを参考に、qmkの環境をセットアップします。セットアップでcloneしたqmk_firmwareに移動し、HHKBのjpキーマップを今回作成する新たなキーマップus_jpにコピーします。

cp -r keyboards/hhkb/keymaps/jp keyboards/hhkb/keymaps/us_jp

この時点で、ビルドできるか確認します。

make hhkb:us_jp

ビルドが通らない場合は、Getting Started - QMK Firmwareに戻り、環境セットアップを見直してください。

キーマップの設定

keyboards/hhkb/keymaps/us_jp/keymap.cを以下のように書き変えます。
JIS配列とUS配列で異なるキーに、カスタムキーコードを割り当て、process_record_user()内で、置き換え処理をしています。

また、以下の設定にしています。

  • 右AltでJIS配列とUS配列のトグル
  • バッククォート/チルダはJISの]/}のキーに配置
#include QMK_KEYBOARD_H
#include "keymap_jp.h"

enum keymap_layer {
    KM_US = 0,
    KM_JIS,
    KM_FN,
};

enum custom_keycodes {
    CS_2 = SAFE_RANGE,
    CS_6,
    CS_7,
    CS_8,
    CS_9,
    CS_0,
    CS_MINS,
    CS_EQL,
    CS_SCLN,
    CS_QUOT,
    CS_GRV,
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    [KM_US] = LAYOUT_JP(
        KC_ESC, KC_1, CS_2, KC_3, KC_4, KC_5, CS_6, CS_7, CS_8, CS_9, CS_0, CS_MINS, CS_EQL, JP_YEN, KC_BSPC,
        KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, JP_LBRC, JP_RBRC,
        KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, CS_SCLN, CS_QUOT, CS_GRV, KC_ENT,
        KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_UP, KC_RSFT,
        MO(KM_FN), KC_ZKHK, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_HENK, KC_KANA, TO(KM_JIS), MO(KM_FN), KC_LEFT, KC_DOWN, KC_RGHT),

    [KM_JIS] = LAYOUT_JP(
        KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_JYEN, KC_BSPC,
        KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC,
        KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_BSLS, KC_ENT,
        KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_UP, KC_RSFT,
        MO(KM_FN), KC_ZKHK, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_HENK, KC_KANA, TO(KM_US), MO(KM_FN), KC_LEFT, KC_DOWN, KC_RGHT),

    [KM_FN] = LAYOUT_JP(
        KC_PWR, 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_INS, KC_DEL,
        KC_CAPS, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_SLCK, KC_PAUS, KC_UP, _______,
        _______, KC_VOLD, KC_VOLU, KC_MUTE, KC_PWR, _______, KC_PAST, KC_PSLS, KC_HOME, KC_PGUP, KC_LEFT, KC_RGHT, _______, KC_PENT,
        _______, _______, _______, _______, _______, _______, KC_PPLS, KC_PMNS, KC_END, KC_PGDN, KC_DOWN, _______, _______, _______,
        _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
};

const macro_t *action_get_macro(keyrecord_t *record, uint8_t macro_id, uint8_t opt)
{
    return MACRO_NONE;
}

void tap_cs(bool lshift, uint16_t kc, uint16_t kc_shift) {
  if (lshift) {
    unregister_code(KC_LSFT);
    tap_code16(kc);
    register_code(KC_LSFT);
  } else {
    tap_code16(kc_shift);
  }
}

bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  static bool lshift = false;
  lshift = keyboard_report->mods & MOD_BIT(KC_LSFT);
  switch (keycode) {
    case CS_2:
      if (record->event.pressed) {
        tap_cs(lshift, JP_AT, KC_2);
      }
      return false; // Skip all further processing of this key
    case CS_6:
      if (record->event.pressed) {
        tap_cs(lshift, JP_CIRC, KC_6);
      }
      return false; // Skip all further processing of this key
    case CS_7:
      if (record->event.pressed) {
        tap_cs(lshift, JP_AMPR, KC_7);
      }
      return false; // Skip all further processing of this key
    case CS_8:
      if (record->event.pressed) {
        tap_cs(lshift, JP_ASTR, KC_8);
      }
      return false; // Skip all further processing of this key
    case CS_9:
      if (record->event.pressed) {
        tap_cs(lshift, JP_LPRN, KC_9);
      }
      return false; // Skip all further processing of this key
    case CS_0:
      if (record->event.pressed) {
        tap_cs(lshift, JP_RPRN, KC_0);
      }
      return false; // Skip all further processing of this key
    case CS_MINS:
      if (record->event.pressed) {
        tap_cs(lshift, JP_UNDS, JP_MINS);
      }
      return false; // Skip all further processing of this key
    case CS_EQL:
      if (record->event.pressed) {
        tap_cs(lshift, JP_PLUS, JP_EQL);
      }
      return false; // Skip all further processing of this key
    case CS_SCLN:
      if (record->event.pressed) {
        tap_cs(lshift, JP_COLN, JP_SCLN);
      }
      return false; // Skip all further processing of this key
    case CS_QUOT:
      if (record->event.pressed) {
        tap_cs(lshift, JP_DQT, JP_QUOT);
      }
      return false; // Skip all further processing of this key
    case CS_GRV:
      if (record->event.pressed) {
        tap_cs(lshift, JP_TILD, JP_GRV);
      }
      return false; // Skip all further processing of this key
    default:
      return true; // Process all other keycodes normally
  }
}

ファームウェアのビルドと書き込み

keymap.cを変更したので、再びビルドします。

make hhkb:us_jp

HHKBを接続し、Alt Controllerの赤ボタンを押して、以下のコマンドでファームウェアを書き込みます。

make hhkb:us_jp:flash

以上で、HHKB JPがUS配列で使えるようになりました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?