初心者によるキーボード自作 ファームウェアビルド編

前回はウェブ上のツールで簡単にファームウェアを作成してみました。
ただ、その方法では細かいカスタマイズができません。

たとえば、QMK Configuratorで作成できるRunner3680のファームウェアではキーのタッピング時間(キーを押して離すまでの時間。これで短押しと長押しを判別する)が120ミリ秒になっています。これだと私には短すぎるのでもう少し長くしたいのですが、QMK Configuratorではカスタマイズできないのです。
こういった細かいカスタマイズを行うには自分で環境を整えてビルド(ソースコードからファームウェアを作成)する必要があります。

この記事では環境構築からファームウェア作成・書き込みの手順を紹介します。
キーボードからのコマンド入力で操作することがほとんどなので普段そういった操作をしていない人には敷居が高いと思いますが、実際にやってみると4つのコマンドを実行するだけなので思ったより簡単です。
なお、素人の私がいろいろと調べながらやったものなので間違いがあるかもしれません。その点はご了承を。

作業の流れは以下の通です。

  • ビルド環境の「QMK MSYS」をダウンロードしてインストールする
  • QMK MSYS環境の初期設定を行う
  • QMK Configuratorでキー配列を作成する
  • キー配列をビルド用ファイルに変換する
  • ファームウェアをビルド・書き込む

それではやってみましょう。
最後に私が行ったカスタマイズ(一つだけですが・・・)をご紹介します。

QMK MSYSのダウンロード・インストール

QMK MSYSはキーボードファームウェアのビルド環境です。自作キーボードの作者たちがデータを登録してくれているため、さまざまのキーボードのファームウェアをビルドすることができます。

まずはQMK MSYSのサイトからインストーラをダウンロードします。
https://msys.qmk.fm/ にアクセスして「Latest Version↓」をクリックします(下図)。

次の画面で「QMK_MSYS.exe」をクリックしてこのファイルをダウンロードします。

ダウンロード出来たらこのファイルをダブルクリックしてインストールしてください。インストールには少し時間がかかります。

インストーラの画面その1
「Install drivers」にチェックを入れて「Nest」
インストーラの画面その2
「Install」をクリック
インストーラの画面その3
ここで少し時間がかかります
インストーラの画面その4
インストール完了です

QMK MSYS環境の初期設定

インストールが完了したら、QMK MSYS環境の初期設定を行います。
スタートメニューに「QMK MSYS」という小目ができているはずなので、それをクリックします。
するとQMK MSYSが起動し以下のようなウィンドウが立ち上がります。

QMK MSYSを起動した状態

コマンドプロンプトのような画面ですね。
ここからコマンドを打ち込んで初期設定を進めます。

まずは

qmk setup

と打ち込んでEnterキーを押します。
一番最初にセットアップする際にはドライバーのインストール画面が開くことがあります。その際には特に内容を変更せず次へ次へを進めていってください。

コマンドを打ち込んだ後でEnterキーを押す

すると以下のようにYesかNoかの入力を求めてきます (ディレクトリの文字を一部隠しています。以下の画面キャプチャも同様です) 。
これは、ファームウェアのソースコードをダウンロードしてきますか? という確認です。ソースコードをダウンロードしないとビルドができませんので「y」を入力してEnterキーを押します。

ソースコードをダウンロードするか確認を求められる
当然ダウンロードするので「y」を入力しEnterを押す

するとソースコードをgithubからダウンロードして展開してきます。
これも少し時間がかかります。
これが終わると初期設定は完了です。

初期設定が完了

ソースコードがどこにあるかというと、上の画面の「QMK home」の右側に書いてあるパス(「C:/Users/…」という記述)の場所にソースコードが展開されます。
通常は、「C:\Users\<ユーザ名>\qmk_firmware」です。

ここにある「keyboards」フォルダにはキーボードごとのビルド情報がはいっています。フォルダ内見ると非常に多くのキーボードが登録されているのがわかります。

非常に多くのキーボード情報が入っています

例えば私が作成したRunner3680の5行8列の情報は 「keyboards」フォルダ内の「runner3680/5×8」というパスに入っています。
細かいカスタマイズを行う際には主にココのファイルを編集します。

以上で初期設定は完了です。

自分用のビルド情報を作成する

まずは自分のキー配列用に新しいビルド情報(キーマップ)を作成します。
QMK MSYSのウィンドウに 以下のコマンドを入力・実行します。

qmk new-keymap

すると「Keyboard Name:」と表示され、どのキーボードを使うのか入力を求められます。
ここでビルドしたいキーボードのフォルダのパスを、このkeyboardsフォルダ以下のパスで記入します(「/」〔スラッシュ〕区切りのパスで記入します)。私のキーボードの場合は以下のように入力しEnterを押します。

runner3680/5x8

今度は「Keymap Name:」と表示され、新しく作成するキー配列の名前を求められます。
ここは任意の名前でよいので、

kanepee_1st_keymap

とでも入力しEnterを押します。
これで完了です。
新しいビルド情報が作られた場所は画面に表示されています。

新しいキー配列のビルド情報が作成された

この例では

C:/Users/*******/qmk _firmware/keyboards/runner3680/5x8/keymaps/kanepee_1st_keymap

に作成されたことが分かります(一部伏字)。
カスタマイズを行う際にはココのファイルを編集することになります。

QMK Configuratorでキー配置を作成する

これは前回の記事の内容そのままです。
ダウンロードしたJSON形式のファイルを使用してファームウェアのビルドを庫内ます。
もちろん、キー配列のファイルを作成することも可能ですが、QMK Configuratorを使用するほうがはるかに楽です。

キー配列をビルド用ファイルに変換する

それではいよいよビルドしてきます。
QMK Configuratorでキー配列を作成した場合はひと手間ありますが、大した手間ではありません。

QMK Configuratorで作成したキー配列をキーマップのソースコードに反映させます。
QMK ConfiguratorからダウンロードしたJSON形式のファイルではビルドを行うことができないためこれを変換する処理です。JSON形式ファイルを、先ほどのファームウェアのフォルダ(おそらく「C:\Users\<ユーザ名>\qmk_firmware」)にコピーします。
そうしたら、QMK MSYSのウィンドウに以下のようにコマンドを入力・実行します(すべて1行で入力します)。

qmk json2c -o qmk_firmware/keyboards/runner3680/5x8/keymaps/kanepee_1st_keymap/keymap.c qmk_firmware/runner3680_kanepee.json

「keyboards/runner3680/5×8/keymaps/kanepee_1st_keymap/keymap.c」は先ほど作成したフォルダのパスの最後に「keymap.c」をくっつけたものです。「keymap.c」はビルドで使用するキーマップのソースコードファイルでファイル名は固定で「keymap.c」です。また「runner3680_kanepee.json」はダウンロードしたJSON形式のファイル名です。
この処理はすぐに終わります。

JSON形式からビルドできるソースコードへの変換

ちなみに変換された「keymap.c」のファイルは以下のような内容になっています。

#include QMK_KEYBOARD_H


/* THIS FILE WAS GENERATED!
 *
 * This file was generated by qmk json2c. You may or may not want to
 * edit it directly.
 */

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
	[0] = LAYOUT(KC_NO, KC_F2, 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_NO, KC_F5, 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_NO, KC_NO, KC_F6, 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_NO, KC_F8, 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_RSFT, KC_NO, KC_NO, KC_F10, KC_ENT, KC_DEL, KC_LGUI, KC_LALT, LT(1,KC_MHEN), KC_SPC, KC_SPC, LT(2,KC_HENK), KC_BSPC, KC_NO, KC_RGUI, KC_NO, KC_NO, KC_DEL),
	[1] = LAYOUT(KC_NO, KC_TRNS, KC_TRNS, 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_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_HOME, KC_UP, KC_END, KC_PGUP, KC_TRNS, KC_P7, KC_P8, KC_P9, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, KC_TRNS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_PSLS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P1, KC_P2, KC_P3, KC_PPLS, KC_PAST, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_P0, KC_P0, KC_PDOT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
	[2] = LAYOUT(KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_END, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_HOME, KC_TRNS, KC_DEL, KC_RGHT, KC_TRNS, KC_BSPC, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_NO, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
};

内容は私も完全にはわかっていないので詳しい説明は省きますが、「LAYOUT」の配列に書かれているのがキー配列です。一番上の行の左の列から順番にカンマ区切りでキーが記載されています。
また「[0]」、「[1]」、「[2]」と書かれていますが、これがレイヤーごとのキー配列を指定しているものです。

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

ここまで来たらあと少しです。
ビルドの実行は以下のコマンドです。

qmk compile -kb runner3680/5x8 -km kanepee_1st_keymap

「-kb」、「-km」の後には作成するキーボードを指定します(前の「自分用のビルド情報を作成する」のところで指定したKeyboard Name, Keymap Nameです)。
するとビルドが進みファームウェアが作成されます。

ファームウェアが作成されました

しばらく文字が流れて行って上の画面になるとファームウェアのビルドが完了です。
作成されたファームウェアは QMK home(おそらく「C:\Users\<ユーザ名>\qmk_firmware」)に保存されています。拡張子が「.hex」もしくは「.bin」のファイルです(作成するキーボードによって異なります)。
私が今回作成したファームウェアはは「runner3680_5x8_kanepee_1st_keymap.hex」という名前で保存されていました。
ちなみに、前回紹介したPro Micro Web Updaterを使用して、このファイルをキーボードに書き込むこともできます。

ファームウェアの書き込みを合わせて行う場合は以下のコマンドを実行します。

 qmk flash -kb runner3680/5x8 -km kanepee_1st_keymap 

文字が流れて行って、しばらくすると以下のように「Waiting for USB serial port – reset your controller now」と表示されキーボードの接続待ち状態になります。

最後の行にUSB接続待ちであることが表示されています

この状態でキーボードを接続し、キーボードのリセットスイッチを押すとファームウェアが書き込まれます。文字が流れて行って以下のようになったら書き込み完了です。

キーボードへのファームウェア書き込みが完了

以上でファームウェア書き込みが完了です。

記事にするととても長いですが、実行したコマンドは以下の4つだけでした。

  • qmk setup
  • qmk new-keymap
  • qmk json2c -o qmk_firmware/keyboards/runner3680/5×8/keymaps/kanepee_1st_keymap/keymap.c qmk_firmware/runner3680_kanepee.json
  • qmk flash -kb runner3680/5×8 -km kanepee_1st_keymap

やってみると意外と簡単です。

さらに、上記の下2つのコマンドはまとめることができます(多分)。

qmk flash -kb runner3680/5x8 -km kanepee_1st_keymap qmk_firmware/runner3680_kanepee.json

で完了です。

キー配列を変更する場合は「QMK Configuratorでキー配置を作成する」以降をやるだけでOKです。
また、新たなキーボードを作成した際のファームウェア作成は「自分用のビルド情報を作成する」 以降でOKです。

ちょっとしたカスタマイズ

さて、私がやったカスタマイズは、一番最初に書いたタッピング時間に関するものです。
私は「無変換」キーでレイヤー変更する設定にしていますが、「無変換」キーの短押しでは「無変換」キーとして動作してほしいです。
もちろんそういった動作になるのですが、ビルド情報内の「TAPPING_TERM」という項目で指定された120ミリ秒以内にキーを離さないと短押しとして認識されません。ちょっと長く押していると期待した動作にならないためこれを変更したいと思いました。

いろいろ調べていると、キーを押した後に他のキーが押されない場合は短押しと判断する、という設定が可能であることが分かりました。
これは「RETRO_TAPPING」という項目を定義すればよいだけです。

これらはqmk_firmware内のソースコードを変更することで反映できます。
今回の変更は「keyboards/runner3680/5×8」のフォルダ内の「config.h」というファイルを編集します。

config.hの中身

一つ目のマーカー部分が「TAPPING_TERM」を定義している行です。120と書いてあるので120ミリ秒が指定されていることになります。
二つ目のマーカー部分が今回追加した「RETRO_TAPPING」の定義です。この一行を追加するだけです。
これを保存してビルド・書き込みすることで無事、期待通りの動作をするようになりました。
他にもいろいろとカスタマイズできると思いますが、今のところは満足して使っています。

これでファームウェアのビルド環境構築~ファームウェア書き込み・カスタマイズの記事は終わりです。
長い記事ですがご覧いただきありがとうございました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です