キーボード #1 Advent Calender 2024 21日目担当のせきごんです。BLE Micro Proなどキーボード関連のモジュールを色々作っています。

今年作ったもの(作っているもの)を振り返っていきます。

auto-kdk

概要

最近はAuto-Keyboard-Design-Kitなるものを作っています。その名の通り自動でキーボードを設計してくれるツールとコントローラーボードです。キー配置を指定すると基板・ケース・ファームウェア(の設定)を自動で設計してくれます。

現在はファイル出力機能をオフにしたデモ版を公開しています。いくつかの修正が完了し、何パターンかの試作とコントローラーボードの頒布準備が整ったらファイル出力機能も有効にします。

説明

auto-kdkを使ったキーボードの設計フローを説明します。

分割か一体型か、スイッチはMXかChocV2(19mm/17mmピッチ)を選択したあと、マトリクスのサイズとどのスイッチを使うかを選択します。 auto-kdk用のコントローラーボードは18本のIOを持っていて、現時点では最大のマトリクスサイズは5x13または6x12です。
マトリクスの形を決定したら、それぞれのキーの位置・サイズとコントローラボードの位置を設定します。必ず配線できるわけではなく、マトリクスとコントローラの位置関係によっては失敗することもあります。その場合は位置を調整するか、後ほど基板CADに読み込んでからに修正することになります。
下の図では、左側が位置の設定前、右側が位置の設定後の例です。



レイアウトを決定すると基板のデータが自動で生成されます。Live updateを有効にするとレイアウトの変更がリアルタイムで反映されます。基板の外形やコントローラーボードのピンの干渉がないことなどを確認したら、Start routingボタンを押すと自動で配線されます。多少重い計算なので、PCやブラウザによっては時間がかかります。自分の環境だとfirefoxよりchromeのほうが速かったです。
下の図では、左側が配線前、右側が配線後の状態です。



さらに下に移動するとケースのデータも生成されています。これもLive updateが有効の場合はレイアウトの変更がリアルタイムで反映されます。ケースは2ピース構造で、3Dプリントサービスで製造することを想定しています。
今回は無線用のコントローラーボードを使う前提のため、ボトムケースにはUSB用の穴のほかに電源スイッチやバッテリー用のスペースが空いています。ChocV2スイッチを使う場合はキーキャップとトッププレートの干渉除けにスイッチをかさ上げする突起がトッププレートに付きます。


ケースのチルト角やベゼルの太さも変更できるようになっています。

ケースの微妙な凹みが気になったりする場合は、レイアウト画面でpaddingモジュールを追加することである程度は外形を制御できます。


トラックボールやエンコーダを付けたい場合もレイアウト画面から拡張モジュールを追加します。この辺りはまだ拡張モジュールの詳細が決まっていないので、形などは変わっていくと思います。現時点で決まっていることとして、拡張モジュールはコントローラボードとフレキシブルケーブルで直結するようになっていて、メイン基板の配線には影響しません。ただし、無線版のコントローラボードはピン数の都合でマトリクス用の一部IOと拡張用IOが共用になっており、拡張モジュールを使用する場合はマトリクスの最大サイズが小さくなります。

レイアウトでボール位置を指定 ケースにモジュール取付用の穴が開く

編集が完了したらGenerateボタン(2024/12/21時点では非表示)をクリックすると、基板(json)・ケース(STL)・ファームウェア用設定ファイル類がzipファイルとしてダウンロードできます。

基板データはEasyEDA(STD)で読み込みます。EasyEDA(Pro)にインポートすることもできます。

配線にティアドロップを付けたい場合はEasyEDAの機能で1クリックで付けられます。
EsyEDAはJLCPCBと連携しているため、そのまま基板を発注できます。ソケットをJLCPCBに預けている人はPCBAまで頼めます。

ティアドロップ JLCPCBで製造

こんな感じでJLCPCBに基板とケースを頼んでみた結果がこちらです。
コントローラーボードとメイン基板は1.27mmピッチのコンスルーで接続予定なのですが、手配が間に合わなかったので完全な動作確認まではできていません。メイン基板側は単純なマトリクスなので問題なく動くと考えています。

上から 横から メイン基板

今後のマイルストーンとしては

  • 右手用コントローラボード(無線版)の設計
  • MX以外にChocV2(19mm/17mmピッチ)での動作確認
  • 設計アプリのファイル出力機能の有効化
  • コントローラボード(無線版)の頒布
  • 有線版コントローラボードの設計、設計アプリ側の対応
  • トラックボールモジュールの設計

などを考えています。キーケットまでにはコントローラボードの頒布を間に合わせたいです。
ケース周りはあまり知見がないので、デモサイトを操作して思うところのある人がいたらご連絡ください。

VIA Custom UI for Vial

VIA Custom UI for VialVialをベースに拡張したWebアプリです。
Vialと互換の機能に加えて、いくつかの拡張機能や特徴があります。ときどき勘違いされますがBMP専用ではありません。Vial対応しているキーボードならマイコンによらず使えます(protocol 6)。

特徴

  • 起動が速い
    • キーボードを選択してからキーマップが表示されるまでの時間がVialより短いです
  • Remapを参考にしたキー設定方法
    • Remapを参考に、ポップアップとドラッグアンドドロップでキー設定を変更します
  • vial.jsonにカスタムUIを設定可能
    • VIAのようなカスタムUI機能を使用できます
  • ファイル保存/読込機能
    • ブラウザ版でもキーマップ設定をjsonファイルに書き出せます(注:Vialの.vilファイルとの互換性はありません)
  • BLE経由の書き換え機能
    • BLE Micro ProではBLE経由でもキーマップや設定が変更できます

背景・経緯など

QMK Firmwareをベースにしたキーボードのキーマップを書き換えるためのアプリとして、VIA, Remap, Vialがあります。

まずVialについて簡単に説明すると、Remapのようにキーマップを書き換える機能に加えて、コンボやタップダンス、タップ設定などの機能も持っているアプリです。
キーボードに書き込むファームウェアはQMK Firmwareのフォークで、キーボード側にキーレイアウトの情報を持たせるため、アプリ側に情報を登録しなくてもキーボードを認識してくれます。
ブラウザからも利用できますし、ローカル用のアプリも用意されています。
BLE Micro Proのファームウェアは昨年Vialをベースとしたものに移行したため、v1以降のファームウェアを書き込むとどのキーボードでもVialが使えます。もちろん、以前のようにRemap(0.19以降用)を使うこともできます。

一方、VIA/Remapはいずれも本家のQMK Firmwareの機能を利用しています。事前にjsonファイルをアプリ側に登録する必要があり、日本の自作キーボードキットでは登録時のレビューの早さに定評がありRemapが主流の印象です。
そんなわけで日本のキットでは見かけないVIAですが、VIA独自の機能としてCustom UIという機能があります。設定ファイルにメニューを定義しておくことで独自のメニューをアプリ上に表示する機能です。
ファームウェア側に対応するデータの送受信部を実装しておくことでキーマップ以外の設定もGUIから変更できるようになります。
Custom UI機能はアプリ側のGUI設定にあわせてファーム側の変更も必要ということを踏まえるとVialとの相性が良さそうですが、残念ながらVialには実装されていません(2024年12月時点)。

そこで、Custom UI機能をVial向けに移植してみたのがVIA Custom UI for Vialです。
最初に作った時はCustom UI機能だけサポートするつもりだったのでこの名前になりました。

たとえばvial.jsonに下記のように追記すると、Trackballというメニューが表示され、分解能を選択するためのドロップダウンリストが表示されます。

vial.json設定例
{
  "menus": [
    {
      "label": "Trackball",
      "content": [
        {
          "label": "Cursor",
          "content": [
            {
              "label": "CPI",
              "type": "dropdown",
              "content": [
                "id_trackball_cpi",
                0,
                1
              ],
              "options": [
                "200",
                "400",
                "600",
                "800"
              ]
            }
          ]
        }
      ]
    }
  ]
}

id_trackball_cpiから2つ目の数字、1がidの数値です。


keymap.cにはデータ受信時の処理を記載します。

keymap.cの例
void raw_hid_receive_kb(uint8_t *data, uint8_t length) {
    uint8_t *command_id = &(data[0]);

    // Due to an older version of via.c in Vial that does not support
    // id_custom_set/get_value, we use id_handled to invoke via_custom_value_command_kb.
    if (*command_id == id_unhandled) {
        via_custom_value_command_kb(&data[1], length - 1);
    }
}

void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
    // data = [ command_id, channel_id, value_id, value_data ]
    uint8_t command_id  = data[0];
    uint8_t channel_id  = data[1];
    uint8_t value_id    = data[2];
    uint8_t *value_data = &(data[3]);

    if (command_id == id_custom_get_value) {
        // キーボードの指定されたidに設定する
        custom_value[value_id] = *value_data;
    } else if (command_id == id_custom_get_value) {
        // キーボードの指定されたidの設定を取得する
        *value_data = custom_value[value_id];
    } else if (command_id == id_custom_save) {
        // 必要に応じてeeprom_update_byte などでeepromに保存する
    }
}


以上が単純な例です。いろいろメニューを増やそうとするとidの管理やkeymap.cの分岐が増えて大変になったり、設定を受け取った時点でキーボード側で処理を走らせたりしたくなるので、BLE Micro Proではvial.jsonからid管理のヘッダファイルを生成するスクリプトidと設定の構造体の紐づけなどをしています。


その後、設定のためにツールをあれこれ変えるのが面倒に感じたのでキーマップ編集機能などが追加されて今に至ります。
機能追加にあたってはVialを使っていて不便に感じた点を解消していきました。

BLE Micro Proでの使用を念頭に置いて無線経由での書き換え機能を追加しました。USB接続と違いキーボード接続時にすべてのデータをキーボードから読み込むと表示が非常に遅いことが分かったので、キーマップや設定は表示に必要なものだけを都度読み込んでいます。
キーマップを書き換えるときに必要なキーを探すのが大変だったり、意図しないキーをクリックしただけで書き換わってしまうのも慣れなかったので、Remapを参考にポップアップからリストを絞り込んで選択できるようにしました。
キーマップのファイル出力機能もブラウザ版Vialではなぜか使えないので追加しました。ただし、キーコードの辞書をQMKベースにしていたところVialでは若干違う辞書を使っていることが後から分かり、設定ファイルは互換性がないものになっています。

後述のtorabo-tsukiではCustom UIをフル活用してトラックボールの設定などを編集できるようにしました。また、BLE Micro Proのファームウェアにも、無線接続先のIDに応じてデフォルトレイヤーを切り替える機能を追加しています。
マトリクステスターなど足りない機能もあったり、見た目もおしゃれじゃないですが、少なくとも必要な機能は揃っていると思います。
冒頭で述べたようにBLE Micro Proじゃなくても使えるので、良かったら使ってみてください。

GTRK67

キーケット2024に向けて作成したトラックボール付きの一体型キーボードがGTRK67です。日本語配列対応の67キー配列で、右手または左手の親指部分にトラックボールを搭載できます。 ダイオードやスイッチソケットは半田済みです。有線接続でのみ使用する場合は半田付けせずに組み立てられます。 ファームウェアはvial-qmkベースで、RemapやVialでキーマップや設定を変更できます。

単四電池を2本搭載することで無線接続もできます。ファームウェアやトラックボールは無線用にチューニングされており、低消費電力を実現しています。

GitHub - sekigon-gonnoc/gtrk67

Contribute to sekigon-gonnoc/gtrk67 development by creating an account on GitHub.

2022年に作成した玉太郎2(仮)そのまま頒布しようかとも思ったのですが、センサが2個になると組立時に考えることが増えたり消費電力も増えるので、別のキーボードを考えなおしました。

キーケット後にUS配列版も作りたかったのですが、残念ながらセンサが入手不可になってしまったためお蔵入りとなりました。(保守用のセンサは確保しています)

torabo-tsuki

一体型トラボ付きを作ったなら分割型も、ということで作ったのがtorabo-tsukiシリーズです。

トラックボールセンサーと基板をフレキシブルケーブルで接続することでトラックボールの位置を自由に調整できます。自分は親指キーぎりぎりまで近づけたかったため、親指キーをChocにしました。

GTRK67からさらに省電力化を進めることで、トラックボール操作中平均電流が2mA、待機時の平均電流が500~200μA(マスター側, 1.2V)まで削減できました。
これにより、乾電池一本でも数か月間も利用できます。

先述のVIA Custom UI for Vialを使うことで、トラックボールの感度や方向補正、バッテリーモード、JIS/USキーボード変換など、各種オプションを変更できるようにしています。

GitHub - sekigon-gonnoc/torabo-tsuki

torabo-tsukiはトラックボール付きの無線分割キーボードキットです. Contribute to sekigon-gonnoc/torabo-tsuki development by creating an account on GitHub.

12月発送分は現在梱包作業中です。ご購入いただいた方は今しばらくお待ちください。

自作ローラーマウス

ローラーマウスを作ってみたりもしました。2本のパイプを3Dプリントしたセンサー保持部で連結する構造になっています。試作の寸法だと連結部でたわんでしまって外側ローラーの内壁がセンサーにこする問題がありました。一応改良モデルも設計していますが、お披露目するのはいつになるやら。

12mmトラックボールモジュール

数年前まであった7mmトラックボールモジュール的なものが欲しくなり、小型のセンサーを使って作ってみました。
7mmトラックボールモジュールより背が高いですが、代わりにスイッチプレートの14mm各の穴に取り付けられます。フレキシブルケーブルで配線できるので、キーボード側が対応していれば好きな位置に小型トラックボールを付けられるようになります。
現在頒布方法を検討中です。いくつも作るとなると組立が大変なので、トラックボール部分は公開してセンサーだけ頒布とかになるかもしれません。

来年のこと

来年のキーケット2025に、のぎけす屋(B-01)として出展予定です。
よろしくお願いします。

この記事はtorabo-tsuki(S)で書きました。