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

QMK Firmware + RP2040でマクロパッドを作る

キーボードファームウェアの中でも機能豊富なQMK Firmwareと、安価で高性能なMCUであるRP2040を使ったキーボードを作ってみます。
いきなりフルキーボードは大変なので、9キーのマクロパッドにします。
マイコンボードはRP2040-Zeroを使用します。

用意するもの

今回は電子部品のはんだづけが必要になります。
上記材料の他、ニッパー等の道具を必要に応じて用意してください。

RP2040-Zeroをブレッドボードに繋げる

RP2040-Zeroにはピンがついておらず、そのままではブレッドボードに刺せないので、ピンヘッダーをはんだ付けします。
9ピン×左右にはんだ付けするので、ピンヘッダーを2つ用意します。
GP09~GP13は今回使わないので、ピンヘッダーは省略します。

先にピンヘッダーをブレッドボードに刺します。
脚が短いほうが上になるようにします。

ピンヘッダーの上にRP2040-Zeroを乗せます。

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です。

9キーのファームウェアに改造する

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の数字が入力されました!
ここまでできれば、あとはキー数をもっと増やして、自由にキーボードを作ることができます。