EdoBall KB 5 の詳細(キーキャップ編)

ティアドロップ型キーキャップ

物理配列編でも書きましたが、このキーボードは、スイッチをロープロファイル、配列を右手がオーソリニアとロースタッガードのシームレスなハイブリッド、かつ18mmピッチにしたので、市販の四角いキーキャップの多くは、隣のキーキャップと角の部分で干渉してしまいます。このため、キーキャップも3Dプリントすることにしました。(Alice配列はこの干渉を回避するために、角度が変化する部分で若干ピッチが変わるわけです。)

隣のキーキャップとの干渉を無くすためには、小ぶりな円形のキーキャップにするのが簡単なのですが、それだと文字の刻印領域が取りにくいので、このティアドロップ型のキーキャップを考えました。(通常は私はタッチタイプするので、刻印は不要なのですが、最近、長いパスワードの入力や長い数字列のパスキーの入力の機会が増えていて、キーに刻印があった方が便利だな、と思うことも増えたので、今回は刻印することを考えました。)

また、キーキャップにスカート部分を付けるとキーキャップの天面が狭いため、キースイッチ本体と干渉してしまいます。このため、ホコリの問題が大きくなりますが、思い切ってスカート部分を無くしました。一方、キースイッチをホコリなどから保護するため、筐体側にキーキャップの形に合わせて(ノートPCのように)穴をあけてあります。(これもまたちょっと面倒でしたが。)

他の特徴としては、天板の厚さは2mmで中央に向けて1mm深さの窪みを作っています。文字はこの窪みとある程度重なっても良いように0.8mmの深さで掘ってあります。

 

形状

文字を刻印するため、印刷方法と形状にちょっとした工夫があります。

キーキャップとサポート

 

キーキャップとサポート(刻印面)

このようにキートップの奥側の側面を30度ほど斜めにカットして、斜めにプリントしています。

これにより、刻印部分はサポートの必要がないので、キレイに印刷できます。逆にステム部分は浮いた部分からプリントが始まるため、サポートが必要で、フィラメントが良くないとステム部分が上手く印刷できなかったりします。

の図は、QIDIのスライサの画面で、サポートの角度30度以上、オーガニックサポートにしてます

私は3DプリンタにQIDI Q1 Proを使用してるのですけど、ノズル0.4mm、積層ピッチ0.12mmで印刷すると、水平に印刷するより、刻印部の精度もステム部の強度もいい感じです0.2mmノズルでなくても結構いけるんですね。(というか、交換が面倒なので、0.2mmノズルは持っているものの使ったことがないのですが。)

印刷

印刷に関するちょとしTipsとしては、一層目だけプレート温度~割高め、ノズル温度割ほど高めにするとつりプレートに定着して失敗が少なくなるよですともこれもフィラメントにるようですが。

私が試した中で良かったフィラメントとしては、QIDI純正のPLAフィラメント、ElegooのPLA Plusやマットなどがありました。

 

一方、某有名で安価なフィラメントは、上記温度設定等、いろいろ印刷設定を変えても、一層目の印刷に失敗することが多かったり、サポートが上手く機能しなかったりで、スライサの計算するサポートに加え、設計時にオリジナルのサポートを付けないと上手く印刷できない、なんてこともありました。ことキーキャップに関しては、フィラメント選びは重要ですね。

 

あと、QIDIのクールプレートというのも試してみたのですが、プレート低温は便利な一方、定着力が強すぎて印刷物うまく剥がれません。先日、通販サイトを改めてみたら、印刷用接着剤を使えとか書いてました。接着剤使うなら、普通のプレートでいいじゃん的な……。Bambooのクールプレートは評判いいらしいですけど、QIDIとはだいぶ違うものなんですかね?

 

タッチスイッチ内臓キーキャップ

タッチセンサ付きキーキャップ

キーキャップについてのもう一つの特徴は、タッチスイッチを内蔵したキーキャップです。

左端の列のキーは少々大きくなっていますが、その左側にはネオジム磁石が埋め込んであります。この部分がタッチセンサになっていて、その部分に触れるとレイヤーが変わるようになっています。ネオジム磁石の下には、導線が半田付けされたネオジム磁石がくっつくようになっており、そこからセンサICに繋がるようになっています。(ネオジム磁石をはんだ付けするのは、本当は良くないんですが……)これで、コードが断線しても比較的簡単に交換できるようになっています。基板側の方は、今のところ暫定的にテキトーにつないでいるので、お見せできる状態ではありませんw

センサの接続部分

タッチセンサ付きキーの具体的な使用例としては、私はAキーの左隣コントロールキー派なのですが、そのキーのセンサ部分を触って押すと、普通のコントロールキーとして動作し、それ以外の部分を押すとC-f, C-b, C-p, C-nでカーソル移動、それ以外は通常のコントロールキーとして動作するようにしています。何のことか分からない方も多いかと思いますが、エディタのEmacsのカーソル移動キーバインド風の動作をするように設定しています。でも、多くのアプリでCtrl-Fでの検索のキーバインドと被るので、検索したいときは、タッチセンサ部を押しながら、Ctrl-Fする、という使い方になります。

あと、ネタとしてEscのセンサ部分を触って押すと、hjklでカーソル移動、iでインサートモードに戻る、なんて機能も付けてあったりします。

センサチップ

タッチセンサICTTP223を使用しています。過去作のEdoBall KB 1KB 3でも、タッチセンサは多用していたのですが、 これらではタッチセンサチップは使わず、マイコンでタッチセンサ部の電圧変化時間を測定してタッチを判定していました。この方法はマイコン側の処理負荷が大きいことと、必要なマイコンのピン数が多くなることから、今回は専用のチップを使ってみました。ただ、マイコンを使うと感度の設定を(プルアップ抵抗と)マイコンの時定数で決定できるのですが、このチップは外付けのコンデンサの容量で感度調整することになるので、その点だけはちょっと不便ではあります。まぁ、やってみたところ、実用上問題はなさそうです。

EdoBall KB 5 の詳細(物理配列編)

物理配列編

今回から何回かに分けて、EdoBall KB 5シリーズの詳細について解説していきたいと思います。

 

EdoBall KB5シリーズには、いろいろな特徴がありますが、まず目につくのは、その(物理)配列だと思っています。

 

 

(EdoBall KB 5.1. 天キー Vol.9 でも展示しました。)

 

先日の天キーでも、この配列はどうやって思い付いたのですか?という質問も受けたりもしたので、その背景をちょっと解説します。

背景

昨年の天キー(vol.7)に参加した時に、ちぃなさんのChildhood's Endというキーボードを知りました。https://zenn.dev/cheena_gb/articles/5804348b47bc4a

(Childhood's End / Cheena. 天キー Vol.7 で私が撮影したもの。)

 

 

これは一般的なJIS配列のキーボードをベースとしながら、ちぃなさんが違い棚配列(仮称)と呼ぶ「右手側の一部キーのみを傾斜させ、残りを等差ロースタッガードで纏めた左右一体型・半Alice配列」です。これによりあまりフットプリントが大きくならずに、腕が左右に開き、体に負担の少ないというエルゴノミックな効果もありつつ、見た目も美しい配列になっています。配列以外を見ても

、とてもカッコいいキーボードで、衝撃を受けました。そこで、私もオマージュしてみようと思いました。(購入しろよ>オレ。でも、US配列派なので......)

とはいえ、違い棚配列をそのままUS配列化するのはさすが気が引けたのと、自分の好みとしては、中央部にポインティングデバイスを配置したかったので、左右異物理配列なら、いっそ左手もロースタッガード→オーソリニア化すれば、真ん中がもっと空くんじゃね?、と思ってできたのがこの配列です。

(EdoBall KB 5.1のスイッチの中心点をプロットした図)


配列の詳細

もう少し詳しくその成り立ちを見ていきましょう。

前述のとおり、左手側は単純なオーソリニアです。縦は6行(数字行あり)です。トレンドではありませんが、私はいわゆる40%キーボードが使えない(モディファイアと組み合わせた入力が苦手。新しい論理配列を覚えるのが苦手。)なため、こうしました。キーピッチは18mmです。

(上の図の右手側。上左端が6キー、折れ曲がったところが9キー)

右手側の行は中央の列(6キー)から3列にかけて(9キーまで)、ちょうど縦方向1U分(18mm)斜めになっています。9キーの列から最右列までは、水平です。

列は、全ての列について、上端のキーのX座標が左隣の列の上端から4つ目のキーのX座標と同じになっています。(例えば上の図のように9キーのX座標と","キーのX座標が同じ。)これで、6キーの列から9キーの列までは、行と列がちょうど90度で交差していてます。つまり、6キーの列から9キーの列までは(斜めに配列された)オーソリニア配列に、9キーの列から最右列まではロースタッガード配列というハイブリッド配列になっています。このあたりは違い棚配列(仮)と細部は異なるもののコンセプトとしてはほぼ一緒です。縦横のキーピッチは全て18mmになってるので、半Aliceの部分をより単純化した、とも言えます。(Alice配列のキーピッチが広くなるところがあるのが、個人的に好みじゃなかった、というのもあります。)

個人的には幾何学的にリズミカルな配列になっていて、わりと気に入っています。

ということで、幾何学的な面白さから決めた配列ではあるのですが、実際に使ってみても、わりと実用的な配列かと思います。私は小指が短いので、通常のUS配列で頻発に使う-(マイナス)キーやEnterキーが遠く、押しにくかったのですが、この配列ですと右上部のキーもホームポジションからの距離が比較的近いため、(個人的には)実使用上とても押しやすい配列になっています。

左手も同じような配列にすれば、さらに使い易くなるのかもしれませんが、左手は一右手より列少ないので、実使用上あまり気にならなかったりします(この辺は違い棚配列から学びました。)。あとフットプリントも比較的小さくできるというメリットもあります。

 

ということで、実用上もこの配列は結構合理的なんじゃないかとも思います。市販のキーキャップに使えるものが少ない、という問題はあるんですが、最近は(その筋の人の間では)3Dプリンタもかなり普及してきましたし、キーキャップ作成のためのツールもありますしで、ハードルは下がっていると思います。

よろしければ、皆さんもお試しください。

EdoBall KB 5

皆さんこんにちは

すっかりこちらは放置していたEdoBallです。

 

EdoBall KB5シリーズ

ここは放置していたのですが、Xでの投稿と、キーボードの開発は相変わらず細々と続けています。

今作成しているのは、これ、EdoBall KB 5シリーズです。

EdoBall KB5.5

これは、昨年の天キーでcheenaさんのChildhood's Endを見せてもらって、その違い棚配列(Childhood's Endと違い棚配列(仮称)について)の形状のリズミカルな美しさ、機能性に感銘を受けて、じゃ、私も左右異物

理配列みようか、と思って試作を始めたものです。以下に特徴を解説します。

配列

EdoBall KB5.1

まず配列です。見てのとおり、左手側がオーソリニア、右手側がAlice風のカラムスタッガードの配列になっています。キーピッチは若干狭ピッチの18mmです。

違い棚配列にならい、横(行方向)は1U分徐々にズレています。縦(列方向)も1U分徐々にズレて言います。("6"キーと"o"キーのY座標が一緒、"8"キーと"Spc"キーのX座標が一緒。見た目ちょっと分かりにくいですけど。)違い棚配列でも左右の手は若干開き気味になりますが、さらに角度を付けたかったのと、ポインティングデバイスを配置する空間を設けたくて、この配列を思い付きました。もちろん両手Alice風でも良かったのですが、そこは左右異物理配列にしたかったので。左手は一列キーが少ないので、オーソリニアでもあまり問題ないというか、この配列でも慣れると違和感を(私は)感じていません。

なお、最近の自作キーボード界のトレンドと異なり数字行が存在する60%(?)キー配列です。私が還暦近いオッサン(ジイサン?)なので、新規に配列を覚えるのが難しいのと、個人的に(昔から)モディファイヤを駆使するのが得意ではないため、ちょっとキー数は多めです。流石にファンクションキーはモディファイヤ使ってレイヤ切り替えして入力するようにはしていますが。

キーキャップ

漢のキーキャップ(前回の天キーで配布したもの)

右手がAlice風かつ折れ曲がり部も18mmピッチにしたので、市販のキーキャップの多くは、近隣のキーキャップと干渉してしまいます。この

ため、キーキャップも3Dプリンタで自作しました。(多くのAlice配列キーボードのキーピッチは、折れ曲がり部で広くなり、端の方のキーがより遠くなってしまうのが、個人的に好きではなかったので。)干渉を避けるために、単なる円形でも良かったのですが(自称)ティアドロップ型になっています。ティアドロップ型にしたことで、単なる円形広がった部分にはキーに対応する文字を彫り込んで

みました。(キー一個ずつ文字を配置するのはちょっと面倒でしたが。)ただ、これを印刷するには結構試行錯誤が必要でした。詳細は別途書きたいと思っています。

また、キーキャップにスカート部分を付けるとキースイッチ本体と干渉してしまうため、キーにスカート部分はありません。このため、キースイッチを保護するため、筐体側にキーキャップの形に合わせて穴をあけてあります。(これもまたちょっと面倒でした。)

 

タッチセンサ付きキーキャップ

これもキーキャップのネタではあるのですが、今回、最左列のキー群はタッチセンサ付キーキャップにしました。円形の金属部分(実はネオジム磁石)の部分がタッチセンサになっており、これにより、キーの金属部分を押すと、キーボードのレイヤが変わり、通常のキーとは異なる動作をさせることができます。

例えば、私は、A左隣Ctrl派なのですが、金属部分を押すと通常のCtrlキーとして動作し、それ以外の部分を押すと、Emacs ライクなC-f, C-b, C-p, C-nでカーソル移動、それ以外はCtrlキーとして動作、という風に設定しています。Windowsの場合、これで、どんなアプリでも(MacOSのように)Emacsライクなカーソル移動ができるので、Emacs使いとしては大変便利です。これについても、詳細は別途書きたいと思います。

なお、キーキャップのネオジム磁石には、両端に無理やりネオジム磁石をはんだ付けした銅線をくっつけて、そこから基板上に設置したネオジム磁石を介してタッチセンサICに接続し、タッチの検出・レイヤ切り替えするようになっています。これで、銅線が断線しても比較的簡単に銅線の交換ができます。(簡単か?)熱を掛けると磁石の磁力が弱まってしまいますが、まぁ、実用にはなっています。

 

ポインティングデバイス

EdoBall KB5.0 (前回の天キーでの展示。この後KB5.5に改造されたので、この筐体は現存しません。)

EdoBall KB5はトラックボールをドッキング可能に、EdoBalli KB5.5はタッチパッド内蔵です。最初KB5のキーボード部分だけ作ったのですが、思ったより薄かったので、こりゃタッチパッドの方がいいかな、とタッチパッドを後付けしたのが、KB5.5です。トラックボール部分はイマイチ仕様がしっくりきていないため、オリジナルのトラックボールセンサボードも既に設計・製作したのですが、実はまだちゃんと組みこんでいませんw

KB5.5のタッチパッドThumbSenseライクな自動レイヤ切り替え機能(タッチパッドに触れた時にキーボードのレイヤが変わる)があり、"F"キーや「漢」キーがマウスの左ボタン相当になります。スクロールもできるので結構便利です。長時間使うものではないですが。

 

筐体

EdoBall KB5.5

Fusion360で設計し、FDM方式の3Dプリンタ(QIDI Q1Pro)でPLAフィラメントで印刷しています。プリンタの印刷可能な大きさが微妙に足りなかったのでパーツを分けて印刷しました。どうせ分けるなら、ということで、KB5.5ではツートンカラーにしてみました。

 

電子回路

マイコンRP-200 Zero、マルチプレクサ(CD74HC4067M)、タッチセンサIC(TTP223)、トラックボールセンサ(PMW3360)、タッチパッドモジュール(SSCI-080798(Azoteq IQS525))、などを使用したオリジナル回路です。設計はKiCADを使い、PCBはJLCPCB製造です。

 

ファームウェア

QMK Firmwareを使用しています。マルチプレクサを使ったので、マトリックススキャン、ポインティングデバイス周りはオリジナルで書かざるを得なかった部分が多くなってしまいました。(こういう時はQMKは結構面倒。)US(物理配列)->JIS(PC側論理配列)変換機能や、前述のEmacsライクなカーソル移動機能、viライクなカーソル移動機能など、小技が仕込まれています。

 

おわりに

といった感じで試作を続けていました。特にKB5.5は可愛くできたと思うので、今のところ頒布の予定はないのですが、なるべく多くの人に使っていただきたいな、とは思っていて、何か頒布以外の策はないかと今考えているところです。11/8の天キーに持ってい行く予定なので、見かけたらご意見・ご感想をぜひお聞かせください。

 

 

ALT Modのソースを公開します

ALT Modのソースコードを公開します。

先日紹介しました、ALT Modのソースコードを公開します。

ALT Modとは?

改めて、ALT Modを紹介しますと、既存のキーボードのキーに、アルミテープを貼ってタッチセンサにすることで、本体は無改造で実質的にキーの数を増やすことができる手法です。ALuminum Tape Modification略してALT Modです。 ハードはスイッチサイエンスのPicossciに簡易タッチセンサを付加し、ソフトはせきごんさんのKeyboard Quantizer Miniのコードに簡易タッチセンサのコードを組み込み、Keyboard Quantizer Miniの機能に加え、タッチセンサによりレイヤの変更を行うようにしてあります。 これにより、例えば、スペースキーの押す場所を変えることで、4つの異なるキーコードを打ち分けることができます。

ハードウェアについて

具体的には、PicossciのGP8-GP9, GP10-GP11, GP12-GP13, GP14-GP15間にそれぞれ、1M Ohmの抵抗を接続し、GP9, GP11, GP13, GP15にそれぞれタッチセンサ(アルミテープ、銅テープ、導電性ゴム等)を接続します。USBホスト端子には、USBキーボードを接続し、USB-C端子はパソコンに接続します。 タッチセンサとPicossciの接続がちょっと難しいですが、私は、銅線はアキバのオヤイデ電気で多分これ、アルミの導電性テープはアマゾンマケプレで購入し、使用しました。配線は、あえて隠してないので、写真でもちょっと見えていますが、適宜、両面テープやアルミテープでキーボードに固定しました。工作の得意な方は上手く隠せると思いますが、私は不器用なので、配線に負担がかからず、簡単に作業できるようにこうしました。

ソフトウェアについて

(以下、既にqmk firmwareの開発環境があることを前提にしています。私はGit/GitHubについて良く分かってないので、間違いがありましたらご指摘下さい。) ソースはこちらにあります。(せきごんさんのvial-qmkをforkしたものです。)Gitでクローン、又は、ファイルをダウンロードして適当なディレクトリに展開してください。

その後、vial-qmkをインストールしたディレクトリに移動して、

qmk setup

して、開発環境をセットアップします。

 make edoball/keyboard_quantizer/mini:vial:uf2

コンパイルできます。 (vial-qmkをインストールしたディレクトリ)/.build にedoball_keyboard_quantizer_mini_vial.uf2とのファームフェアできていれば成功です。PicossciをBOOTSELスイッチを押しながら電源投入し、フォルダが認識されたら、edoball_keyboard_quantizer_mini_vial.uf2を転送してください。(Windowsならドラッグ&ドロップでできます。)

Keyboard Quantizer Mini から修正した点

私が修正した点は、 vial-qmk/keyboards/edoball/keyboard_quantizer/mini 以下にあります。基本的に修正点はコメントで示してあります。

設定

Remapに対応しています。

GP9, GP11, GP13, G15に接続されたセンサがタッチされた時、それぞれレイヤ4,5,6,7がアクティブになります。例えば、GP9センサをスペースバーに貼って、GP9センサを押しながら、スペースバーを押した時にEnterを入力したい場合、レイヤー4のスペースバーEnterを設定します。

私の場合、スペースバーの真ん中のタッチセンサをレイヤ4にし、スペースをEnterに、右側のタッチセンサをレイヤ5でBSに、左側のタッチセンサをレイヤ6で*Ctrl-Space(かな漢字のトグル)に割り当てています。(レイヤ7は使用していません。)スペースバーのタッチセンサ以外の部分は当然ながら通常のスペースです。

また、Ctrlの右側のセンサもレイヤ4に割り当てて、Emacs風のカーソル移動キーバインドを実現しています。通常のCtrlを入力したいときは、Ctrlキーの左側を打鍵すればよいので、個人的には、わりとすぐ慣れて、使い分けができるようになりました。Emacs風のキーバインドに慣れた私には、これはとても重要で、WordやExcelを使う時のストレスが、これでかなり減りました。(このテキストもあえてWordで書いています。)

最後に

とりあえず、このような方法で、本体無改造で実質的にキーの数を増やすことができました。タッチキーを用いた手法は、既存のキーの改造だけでなく、自作キーボードにおいて、いろいろ広がりがある手法ではないかと思っています。できるだけ多くの方にこの手法を試して頂ければなぁ、と思っています。現状ではちょっとハードルが高いですが、自作キーボードを設計するよりはかなり簡単なので、キーボードを自作されている方には試して頂き、いろいろ改良していただければ、大変ありがたいです。皆さん、ぜひ試してください!

また、改めて、Keyboard Quantizer Miniを開発、ソースコードを公開されている、せきごんさんに感謝の意を表します。ありがとうございました。(私自身、Keyboard Quantizerシリーズの幾つかの製品のユーザです。)そして、P Picossci でKeyboard Quantizer Miniのファームを動かすにあたり、cheer4uさんのこの記事も大変参考になりました。ありがとうございます。

AlT-Modのススメ

おひさしぶりです。

自キー界の皆さんは、市販のキーボードに不満があると、ご自身でキーボードを設計されているかと思います。とはいえ、市販のキーボードは市販のキーボードならではの良さがありますよね?私はもちろん自作のキーボードも使っているのですが、古いFilcoのMajestouch Miniを(前に書いたを改造して )使ってもいます。

ほかにも、HHKB Proとかわりと好きなのですが、好きと普段使いできるかは、また別問題だったりもします。HHKB発案者の和田英一先生のような真のハッカーでしたら、カーソルキーとかいらないんでしょうが、諸般の事情でWordやExcelと長い時間すごさざるをえない、ハッカーどころかIT技術者でもない私には、HHKBは好きとはいえ、常用するにはつらい面があります。特に、カーソルキーがなくて、Fnとのコンビネーションも使いにくいこと、スペースバーがやたら大きいことなどです。(HHKB日本語版があるじゃないか、という意見があると思いますが、タッチタイプをSun3やSPARCstationでおぼえたとか、HHKB初代からのユーザということもあって、HHKBはASCII版しか持っていません。)

一方、最近の自キー界のトレンドをみると、60%や40%キーボードであっても(だからこそ?)、親指で押せるキーを増やして、各種モディファイヤキーやバックスペースに割り当てている方が結構いらっしゃるようです(私もそうしてます)。親指はそんなに器用な指ではないとはいえ、押しやすい位置にスペースバーだけというのも、スペース的にはなんとももったいないですよね。

とはいえ、HHKB Proはキータッチ等、捨てがたいんですよね。

AlT-Mod

そこで、なんとか実質的にキーを増やせないかと考えたのが、今回提案するアルミテープを使ったキーボードのモディファイ方法、名付けてAlT-Mod(Aluminum Tape Modification、あるともっど)です。銅テープだとCuT-Mod(かっともっど)ですかね? 見てのとおりHHKB Proのスペースバーとコントロールキーのところにアルミテープがベタベタと貼ってあります。これとキーボードのUSB端子が、スイッチサイエンスのPicossci USBホストに繋がっています。Picossci側にはせきごんさんのKeyboard Quantizer Miniのソースに少々手を加えて、アルミテープがタッチセンサとして機能するための回路(といっても抵抗だけ)とコードが仕込んであります。Keyboard Quantizerシリーズは、USBキーボードから送られてくるキーコードを適宜変換して、キーをマップを変更するものですが、これにタッチキーを組み合わせて、タッチキーが押されると対応するレイヤに変更するようになっています。

例えば、写真のスペースバーには3個のタッチキーがあるので、同じスペースバーを押しても、押す位置によって、レイヤ切り替えで(通常のスペースを含めて)最大4つのキーコードに変更することができます。(私は、アルミテープを張った部分を、左から全角/半角、Enter、Backspaceに割り当てています。)本来のキーがオンになる前に、必ずタッチキーはオンになりレイヤーが変わるのがミソですね。(触れずに押すことはできないので。)

私としても、この技法を多くの方に試して頂きたいので、情報は公開していきたいのですが、私がGitHubの使い方を良く分かっていないことや、一部のファイルのライセンスが不明なこともあり、ソースの公開は少々お待ちを。 5月の天下一キーボードわいわい会で紹介したかったのですが、当日別の予定があるので行けず。7月に行われるキー部で紹介できればなぁ、と思っています。

QMK Firmware: Understanding Split Keyboards

QMK Firmware での分割キーボードの仕組み

皆さんお久しぶりです。気が付いたら2年以上もブログを放置していました。X(Twitter)では、多少呟いてたりはしてたのですが。

キーボードも細々と作っていまして、先日はキー部7%に作りかけのキーボードを持ち込んでみたりしました。

youtu.be

(Daifuku Keyboard さんのアーカイブです。)

 

パームレストに仕込んだタッチセンサで、キーボードモードとトラックボールモードを切り替える点が意外に評判良くて、ちょっと気を良くしました!が、他の方の作品は、どれも見た目も美しくて、私にはとても無理なので落ち込んだり。

まぁ、何れにせよ刺激になりました。スタッフの皆さん、参加された皆さん、ありがとうございました。

 

さて、この作りかけのキーボードでは、上述のとおりマスタ側である右側のキーボードにタッチセンサを組み込んであるんですが、どうせななら、スレーブ(左)側にもタッチセンサを組み込みたい、と思ったのですが、そもそもQMKでの分割キーボードの仕組みが良く分かっていない。仕方がないので、QMKの関連しそうなソースをちょっと探ってみました。

 

QMKの処理の流れ

まず、QMKの処理の大きな流れは、Understanding QMKに書いてありまして、ざっくり言うと、メインループから、protocol_task()を呼び、そこから、keyboard_task()を呼び、keyboard_task()がマトリクスのスキャニング、マウスのハンドリング、LEDなどのキーボードステータスの処理を行う、とあります。より具体的な関数の呼び出し階層なんかも書いてますが、これはマスタ側の処理で、スレーブ側ではどういう処理をしているのかまるで書いていません。しかも、どういうデータが通信されるのかも書いていません。

で、その辺どうなってるの?というのがこの記事の主旨です。

 

分割キーボードのデータ構造

まず、QMK内部で分割キーボードの各種データはどのような構造になっているか見てみます。

qmk_firmware/quantum/split_common/transport.h

に _split_shared_memory_t という構造体が定義されていて、

typedef struct _split_shared_memory_t {
#ifdef USE_I2C
    int8_t transaction_id;
#endif // USE_I2C

    split_slave_matrix_sync_t smatrix;

#ifdef SPLIT_TRANSPORT_MIRROR
    split_master_matrix_sync_t mmatrix;
#endif // SPLIT_TRANSPORT_MIRROR

(以下略)

といった感じになっています。ここで、smatrixがスレーブ側のキーボードマトリクスの値、mmatrixがマスタ側のマトリクスの値になります。

他のLEDの情報やポインティングデバイス等の情報もマスタ、スレーブそれぞれのデータ構造が定義されています。

マスタ・スレーブそれぞれはこのshared memoryの自信の担当領域にマトリクスのスキャン結果などを書き込んでいき、(必要に応じて)特定のタイミングで他方のマトリクススキャン結果を要求して、送られてきた通信結果をshared memoryに書き込み、その後の処理を行うという流れになります。

マトリクスに関しては、これらのshared memoryのデータは、matrix.c等で用いられる、

extern matrix_row_t matrix[MATRIX_ROWS]; 

に(左、右の順で)マップされていて、マスタ・スレーブのどちらのマトリクスであるか意識することなく、読み出して、それをもとに処理(例えばLED処理)できるようになっています。

マトリクスの値を変更したい場合も、このmatrixのマスタ・スレーブそれぞれの担当の領域に書き込みすれば、他方が読み出した時に、転送されるようになっています。(自身の担当外の領域は、読み出し専用で、書き込んでも、相手側のデータは反映されないようです。)

 

スレーブ側のマトリクススキャン処理の流れ

マスタ側は先に見たようにUnderstanding QMKのとおりなのですが、スレーブ側も基本的な流れは同様のようです。(#defineされた機能の定義によりますが)

マスタと同様、matrix.c の matrix_scan()が呼ばれ、マトリクスをスキャンします。この中で、分割キーボードの場合は、matrix_common.c の matrix_post_scan()が呼ばれ、#defineされた内容に応じて、必要なマスタ側のデータを取得したのち、matrix_slave_scan_kb() が呼ばれ、さらに matrix_slave_scan_user() が呼ばれます。

matrix_slave_scan_user()は

__attribute__((weak)) void matrix_slave_scan_user(void) {}

と定義されているので、ユーザは、このmatrix_slave_scan_user()を(keymap.cの中などで)オーバーライドして、そこでマトリクスに読み書きすることができます。例えば、(マトリクススキャンされない)タッチキーのオン・オフデータをマトリクスに反映させるためには、このmatrix_slave_scan_user()中で、matrixの所望の位置のビットを操作すればよいことになります。

matrix[]のデータの持ち方は、キーボードによりますが、テンプレートから生成されたものの場合、左側キーボードは奥がmatrix[0]で、手前に向かって引数が1ずつ増加、LSBが左端に対応、右側キーボードは左側の次の引数から手前に向かって引数が1ずつ増加、LSBが右端に対応かと思います(たぶん。これはキーボードによるので、適宜確認してください。)

私の場合、この操作でスレーブ側のタッチキーのオン・オフをマトリクスに反映し、マトリクス側のキー操作に対応することができました。

 

マトリクスについては以上ですが、LED等の他の機能についても、QMKは一体型のキーボードを基本としているようで、各機能毎にそれぞれ分割型の処理がそれぞれ実装されており、上のレイヤでは、分割型・一体型の違いを意識させずにプログラミングできるようになっているようです。逆にいうと、スレーブ側でちょっと変わったことをしようとすると、いろいろ調べて自前で実装しないといけないようです。分散型ではなく中央集権的、といった感じでしょうか。(これはこれである意味わかりやすいのですが、個人的な趣味とは違うというか。)

 

 

USB2BT+

f:id:EdoBall:20211031125618p:plain

USB2BT+


Bit Trade One のBTOSショップでハロウィーンセール開催、ということで、USB2BT+

ADU2B02P USB2BT PLUS | Bit Trade One, LTD (bit-trade-one.co.jp)

を買って、長年使ってきたFilco Majestouch Miniに接続して試してみましたので、ちょっとご紹介します。

 

このキーボードは日本語キーボードですが、私は英語キーボード配列に慣れているので、OS(Windows/Mac両方に切り替え機を介して接続)には英語キーボードとして認識させる、というちょっと変わった使い方をしていました。(ハード的に日本語配列のノートPCで、英語配列っぽく使うためにこの手法(配列)に慣れた、というのがこんな使い方をしている大きな理由です。)

さて、右下のあたりに変な(汚いw)キーキャップが見えると思います。これは先日Twitterには書いたのですが、シフトキーとカーソルキー周りの配列を変えるため、3Dプリントしたものです。このMajestouch Mini、元の配列ではシフトキーが一番右にあって、右シフトが押しにくかったんですね。これを改善するため、キーキャップを3Dプリンタでプリントして、基板に物理パッチをあて

元は  \ 上 シ だったものを シ 上 上

    左 下 右        左 下 右 (「シ」=シフトキー)

と配列したものです。シフトキーの幅を右に広げるため、カーソルキーは軸から右にオフセットして配置してあります。押し心地は良くありませんが、そんなに多用するキーでもないので今のところそんなに問題は感じていません。ただまぁ、プリントがうまくいかず、だいぶ見た目が悪いのが難ですが。

 

この改造をした後で、USB2BT+が届いたので、さらに、USB2BT+のReplay Key機能を使って、EmacsっぽいControl-F -> 右などのカーソル移動や、無変換キーをEnter、変換キーをBackspaceなど、EdoBall KB-I で試した親指多用なキー配列を試してみたところ、なかなか使い勝手が良くなりました。作成したReplace Key機能のためのCSVファイルの内容は以下のとおりです。上書きしたControl + (X)はShift + Control + (X)に割り当ててみました。これでも実使用上はあまり問題なさそうです。Kanaキーによる変換モードの切り替えは、ブラウザなど、アプリによってはうまく動かない場合があるようです。

// Emacs Like key bindings          
version 1       // 常に1    
device_bitmap 7       // (7)全デバイス/(1)device1のみ/(2)device2のみ/(4)device3のみ
ctrl_capslock 0       // (1)CTRL/CAPSLOCK入れ替え
// 入力シフト キーコード 出力シフト キーコード    
convert[0] 0x00 0x8B 0x00 0x28 // 無変換   - Enter  
convert[1] 0x00 0x8A 0x00 0x2a // 変換     - Backspace
convert[2] 0x01 0x09 0x00 0x4f // C-f - Right  
convert[3] 0x01 0x05 0x00 0x50 // C-b -Left  
convert[4] 0x01 0x13 0x00 0x52 // C-p - Up  
convert[5] 0x01 0x11 0x00 0x51 // C-n - Down  
convert[6] 0x01 0x07 0x00 0x4c // C-d - Delete  
convert[7] 0x01 0x04 0x00 0x4a // C-a - Home  
convert[8] 0x01 0x08 0x00 0x4d // C-e - End  
convert[9] 0x03 0x09 0x01 0x09 // C-S-f - C-f  
convert[10] 0x03 0x05 0x01 0x05 // C-S-b - C-b  
convert[11] 0x03 0x13 0x01 0x13 // C-S-p - C-p  
convert[12] 0x03 0x11 0x01 0x11 // C-S-n - C-n  
convert[13] 0x03 0x07 0x01 0x07 // C-S-d - C-d  
convert[14] 0x03 0x04 0x01 0x4a // C-S-a - C-a  
convert[15] 0x03 0x08 0x01 0x4d // C-S-e - C-e  
convert[16] 0x00 0x88 0x04 0x35 // kana - Alt + 全角/半角

Replay Key機能だけならArduinoを使えば自分でも簡単に作れそうですが、USB Host Shieldが必要だったりで、結構材料費がかかりそう。なによりコンパクトで、デザインもカッコいいので買って満足な製品でした。(BT機能は今のところ使ってませんが、使うこともあるでしょう。)