いままで自分が自作したキーボードには、ATMega32u4などのAVRや、 それを使っているProMicroを使っていた。

しかし、最近、32bitのARMを使ったキーボードが増えている。

ProMicroに相当する基板として、良く売られているのが、 BluePillとその改良版であるBlack Pillだ。

ProMicroと比較すると次のようなメリットがある。

  • クロック的にもビット幅的にも計算性能が高い。
  • IO性能的には5倍高速
  • IO数が10以上多い。
  • フラッシュメモリが倍の容量がある
  • 値段が安い

一方で、ProMicroとは違いUSB経由で書き込めるブートローダが初期状態で書き込まれていない、 今回はBlack Pillでキーボードを作る手順を紹介したいと思う。

準備するもの

Black Pill

Aliexpressだと1.5ドルぐらいから売ってた。

Blue Pillでもだいたい同じだけど、 USB接続が不安定という噂があるので、 USB周辺回路が改良されたBlack Pillの方が良い。 Blue Pillでも問題にぶちあたった事はないけど。

STLinkV2 (のClone)

ProMicroは単体で書き込みできるけど、 生STM32F103にプログラムを書き込むには、 何らかの機器が必要で、 これが一番簡単だと思う。 Aliexpressで2ドルぐらいで買った。

その他

キーボードに使うキー本体とかダイオードなどは、ここではあげずにおく。

ブートローダの書き込み

STLinkを使って、マイコンにブートローダを書き込む。 ブートローダをつかわず、直接STLinkでQMK Firmwareを書き込んで使う事もできるが、 ブートローダを入れておけば、キーマップの変更時にSTLinkを持ち出してつながなくてもすむ。

STLinkとBlack Pillのお尻にある4ピンの端子をケーブルでつなぐ。 順番に並んでいる訳ではないので注意。 どうせ、このコネクタは1回しかつかわないので、 ピンヘッダを半田付けせずに手で押えておくだけですましてもいいかもしれない。

Black Pillにはブートモード選択用ピンがあるので、 これを両方とも0側にしておく。 どうぜ常に0側にするので、背が高くなるヘッダをつけずに、 はんだづけしてしまってもいいかもしれない。

PCにはst-flashコマンドがいる。 Debianだと、stlink-toolsパッケージに入ってる。 stlink-toolsパッケージには、udevルールとかも入っているので設定はいらない。

書き込むブートローダは、stm32duinoの物を使う。 基板のバリエーションによって沢山種類があるが、 Black Pillにはgneric_boot20_pb12.bin を使う。

書き込みは、次のコマンドで行う。

st-flash write generic_boot20_pb12.bin 0x8000000

成功していれば、Black PillにUSBケーブルをつけた時に、 LEDが6回高速に点滅し、その後6回点滅する。 また、この時LeaflabのMapleと認識されるはず。

QMK Firmwareの作成

普段、新しいキーボードの設定は./util/new_keyboard.shで作るが、 このスクリプトは、STMに対応していなかった。

そこで、 sono1 というキーボードの設定をパクって行なった。

全部のファイルをコピーして、マトリクスとキーマップを設定したらうまく作れた。

QMK Firmwareの書き込み

まず、一般ユーザーでも書き込みができるように、udevルールを書く必要がある。

https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/master/tools/linux64/45-maple.rules

ここにあるファイルを、/etc/udev/rules.dに放りこんだ。

次に、先に書き込んだブートローダを有効にする。 どうも、リセットを何度か連続で押すと、 ブートローダのタイムアウトがなくなり、 ずっとブートローダモードに入りつづけられる。 LEDが点滅し続けたままになってる。

この状態で、make <keyboardname>:<keymapname>:dfu-util で書き込みが成功した。

まとめ

STM32ベースのキーボードを激安で作る方法を説明した。

しかし、ここで悲報なんだけど、 今現在、STM32マイコンはIC不足のせいで品薄のようだ。 早く復活してほしい。