自作キーボードのあれやこれや
目次
きっかけ
最近、テレワークが多くなってきて、自宅環境での作業が多くなってきてからというもの、作業場の改善というかこだわりたくなってきた。
具体的には、テレカンのためのカメラやマイクの位置とか、ケーブリングとか、ディスプレイの数や大きさとか、プライベートと仕事の環境分離とか、開発環境とか。
そして、特に入出力デバイスについてはこだわりを持ちたいと思っている。
自作キーボードを作りたい
ここ1年のことの話にはなるが、マウスやキーボードを買いまくっている。
マウスだとELECOM
キーボードだと、logicool
あとはRedragonとか
ROYAL KLUDGEとか
あとは、マクロキーボード。

いろいろ欲が出てくるもので、あれもこれもポチポチしていたらこんな結果に。
ただこうだったらいいなみたいな、欲も出てきてついにキーボードを自作してみたいなという想いが募ってきた。
そう思い始めてきたのも、先日購入したRaspberry Pi Picoがキーボードのコントローラになることが分かっていたので、これはやるっきゃないと思い立ったわけ。

思い立ったが吉日
早速、作ってみたいという欲求に駆られたので、作りたいときが作り時とばかりにググってみる。
すると1から全部作ることもできるらしいのだが、先ずは何が必要かを一覧にしてみる。
材料
- マイコン(ここではRaspberry Pi Pico)
- 基板
- キー数分の以下のパーツ
- ダイオード
- キースイッチ
- キーソケット
- キートップ
- LED(オプション)
- ゴム足(オプション)
- キーボードケース
- ねじ
- USBケーブル(ここでは MicroUSB typeA <-> USB typeA)
道具
- はんだ
- はんだごて
- こて台
- ニッパー
- ドライバー
- テスター
- ラジオペンチ
- PC(開発環境&試験環境)
こんなところかな?
電気工作を苦ではない人たちには、めちゃくちゃ簡単に作れる。
そもそもキーボードの仕組みが単純で、制御はラズパイに任せられるので、非常に簡便にカスタマイズできるので自作キーボード製作初心者の私でもとっつきやすい。
さてやってみようではないか。
ということで

いってみよう。
やってみよう。
キーボードできた暁には、やーったやったたった、で・き・たーって踊ることとする。
理想
まずはどんなのが欲しいのか。
キーボードの理想を描く。
- 61キーぐらいのコンパクトなやつ
- 英語配列
- 数字キーより上にキーは要らない
- Enterキーより右にキーは要らない
- Aの左は絶対Ctrl
- 矢印キーは出来ればほしい
- できればBluetoothのマルチ接続
- 出来れば控えめに光ってほしい
- 有線接続時のコネクタはできればUSB typeC
このくらいかな。
この前、左右セパレートタイプのやつを触ったときも非常に心地よかったのだが、完全なタッチタイピングが出来ないのでイライラしそうで止めた。
これが取り敢えずの理想。
これを自作できたらとりあえず嬉しいかな。
でも、最初からこのスペックはかなりハードルが高いので、先ずは試しにもっとコンパクトで簡単なやつを作ってみる。
出先でササッと出してパチパチできるコンパクトなのあったら何かと便利だと思うので、多分。
トランジスタなBodyも磨けば光りだすってね。

30キー
さて、自作キーボードの登竜門でありメッカである遊舎工房とTALP KEYBOARDを覗いてみたところ、かなりたくさんの種類の自作キーボードがある。
まずは何においてもキーボードの基板が全てのベースになってくるので選定は大事。
そこでよさそうなのを調べてみたら、Gherkin for RPPという基板が見つかった。
キー数は30キーで私がほしいものの半分、テストにはもってこい。
このキーボード専用ケースの3Dプリンタデータを公開されている方がいらっしゃっるので、こちらを使うのも手。
あとは、
こんな感じいけそうだな。
Picoは前に買っていて引き出しの奥に眠っているので、それ以外のものを調達することとする。
Ima get them all except rpp.
調達
ボス「もちろん装備は現地調達だ。」
スネーク「梅澤無線に行ってくる。」

札幌は梅澤ぐらいしかないので、、、いや、流石にコロナの関係でそういうのは憚られる時期なのでネットで調達。
ただ、キーボードケースだけは3Dプリンタがないとダメだな、、って探したらDMM.makeというのを見つけた。
このサイトにレンダリングデータをアップロードして、成形する素材を選んで見積依頼するとすぐに金額を出してくれるので、その場でクレジット決済もでき、そのまま製作までしてくれるというめちゃくちゃ便利なサービス。
他にもこんなサービスあるのかもしれないけど、探していないのでよくわからない。

組み上げ
さて物がすべて届いたら、組み上げてみる。
基板にハンデ付けするのは、ダイオードとキーソケット。
それと、もう他に流用することもないので、今回はラズパイと基板はハンデで固定してしまった。
そこまでの様子がこちら。

- キーソケットとダイオードをはんだ付け
- Picoをはんだ付け
- キースイッチを差し込む

- ブランクキーキャップをつけたとこ

- DMM.makeのケースをつける
- シリコンシートを底面につける(ゴム足と同じ効果)
これで一応ハード的な組み上げが出来た。
導通チェック
テスター使ってちゃんとハンダ付が出来ているか確認する。
I Don’t Like Mondays.の曲に合わせる(あ、今のBGMね)かのように、合いの手か声援のようにテスターでピーピー言わす。
うん、大丈夫そうだ。
ここ結構大事。
キーソケットというのはこんなにスカスカなんだっけ。
ちょっとした衝撃でスイッチが抜けてしまう。
本来はキャップとスイッチの間にカバーを入れるべきなんだろうな。
最初だからいいかいかイルカ、ハッ、るるるるるるるる。

開発環境構築
さて、ここからはソフト的な環境構築をしていく。
コントローラであるラズパイPicoにファームウェアを書き込む必要があるのだが、その環境を準備する必要があるのでそちらをサラッと紹介。
まずはRaspberry Pi Picoの仕組みとしては、起動にはファームウェアをインストールする必要がある。
インストールするには、本体にあるタクトスイッチを押しながら、PCとUSB接続することで、ファームウェアインストールモードになる。
PCがWindowsの場合はDドライブみたいなかたちでマウントされるので、そこのルートディレクトリにファームウェア(ここではuf2)ファイルを置くと自動的にファームウェアが起動される。
で、ここから大事。
ファームウェアの作り方が2種類あって、どちらも試してみた。
- QMK Firmware
- PRK Firmware
まずはQMKの方から。
QMK編
基本的にはこちらのSelf-Make Keyboards in Japanさんの記事を参考にしている。
ただ上記のサイトはrp2040対応をベースに紹介されているので、上記の記事の最後の方でも説明されているとおりカスタマイズが必要だと思う。
作業はWindows 11でWSL2を使っている。
ま、紹介するまでもないのでちゃちゃっと。
python3
gitとpython3がインストールされていれば以下のコマンドは不要。
sudo apt-get update |
QMK
QMKとは主にキーボード用のファームウェアをビルドできる環境であり、以下を実行すると準備が完了する。
python3 -m pip install qmk |
pico-sdk
pico-sdkはRaspberry Pi PicoのSDKでCやC++などで開発するためのプログラミング環境である。
以下の通り実行する。
cd ~ |
QMK Firmware
ファームウェアのソース群。rp2040対応版。
こちらをgithubから頂く。
cd ~ |
ビルド
pipi_gherkinというキーボードのタイプが今回の対象。
ソース群は、QMK Firmwareの下にpipi_gherkinというのがあるのだが、こちらを使ってビルドしてみる。
$ cd ~ |
このソース一覧を使う。
一度何も変更せずにビルドしていく。
cd ~ |
出来上がったuf2ファイルを先述のインストール手順でコピペすると勝手に再起動されてUSBキーボード(HID)として認識されるはずなので、メモ帳とか起動して、パチパチしてみると。

いやいや、こんな指増やすほどキーないから。
動作チェック
全キー認識できているかを確認して入力テスト終わり。
次にケーブルを抜き差ししても問題なく認識されるか、別のPCに挿しても認識されるかを確認して動作チェック終わり。
ちなみに、このキーボードはキー数が少ないので少し癖のあるカブトムシ仕様である。
キーアサインは以下の通り。
| Normal | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Q | W | E | R | T | Y | U | I | O | P |
| A | S | D | F | G | H | J | K | L | ESC |
| Z | X | C | V | BS | SPC | B | N | M | Ent |
で、3行目のキーがそれぞれメタキーになっており、長押しで別のキーとして認識する。
長押しすると、
| Macro Keys | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Q | W | E | R | T | Y | U | I | O | P |
| A | S | D | F | G | H | J | K | L | ESC |
| Ctrl | Alt | FN3 | FN4 | FN2 | FN1 | FN5 | ALT | Ctrl | Shift |
こんな感じになる。
FN1~FN5はキーマップを動的に変更するキーになっており、例えばFN2を押し続けている間は以下のキーマップになる。
| FN2 | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 |
| DEL | FN2 |
なので、SPACE押しながらQって押すと1が入力されるって仕組み。
ちなみに:(コロン)は、V押しながらL。
-(ハイフン、ダッシュ)は、C押しながらY。
覚えるのが面倒かも。
でも、慣れたら最強になってくれるのかも。
そのタイピング音に耳を傾けて深い安らぎに酔いしれることができるのだろうか。

いろいろ問題が
Linuxターミナルでパチパチしようと思ったら、TABキー、ESCキー、Backspaceキー、Ctrlキー、SPACEバーをかなり多様するんだけど、このキーボードだとかなり苦戦しそう。
例えば
LANG=C find . -maxdepth 3 -type f -name "*.js" -mtime +3 -exec ls -l --full-time {} \; |awk '{"echo -n $(basename "$9")"|getline f; print f,$6,$7,$9;}' |sort |sed -e "s/\.[0-9]\{9\}//;s/^[^ ]* //" |tee /tmp/result.txt |
このくらいの長さのコマンドを画面の前で考えながら打っているので、これと同程度のことを新しいキーボードでタッチタイピングできるためにはかなり練習しないと。
あと決定的なのが、CtrlがZのところに割り当てわれているので、Ctrl + Zができない。
ということは、LinuxでProcessをStopさせることができないし、WindowsでUndoができない。
あとは、普段キーアサインを変更してCtrl ⇔ Capsとしているため、かなり使いづらさがある。
リビルド準備
ということで、現在のキーマップから変更できるかを試す。
現行ソースは以下の通り。
下のLAYOUT_ortho_3x10の引数がキーに当たる。
これを下の変更してちゃんと反映されるかを行ってみる。
qmk_firmware/keyboards/40percentclub/pipi_gherkin/keymaps/default/keymap.c
|
行った変更は以下の通り。
| Normal | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Q | W | E | R | T | Y | U | I | O | P |
| A | S | D | F | G | H | J | K | L | Enter |
| Ctrl | Z/Alt | X/FN3 | C/FN4 | V/FN2 | SPC/FN1 | B/FN5 | N/Alt | M/Ctrl | BS/Shift |
うーんこれでも若干打ちづらいけど仕方ないかな。
あと、USBコネクタをキーボードの右側に置きたいので、上下反転させることにした。
変更箇所は以下の通り。
qmk_firmware/keyboards/40percentclub/pipi_gherkin/config.h
|
リビルド
以下の通り。
$ cd ~ |
ちゃんとできているようなので、新しいファームウェアをコピーする。
キーボードのBOOTSELボタンを長押ししながらケーブルを接続する。
上記uf2ファイルをRPI-RP2ドライブにコピーしたら完了。
キーボードパチパチしてみる。大丈夫そうだ。
ちょっと慣れるまで時間がかかりそうだ。
でも、まぁ、完成したことに満足していたりする。
次は別の方法としてRubyによるファームウェア構築を紹介。
PRK編
さっきのQMKはCで作るファームウェアなのに対し、このPRKはRubyでうごくFirmware。
こちらも開発環境を用意してみる。
前のQMKはキーマップのソースを変更した結果はビルドしてuf2ファイルを作ってコピーして適用しないと分からなかった。
ま、Cのプログラムなので当然なのだが、対してこちらのPRKは一味違っていてuf2の更新は一度だけ。
その後はkeymap.rbを更新するだけでよい。
なんと便利な時代になったものだな。
思えば遠くへ来たもんだ。

開発環境を用意して、一からビルドしてもよいのだが、先の通りキーマップのファイルだけを更新するだけでよく、githubにファームウェアも公開されているので、今回はありがたく使用させていただくこととする。
今回は、prk_firmware-0.9.17-20220806-df5f361.uf2を使用する。
インストール
このファームウェアをRPI-RP2ドライブにコピーする。
するってーと、ファームウェアがインストールされリブートして、RPKFirmwareというドライブが自動的に出てくる。
で、ここにkeymap.rbをコピーしてケーブル挿しなおすと自動的にそのRubyファイルを解釈してくれてキーマップが適用されるという便利仕様。
で、このkeymap.rbというのは以下の場所に公開されている。
https://github.com/picoruby/prk_pipigherkin
$ cd ~ |
keymap.rbの中身はこんな感じ。
#Initialize a Keyboard |
こんな感じ。キーマップを可視化したらこんな感じ。
| PRK | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Q | W | E | R | T | Y | U | I | O | P |
| A | S | D | F | G | H | J | K | L | BS |
| Z/Shift | X/WIN | C/ALT | V/CTRL | SPC/lower | Enter/raise | B/CTRL | N/ALT | M/WIN | _/Shift |
なかなか面白いキーマップ。
これはこれでとても便利な仕組み。
ただ、なぜか私のキーボードでは誤動作(特にメタキーを設定した3段目で)を繰り返すので、運用は出来なかった。
最後に
ま、兎にも角にも目的のことができたので踊ることとする。