天高工房

キーキャップに印字して遊んだり電子工作して遊んだりしたことを書くかもしれません。

自作キーボードのファームウェアを用意する手段3種類

現状、自作キーボードのファームウェアはQMKがbetterな方法として選択されています。QMKはとても便利なファームウェアですが、以下の2点から非常にハードルが高いものとなっています。

  1. 手元に開発環境を用意して手元でビルドをする必要がある
  2. キーマップの書き換えに若干のC言語の知識が必要である

今回、沼に沈める一策としてnamecard2x4を開発・販売しましたので、現状取りうる方法を紹介したいと思います。

ゆるふわ手段

相対的にゆるふわです。

具体的には、WEB firmware builderを使うという方法です。WEB firmware builderは現在2種類あります。

WEB firmware builderはhexファイルの生成までを行いますので、書き込みに関しては別のツールを使います。現状ではbetterな方法としてQMK toolboxを使います。

QMK configurator

QMK本家が開発・メンテナンスをしている(っぽい)WEB firmware builderです。qmk/qmk_firmware/keyboardに定義されているキーボードはすべて表示されます。

ただし、常にqmk/qmk_firmware/keyboardと同期しているわけではないようです。namecard2x4のキーボード定義がマージされたあと、しばらくはconfiguratorでは選択できませんでした。10/4にマージされ、10/9の時点で反映が確認できましたので、一週間程度見ておけば反映されそうです。

qmk_firmware/keyboards at master · qmk/qmk_firmware · GitHub

できること

キーマップ配列で定義できる範囲のことは可能です*1。JISでは記号の配置が換わりますのでご注意ください。

日本語入力者のコミッターがいたのか、変換無変換など、日本語専用キーも定義されています。

https://docs.qmk.fm/#/keycodes

現状の課題

Work In Progressとある通り、機能が不安定です。

現状できないこととしては、Load default が機能していません。そのため最初は白紙から始める必要があります。 コンソール部下部のExport keymap Import keymap で保存はできるようですので少し作っては書き出して、次回また読み込んで、と運用で対策するしかなさそうです。

Keyboard firmware builder

サードパーティ製のfirmware builderです。githubソースコードは公開されています。

編集は三種類の方法ではじめられます。

  • preset layoutから選ぶ
  • keyboard layout editorで定義したレイアウトを読み込ませる
  • keyboard firmware builder で作成したキーボード定義を読み込ませる

できること

キーマップ配列で定義できる範囲に比べ、アクションの組み合わせによるマクロの定義、はてはcustom quantum functionまで定義できます。 編集できない部分もあるためフル機能が使えるわけではありませんが*2、QMK configuratorに比べると機能数は多いです。

また、設定はキー配列からではなく、キーとキーの間の配線や行/列がそれぞれどのピンと接続しているかから定義をします。

さらにNum LockなどのLEDや、addressable LEDのピン定義も可能です。

現状の課題

知名度が低いのかどうか分かりませんが全然メンテナンスされていないようです。おそらくANSIのキーのみしか定義がなく、KC_LANG系やKC_INT系に対応していないためJISキーボードを定義することはできないです*3

現状だと日本語入力者にとってはmeishiやnamecard2x4のようなサブキーボード向けでしょう。

また、キーボード定義をKeyboard firmware builder向けに作成する必要があるため、キーボード定義者が専用定義ファイルを用意していなければqmk_firmwareを読んで自分で定義する必要があります。ピン配置はqmkのキーボード定義ファイルのうちのconfig.hのどこを見るかを知っていれば難しくはないですが、レイアウトのワイアリングは大変なんじゃないかと思います。

ハードコア手段(QMK本家が推奨する手段)

qmk_firmwareの開発環境を用意して手元でビルドする方法です。

みんな書いてるし省略してもいいよねそのうち書きます。

*1:自分が知ってる範囲では。

*2:自分の知識の範囲。

*3:知識の範囲