キーボードファームウェアの中でも機能豊富なQMK Firmwareと、安価で高性能なMCUであるRP2040を使ったキーボードを作ってみます。
いきなりフルキーボードは大変なので、9キーのマクロパッドにします。
マイコンボードはRP2040-Zeroを使用します。
今回は電子部品のはんだづけが必要になります。
上記材料の他、ニッパー等の道具を必要に応じて用意してください。
RP2040-Zeroにはピンがついておらず、そのままではブレッドボードに刺せないので、ピンヘッダーをはんだ付けします。
9ピン×左右にはんだ付けするので、ピンヘッダーを2つ用意します。
GP09~GP13は今回使わないので、ピンヘッダーは省略します。
先にピンヘッダーをブレッドボードに刺します。
脚が短いほうが上になるようにします。
ピンヘッダーの上にRP2040-Zeroを乗せます。
RP2040-Zeroのスルーホールとピンヘッダーの脚をはんだ付けします。
はんだづけが終わったところです。
これでブレッドボードでRP2040-Zeroを動かせるようになりました。
キースイッチの位置を決めるため、キースイッチ台に並べます。
裏面の端子にはんだづけしていくので、キースイッチ台を裏返します。
キーマトリクスの【行】を配線します。
後からはんだ付けするダイオードと通電しないように被膜ワイヤーを使います。
以下の写真のような感じで被膜ワイヤーの両端をカットします。
キースイッチの上側の端子同士を繋ぐようにはんだ付けします。
行方向の配線ができました。
次は【列】方向の配線です。
こんな感じで、ダイオードを通過してから隣の列に流れるように、脚を折り曲げます。
キースイッチの端子から、ダイオードを経由して、隣のダイオードに橋渡しするようにはんだ付けします。
列方向の配線もできました。
キーマトリクスの【列】と【行】をRP2040-Zeroに繋ぎます。
ブレッドボードに繋ぐ必要があるので、基本編でやったようにキースイッチにジャンパーワイヤーをはんだ付けします。
以下の写真は【行】側のジャンパワイヤーをはんだ付けしたところになります。
【列】側はダイオードの脚と繋ぐのでちょっと難しいですが、同じようにジャンパワイヤーの片側をはんだ付けします。
ジャンパワイヤーを繋ぎ終わりました。
ジャンパワイヤーのオス端子をブレッドボードに刺します。
ここでキーボードファームウェアが使用するピンを決めます。
今回は以下のGPIOピンを使うことにします。
【列】のGPIOピン = GP6、GP7、GP8
【行】のGPIOピン = GP27、GP28、GP29
QMKコマンドで、新しいファームウェア用のファイルを作成します。
Ubuntu上の「端末」で、以下のコマンドを実行します。
qmk new-keyboard
新規キーボードを作成する処理が始まるので、必要な情報を入力していきます。
最初は作成するキーボードの名前です。
好きな名前でよいですが、作成されるファイルを格納するディレクトリの名前になるため、半角英数字のみ・小文字のみで名づけるようにしましょう。
入力したらEnterキーを押して確定します。
GitHubのユーザー名を入力します。
普通、キーボードファームウェアのソースはGitHub上で管理されるはず、ということで要求されるようです。
自分のGitHubアカウントがあればその名前を、なければ英語表記の自分の名前でよいです。
入力してEnterで確定します。
名前を入力します。
「Real Name」とありますが、本名ではなくインターネットで使用する名前でよいです。
直前の項目はあくまでGitHubユーザー名なので、こちらが実際の「ファームウェア作成者の名前」になります。
GitHubユーザー名がデフォルトで入っているので、同じでよければそのままEnterを押します。
作成するキーボードのレイアウトを入力します。
キーボードのレイアウト(=キーの並び方)には名前がつけられた定番があるため、該当するものがあればその番号を入力します。
今回は既存レイアウトとは違うオリジナルのキーボードということで、「57. none of the above(上記には無い)」を選びます。
デフォルト値なので、そのままEnterを押します。
ファームウェアを動かすMCUを入力します。
この一覧に出ているMCUであればQMKは対応しているということです。
今回はRP2040で動かしたいので、「36」を入力し、Enterを押します。
「Created a new keyboard called <キーボードの名前>」と出力されれば成功です。
作成されたファイルを確認してみましょう。
左側のパネルの「ファイル」アイコンをクリックし、ファイルマネージャーを起動します。
ホーム > qmk_firmware > keyborads > ceres_9keys
と辿っていきます。
以下のファイル・ディレクトリが揃っていればOKです。
new-keyboardコマンドでファイルを作っただけでは、実際のキーボードにあった動作をするようになっていません。
設定を変更して、9キーで動くようにする必要があります。
先程作った「ceres_9keys」ディレクトリを開きます。
「info.json」を右クリックし、「テキストエディターで開く」をクリックします。
テキストエディターが立ち上がり、「info.json」を開いた状態になります。
以下のように書き換えます。
「VID」と「PID」は、作成したキーボード等を製品として販売するのであれば、正規の手順を踏んで有効な値を取得する必要があります。
今回は試作なので、こちらの記事を参考に「V-USB」が予め取得しているVIDとPIDを使わせてもらいました。
{
"manufacturer": "Ceres Soft",
"keyboard_name": "ceres_9keys",
"maintainer": "Ceres Soft",
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["GP8", "GP7", "GP6"],
"rows": ["GP29", "GP28", "GP27"]
},
"processor": "RP2040",
"url": "",
"usb": {
"device_version": "1.0.0",
"pid": "0x27DB",
"vid": "0x16C0"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2}
]
}
}
}
編集が完了したら「保存」ボタンをクリックし、保存します。
これで、どのMCUで動作し、どのGPIOピンを使うかを設定できました。 テキストエディターを閉じて終了します。
次はキーマップ(=どのキーを押したら何の文字が出るか)を編集します。
keymaps > default
をディレクトリを進み、「keymap.c」をテキストエディターで開きます。
今回はテンキーのように「1」~「9」の数字を打てるよう、以下のように書き換えます。
もし違う文字を打てるようにしたければ、QMK公式ドキュメントのキーコード一覧を参考にアレンジしてみてください。
// Copyright 2023 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/*
* ┌───┬───┬───┐
* │ 7 │ 8 │ 9 │
* ├───┼───┼───┤
* │ 4 │ 5 │ 6 │
* ├───┼───┼───┤
* │ 1 │ 2 │ 3 │
* └───┴───┴───┘
*/
[0] = LAYOUT(
KC_P7, KC_P8, KC_P9,
KC_P4, KC_P5, KC_P6,
KC_P1, KC_P2, KC_P3
)
};
編集が完了したら「保存」ボタンをクリックし、保存します。
テキストエディターを閉じて終了します。
ビルドしたファームウェアを書き込むため、RP2040-ZeroをUbuntuに接続します。
まず、データ通信が可能なUSBケーブルでPCに接続します。
この時、LEDが点灯することを確認します。
点灯しない場合は電力不足やケーブル不調などでうまく接続できていないので、違うUSBポートに繋いだりケーブルを替えたりして調整してください。
問題なく接続できていることを確認したら、RP2040-Zeroの「BOOT」ボタンと「RESET」ボタンを同時に押します。
ボタンを同時押しすると、RP2040はUSBストレージとして認識されるようになります。
ここでVMWareがRP2040を検出し、「新しいUSBデバイスが検出されました」というダイアログを表示します。
ファームウェアを書きこむため、WindowsではなくUbuntuにRP2040を認識させたいので、「仮想マシンに接続」を選択して、「OK」をクリックします。
※ダイアログが出ない場合、RP2040がUSBストレージとして動いていないので、同時押しをやり直すなどしてください。
RP2040をUbuntu側で認識・操作できるようになったので、ファームウェアを書き込みます。
まず、以下のコマンドでファームウェアをコンパイルします。
qmk compile -kb ceres_9keys -km default
コンパイル完了を待ちます。
エラーが出なければ成功です。
生成されたファームウェアをRP2040に書き込みます。
以下のコマンドを実行します。
qmk flash -kb ceres_9keys -km default
「Wrote XXXXX bytes to /media/ceres/RPI-RP2/NEW.UF2」と出れば、ファームウェアの書き込みは成功です。
キーキャップもつけて完成です。
キーを1つずつ押して、意図した文字が入力されるかテストします。
キーマトリクスが正しく動き、1~9の数字が入力されました!
ここまでできれば、あとはキー数をもっと増やして、自由にキーボードを作ることができます。