自作キーボード設計に挑戦した記録(本格的なのはこれから)


はじめに

これは初めて自作キーボード設計に挑戦したときの記録です。
初めて自作キーボードを行う方への入門のような記事ではなく、ただの自己満足+記録用のページです。

まず何をしたか

いきなり設計をするのは難しいので、はじめに販売されているキーボードの作成から開始しました。
分離型を作ってみたかったので、色々調べた結果、Irisを作成してみることにしました。

PCB(基板)はkeebioのページで注文。PCB以外に各種パーツもついてきます。
ネジやPro Microはついていないので、AliExpress等で発注。全部届くまで1~2か月ぐらいかかりました。

勉強

既存の自作キーボードを作成することで、組み立てはできるようになりましたが、設計は当然ながら分からないので、まずは基板の設計等について勉強を始める。
まずはネットで調べてみたが、最終的には以下の3冊を購入して勉強した。

上の2冊で自作キーボードは設計できるようになるはず。ただし、KiCadの操作方法の記載が薄いので、下の1冊も買って勉強すると設計がスムースになるかと思います。

キーボードレイアウト設計

まずは、キーボードレイアウトを決めます。
いきなりフルキーボードを作成するのは難しいので、10cm x 10cmにすると安く作成できるので10キーの小さなキーボードを作成しました。

以下のサイトでキーボードレイアウトを作成します。

3x3の9キーと、右下にレイヤー切り替えのキーを配置しました。

PCB(基板)設計

KiCadでPCBを設計します。
作成方法等は省略。

ケース(プレート)設計

KiCadから基板をエクスポートし、InkScapeに取り込んでケースを設計します。
今回はアクリルプレートで作成し、PCBの上下をサンドイッチするため、ボトムプレートとトッププレートの2つを設計します。

KiCADで「Dwgs.User」、「Edge.Cuts」、「F.CrtYd」と「Eco2.User」の4つをSVGで出力します。
「ファイル」-「プロット」で製造ファイル出力ダイアログを出力し、先ほどのレイヤーを選択し、「製造ファイル出力」を選択します。

次に出力したSVGファイルをInkScapeで取り込んで編集します。
作成したプレートは以下のようになります。
最終的に発注するためにDXFフォーマットで出力します。

  • トッププレート

  • ボトムプレート

Inkscapeの設定

Inkscapeの設定を開き、「使用する境界枠」に「幾何学的境界枠」を設定する。

「ドキュメントのプロパティ」からグリッドの設定で、グリッドの単位は「mm」に設定し、X/Y方向の間隔を0.1mm程度に設定しておく。

発注

PCB、ケースともにElecrowに発注しました。
アクリルならファイルを持ち込んでレーザー加工するという方法もあるようですが、近くに手頃なお店がなかったので、時間はかかりますがElecrowを利用。

今回は10cm x 10cm用なので送料は高くなりますがPCB、ケース自体は5ドルぐらいで安かった。
たしか1~2週間で届いたはず。

最低発注が5個からなので、PCB、ケースともに5枚ずつ届きました。

アクリルの価格は以下のとおり(2019年12月時点)。

  • 10cm x 10cm x 2mm $5.8
  • 20cm x 20cm x 2mm $16.55
  • 30cm x 30cm x 2mm $37.8

ファームウェア作成

発注している間、作成するキーボードのファームウェアをプログラミングします。

QMK Firmwareというフレームワークを利用し雛型を生成できるので、単純なキーボードであればプログラム自体はほとんどなしで作成できます。

MSYS2をインストール

まずはファームウェアを開発するための環境構築です。MSYS2を以下からダウンロードします。

インストールし、「C:\msys64\msys2.exe」をダブルクリックし起動します。

MSYS2のパッケージを最新へ更新するために以下のコマンドを実行(したはず)

pacman -S git
pacman -Syu
pacman -Su
pacman -S avr-gcc

QMK Firmwareをダウンロード

git clone --recurse-submodules https://github.com/qmk/qmk_firmware.git
cd qmk_firmware
util/qmk_install.sh

Which USB drivers do you want to install?
(A)all - All supported drivers will be installed
(C)onnected - Only drivers for connected keyboards (in bootloader/flashing mode)
              will be installed
(F)force - Like all, but will also override existing drivers for connected
           keyboards
(N)one - No drivers will be installed,
         flashing your keyboard will most likely not work
(A/C/F/N)? F

最後にmsysを再起動する。

テンプレートを生成

$ cd qmk_firmware
$ util/new_keyboard.sh
Generating a new QMK keyboard directory
Keyboard Name: emkee10m
Keyboard Type [avr]:
Your Name: mkyz08

以下のディレクトリが作成される。
keyboards/emkee10m/

ファイルの修正

主に修正するファイルは以下の4つ。

  • keyboard_name.h
  • rules.mk
  • config.h
  • keymaps/default/keymap.c
keyboard_name.h
#define LAYOUT( \
    k00, k01, k02, \
    k10, k11, k12, \
    k20, k21, k22, k23 \
) \
{ \
    { k00, k01, k02, KC_NO }, \
    { k10, k11, k12, KC_NO }, \
    { k20, k21, k22, k23 } \
}
rules.mk
RGBLIGHT_ENABLE = yes        # Enable keyboard RGB underglow
config.h
/* key matrix size */
#define MATRIX_ROWS 3
#define MATRIX_COLS 4

#define MATRIX_ROW_PINS { E6, B4, B5 }
#define MATRIX_COL_PINS { B3, B2, B6, B1 }

#ifdef RGB_DI_PIN
   #define RGBLED_NUM 16
   #define RGBLIGHT_HUE_STEP 8
   #define RGBLIGHT_SAT_STEP 8
   #define RGBLIGHT_VAL_STEP 8
   #define RGBLIGHT_LIMIT_VAL 255 /* The maximum brightness level */
   #define RGBLIGHT_SLEEP  /* If defined, the RGB lighting will be switched off when the host goes to sleep */
// /*== all animations enable ==*/
//   #define RGBLIGHT_ANIMATIONS
// /*== or choose animations ==*/
//   #define RGBLIGHT_EFFECT_BREATHING
   #define RGBLIGHT_EFFECT_RAINBOW_MOOD
//   #define RGBLIGHT_EFFECT_RAINBOW_SWIRL
//   #define RGBLIGHT_EFFECT_SNAKE
//   #define RGBLIGHT_EFFECT_KNIGHT
   #define RGBLIGHT_EFFECT_CHRISTMAS
//   #define RGBLIGHT_EFFECT_STATIC_GRADIENT
//   #define RGBLIGHT_EFFECT_RGB_TEST
//   #define RGBLIGHT_EFFECT_ALTERNATING
// /*== customize breathing effect ==*/
//   /*==== (DEFAULT) use fixed table instead of exp() and sin() ====*/
//   #define RGBLIGHT_BREATHE_TABLE_SIZE 256      // 256(default) or 128 or 64
//   /*==== use exp() and sin() ====*/
//   #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85  // 1 to 2.7
//   #define RGBLIGHT_EFFECT_BREATHE_MAX    255   // 0 to 255
#endif

keymap.c
// Defines names for use in layer keycodes and the keymap
enum layer_names {
    _BASE,
    _FN
};

// Defines the keycodes used by our macros in process_record_user
enum custom_keycodes {
    QMKBEST = SAFE_RANGE,
    QMKURL
};

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
    /* Base */
    [_BASE] = LAYOUT(
        KC_LCTL, KC_DEL, KC_BSPC,
        KC_LSHIFT, KC_UP, KC_ENT,
        KC_LEFT, KC_DOWN, KC_RIGHT, MO(_FN)
    ),
    [_FN] = LAYOUT(
        KC_LCTL, KC_C, KC_V,
        KC_SPC, KC_APPLICATION, KC_RALT,
        RGB_TOG, RGB_MOD, RGB_HUI, KC_TRNS
    )
};

ビルドと書き込み

組み立て後になりますが、自作キーボードを接続し、以下のコマンドでファームウェアのビルドと書き込みが実行されます。

cd ~/firmware/qmk_firmware
make emkee10m:default:avrdude

以下のファイルができる。

.build/emkee10m_default.hex

組み立て

PCBとプレートが届いたら、あとは頑張って組み立てる。
はんだごてなど買わなきゃいけないものが多く、部品もねじとかあらかじめ購入しておく。

ソース

ソースはGitHubに公開しています。ライセンスはMITです。

最後に

最後に現在設計しているキーボード(未完成)です。
分割JISキーボードという既存ではほとんどないので自作中です。

今回使用したソフトウェアとバージョン

  • KiCad 5.1.4
  • Inkscape 0.92.4
  • MSYS
  • QMK Firmware