ウェブブラウザからキーマップを書き換える「WebVIA」を開発中です

こんにちは。洋一郎です。このエントリは、 キーボード #2 Advent Calendar 2020 - Adventar の21日目の記事となります。昨日は、 @ymotongpoo さんの、 自作キーボード活動していたらお店を開いてしまった という熱いお話でした。僕もそんな @ymotongpoo さんからの誘いで自作キーボードに入沼させていただいております。

おそらく他の方々とは違い、僕は今年2020年の夏頃からの入沼となりますので、遅めかなと思います。が、既存自作キーボードキットの組み立てだけでは満足できず、既に自分で設計したキーボードの販売すらしている状況となりました。自分でもびっくりです。

【委託】Lunakey Mini - 遊舎工房

既に最初の在庫は売り切れになっていて、現在新しい在庫の準備中です。ただし、次のモデルは「Kailh ロープロファイルキースイッチ」も対応可能になる予定でして、現在その最終確認中となっています。問題なさそうであれば、さらなる特徴を持つ自作キーボードキットとして、遊舎工房さんに在庫を納めようと思っています。2021年1月中には準備できると思いますので、お待ちください。

さて、アドベントカレンダーですが、最初は入沼から設計、販売までのエピソードを書こうかな、と思っていましたが、別のトピックの方が面白そうな内容になりそうだったので、予定を変更してお届けしようと思います。

そのトピックとは、「VIAってどうよ」です。

キーマップを何で書き換えていますか?

自作キーボードキットの大きな魅力の一つに、「自分でキー割り当て(キーマップ)を変更することができる」ことがあげられるかと思います。僕も最初に自作キーボードに興味を持った要因はこれでした。

特に、キー数が少ないキーボードを利用する際には、記号や数字、ファンクションキーなどを割り当てるためのキーがなくなってしまうため、何かのキーと同時押しをしないといけなくなり、ではどのキーとどのキーを押すようにしようか、というキーマップ沼が出現します。これがまた楽しいわけで、試行錯誤を繰り返して納得のいくキーマップを発見した時は、それはそれは嬉しいです(僕は40%キーボードで一定のEnd Gameを迎えています)。

キーマップは、パソコン側ではなく、キーボード側に搭載されているマイコンの中に書かれています。もし「右上のキーをESCではなく別のキー割り当てにしたい」と思ったら、キーボードのマイコン内に書かれたキーマップを書き換えなければならない、つまり、ファームウェアの更新が必要になります。

書き換えを行うためには、いくつかの方法があります。代表的な方法としては、以下があるでしょう。上から下に行くに従って、難しくなりますが、カスタマイズできる範囲が広がります。

VIA アプリを使って、キーマップを直接更新する。

QMK Configurator を使ってキーマップが更新されたファームウェアを入手して、それをキーボードのマイコンに書き込む。

qmk/qmk_firmware からファームウェアのソースコードを落としてきて、C言語にてキーマップのコードを変更して、ファームウェアのビルドし、結果をキーボードのマイコンに書き込む。

自分でコードを書くことは、もちろんプログラミングの知識が必要になりますので、難易度は高いです。それに対して、VIA を使うと、以下の利点を得ることができ、手軽にキーマップを変更することができます。

  • ファームウェアをキーボードのマイコンに書き込む作業は、最初に1回だけやれば良い。
  • キーマップの書き換えは、ファームウェアの更新ではなく、キーボードのマイコン側にあるキーマップ情報(EEPROMに保存されている)を書き換えるだけなので、ファームウェアの更新なしに、即座に反映される。
  • VIA アプリを起動してキーボードを差し込むだけで、キーボードの種別を自動的に認識してくれて、画面にキーレイアウトが表示される。とても直感的。

多くの人にとって、VIA を使うことが最適解と言うことができるかと思います。VIA は、LED の点灯状況の変更や、マクロ(複雑なキーバイディングの作成)にも対応しているので、キーボードを使うに当たり必要十分な機能を提供してくれています。

そのため、多くのキーボード作者が、VIA 対応を進めています。僕も、Lunakey Mini について、VIA 対応を進めています。

VIAアプリの将来性に疑いあり?

VIAアプリは、自動的にキーボードの種別を認識して、キー配列のレイアウトをそのキーボードに応じて表示してくれます。これは、キーボード作者が「このキーボードのVendor IDやProduct IDはこれで、キーのレイアウトはこうで、LED をサポートしていて、・・・」といった定義ファイルを VIA アプリ開発陣に提出して対応してもらうことで、実現されています。

僕も、Lunakey Mini 向けの定義ファイルを作成して、VIA アプリ開発陣に提出を行い、取り込んでもらうべく依頼をしています。その様子が以下になります。

Add Lunakey Mini keyboard to support VIA. by yoichiro · Pull Request #424 · the-via/keyboards

上記のスクリーンショットを撮影したのは、12月19日です。その時点でなんと「26日間放置」です。何のアクションもコメントもありません。この記事を公開した21日時点でも、何のリアクションもなく、28日間放置です。

僕が上記の依頼を提出した後にも、30個以上の新規キーボードの登録依頼がされていますが、見事に全部放置されています。

噂で聞いたのですが、どうやら1ヶ月に一回程度のレビュー&取り込みといった頻度のようです。提出タイミングによっては、最大1ヶ月程度待たされることになります。そして、もし記載に不備があったら、そこからまた1ヶ月待たされることになるわけです。

僕はソフトウェアエンジニアであり、オープンソースプロジェクトにも多数参加してきました。そんな世界では、1ヶ月待たされて、その後また1ヶ月、というスピード感のプロジェクトは「事実上死んでる」と見なされても仕方ない感じになります。少なくとも、アクティブとは呼べず、作者にやる気がなくなった状態であり、そのまま相手にされなくなっていく末路となる確率は非常に高いという印象が強いです。

「貢献はボランティアだから」という面ももちろんあるのですが、作者にメールなどしてコンタクトを取ろうとしたところ、完全スルーな結果でした。一切返事が来ることがなかったです。

ファームウェア側の VIA に関するコードは、QMK Firmware のコード内に含まれるので、オープンです。しかし、VIA アプリ側はコードはオープンになっておらず、ライセンスについても表記がなく、しかもキーボード定義の追加サイクルは上記の通り、さらに作者からの返事はない、という「完全クローズド」な状況です。これでは、助けようがありません。

ダメなら自分で作ってしまおう

幸いにも、VIA のファームウェア側のコードは読むことができます。見てみたところ、RawHID でコマンドを受け付ける形式となっていました。つまり、RawHID にて規定のバイト列を送り込むことで、VIA アプリでできていることは全てファームウェアに自分で直接依頼することができる、ということです。

そう、VIA アプリは、自分で作り出すことができるのです。

VIA アプリに対しては、個人的には「アプリをインストールしないといけない」ということが壁だな、と思っていました。代わりに、ウェブブラウザから直接キーボードを制御できれば、アプリのインストールをしなくても良くなります。

USB のプロトコルを自分で実装してキーボードと話す、ということを最初考えましたが、幸いにも、現在 WebHID API という新しい API が Chrome にて Origin Trials となっています。これを使えば、RawHID 経由で、ウェブブラウザからファームウェアにある VIA の機能を直接呼び出すことが可能です。

WebHID の機能が本当に有効かどうか、確認を行ってみました。

まず、テスト用のページを開きます。

そして、キーボードを接続します。ここでは、Lunakey Mini を接続しました。そして、 Connect and open というボタンを押します。

すると、Chrome が自動的に接続されたキーボードを検出して、どのキーボードを接続するか聞いてきます。これがユーザに明示的にChromeが求める認可となります。接続した Lunakey Mini を選択して、接続ボタンを押します。

Product Name というところに Lunakey Mini と表示されましたが、これもキーボードのマイコンから得た文字列になります。

ここで、レイヤーの数を取得してみましょう。 Get layer count ボタンを押します。

接続した Lunakey Mini には、4つのレイヤーがあると教えてくれました。

次に、キー割り当てを取得してみます。レイヤー 0 の、0行目の1列目のキーに何が割り当てられているかを取得してみます。

Get keycode を押すと、 KC_Q 、つまり Q という文字が割り当てられていることがわかりました。 Test のところでそのキーを押したら、実際に q が入力されました。

この Q の割り当てを変更してみましょう。 KC_R に変更して、 Set keycode ボタンを押します。

そして、先ほど q が入力されたキーを押してみると・・・

キーボードのマイコン内の情報が書き換えられた結果、r が入力されました。

さて、先ほど Chrome から「どのキーボードに接続しますか?」と問い合わせが来ましたが、一度認可してしまえば、そのキーボードに関しては、抜き差ししただけで認識します。具体的には、キーボードの接続/切断イベントが飛んでくるようになります。

一度キーボードを抜いて、ページをリロードします。その状態でキーボードを接続すると、下の図の赤で囲った部分に、自動的に認識したキーボードが表示されます。

そして、キーボードを抜くと、自動的に表示が消えます。

こんな感じで、WebHID API を使って、実際にキーボードと通信して VIA の情報を書き換えることができることがわかりました。あとは UI をちゃんとすれば、ウェブブラウザ版の VIA アプリ、題して「WebVIA」の完成となります。

現在、僕と同じ GDE(Google Developers Experts)仲間の @adamrocker さんと一緒に開発を進めています。彼の手によって、素敵な UI に仕上がりつつあります。以下は検討中の UI です。

順調に開発が進めば、そう遠くない時期に、WebVIA をお使いいただけるようになるはずです。VIA アプリを入れなくても、VIA 対応が既に終わっているキーボードに関しては、WebVIA からキーマップのカスタマイズが行えるようになると思っています。ご期待ください!

そして、自作キーボードキットの設計をされている方々に、現状の VIA アプリと同様に、キーボードごとの定義ファイルが必要となりますので、WebVIA に再度登録していただけると嬉しいな、と思っております。現状では VIA アプリと全く同じ JSON ファイルを利用できるようにしようと考えています。

登録のための手段として、GitHub での Pull Request 受付ではなく、もっと手軽に登録できる手段を現在検討中です。GitHub アカウントでの認証と QMK Firmware へのコミット実績から自動的に判断して・・・とかアイディアを練っています。設計者の方々のご協力が必要となりますので、ご理解ご協力をお願いいたしたいと思っております。

まとめ

今回の WebVIA の開発によって、少しでも自作キーボードキットに興味を持つ人が増えることを期待しています。それと同時に、パソコンに付いてくる標準的なキーボードだけではなく、もっとキーボードは手軽にカスタマイズすることができて、自分の手でより便利にできるんだよ、ということを多くの人に知って欲しい、と心の底から思っています。

少なくとも、今年の夏までタッチタイピングもできなかった自分がここまでどっぷり自作キーボード沼にハマってしまったということは、この世界が本当に素晴らしいと痛感した結果だと思っています。この世界をもっといろんな人に知って欲しいし、入った結果「なんか難しそうで怖い」と敬遠してしまわないように、自分ができることはやっていきたいな、と思っています。WebVIA はその第一歩です。

明日は、 kushima8 さんの「設計したキーボード(Reシリーズ)について」の話です。

このエントリは、Lunakey Mini を使って書かれました。

このエントリーをはてなブックマークに追加

関連記事

Lunakey Miniケースの最終形です

Google Smart Home Summit '21のまとめです

Lunakey Pico ビルドガイド (Rev.1以降)

Lunakey Mini/Pico/Macroの設計をオープンにしました

Lunakey Picoを製作しました