ここ数か月のマイブームで自作キーボードに熱が入っており、基板を設計したりしていますが、私がメインで使っているのはSTM32Fシリーズのマイコンです。
最近はProMicroに採用されているATmega32U4が半導体不足の影響や円安の影響で値段が高騰しています。また、納期も不安定なことも多く、安定して入手できないという問題もあります。現在はProMIcroの値段もじわじわ上がってきており、今後の価格や供給の先行きも怪しいでしょう。
私の目標としては、ProMicroに相当する部分を基板上に組み込んだ形でキーボードを製作したいというのがあり、基板屋さんに実装までしてもらうとなると、安定した供給や価格というのは大切になってきます。
さらに、試作等のことも考えて安価に作りたいとなると、上述のProMicro以外の選択肢というのを考えることもできます。そのなかで価格や現在の供給面をみると最初に書いたSTM32Fシリーズが上がってきます。
後で紹介するSTM32F103C8T6を使って作ったという話はネットでも結構見つかりますし、実際に私も他チップからの乗り換えで使用して販売するまでに至っています。
今回はSTM32F103シリーズの中でかなり安価な製品のSTM32F103C6T6Aを使ってキーボードを作ってみたという話を書きます。STM32F103C8T6は私が作るレベルのキーボードだと何も考えずに使うことができたのですが、STM32F103C6T6A気を付けなければならないことが多かったのでそれも紹介します。
目次
STM32F103Cシリーズと性能
STM32Fシリーズというのがラインナップが豊富で、初見では何がなんやらわからない状態です。ProMicroに相当するようなブレイクアウトボードというのがSTM32Fシリーズにも存在しており、Blue PillやBlack Pillと呼ばれるものがあります。
これらに実装されているのはSTM32F103かSTM32F411あたりなことが多いです。基本的にSTMF4シリーズはSTM32F1シリーズより高価であるため、安価なものだとSTM32F1シリーズを選ぶということになります。しかし、またしてもそこで立ちはだかるのがSTM32F1シリーズ内での型番。
互換ボードを調べてみるとBlue Pillに搭載されるものはSTM32F103CBT6とSTM32F103C8T6、そして今回の記事にあるSTM32F103C6T6Aという状態です。
これらの違いは搭載されているRAMとフラッシュサイズにあります。STM32F103Cシリーズを表にするとこんな感じです。頭のSTM32F103の部分は省略しています。
末尾の文字 | フラッシュメモリサイズ | RAM |
CBT6 | 128KB | 20KB |
C8T6 | 64KB | 20KB |
C6T6A | 32KB | 10KB |
C4T6A | 16KB | 6KB |
このようになっています。最も安価に購入できるのはSTM32F103C4T6Aですが、現状Blue Pillの互換ボードに搭載されているのは目撃していませんね。おそらくはフラッシュサイズが小さすぎてかなり限られた用途でしか使えないのでしょう。
今回使うC6T6Aはスペック的に上位製品と比較してRAMとフラッシュメモリサイズの両方が劣ります。これが自作キーボードを作るにあたって影響するのかというと、RAMサイズは気にしなくても大丈夫のようですが、フラッシュメモリサイズはかなり気を使う必要がありそうです。
というのも、STM32F103C8T6で作製したQMKファームウェアのサイズを見ると、50キーの分割キーボードの構成で45KB、分割なし25キーで37KBとなっておりこの時点でSTM32F103C6T6Aには書き込むことができないのです。
つまり、STM32F103C6T6Aを使って自作キーボードを作るには何かしらの制約を付ける必要があるというのは簡単に理解できます。
と言っても「そこまで容量を小さくできるのか?」という疑問が残ります。そもそもこれで自作キーボードを作るのは前例が全然見つからない時点で無理なんだろうなと軽く考えていました。まあ、値段を抑えると言ってもSTM32F103C8T6を搭載したブレイクアウトボードとの価格差は数百円レベルです。個人で遊ぶ分には全然問題ない金額です。
しかし、Aliexpressでチップ単体の価格差を見ると数百円と言えど、C6T6AとC8T6Aでは4倍の価格差があります。C8T6なら1個しか試作できないところ、C6T6Aなら4個作れる…たくさん作って遊びたい私には捨てがたい価格差でした。
STM32F103C6T6Aでキーボードは作れるのか
結論から言えば、かなり制約はありますが作れます。
STM32F103C6T6Aが自作キーボードを作るのに使えるのかは、QMKファームウェアが対応しているのかがポイントになります。基本的にはSTM32F103シリーズならなんでもいけるだろうと思っていました。STM32F103C8T6で使えましたし、そのファームウェアはSTM32F103CBT6でも使えましたしね。しかし、よく考えるとSTM32F103C6T6Aには上述の二つのチップとはRAMサイズが違うため、そう簡単な話ではなさそうだなと思いました。調べているとGitHubでこんなスレッドを発見しました。
GitHub -Support for new bluepill stm32f103c6t6a with 32k flash size-
https://github.com/qmk/qmk_firmware/issues/15297
やはり同じようなことを考える人はいるようでSTM32F103C6T6Aを使おうとしたものの上手くいかず最終的にはChibiOS側のバグだったため使えなかったようです。また、しばらくはC6T6Aでは正しく動作しなかったようです。
さらにここを辿っていくと、マージされた最小限のテストコードを見つけました。
GitHub -Add minimal STM32F103C6 support-
https://github.com/qmk/qmk_firmware/pull/17853
これによると、いくつかの機能をテストした結果正しく動くことを確認しているそうです。機能としては色々実装しているようですが、どれだけ機能を詰められるかは構成に左右されることは間違いなさそうです。
後で紹介しますが、実際にファームフェアをビルドしてみた結果、バックライトとアンダーグローを全部消し、VIAで使える状態にして21KB程度のファームフェアとして作製できました。キーマトリクスのサイズは5×15で60%サイズのキーボードです。
32KBと比較すると結構余裕がありそうなのですが、実はSTM32F1シリーズはUSBでの操作に対応したDFUが書き込まれていないため、別途書き込む必要があり、それが8KB使用しています。そのため、実際に使える領域というのは24KBなので、21KBというサイズはかなりギリギリです。
VIAサポートがかなり容量を使っているので、これを無効化してしまえば分割キーボードも作れるかもしれませんが、そこまで確認はしていません。もう少し容量を小さく手段もあるかもしれませんしね。
基板での実装について
これBluePillなどのブレイクアウトボードを使う人にはあまり関係のない話かと思いますので、不要なら読み飛ばしていただいても大丈夫です。
STM32F103C6T6Aを使う場合の基板実装は特別気にすることはありません。キーマトリクス部分はProMicroでもBluePillでもどちらでも使えます。
肝心なUSB周りやクリスタルの実装については、STM32F103を搭載したボードならどれも共通でSTM32F103のチップの部分が違うだけです。
そのため、BluePillなどの基板情報を基に実装を行えばなんら問題ありません。やっぱりC6T6Aでは容量的に難しかったとなってもC8T6やCBT6にそのまま載せ替えられます。なので、正しく設計できていれば基板はそのまま使いまわせるため結構楽です。
QMKファームウェアでの実装
QMK側での実装について紹介します。基本的な部分は省略しますので、C6T6Aならではの実装の部分を紹介します。
それにあたっては、ベースとなるSTM32F103ベースのファームウェアが用意できることが大前提となります。その具体的な実装サンプルは私が設計したTH25TK用でも存在するので、そちらを見ていただくのも良いかもしれません。
GitHub -TH25TK-
https://github.com/T-H-Un/th25tk
今回の実装にあたって、マージされたテストコードを参考にしています。
GitHub - onekey/bluepill_f103c6 -
https://github.com/qmk/qmk_firmware/tree/master/keyboards/handwired/onekey/bluepill_f103c6
いくつかのファイルに変更を加えます。始めにKeyboard.hに以下の記述を追加します。
#undef STM32F103xB
#define STM32F103x6
halconf.hとmcuconf.hでは不要な機能を削除しておきます。これもいらない作業かもしれませんが、念のためやっておきます。
rules.mkですが、最低限以下の記述を追記します。
OPT_DEFS += -DBOOTLOADER_STM32DUINO
MCU_LDSCRIPT = STM32F103x6_stm32duino_bootloader
BOARD = STM32_F103_STM32DUINO
BOOTLOADER_TYPE = stm32duino
DFU_ARGS = -d 1EAF:0003 -a 2 -R
DFU_SUFFIX_ARGS = -v 1EAF -p 0003
LTO_ENABLE = yes
また、ここでバックライトやRGBアンダーグローなど不要な設定を全てnoにします。こうすることで最大限に容量を節約することができます。どうしてもダメな場合はマウスキーの設定も消すとさらに小さくできるようです。
これで最小限のC6T6Aを使ったファームフェアとすることができます。私の場合はここまでやって余裕があったので、一番便利なVIA対応のファームフェアにすることとしました。
その場合は以下の設定を追記する必要があります。EEPROMのエミュレーションを容量節約のために削除しているためです。
EEPROM_DRIVER = vendor
次にconfig.hに以下の記述を追加します。
#define FEE_MCU_FLASH_SIZE 32
#define FEE_PAGE_COUNT 2
#define FEE_PAGE_SIZE 1024
#define NO_ACTION_TAPPING
この状態でVIAの設定をしてコンパイルしたところ、21KBとなりました。実際にVIAに読み込んで設定もできたため、私が設定した範囲では正常に機能しているようです。
たただし、1VIAを使うにあたってNO_ACTION_TAPPINGを設定しているためレイヤーの移動に制限があるようです。詳しくは見ていないのでわかりませんが、やはりある程度機能は犠牲になるっぽいですね。VIAを使わないならレイヤーは使えるかもぐらいに思っておくのが良いかもしれません。
私がテストしたキーボードのファームウェアを宣伝も兼ねて置いておきます。60%の日本語配列の自作キーボードのTH60JPです。
GitHub -TH60JP-
https://github.com/T-H-Un/th60jp
自作キーボードを作ってみたい、だけどそんな光る必要もない場合はSTM32F103C6T6Aを使ったキーボードもいいかもしれません。
まとめ
STM32F103C6T6Aを使ったキーボードを作製し、例も示しつつファームフェアのビルドとテストを行いました。
ハードウェアの性能的な制約が大きく、制限はあるもののVIA対応ができたりと、機能を絞れば低コストで良い自作キーボード作製することができます。
コストが非常に安いので、基板上に直接実装するチップとしてや、STM32F系の互換性から、設計の土台としての試作用としても優れていると思いました。
自分用のキーボードで割り切って使う場合はこれで良いですね。試作や自分用には今後はこれも使っていくことを考えてみようと思います。
以上です。お読みいただきありがとうございました。