自作キーボード:やさしいファームウェアの作り方
はじめに
私はエンジニアではなく、プログラミングの知識もほとんどありません。そのため、ファームウェアの作成には非常に苦労しました。
自作キーボードに興味を持つ方は、必ずしもエンジニアとは限らないと思います。そこで、この記事では、プログラミング初心者でも理解しやすいように、ファームウェアの作成方法を丁寧に説明していきたいと思います。
対象としている方
エンジニアではない
プログラミングが得意ではない
一体型キーボードを作成している
キーボードが光らない
ロータリーエンコーダーなどを搭載していない
VIAやREMAPの登録は考えていない
Macを使用している(Windowsでも通じる部分はあるかと思います)
ターミナルなど文字だけの画面が怖い
必要なもの・使用するもの
Webブラウザ(Chrome系が望ましい)
ターミナル(最初からMacにインストールされている)
テキストエディター(MicrosoftのVisual Studio Codeがお勧め)
大まかな流れ
環境構築を行う
ファームウェアを作成する
ファームウェアを書き込む
環境構築を行う
Mac上でQMKを動かすためには、まず環境を構築する必要があります。
以下の手順を参考に、環境構築を行ってください。
Homebrewのインストール
Homebrewのサイトに遷移し、インストールするためのコマンドをコピーします。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ターミナルを起動し、コピーしたコマンドをペーストしてEnterキーを押してください。
大量の文字が流れていきますが、これはHomebrewのインストール過程で表示されるメッセージです。問題ありませんので、落ち着いてお待ちください。
大量の文字の流れが止まり、「installed」的なメッセージ(うる覚え)が表示されれば、Homebrewのインストールが完了です。
念のため、インストールの確認コマンドを実行して、正しくインストールされていることを確認しましょう。
確認コマンド:
brew -v
出力例:
Homebrew 4.2.12
QMK CLIのインストール
次に、QMK CLIをインストールしましょう。以下のコマンドをターミナルで実行してください。
コマンド:
brew install qmk/qmk/qmk
QMKのインストール
最後にQMKをインストールします。以下のコマンドをターミナルで実行してください。
コマンド:
qmk setup
これで環境構築は完了です。慣れない画面での作業、お疲れ様でした。
ファームウェアを作成する
ターミナル内でqmk_firmwareフォルダーに移動する
下記のコマンドをターミナルで実行し、qmk_firmwareフォルダーに遷移します。
別の場所に保存した場合は、「cd 保存先の場所」で実行します。
コマンド:
cd qmk_firmware
新しいキーマップを作成する
下記のコマンドをターミナルで実行します。
「xxxx」の部分は作成するキーボードの名前に変更してください(使用できるのは小文字と数字です、、、多分)。
コマンド:
qmk new-keyboard -kb xxxx
例:
qmk new-keyboard -kb test001
コマンドを実行すると質問が表示されます。下記を参考に入力を行いEnterキーを押下してください。
Your GitHub Username?
→GitHubのアカウント名、なければネットで使用している名前を入力Your Real Name?
→ネットで使用している名前を入力Default Layout?
→数字で答えます。オリジナルのレイアウトであれば「62」を入力MCU?
→数字で答えます。Pro Microを使用するのであれば「14」を入力
すべての質問に答えると、qmk_firmwareフォルダ内のkeyboardsフォルダに、入力したキーボードの名前のフォルダが作成されます。
ここで、ターミナルとは一旦お別れです。
info.jsonファイルを編集する
まずは、Keyboard Layout Editorに遷移し、作成したキーボードのレイアウトを再現します(単純化したものでOK)。再現が終わったら、各キーにRowとColの値を入力していきます。
この時、必ず「Row ,(カンマ) Col」の形式で入力します。カンマの代わりにピリオドを使用すると、後でエラーが発生しますので注意してください。
RowとColの値の調べ方
Kicadの回路図を開き、下記のように考えていきます。
SW1の場合:Row 0、Col 0 =「0,0」
SW14の場合:Row 1、Col 1 =「1,1」
SW39の場合:Row 3、Col 4 =「3,4」
Convertする
RowとColの値を入力したら、Keyboard Layout EditorのRaw dataタブ内に表示されている文言を全てコピーし、Convertに遷移します。
Inputの入力フォームにペーストし、Convertボタンを押下すると、Outputに文言が表示されますので、灰色で囲った箇所を全てコピーします。この時、入力フォーム内に全ての文言が表示されていない場合がありますので、スクロールして必ず下までコピーするようにしてください。
自分のキーボードのフォルダ内にあるinfo.jsonファイルを開き、下の画像を参考にペーストします。
よく見ると、文言も違うため下記のように修正します。
"label":"0,0" → "matrix":[0,0]
下の画像のようになればOKです。
次は"matrix_pins"を修正していきます。
Kicadの回路図を開き、Pro Microで使用しているピンを見ていきます。
赤枠で囲った箇所の文言を記入します。Row0であればF4ですので、"rows"にF4と記入します。
上の画像の回路図の場合、全て書き出すと下の画像のようになります。
keymap.cファイルを編集する
もう少しファイルをいじる必要があります、頑張っていきましょう。
自分のキーボードフォルダ→keymapsフォルダ→defaultフォルダ内にあるkeymap.cを編集します。
ここでは、[0] = LAYOUT_ortho_4x4( の箇所を変更していきます。
下の画像では「KC_P7, KC_P8, KC_P9, KS_PSLS,」と書かれていますが、これはキーコードと呼ばれるもので、このキーコードを各キーに設定することで、キーを押下した際に入力される文言が決まります。
例えば、「KC_P7, 」だと「7」が「KC_A」は、「a」が入力されます。
キーコードについてはこちらを参考にしてください。
キーコードの書き方
基本的には「キーコード,(カンマ)」がワンセットで、見やすいようにスペースを入れることが多いです。
[0] = LAYOUTの書き方は割と自由に書かれています。私は、キーのレイアウトがわかるように、下の画像のように記号を含めて入力していますので、参考にしてみてください。
見本:
//,-----------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PMNS,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_LBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, KC_LALT, KC_SPC, KC_LCTL, KC_ENT, KC_PDOT, KC_BSPC, KC_BSPC
//|-----------------------------------------------------------------------------------------------------------'
)
レイヤー機能の設定
レイヤー機能とは、例えば、Fnキーと数字を同時に押下するとF系のキーや、ボリューム調節ができるキーボードがあると思います。これと同じ機能で、単独で押下すると「a」が入力できるのに、レイヤーキーと同時押しをすると「a」ではなく「Enter」になるのがレイヤー機能です。
レイヤーのキーコードはこちらとこちらを参考にして下さい。
レイヤー機能の書き方
下の画像のように先ほど作成したレイヤーをコピペします。
VIA対応などをする場合、最低4レイヤー必要らしいので、使用する予定がなくても4レイヤー登録しておくと後で楽かもしれません。[0] = LAYOUTの[0] の数字を書き換えます。
0始まりですので、1、2、3と変更します。キーコードとキーコードの間にある「 ) 」にカンマをつけます。
最後のレイヤーの「 ) 」にカンマは不要ですので注意して下さい。レイヤーのキーコードを入力します。
レイヤーのキーコードには種類がありますが、ここでは押下している間だけレイヤーが切り替わる「MO」で説明をします。下の画像の15行目に「MO(1)」というキーコードがありますが、これが、レイヤーのキーコードでです。
MO(1)なので、このキーを押すと[1] = LAYOUTに切り替わります。MO(2)にすれば[2] = LAYOUTに切り替わります。
見本:
[0] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PMNS,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_LBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
MO(1), KC_LALT, KC_SPC, KC_LCTL, KC_ENT, KC_PDOT, KC_BSPC, KC_BSPC
//|-----------------------------------------------------------------------------------------------------------'
),
[1] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PMNS,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_LBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, KC_LALT, KC_SPC, KC_LCTL, KC_ENT, KC_PDOT, KC_BSPC, KC_BSPC
//|-----------------------------------------------------------------------------------------------------------'
),
[2] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PMNS,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_LBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, KC_LALT, KC_SPC, KC_LCTL, KC_ENT, KC_PDOT, KC_BSPC, KC_BSPC
//|-----------------------------------------------------------------------------------------------------------'
),
[3] = LAYOUT(
//,-----------------------------------------------------------------------------------------------------------.
KC_ESC, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PMNS,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_LBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RBRC,
//|--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------|
KC_LGUI, KC_LALT, KC_SPC, KC_LCTL, KC_ENT, KC_PDOT, KC_BSPC, KC_BSPC
//|-----------------------------------------------------------------------------------------------------------'
)
};
ファームウェアを書き込む
ファームウェアをコンパイルする
コンパイルとは、、、検索してください。
再び、ターミナルを使用しますが、少しだけなので頑張って下さい。
もしターミナルを閉じたり、別のフォルダに遷移している場合は、下記コマンドを実行し、qmk_firmwareフォルダーに遷移します。
コマンド:
cd qmk_firmware
下記コマンドをターミナルで実行します。
「xxxx」の部分は自分のキーボードの名前になります。
コマンド:
make xxxx
コンパイルが無事に終わると、下記のような文言が表示され、qmk_firmwareフォルダー内に「xxxx_default.hex」というようなファイルが作成されています。
xxxxの部分は自分のキーボード名です。
Creating load file for flashing: .build/test001_default.hex [OK]
Copying test001_default.hex to qmk_firmware folder
ファームウェアを書き込む
もうターミナルの画面を見たくないと思いますので、QMK Toolboxを使用します。
こちらからQMK Toolboxをダウンロードし、インストールして下さい。
Apple シリコン搭載のMacを使用している方は、最新版ではうまく書き込めないため、いくつかのバージョンで試す必要があります。私はM2 Maxを使用していますが、「0.2.1」で書き込みが行えました。
QMK Toolboxのインストールが終わったら、MacとPro Microを繋げ、QMK Toolboxを起動します。
QMK Toolboxが起動したら、Openボタンを押下し、作成したhexファイル(ファームウェア)を読み込み、Auto-flashのチェックボックスにチェックを入れ、キーボードの基板に実装したリセットボタンを押下すると書き込みが始まります。
コンパイル時にエラーになりそうな場所
RowとColの値
例えば:「,(カンマ)」ではなく、「.(ピリオド)」になっているinfo.json
例えば:"label":"0,0" → "matrix":[0,0]の修正方法が間違っている
例えば:"label":"0,0" → "matrix":[0,0]の修正時に必要な文言を消している"matrix_pins"
例えば:記入したピンの数と使用しているピンの数が合わないkeymap.c
例えば:一番最後のキーコードのお尻には「,(カンマ)」は不要です
例えば:最後のレイヤーの「 ) 」にカンマは不要です
おわりに
ファームウェア作成お疲れ様でした!
この記事を書きながらファームウェアを作成しましたが、私の環境では問題なく書き込みまで完了しました。
ファームウェアの知識があまりない私が、試行錯誤しながら書き込みに成功した体験談として、この記事を書かせていただきました。分からない人目線で、誰でも作成できるように分かりやすく書いたつもりです。
そのため、最低限の作成方法のみ記載しており、分割キーボードやLEDの点灯などについては、別途情報収集が必要となります。
また、私の知識不足により、質問への回答は難しいことをご了承ください。
この記事はAkashaを使用して書きました。
この記事が気に入ったらサポートをしてみませんか?