記事一覧自作キーボードの魅力

基板なしでオリジナル自作キーボードを作ってみた その4 ープログラム編ー

今回は、前回作成した回路図を元に、Pro Microに焼く自作キーボードのソフトを作成していきます。

Windows上でのQMK Firmware環境構築

まずは、最も利用者が多いと思われるWindowsでのQMK Firmwareの環境構築方法を説明していきます。

MacOSやLinuxを利用されている方は、QMK Firmwareの公式ドキュメントをご確認ください。

QMK MSYSのインストール

QMK MSYSというソフトをインストールします。

まずは公式サイトに行き、Latest Versionをクリックします。

その後、QMK_MSYS.exeをダウンロードします。

ダウンロードしたらexeファイルを開き、インストールしてください。

QMKの準備

インストールしたQMK MSYSを起動すると、下のような画面が現れると思います。

まずはQMKをセットアップすために、下の画面のようにqmk setupと入力し、エンターを押します。

そうすると、下の画面のように、QMK Firmwareをローカルにクローンするか聞いてきますので、yを押して、エンターを押します。 (クローンはQMK Firmwareをローカルディスクにクラウドからコピーしてくるイメージです。)

Cloning intoという文字が現れてクローンが始まりますので、しばらく待ちます。

クローンが完了すると、下の画面のようにQMK is ready to goと現れます。

C://Users/(ユーザ名)/の直下にqmk_firmwareというフォルダができていることを確認してください。

必要なソフトのインストール

続いてソフトを作成するのに必要なソフトをインストールしていきます。

QMK MSYSで cd qmk_firmware と入力し、qmk_firmwareのフォルダに移動します。

さらに cd utilと入力し、utilフォルダに移動します。

このutilフォルダにある qmk_install.shというスクリプトをはしらせるために、sh qmk_install.sh と入力します。

しばらくすると必要なソフトがインストールされます。

これでQMK Firmwareの準備は完了です。

新しいキーボードプロジェクトの作成

続いてqmk_firmwareのフォルダの中で、新しいキーボードプロジェクトを作成していきます。

上記の手順でQMK MSYS上で qmk_firmware/utilまで移動します。

そして sh new_keyboard.shと入力します。

新しいキーボードの名前を聞かれますので、お好きな名前を入力します。

ここで入力された名前が、PCに接続した時にPCに認識される名前になります。

ここでは名前を“MyNewKeyboard”として進めます。 今後MyNewKeyboardの部分は、入力された名前に置換してお読みください。

続いてキーボードのタイプが聞かれます。

マイコンにPro Microを使用しているので、デフォルトのavrで大丈夫です。

そのため、ここでは何も入力せずエンターを押します。

最後に製作者の名前を聞かれますので、入力します。

ここでは“MyName”と入力して進めます。

名前を入力すると新しいキーボードプロジェクトが作成されます。

下の画面が表示されれば完了です。

ソフトの作成

無事新しいキーボードプロジェクトが作成されると、qmk_firmware\keyboards\の下に、今回作成したキーボードの名前のフォルダが作成されます。

フォルダの構成は下記のようになっていると思います。

keymaps default keymap.c readme.md config.h info.json MyNewKeyboard.c MyNewKeyboard.h readme.md rules.mk

これらのファイルの中から、必要なファイルを修正していきます。

お好きなテキストエディタを使用して、ファイルを修正していってください。

おすすめのテキストエディタはVS codeです。

rules.mk

Bootloaderの選択を行います。 今回はPro Microを使うので、BOOTLOADER = caterina と入力します。

Bootloader selection

Teensy halfkay

Pro Micro caterina

Atmel DFU atmel-dfu

LUFA DFU lufa-dfu

QMK DFU qmk-dfu

ATmega32A bootloadHID

ATmega328P USBasp

BOOTLOADER = caterina

また私のキーボードのように左右分割型を作成する場合は、このファイルの最後に下記の1行を追加します。

SPLIT_KEYBOARD = yes

config.h

USB Device descriptor parameterに関しては、特に変更する必要がなさそうです。

/* USB Device descriptor parameter */ #define VENDOR_ID 0xFEED #define PRODUCT_ID 0x0000 #define DEVICE_VER 0x0001 #define MANUFACTURER myname #define PRODUCT MyNewKeyboard

key matrix sizeで作成するキーボードの行数と列数を指定してきます。 ここでMATRIX_ROWSでは、左右の行数の合計を指定します。 私のキーボードの場合は左右5行ずつなので、10と指定します。 MATRIX_COLSは左右の列数で大きいほうを指定します。 私のキーボードの場合は右の8列の方が大きいので、8と指定します。 まとめるとこんな形です。

/* key matrix size */ #define MATRIX_ROWS 10 #define MATRIX_COLS 8

MATRIX_ROW_PINSとMATRIX_COL_PINSで使用するPro Microの端子番号を指定していきます。 ここで注意しなくてはいけないのは、Pro Microに印字してある端子番号と、プログラム上の端子番号は異なるということです。 印字の端子番号と、プログラム上の端子番号の関係はこちらに記載があります。 表にまとめるとこんな感じです。

印字されている端子番号 プログラム上の端子番号
2 D1
3 D0
4 D4
5 C6
6 D7
7 E6
8 B4
9 B5
10 B6
16 B2
14 B3
15 B1
A0 F7
A1 F6
A2 F5
A3 F4

これを踏まえて回路図を修正すると下の図のようになります。

プログラム上の端子番号を追記した回路図
プログラム上の端子番号を追記した回路図

まとめると、MATRIX_ROW_PINSとMATRIX_COL_PINSの部分の記述はこのようになります。 左右で列数が異なる場合、MATRIX_COL_PINSは列数が大きいほうの端子番号を記述します。

#define MATRIX_ROW_PINS { C6, D7, E6, B4, B5 } #define MATRIX_COL_PINS { F4, F5, F6, F7, B1, B3, B2, B6 }

DIODE_DIRECTIONはCOL2ROWとします。 上の回路図のようにダイオードは列方向(COL)から行方向(ROW)に向かって配置しているためです。

#define DIODE_DIRECTION COL2ROW

SOFT_SERIAL_PINはPro Miciroのおうちを使用するため、D2とします。

#define SOFT_SERIAL_PIN D2

MyNewKeyboard.h

define LAYOUTの部分を変更していきます。

私のキーボードの場合はこのようになります。

#define LAYOUT(
L00, L01, L02, L03, L04, L05, R00, R01, R02, R03, R04, R05, R06, R07,
L10, L11, L12, L13, L14, L15, R10, R11, R12, R13, R14, R15, R16, R17,
L20, L21, L22, L23, L24, L25, R20, R21, R22, R23, R24, R25, R26, R27,
L30, L31, L32, L33, L34, L35, R30, R31, R32, R33, R34, R35, R36, R37,
L40, L41, L42, L43, L44, L45, R40, R41, R42, R43, R44, R45, R46, R47
)
{
{ L00, L01, L02, L03, L04, L05},
{ L10, L11, L12, L13, L14, L15},
{ L20, L21, L22, L23, L24, L25},
{ L30, L31, L32, L33, L34, L35},
{ L40, L41, L42, L43, L44, L45},
{ R00, R01, R02, R03, R04, R05, R06, R07 },
{ R10, R11, R12, R13, R14, R15, R16, R17 },
{ R20, R21, R22, R23, R24, R25, R26, R27 },
{ R30, R31, R32, R33, R34, R35, R36, R37 },
{ R40, R41, R42, R43, R44, R45, R46, R47 }
}

上半分はキースイッチと同じ数だけ変数を宣言します。 私の場合はL01やR30のように、LまたはR + 行数(04) + 列数(Lの場合05、Rの場合0~7)という命名規則で、変数宣言を行いました。 理論上、変数の宣言はランダムで行ってもよいですが、実際に作成するキーボードと同じ配置にしておいた方が、コードが見やすいと思います。

下半分では、上半分で宣言した変数の実際の物理配置を定義していきます。 ここで重要なのは、左右分割型の場合、主となる側の行ごとに{ }で括って記述するということです。 QMK Firmwareはデフォルトは左側が主なので、左側の1行目から記述を始め、左側の最後の行の次に右側の1行目を書くという形になります。

keymap.c

最後にキーマップを設定します。

keymap.cをみると、下記のようなコードがあると思います。

= LAYOUT( KC_A, KC_1, MO(_FN), KC_TAB, KC_SPC ), = LAYOUT( QMKBEST, QMKURL, _______, RESET, XXXXXXX )

まずはベースのレイヤー(通常のキーマップ)を記述していきます。 私のキーボードの場合は、下記の通りです。

/* Base */

= LAYOUT( KC_GRV, 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_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_ESC, LALT(KC_GRV), KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, 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_BSLS, KC_UP, KC_RSFT, MO(_FN), KC_LCTL, KC_LGUI, KC_LALT, KC_DEL, KC_SPC, KC_ENT, KC_BSPC, KC_LGUI, KC_PSCR, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT ),

ここでは左右分離型のキーボードであっても、左右をつなげた順番で記載すれば問題ありません。

続いて左下のFNキーを押した時のレイヤーを記載します。

FNキーを押した状態でも、通常と同じキーを割り当てたい場合は、_______と入力します。(アンダーバー5つです。)

= LAYOUT( KC_ESC, 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_7, KC_8, KC_9, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_4, KC_5, KC_6, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_1, KC_2, KC_3, _______, _______, KC_PGUP, _______, _______, _______, _______, _______, _______, _______, _______, KC_0, KC_DOT, _______, _______, KC_HOME, KC_PGDN, KC_END )

以上でソフトの変更は終了です。お疲れ様でした。

最後にビルドして確認する

ソフトの作成が完了したらビルドして、エラーがないか確認します。

QMK MSYSを立ち上げ、qmk_firmwareのディレクトリに移動し、下記のコマンドを打ち込みます。

make MyNewKeyboard:default

しばらくしてすべての項目がOKになっていれば、ビルド完了です。お疲れさまでした!

エラーが出た場合は、エラーメッセージを参照して修正してください。

記事が長くなってしまったので、下記2つの追加情報は別記事にまとめさせていただきます。

  1. 空白キーを作りたい場合
  2. JIS配列のキーを追加したい場合。

最後まで読んでくださりありがとうございます。

次回はついに最後の組み立て編になります。