⌨️

Raspberry Pi Picoでキーボードを自作してみた。

2022/03/21に公開

この記事は以下内容を記述するもの

  • RaspberryPi Picoを使ったキーボードを自作した
  • ProMicro互換機で自作キーボードを作る事との差異(分かる範囲で)

RaspberryPi Picoを使ったキーボードを自作した

こんなの。

公開URL

MachiaWorks/picobd: 30% (close to 40%) keyboard using Raspberry Pi Pico.
https://github.com/MachiaWorks/picobd

オープンソースで公開中。

開発経緯

以下の要素を満たすキーボード(PCB)を求めていたため作ることにした。

  • 単純な構成で作れるPCB
    初学者の学習用にマイコンボード・ダイオード・キースイッチがあれば動くような形にする。
    よって表面実装等は不要な構成とする。
    また、自分が表面実装に関するノウハウをあまり持っていないことにも起因する。
  • 小型(30-40%程度)のキーボード
    自作キーボードの特徴的な部分として60%以下のキーボードが存在すると考えているので、その美味しい部分をすぐに味わえるようにする。
    ただ現状探してみても、コンパクトにするためAVR/STM32マイコンを表面実装しているものが多く、準備が困難なものも多い(後述)
  • 各人が発注できるように基板の設計を公開予定にする
  • 現状すぐ手に入るMCUで作れるようにする
    今世界的にAVR・STM32が不足している状態。
    一例を挙げると、キーボードでよく使われるProMicro(互換)ボードが不足、もしくは価格が高騰している。ProMicroで使われているMCU(ATMega32u4)も同様の状況で、マイコンボードとMCUが同価格程度というわけのわからない状態になっている。
    よって、まだ割と市場に出回ってるMCU・RP2040を使えるキーボードを選択した。
    ただ、RP2040を採用しているキーボードは数が少ないため、作例を増やす目的作ってみることにした。
  • 標準的なマイコンボードを使って作れるキーボード
    RaspberryPi財団標準のボードになるため、販売終息等ですぐ市場から消えないであろうと考える。
  • 単純な配線設計にする
    他のProMicro使ったキーボードの設計を見ると、結構無理のある位置にProMicroを装備しているのもあって、なんとかRaspberry Pi Picoを込み入った位置に置かない構成にできないかと考えた。
    また、難しい構成に挑んだ際の成否の確認が困難で出費が1回あたり1万円くらい飛ぶのは痛いので、できる限り失敗を少なくするよう、配線の確認が容易な設計にする。
    (デザインルールチェッカー等で簡易的に確認は可能だが、それも限度がある)
  • マイコンボード本体のスイッチを押せるようにする
    Raspberry Pi PicoやRP2040マイコンボードの場合、本体にスイッチが入ってるのがほとんど(場合によってはそのためにピンを省略している)なため、スイッチを手元で押せるような構成にしておく。

参考にしたもの(持ってないのがほとんどだけど)

Relic

Founder's Edition Relic PCB – MechVault
https://mechvault.net/products/founders-edition-relic-pcb

見かけの形は参考にした。
ただ、そもそもの開発経緯のひとつが「標準的なマイコンを利用する」事で、Raspberry Pi Picoを付けられる構成のため最終的には少し違うレイアウトになった。

QAZ

QAZ Keyboard PCB | Coffee Break Keyboards
https://cbkbd.bigcartel.com/product/qaz-keyboard-kit

なかなか再販されないので自分でQAZ風の構成を作ってみた。

MiniVan系列

MiniVan | Trash Man Wiki
https://trashman.wiki/keyboards/minivan

ロースタッガード配列であることを重視しており、構成は参考にした。

Planck

The Planck Keyboard – OLKB
https://olkb.com/collections/planck

ケースの大きさやネジの位置は参考にしてる。

最初Planckケースに格納できるような寸法に仕上げたけど、結局マイコンボードに直接コネクタを挿す形になったため、装着は無理そう。

C-13x

flurples/C-13X: alice qaz-ish board designed by flurples
https://github.com/flurples/C-13X

これ作るときにRP2040マイコンボードを採用して、動作確認とした。
(元はProMicro互換ボードを利用想定しているけど、同様の大きさになるRP2040ボードを使ったという話)

ProMicro互換機で自作キーボードを作る事との差異(分かる範囲で)

ここでは、自作キーボードでよく使われるマイコンボード「ProMicro」(および互換機)とRaspberryPi Pico(または別のボード)を使う際の違いについて記載してみます。

電源の定義方法が違う

ProMicro互換だと一応選択できるが、実質別物扱いで電源の電圧を選択して購入することになる。
(MCUに変更はないので、どういうレギュレータ使うかの違いくらいかなあと考えるがどうだろ)

RaspberryPi Picoは電源の電圧を選択できる方式のため、VBUS(5V)と1.8-3.3Vの電圧、いずれかの方法で使える。
また、マイコンボード側でコンバータを用意しているみたいなので、内部では3.3Vの電圧が流れる。
参考資料(修正済み)
https://datasheets.raspberrypi.com/rp2040/hardware-design-with-rp2040.pdf
https://blog.boochow.com/article/rpi-pico-spec-5.html

RaspberryPi Picoを利用する際は以下の3通りの電源供給を想定する。

  • USBホストからの5V供給
  • PinからのVBUSへの5V供給(USBホストとして使う場合)
  • 可変電圧をVSYSへ供給する場合(USBデバイスとして使う場合)

キーボードとして利用するのに、1番目のUSBホストからの供給が一番問題ない認識。
2・3番目は他のデバイス使ったりする場合やUSBコネクタを表面実装する際に使いそうな気がする。キーボードとして使うなら3番目だろうか。

あと、他ボードだと電圧周りの記述を簡略化して、1個のピンにまとめてるケースもあるので、一度ボードの仕様眺めておいたほうがいいかも。


https://wiki.seeedstudio.com/XIAO-RP2040/
(5V専用のピンのみ用意している)

SRAM・フラッシュメモリが多い

ProMicroに載っているチップについては以下。
https://www.microchip.com/en-us/product/ATmega32U4

Program Memory Size (KB) 32

一方ラズパイは以下。
https://magpi.raspberrypi.com/articles/raspberry-pi-pico-microcontroller-specifications-features-and-rp2040

264kB of SRAM, and 2MB of on-board flash storage

SRAMだけを比較しても容量が段違いで、KMK firmwareやPRK firmwareみたいにインタプリタを格納するのも可能になっている。これは表面実装の事例が多くなってくるとメリットになりえる。
QMK firmwareが移植される場合、今までのようにメモリが少ないMCUにおいて機能を削る必要がなくなるということなので、非常に有用そう。

後発のマイコンボードはフラッシュメモリが増強されてることが多く、ストアできる情報が多くなると考えるとこれも有用。

MCUの種類は今の所RP2040のみ

ProMicro互換についてはATMega32u4だが、表面実装の場合ATMega32u2を利用しているケースもあったりする。また互換なので少しMCUの型が違うケースも有る。
この差異はQMK firmwareでほとんどカバー可能なのであまり気にしなくてもいいと考える。

RaspberryPi PicoはそのGPIOの多さからか、ボードが大きい。
ただ、Xiao RP2040みたいな小型想定デバイスもあるので、それを選ぶことは可能。

ここで注目すべき点は、RP2040ファミリのMCUは現状RP2040一択ということ。
即ち、スペックの差異を気にすることなくデバイスの大きさ(言ってしまうとGPIOの多さ)でマイコンボードを決めることが可能。
また、上記からプログラムを書く対象となるMCUも同じため、プログラムの使い回しも容易なことが予想される。

ファームウェア

ProMicro互換の場合、実質QMK firmware一択。
(AVR/STM32に対応しているが、一部MCUはサポート外)
https://qmk.fm/

あとはArduinoで自作するとかになりそう。

RaspberryPi picoは今の所複数ファームウェアがある。
KMK firmware
https://github.com/KMKfw/kmk_firmware

PRK firmware
https://github.com/picoruby/prk_firmware

自分はPRK firmwareを利用。
コンパイル不要(自動で処理される)で書き下したマップが適時反映される形なので、お試しで修正みたいなのが簡単に可能な環境になっている。

もしくは自分たちでコンパイルしてバイナリを作成することになる。
(環境はRaspberryPi上で構築可能、自分の環境ではWindows10で試してみたけど何故かうまくいかなかったのでUbuntu上で構築済み)

リセットボタン

ProMicro互換の場合、特定ピンを短絡させるとリセットが発生する。
RaspberryPi picoも同様にRUNピンとGNDを短絡させるとリセット発生可能。

ただ、マイコンボードによっては、リセットスイッチをボード上に実装する代わりにこのRUNピンを削除するというケースがある模様。(RP2040zeroはこのパターン)

上記のケースでは、仕方ないので本体側のボタンでリセットするしかない
この場合レイアウトやリセット方法(穴あける等)に制約が出てくることに注意。
(流石にこの状態でRP2040から直接配線生やすのか・・・とも思うし)

終わりに

今回はRaspberryPi picoを使ったキーボードの作例がもっと増えると良いなあと考えて記事を書きました。

現状ProMicro互換やATMega32u4の表面実装を依頼しようとすると品不足、あっても価格が高騰しているのもあって、公開されているキーボード実装のほとんどが利用しづらくなっています。(参考資料がATMega32u4ベースなのもあり少ないんだろうなあと思いました。
資料: https://wiki.ai03.com/books/pcb-design/chapter/pcb-designer-guide

そんな中で(奇特にも)自作キーボードを作成してみようという方向けに資料がないってのはあまりにも辛いのもあり、また自分が参考にできそうなキーボードが少ない状態になっているのもあり、簡単な作例として自分の欲しいキーボードを作ってみました。

自作キーボードたのしいよ、コワクナイヨ。

Discussion