0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

はじめに

本記事は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配列で使えるようになりました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?