2022年のPRK Firmwareまとめ、2023年の展望

hasumikin is a programmer.


この記事は キーボード #1 Advent Calendar 2022 の記事です。 きのうはYMG WORKSさんによる End Gameを目指して!自作キーボード「Ergo The End」を作った話 でした。


そしてこの記事は、KBD.NEWS Advent Calendar 2022のために書いた英文記事の日本語版です。 日本語へ訳すにあたり、情報やお気持ち表明を若干増やすなどしており、逐語訳ではなくなっています。


こんにちは@hasumikinです。 PRK Firmwareの作者です。 KBD.NEWS Advent Calendar 2022の予定をざっと見る感じ、個別のファームウェアについて書く記事はほかに1本だけ、ZMKについてのものだけみたいですね。 この記事では、私がどんな経緯で、なぜPRKをつくったのか、PRKでできることは何か、そして将来の計画とそれについて読者のみなさんができるかもしれないことを書きます。

直近のバグフィクス

本題の前に短く。 keymap.rb をドラッグ&ドロップすればすぐに適用されるのがPRKの売りなのですが、そこが壊れている(ドラッグ&ドロップするとハングアップする)ことに最近気づきました😅

次のリリース(0.9.20)で直ると思うので、少々おまちください。

では本題。

PicoRuby

筆者は島根県松江市に住んでいます。 松江はプログラミング言語Rubyの開発者であるまつもとゆきひろさん(Matz)の住む街でもあります。 自作キーボードの世界ではあまり有名ではないかもしれませんが、RubyはでっかいWebサービスのバックエンドアプリケーションを書くためにたくさん使用されています。 AirbnbとかShopifyとかGitHubとかクックパッドとかSmartHRとか。

Rubyは、世界中のWebサービスを発展させることにたいへん貢献してきました。 しかし組み込みプログラミングの世界では、人気のある言語という訳ではありません。

そこでMatzは、10年前にmrubyという「Rubyの別実装」の開発を始めました。 名前が示すとおり、Embeddedのための言語およびエコシステムです。 mrubyは、CRuby(いわゆるRubyのことです)よりも大幅に省メモリですが、ワンチップマイコンで動かすにはまだ大きかった(最近さらに小さくなってきていますが)です。 とくにRubyコンパイラの消費メモリが大きく、このことが筆者がPicoRubyというものをつくりはじめた理由です。 そしてPicoRubyは、PRK Firmwareを実装するための言語になりました。

思わぬ評判

正直に言って、Rubyを知らない人がPRKをつかってくれるとはまったく想像していませんでした。 PRKの開発を始めたのは2021年の3月です。 筆者はこれを、PicoRubyがワンチップマイコン(ラズパイピコ)で立派に動くことを証明するための参考実装のつもりでつくり始めたのです。 PicoRubyをマイコンプログラミングの統合フレームワーク(?)に育てるためには、実際のプロダクトをつくってみる必要がありました。

自作キーボードをやっているRubyistの何人かは実際に使ってくれるかもしれない、くらいの期待はありました。 ところが、PRKについてRubyKaigi Takeout 2021(日本語)やRubyConf 2021(英語)で発表してからしばらくすると、結構たくさんの人たち(もともと知人ではない人たち)からDMをもらうようになりました。 もちろん海外からも。 それらは主にkeymap.rbの書き方についての質問で、彼らはみなRubyを知らない人たちで、それどころかプログラミングもあまり分からないという人たちも多くいました(Rubyを知っていてかつPRKを使いたいという人はだいたい知り合いなので、この話には含まれません)。

いろいろと話を聞いてみると、新たな自作キーボードの試作のためにPRKが使いやすいらしいと認識されているようです。 2022年に入ってからもPRKの開発を(まあまあ精力的に)進めているのは、このように想像以上に受け入れてもらえたからです。 (今後ともご指導ご鞭撻ご声援のほどよろしくお願いします)

PRKの機能

ここで、2022年12月現在のPRKの機能をまとめます:

  • ターゲットMCU: RP2040
  • 設定がかんたん。ファームウェアをビルドする必要はなく、 keymap.rb をマスストレージにドラッグ&ドロップするだけ
  • 実装された機能
    • キースキャン方式: Direct/Duplex/Round-robin
    • RGB LED(NeoPixel)
    • 分割型
    • コンシューマキー
    • Compositeキー(1つのスイッチタップから複数キーコードを送る)
    • ロータリエンコーダ
    • ジョイスティック
    • VIA(Remapでキーマップを設定できる)
    • 圧電サウンダ
    • Num/Caps/Scrollロックとインジケータ
    • チャタリング抑制
  • いまのところ実装されていない機能(筆者がなんとなく必要かなと思っているものと、GitHubで要望を受けているものと、このあと補足するもの)
    • Combos
    • マウスキーコード
    • マウス/トラックボールによるマウスカーソル移動
    • OLEDディスプレイ
    • Modulo(I/Oエキスパンダ)
    • 無線

ことしの進捗

VIAとRemap

ドキュメント

個人的には、Rubyスクリプトを書いてドラッグ&ドロップするという仕様に満足しています。 もうちょっと言うと、たくさんのキー(40%レイアウト×3レイヤなら120キーですね)をGUIでポチポチと設定する方法が、keymap.rbをテキストエディタで書く方法よりも「確実に便利」だとは思っていません(一長一短ある、という感じでしょうか)。 が、GUIのほうがいいと考える人がたくさんいるであろうことは疑いの余地がありません。

というわけで、VIA機能をマージしました。 Remapでポチポチできます。

ところで最近、QMK Firmwareが非互換な開発をマージしたようです。 VIA機能に影響のある箇所を含むようです。 Link

将来さらに変わる予定もありそうです。 これにより、RemapやPRKなどのサードパーティツールはQMKの仕様に付いていくかどうかを判断する必要に迫られています。

そこでいま、PRK独自のブラウザアプリを開発することを夢想しています。 これには背景があります。 今週末リリース予定のRuby(バージョン3.2)にはruby.wasmという機能が含まれています。 要はブラウザで(フルスペックに近い)Rubyが動くようになります。 ジャバスクリプト弱者な筆者でもブラウザアプリをつくるインセンティブというわけです。

PRK専用のUIをつくれるのであれば、RGB LEDやロータリエンコーダの設定スクリプト生成をサポートする機能も提供できるかもしれません。 keymap.rb の文法チェックもできます。 Rubyの記法が分からなくてPRKが動かなかった、という人もいると思いますが、いくらかの手助けになるでしょう。

このブラウザアプリの開発は大きく分けて2つのパートから成ります:

  • KLEのレイアウトデータ(がよいのかはわかっていません。ご意見をお寄せください)を読み込んでキーボードレイアウトを再現する(CSSがんばる?JSも要るとは思います)
  • ブラウザ上に再現されたレイアウトへのクリックやドラッグ操作などを処理して keymap.rb を生成する(Rubyで書く)

とくに前者について、手伝ってもいいよという奇特な方がおられましたらご連絡ください。 あと自キ作者にとっては、レイアウトデータをRemapなどと共用できて、なおかつPRK独自機能の拡張も容易なことが求められると思います。 この点について、どういう仕様だとよいかご意見をお寄せください。

Joystick

ドキュメント

筆者はあんまりゲームとかはやらないのです。 自作キーボードファームウェアはたんなるキーボードだけでなくて、コンシューマ機器や業務用コンソールのプロトタイピングにつかったり、身体にハンディキャップをもつ人のための入力デバイス開発につかったりできるんじゃないかと考えています。 なので、ジョイスティックはあるとよさそうって考えました。

圧電サウンダとMusic Macro Language

ドキュメント

昭和なパソコン少年ならMMLというのを知ってると思います。

圧電サウンダを鳴らすだけの低レベルAPIの実装はすにさんがPRをくれたのですが、いやこれはMML要るでしょうと思ってガーッと1日くらいでつくりました。 Rubyだとこういう開発が早いのです。

今後の予定

上述のとおり、筆者の究極の目的はPicoRubyをマイコンプログラミングのフレームワークとして育てていくことです。 この活動の一環として、軽量RubyフォーラムさんやITOCさんといっしょに、組み込みRubyファミリの共通インタフェース仕様を策定中です。 これは実は、PRKがOLEDやトラックボールに未だ対応していない理由のひとつです。

トラックボールやOLEDを動かすためには、I2CやSPIというマイコンペリフェラルを使用する必要があります。 PRKには1年以上前にI2C実装を含むOLED機能のPRが来ていたりします。 でもマージしていません。 理由は、低レベルAPIをちゃんと設計することなしにこれらの機能を外形上動くようにつくってしまうと、そのあとが面倒になると思っているからです。 繰り返しますが、実現したいのはマイコンプログラミングのフレームワークであって、自キのためだけのOLEDではありません。

ちなみに、キースキャンのためのGPIOやジョイスティックのためのADCも、低レベルAPIの変更によって非互換が生まれる可能性という点は同じです。 これらのAPIは比較的に単純なので、多少の手戻りは許容できると思います。

で、最近、そのAPI策定が進捗しています。 とりあえずのたたき台もできあがりました。 ということは、2023年のPRKはI2CやSPIを使用する機能が進捗する可能性がある、ということです。 乞うご期待。

ありそうな質問

ありそうだな、と思っていますが実際には聞かれたことのない想定問答です。

無線対応する?

あんまり前向きではないです。 過去に使用した無線のキーボード(市販品)にあまりよい印象がないのと、あと電池が保たなそうという気もするので。

RP2040以外のMCUは?

これもなさそうです。 ただnRF52シリーズは購入だけしてあります。 気が向いたら触ってみて、もしかしたらなにかやるかもしれません。 キーボードは別にしても、無線機能そのものはPicoRubyフレームワークに必要ですし。

ところで、最近PRKの実装を大きく直しています。 RP2040ハードウェアに依存する部分をpicoruby/prk_firmwareリポジトリに置き、ハードウェアに依存しないコードをPicoRubyのライブラリのかたちでpicoruby/picorubyリポジトリ内に切り出しています。 PicoRubyはMatz謹製mrbgemsというライブラリ管理システムを受け継いでいます。 これにより、他のMCUへのPRKの移植がやりやすくなると思います。 実際に作業してみると、もっとよく考えなきゃならないコーディング詳細がありそうですが、移植してみたい方がいたら協力します。

すべてがひとつのリポジトリに突っ込まれているQMKをみると、ちょっと自分には無理、と思ってしまいますね….(最近のリポジトリにはキャッチアップしていないので古い印象を引きずっているだけかもしれません)。

というわけで年末のご挨拶

PRKはOSSです。 MITライセンスです。 自由に商用利用できます。 マイコンにプリインストールして販売したってOKです。 みなさんどんどんPRKをつかってください。

現在アクティブな開発者は@ysni_pubさんと筆者の2人だけです。 この記事を読んで、開発に参加したいと思った人がいたら、ぜひ連絡をください。 いまは英語しかないドキュメンテーションですが、日本語版をつくってメンテしたい人も募集しています。 それでは良いお年を!


この記事は “Willow” レイアウトの GPK60-W で書きました。 SparkFun Pro Micro RP2040 ではもちろん PRK Firmware が動いており、 キーキャップはDrop MT3 Skiidata keycap set と Zomo Silicone Kitty Paw Keycapsです。 スイッチは忘れました。

あしたはRemap作者のよういちろうさんが何か書くみたいです!