RP2040で自作キーボードを作る その1 ブレッドボードでワンキーボードを作ってみた
はじめに
自作キーボードの設計をしたい!ので、まずは以下のことをやってみることにした。
- RP2040=Raspberry Pi Picoを使ってみる
- QMK Firmwareをビルドして書き込んでみる
- ブレッドボードで簡単なキーボード=ワンキーボードを作ってみる
背景
Nuphyのキーボードを購入して、やっぱりメカニカルキーボードはいいなー、キーマップのカスタマイズも楽しい!となったので、そういえば自分はハードウェア設計もやったことあるわけだし、自作キーボードに手を出してみるかーと思ったのがきっかけ。
さっそく調べると、有名なのが以下の同人誌。
自作キーボード設計入門
自作キーボード設計入門2
これらを読んでがぜんやる気になった。
まずは自作キーボード設計入門2にあるように、ワンキーのキーボードを動かしてみるのに挑戦しよう。
せっかくだから今後潰しが効きそうなRaspberry Pi PicoことRP2040を使ってみよう、というのが今回のきっかけ。
まず知っておくこと
自作キーボード
キーボード自作において、制御の方針としては大きく2つあります。
- 自分でファームウェアを実装する
- 既存のファームウェアをカスタマイズする
現在は2が主流のよう。制御上の諸々が考慮されているのはもちろん、キーレイアウトの変更ツールもこれ要に様々あったりするので、2でやるのが早い美味い安い。
1については、こちらの連載が始まったようなので、気になる方はチェック。[1]
ラズパイPicoで始める自作キーボード入門 | PIOで4×4キーパッドを制御
QMK Firmware
そんな叡智の詰まったファームウェアがQMK。
C言語で実装されているけど、最近は設定がjsonになったりとそれほど苦労はしないはず。
類似で他にもKMKとかRMKとか別言語で実装しているものもあるけど、QMKがスタンダード。
このファームウェアの中に自作キーボードを定義して、ビルドすればマイコンに書き込む用のファイルを作成してくれる。
先人たちに感謝して使わせていただく。
RP2040
いわゆるRaspberry Pi Pico。というか、PicoのためにRaspberry PiがリリースしたマイコンがRP2040。
自作キーボード界隈ではProMicroというマイコンボードが主流(だった)ようだけど、USBコネクタがもげやすいという話もあり、今後他の用途でRaspberry Pi Picoシリーズはお世話になるかもと思い、RP2040を選択。
QMKはRP2040にも正式対応しているので、利用は簡単。
ちなみにRP2040を搭載したマイコンボードはRaspberry Pi公式以外でも出ているので、安いものを買えば良い。自分も今回は互換ボードを使った。
結論、どうすると最後まで行けたか
多少紆余曲折というか、本の情報やネット上の記事と最新のQMK Firmwareの構成が合っていなく、遠回りをしてしまったけど、結論は以下。
環境
以下の環境での前提。ネット上ではMacやLinuxでの例が多かった・・・
- Windows11
- WSL2
- Raspberri Pi Pico 互換ボード
QMK
まずQMKの環境を作り、手元でビルドできる状態にする。
QMK公式のチュートリアルでは、WindowsではQMK MSYS2を使うように書いてあるが、
QMK WSLというWSLのディストリビューションの位置づけのものがあるので、WSL環境があるのであればこちらのほうがビルドが早くクリーン(な気がする。Windows環境汚さないので[2])。
ただし、QMK公式チュートリアルから直接のリンクがなく、最新のメンテナンスが2024年1月なので、今後もサポートされるのかは不明・・・
ちなみに、チュートリアルではインストール後に qmk setup
を実行するように書かれているが、QMK WSLではqmk-admin
を実行するようにとなっていて、一抹の気持ち悪さはある。
きれいな環境が良いという人はQMK WSLを、公式な方法に乗っかったほうがスッキリという人はQMK MSYSを入れるといいかと。
構築とビルド
こちらの記事が最新のQMK Firmwareに沿っていてわかりやすかった。
QMK Firmwareで自作キーボードのファームウェアをイチから書く
もしくは公式チュートリアルを見ましょう。
一応箇条書きすると以下のステップ
- 自分のキーボードを初期セットアップする。ディレクトリが作られる
- ディレクトリ内の
keyboard.json
とkeymap.c
をいじる -
qmk compile
する
RP2040への書き込み
様々なネット上の情報があったが、結論、RP2040の場合は書き込みツール(QMK Toolbox)とかは不要。
qmk compile
すると、[キーボード名]_[キーマップ名].uf2
というファイルが出来ているので、これをRP2040にコピーするだけ。
まずはエクスプローラでWSL環境内のファイルにアクセスする。エクスプローラのパス欄に\\wsl.localhost\
でアクセスできる。
その中のQMKフォルダが、QMK WSLのディストリビューション。
RP2040を初期化モードで起動する。
すでにUSB-Cで接続しているなら、基板上のBOOTSELボタンを押しながらRESETボタンを押す、もしくはBOOTSELボタンを押しながらUSB-CでPCはに接続する。
自動でWindowsにマウントされるので、開いたフォルダにuf2ファイルを置くと、自動でファームウェアが取り込まれてPicoが再起動される。
反応が無い場合は、ビルド設定が間違っているかも。
うまくいっていれば、キーを押すとWindows側でキー入力がされるはず!
実装とコード
自分の環境では、タクトスイッチを一つ、5番ピンにつなぎ、GNDとつないた。
keyboard.json
とkeymap.c
は、以下のようにした。(当該部分だけ抜き出し)
"matrix_pins": {
"direct": [["GP5"]]
},
"processor": "RP2040",
"url": "",
"usb": {
"device_version": "1.0.0",
"pid": "0x0000",
"vid": "0xFEED"
},
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0}
]
}
}
[0] = LAYOUT(
KC_A
)
わかりづらかったところ・・・
keyboard.josn
はかつてはinfo.json
という名前だったので、情報を検索するときはそちらも参照すると良いです。
また、keymap.c
はkeymap.json
に変換することもできるとの記述もあり、jsonの情報がヒットしたりもして混乱するけど、キーマップ部分は変わらないので気にしなくていい。
それから、keyboard.json
のmatrix_pins
は配線の、layout
は見た目の設定です。
見た目というのは、オンラインのレイアウトエディタ等で扱うときに必要になるもので、お試し時点では適当で良いです。
ちゃんとレイアウトするときは、レイアウトエディタでファイルを作成することになるので、これまた直接の編集としては気にしなくて良いと思います。
keymap.c
の方は、ボタンとキー入力の対応表です。初期設定として入れておく必要がありますが、結局あとで色々いじることになると思うので、神経質にならず、まずは何かしらを入れておけばよいかと。
おわりに
画面にAが出るだけでこんなに達成感があるとは・・・!という感じです。
情報が古かったりして調べるのに時間がかかったり、いらないツールを入れたり消したりして無駄に時間がかかりましたが、終わって整理してみればめちゃくちゃ簡単にキーボードのファームウェアが用意できることが理解できました。
情報が古いというより、QMKの進化が早く、積極的なアップデートがあるということなので、この盛況な状況は嬉しいですね!
次はハードウェアの設計の方に入るので、これまた楽しみです!
Discussion