Macで Minecraft Java版を遊ぶための専用キーボードが欲しい。

ということで、自作で作ってみた。

Arduino の Pro Micro(ATmega32U4 5V 16MHz) を利用すると、PCにUSB接続してHID キーボードとして認識させることができる。

その Pro Micro のPINにキーボードの基盤(PCB) を設定していわゆる 自作keyboardを作成できる。

su120

PCBは、自由度の高い su120。

PCB上のキーが全て切り離し、再結合可能で好きな形のキーボードをつくるためのプロトタイプにぴったり。 合計128stepのマクロも使えて、これとマウスで快適なマイクラライフを楽しめるはず。

組立

まずは練習として、購入したままの状態で組み立てた。

親切なページがあるので、ここを参考に半田付けと組立を行った。

Minecraft でのキー配置カスタマイズ

通常のキーボードだと、こんな感じの操作になる。

これをsu120の17キー(内2個が拡張キー)で、以下のように割り当てる。

qmx のsetup

mac の場合brewが簡単

bash
brew install qmk/qmk/qmk

数あるキーボード配列から、su120用のbranchを取得

bash
qmk setup e3w2q/qmk_firmware --branch e3w2q

これで、 $HOME/qmk_firmware/keyboards/e3w2q/su120 にデータがinstall される。

default のキーマップを試す

最初にローターリーエンコーダー2つ用に、キーマップ rev1_4knob を利用する。

su120 の片手15キー用の sasami15+2 プログラムをキーボードにプログラムを書き込み

bash
qmk flash -kb e3w2q/su120/rev1_4knob -km default

動作確認して、全部のキーがちゃんと押せるか確認する。 テストはここがお薦め。

Minecraft用のキーマップを作成

Dynamic Macroを有効化

$HOME/qmk_firmware/keyboards/e3w2q/su120/rev1_4knob/rules.mk の先頭行に以下の記述を追加

bash
DYNAMIC_MACRO_ENABLE = yes

Minecraft用キーマップファイルを作成

前述の sasami15+2 をコピーして作る

bash
cd $HOME/qmk_firmware/keyboards/e3w2q/su120/rev1_4knob/keymaps
cp -r sasami15+2 minecraft

好みの問題だけど、Dynamic Macro をシンプルにするためにMacroのnestをしないように、minecraft/config.h に以下の記述を追加

c
#define DYNAMIC_MACRO_NO_NESTING 1

実際のキーマップは、こんな感じ。

mincraft/keymap.c

keymap.c · Gistc
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {

  /* Default Layer
   *  Master Side (USB Cable Connected Side)
   *  ,-------------------------------
   *  |    1    2    3    4   5  XXXX 
   *  |  ESC    q    w    e  MO(1) XXXX
   *  |  MO(1)  a    s    d   f XXXX 
   *  | XXXX  SPC XXXX REC1 REC2 XXXX
   *  | XXXX XXXX XXXX XXXX XXXX XXXX 
   *  `-------------------------------
   *  Slave Side (USB Cable Not Connected Side)
   *  ,-------------------------------
   *  |    6    7    8    9 DEL  XXXX 
   *  | XXXX XXXX XXXX XXXX ENT  XXXX 
   *  | XXXX XXXX XXXX XXXX XXXX XXXX 
   *  | XXXX LSHT XXXX PLY1 PLY2 XXXX 
   *  | XXXX XXXX XXXX XXXX XXXX XXXX 
   *  `-------------------------------
   */

  [0] = LAYOUT( /* Base */ 
    KC_1,     KC_2,     KC_3,     KC_4,     KC_5,    XXXXXXX,  
    KC_ESC,   KC_Q,     KC_W,     KC_E,     MO(1),    XXXXXXX,  
    MO(1),    KC_A,     KC_S,     KC_D,     KC_F,     XXXXXXX,  
    XXXXXXX,  KC_SPC,   XXXXXXX,  DM_REC1,  DM_REC2,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  

    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX   
  ),

  [1] = LAYOUT(
    KC_6,     KC_7,     KC_8,     KC_9,     KC_DEL,   XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  _______,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  KC_ENT,   XXXXXXX,  
    XXXXXXX,  KC_LSHIFT,XXXXXXX,  DM_PLY1,  DM_PLY2,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  

    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  
    XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX,  XXXXXXX   
  ),
};

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

void matrix_init_user(void) {
}

void matrix_scan_user(void) {
}

void led_set_user(uint8_t usb_led) {
}

void encoder_update_user(uint8_t index, bool clockwise) {
    if (index == 0) {
        if (clockwise) {
            tap_code16(KC_RIGHT);
        } else {
            tap_code16(KC_LEFT);
        }
    } else if (index == 1) {
        if (clockwise) {
            tap_code16(KC_DOWN);
        } else {
            tap_code16(KC_UP);
        }
    }
}

/* vi:set ts=4 sw=4 sts=4 ft=sh et: */

compile

bash
qmk compile -kb e3w2q/su120/rev1_4knob -km minecraft

install

bash
qmk flash -kb e3w2q/su120/rev1_4knob -km minecraft

続き