Amazonのアソシエイトとして、このブログは適格販売により収入を得ています。

zmkのファームウェアを書いた話

3Dプリント

自作キーボードをやってると、いずれぶつかる壁。
『ワイヤレスのキーボードを自作したい』という欲。

安いBluetooth対応マイコンボードがほしい

QMK対応のキーボードが手元にあるなら話は簡単で、BLE micro proを買えば良い。
コンバータが揃ってるのでマジ簡単。
既存のファームウェアをコピペしてふんっ!とすれば対応完了。
あとは適当に電池を載せて完成。

ただ、BLE micro proは高い。(だいたい5,000円くらいする)
ここがほぼ唯一にして最大のネック。

国外ならnice!nanoのような比較的安価なボードもあるけど、技適を受けてないので厳しい。
そこに白羽の矢が立つのが、SeeeeeeeeeeeedのXIAO BLE(XIAO nRF52840)という基板。

XIAO BLE(XIAO nRF52840)とは

技適を受けていて、スイッチサイエンスから2,200円くらいで買える。
ネコポス対応なので送料も安い。
しかも充電できるバッテリー端子つき。
バッテリーの対応幅も広く、いわゆるリポがそのままつけられる。

amazonでも買える
Seeed Studio XIAO nRF52840

まさに神と言って差し支えない。
ただ一点、基板上のピンが非常に少ないという問題がある。

https://wiki.seeedstudio.com/XIAO_BLE/ より

11ピンじゃあ何もできねえよお、と思っていたところ、
実はセンサーのないバージョンは3ピン追加で使え、裏面のNFC用2ピンも実は使えるとのこと。

11+3+2で合計16ピンもある。
64キー使えるならなんでもできる。

そこで今回は50%キーボードを作ることにした。

今回ベースにしたのはReviung53というキーボード。
githubにデータが公開されていたので、ありがたく流用させていただく。
gtips – reviung

(余談)

海外にはXIAO nRF52840 Plusというバージョンがある。
こちらは更にピンが多く、+7本使える。
今後技適を受けることがあれば、こっちを選んだ方がいいと思う。

ハードの設計

適当にやればいいので割愛。
KicadファイルからDXFファイルを作って押し出して、良い感じにケースを作れば完了。

BambuLab A1 miniだと2分割で作れる。

ZMKファームウェアを作る。

ここからが本題。
まずはNew Keyboard Shieldのページを開き、書かれている通りに進む。

New ZMK Module Repository

最初はローカルビルド環境作ろうとしてWSL2のUbuntuにいろいろ入れたりしたんだけど、最終的にオンラインビルドで作り直した。
いろいろエラーが出る中で、原因が環境なのかファイルなのかいまいち分かんなかったから。
多分原因は自分で作ったファイルなんだけど、だんだん面倒くさくなってきて、最初からやりおなした。
オンラインはビルドが遅いのだけ難点だけど、間違いのない環境で作れるのは精神的に楽なので、オンラインビルドをおすすめしたい。

New Shield Directory

ここから早速詰む。フォルダ作れねえ。

Github上でフォルダを作りたいときは、Create new fileをして、ファイル名のとこにフォルダ名を書いてスラッシュ入れたら勝手にフォルダにしてくれる。

Kconfig.shield と Kconfig.defconfig

難しいことは特になし。

User Configuration Files

今回ZMK Studio対応にあたり、一行だけ書いた。
キーの変更をロックするフラグをnoに。
CONFIG_ZMK_STUDIO_LOCKING=n

Physical Layout

ここからキーボード名.overlayファイルに書いていく。
まあまあ重くて大事なところ。

今回はこんな感じに配置。
rowのところを例にすると、こうなる。

row-gpios
= <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 28 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&gpio1 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;

Matrix Transfoorm

ここも重要…なんだけど、今回はReviung53のソースから流用して楽をした。

Physical Layout

ここ、今回一番大変だったかも。
まずそもそも記事の存在に気付くのに時間がかかった。

ここを押さないと、必要なドキュメントを読めない。

読むと、キーボード名-layouts.dtsiファイルを作るよう指示がある。
.overlayファイルの先頭にincludeを書く指示も。

dtsiファイルはキー1個ずつの情報を作らないといけない。手書きするのは超大変。

今回取った方法は、
まずKeyboard Layout Editorで配置を作って、jsonファイルを書き出し。
なんかコンバータツールがあるので変換。
あとはコピペするだけ。

KLEで配置を作るのに慣れてればすぐ終わると思う。

Chosen Node

特に言う事無い。

Default Keymap

これもReviung53からもらってきて、一部自分の使いやすいように書き換え。

Metadata

これもあんま言う事ないけど、ボード情報が
requires: [seeeduino_xiao_ble]
になるのだけ気をつける。

build.yaml

ここも、ZMK Studio対応させるなら2つ書くことがある。
snippet: studio-rpc-usb-uart
cmake-args: -DCONFIG_ZMK_STUDIO=y

びるど!

あとは勝手にビルドしてくれるので、待つだけ。

組み立て

特に何も言うことがないので割愛。

センサーのところの3ピンは間隔だいぶ狭いけど、0.2mmのUAE線なら特に問題なかった。撚り線は32AWGくらいじゃないと厳しそう。
28AWGでやれって言われたら嫌。

ファームの書き込みとかZMK Studioとか

これも特に言うことなし。

初めてZMK Studio使ってみたけど、正直VIALの方が好き。
といってもLTくらいしか使わないのでどっちでもいいんだけど。

その他

今回、最初はChatGPTに聞きながらゆるく作ってたんだけど、
UnibodyとSplitの違いが認識されてないとか、なんか古い情報が出てくるとか、全体的に話の噛み合いが悪かった。
情報もらったら生成しますよ!って言われるんだけど、生成されたものがなんかおかしい、他のファイルとの整合性が取れてない、みたいな問題があったり。
デフォルトの値でいいのにわざわざフラグを書いて、『これもう使ってないフラグなんですよね』ってコンパイラに怒られたり。

最初からドキュメント見てちまちま作った方が絶対早いね。

実際に作ったキーボードでこの記事を書きました。
おしまい。

タイトルとURLをコピーしました