特集 - 自作キーボードの作り方(QMK Firmware編)

本格的なキーボードへの道

入門編ではArduinoのHIDサポートを使ったキーボードを作成しましたが、皆さんキーボードづくりを楽しんでいますか?
まだという方は、ぜひ入門編を参考に自作キーボードの作成を試してみてください。

さて、ここではもう少しだけ本格的なキーボードを作成してみたいと思います。

キーマトリクス

GPIOピンが足りない!!

キースイッチの押下を検出するにはキースイッチをGPIOピンに接続して通電を確認すればよいのですが、入門編のように単純にGPIOピンにキースイッチを接続する方法では使用するGPIOピン数は【キースイッチの数】になります。
本格的なキーボードを作成しようとすると一番キースイッチが少ない【60%キーボード】でもキースイッチは61個もあります。
Arduinoなどの多くのマイコンボードはGPIOピンが10ピン前後であることを踏まえると【1キースイッチ=GPIO1ピン】では絶対的にGPIOピンが足りません。
GPIOピン数を増やす方法としては『IOエクスパンダ』というIC部品を追加する方法もありますが、もっと簡単に扱えるキースイッチの数を増やす方法として『キーマトリクス』という方法があります。

キーマトリクスとは

キーマトリクスはGPIOピンを【行】と【列】の2種類に分けて制御することで「行ピン数×列ピン数」のキースイッチを扱えるようにする方法です。
例えばGPIOが10ピンある場合、そのままキースイッチを接続すると10キーが限界ですが、行5ピン、列5ピンとした場合は「5×5=25」のキースイッチが扱えるようになります。

以下がキーマトリクスの回路図になります。
行と列の交点にあるスイッチがキースイッチになります。

1列目のGPIOをHIGHにすると、1列目に接続されている全キースイッチの中で押下されているキースイッチの繋がっている列がHIGHとして検出出来ます。
以下は2行目と4行目が押下されている場合の例になります。

これを2列目、3列目、4列目、5列目と繰り返すことで25個のキースイッチの押下状態が取得できます。

ゴーストとの闘い

先の説明では単純に格子状にキースイッチを繋いでいましたが、実際このような「単純に格子状にキースイッチを繋いだ」場合は「ゴースト」という現象が発生します。
「ゴースト」とは「押していないキースイッチがあたかも押されているかのように検出される」問題のことを言います。

例えば以下のように2行1列目と、2行2列目と3行2列目のキースイッチが押下されている場合を考えます。

この状態で1列目のキースイッチ押下を検出を始めます。
この場合2行目だけ検出できれば良いのですが……

実際は2行2列目のキースイッチが押下されていることにより2行目の電気が2列目に伝わります。
※以下画像の緑線の部分

2列目に伝わった電気が3行2列目のキースイッチが押下されていることにより3行目に伝わります
※以下画像の青線の部分

以上のように電気が伝わることで、実際は押下されていない3行1列目のキースイッチが押されているように見えます。
これが「ゴースト」です。

ゴーストが発生する原因は、2行2列目のキースイッチが押されていることにより2行目に流れている電気が2列目に「逆流」したためです。
キーマトリクスを正しく動作させるにはキースイッチで電気が逆流しないように対策する必要があり、これを実現するのが『ダイオード』(正確には『整流用ダイオード』)という部品になります。

ダイオードは特定の方向にしか電気を流さない部品で以下のようになっています。

キースイッチを接続する時に、このダイオードを経由して列に接続することで行側から列側に電気が逆流することを防ぎます。

ダイオードは『秋月電子通商』といった電子部品を扱う店で購入できる他、『遊舎工房』などのキーボード専門店でもキーボード部品の一種として販売されています。

キーボードのオープンソース

本格的なキーボードを作成しようとすると、先のキーマトリクスの制御を行うプログラム(=スケッチ)を記述しなければなりません。
その他にも本格的なキーボードを作成しようとするとNロールオーバー入力(=複数同時押し)など対応しなければいけないことが色々とあるので、「スケッチを自分で書く」ことがだんだんと難しくなってきます。
このため本格的なキーボードを作成する場合は「オープンソースで開発されているプログラム(=ファームウエア)を使う」方法があります。

ここではオープンソースで開発されているファームウエアを紹介したいと思います。

その前に「ファームウエア」ってなに?

入門編ではArduinoをつかってキーボードを作成しましたが、この時作成したプログラムは「スケッチ」と言いました。
今回は「ファームウエア」というもので「スケッチ」とは少々異なるプログラムになります。

入門編で作成した「スケッチ」は「Arduinoとして動作するファームウエア上で動作するプログラム」です。
つまり「スケッチ」は「ファームウエア」がないと動かないわけですが、なぜこのようになっているかといえば「開発のしやすさ」のためです。
スケッチの入れ替えや、デバッグのサポートなどは、このファームウエアにより対応されています。

今から紹介する「ファームウエア」はこの基本的な部分を差し替えるプログラムになります。
パソコンで例えるならWindowsパソコンにLinuxをインストールするようなもので、万が一書込みに失敗したりすると復旧不可能な状態になることもあるので、細心の注意が必要となります。

QMK Firmware

QMK FirmwareはC言語で記述されているファームウエアです。
オープンソースのキーボードファームウェアの中でも歴史が長く、機能が豊富で、対応するMCUが多いです。
キーボード入力だけでなく、ロータリーエンコーダやLEDの制御にも対応しています。

環境構築と改造がやや難しいですが、長年の開発で培われた豊富な機能は魅力的です。
既存のキーボードキットを作るとなると避けては通れない道ですので、挑戦する価値はあります。

PRK Firmware

PRK FirmwareはRubyで書かれています。
2021年に登場した比較的新しいファームウェアですが、日々開発がなされており自作キーボードに欲しい機能は一通り揃っています。
2023年現在、対応するMPUはRP2040のみです。

必要なファイルをダウンロードしてマイコンボードにコピーするだけでキーボードとして動作するので、導入が簡単です。
改造する場合、Rubyで書かれた動作内容を編集すれば即座に反映されます。
これから新しく自作キーボードのファームウェアを作ろう、という時には有力な選択肢です。

MCUの選定

入門編では簡単に作成するためArduinoを使いましたが、オープンソースのファームウエアを使う場合、ファームウエアが対応している「MCU」を使用する必要があります。
『MCU(Micro Controller Unit)』とは、CPUやメモリ等を1チップ程度にまとめたもので、MCUが同じであれば異なるマイコンボードでもおよそそのまま動作します。
パソコンで言えばIntel CPU同士であればだいたい同じソフトが動作するのとおよそ同じ感じです。

ATMega32u4 (Pro Micro)

Pro Microで使われているMCUが「ATMega32u4」です。
自作キーボードが流行りだした頃は「QMK」がほぼ一強だったため、対応するMCUで、かつ安価なことから、自作キーボードといえばこれが使われてきました。

しかしQMKの対応MCUが増えたことと、近年は値上がりしたためスペックに対してコスパが良いとは言えなくなってきたので、デファクトスタンダードではなくなりつつあるようです。
しかし長年使われているだけあって資料と資産は豊富なので「確実に動く」ものが欲しい場合はこれを選ぶとよいでしょう。

RP2040 (Raspberry Pi Pico)

Raspberry Pi財団が開発したMCUで、Raspberry Pi Picoに搭載されています。
新しいMCUなので、全体的にATMega32u4より性能が高いです。

IoT分野で強いRaspberry Pi財団が作っていることもありMCUの供給が安定している印象があります。
しばらくQMKが対応していなかったためキーボードの制作にはあまり使われていませんでしたが、2022年に対応したことで状況が変わりつつあります。
2023年現在は他のMCUと比べて安価で互換ボードの選択肢も多いので、今から自作キーボードを始めるならこれを使うといいかもしれません。