Directpinな分割キーボードを作った備忘録
今回分割キーボードを初めて作成したのですが、その際に躓いたところなどを備忘録として残そうと思います。
QMKについてあまり深い知識がないため、この記事についての正確性は保証できませんのでご了承ください。
また、今回ファームウェア作成の際にこちらの記事が非常に大きな助けになりました。ありがとうございます。
本文中で参考URLと表記した場合は、上記の記事のことを指します。
前提条件
RP2040を使用
Super mini RP2040というRP2040zeroの互換基板を使用しています。
この基板はピン配置がRP2040zeroと同じですが、表面実装基板が上面に集約されており下面がフラットなため、端面スルーホールによる表面実装がしやすいです。
Directpin(ダイオード不使用)
自作キーボードにおいては、ダイオードを入れてキーマトリクスを組むのが一般的です。
これはMCUのピン数に対してキー数が多いために必要になるのですが、今回作成するキーボードでは片手12キーしかないため、RP2040zeroであってもダイオードなしで組めます。
Directpinでは、各キースイッチはMCUのGPIOとGND間に接続します。
RP2040zeroは基板の端面に20個のGPIOが出ており、そのうち2ピンは左右間の通信に使用するため、片手で18キーまではDirectpinで組めるはずです。
左右間の通信方式は全二重
左右間の基板を4極のケーブルを使用して、
・5Vー5V
・GNDーGND
・GP0(TX)ーGP1(RX)
・GP1(RX)ーGP0(TX)
を接続しています。
どうやら設定によってはTXとRXには別のGPIOが使えるようなのですが、特別な理由がない限りはGP0とGP1を使っておけばよさそうです。
装飾品類(LED、OLED)や特殊スイッチ類(ロータリーエンコーダ、ジョイスティック)は無し
このあたりの部品をまだ使ったことがありません。
ジョイスティックとかトラックボールとかはいつか実装してみたいなとは思っていますが、LEDとかは好みじゃないのでこの先も使わなさそう。
これらがついているときにファームウェアがどうなるかはよくわかりません。
作った基板
Directpinで基板を作る際には、背面をすべてGNDベタ塗りするのが配線が簡単でおすすめです。
ピン配置を適切にすればビア無しでいけます。
ファームウェアの作成
QMKでファームウェアを作成します。
参考URLと全く同じになる箇所については省略します。
rules.mkの編集
config.hの編集
halconf.hの追加
mcuconf.hの追加
上記の4つについては、参考URLのままなのでそちらを参照してください。
info.jsonの編集
{
"manufacturer": "mato",
"keyboard_name": "spdirect",
"maintainer": "mato",
"bootloader": "rp2040",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"direct": [
["GP7", "GP5", "GP15", "GP27", "GP29", "GP8", "GP6", "GP14", "GP26", "GP28", "GP4", "GP3"]
]
},
"processor": "RP2040",
"url": "",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"split": {
"enabled": true,
"matrix_pins": {
"right": {
"direct": [
["GP3", "GP5", "GP7", "GP27", "GP15", "GP4", "GP6", "GP8", "GP26", "GP14", "GP29", "GP28"]
]
}
}
},
"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": [0, 3], "x": 3, "y": 0 },
{ "matrix": [0, 4], "x": 4, "y": 0 },
{ "matrix": [0, 5], "x": 0, "y": 1 },
{ "matrix": [0, 6], "x": 1, "y": 1 },
{ "matrix": [0, 7], "x": 2, "y": 1 },
{ "matrix": [0, 8], "x": 3, "y": 1 },
{ "matrix": [0, 9], "x": 4, "y": 1 },
{ "matrix": [0, 10], "x": 3, "y": 3 },
{ "matrix": [0, 11], "x": 4, "y": 3 },
{ "matrix": [1, 0], "x": 6, "y": 0 },
{ "matrix": [1, 1], "x": 7, "y": 0 },
{ "matrix": [1, 2], "x": 8, "y": 0 },
{ "matrix": [1, 3], "x": 9, "y": 0 },
{ "matrix": [1, 4], "x": 10, "y": 0 },
{ "matrix": [1, 5], "x": 6, "y": 1 },
{ "matrix": [1, 6], "x": 7, "y": 1 },
{ "matrix": [1, 7], "x": 8, "y": 1 },
{ "matrix": [1, 8], "x": 9, "y": 1 },
{ "matrix": [1, 9], "x": 10, "y": 1 },
{ "matrix": [1, 10], "x": 6, "y": 3 },
{ "matrix": [1, 11], "x": 7, "y": 3 }
]
}
}
}
参考URLのものからの変更点は以下の通りです。
diode_directionタグの削除
matrix_pinsタグ内をdirectで記述
splitタグ内に「"enabled": true」を追加
matrix_pinsタグ内のdirectでのピン指定については、複数行での記述方法がよくわからなかったため1行で記述しています。
この記述をしたときのmatrixはおそらくこうなります。
このままだとkeymapの指定がややこしくなってしまうため、以下を追加します。
(キーボード名).cの追加
#include "spdirect.h"
includeするヘッダファイルもキーボード名に合わせてください。
(キーボード名).hの追加
#pragma once
#include "quantum.h"
#define LAYOUT( \
L00, L01, L02, L03, L04, R00, R01, R02, R03, R04, \
L05, L06, L07, L08, L09, R05, R06, R07, R08, R09, \
L10, L11, R10, R11 \
) { \
{ L00, L01, L02, L03, L04, L05, L06, L07, L08, L09, L10, L11 }, \
{ R00, R01, R02, R03, R04, R05, R06, R07, R08, R09, R10, R11 } \
}
keymap.cで指定しやすいキー配列順となるように入れ替えています。
keymap.cの編集
ここは一体型キーボードと同じなので特筆することはありません。
完成品
…はまだできてないので後で写真を貼ります。
基板は届いたのであとは組むだけ!
最後に
Directpinでの分割キーボードの作例が見つけられなくてちょっと試行錯誤したので、誰かの参考になれば幸いです。
この方法でできるキーボードは36キーが最大なはずなので(※)、あわよくば省キーのキーボードを作る人&使う人が増えればいいなと思っています。
※ラズピコ使えば25*2で50キーまではいけちゃうけど、そのキー数ならダイオード使ってキーマトリクス組む人のほうが多そう。
もし質問等ありましたら、私のtwitter(@mato_kb)までお声掛けください。