キースイッチの研究 1

Romlyさん作の「軸の秤」を購入しました。 これは、キーボードのキースイッチのフォースカーブを測定する装置です。 フォースカーブとはキーを押した時の荷重vs変位曲線で、キースイッチの特徴を表しています。

キースイッチはCherry MX互換だけでもたくさんあって、 しかもバネを変えたり、ルブしたり、カスタマイズしてようやく自分に最適なスイッチになるわけですが、 どうにも感覚的で技術者としては定量化したくなります。

そこで、過去に私もステッピングモーターとロードセルを買ってフォースカーブテスターを作ろうと思ったことがあるのですが、 モーターが動いて、ロードセルで荷重測定できるところまでで頓挫し、 フォースカーブを測定するところまでは辿り着けませんでした。

それと比べたら、軸の秤は本当に完成度が高くて、 初めて計測した時は感動しました。 ファームウェアもよく考えられていて、 市販の測定器みたいです。 ハード的にもHIWINの高級リニアガイド使ってるし、 専用のPCBを起こしていて、 はっきり言って、キーボードを作るより、こっちの方が100倍くらいは難しそうです。

f:id:eswai:20220115200926j:plain

Romlyさんの「軸の本2」も持っていて、こちらも驚くべきクオリティで、 商業ベースだとあり得ないですよ。 「軸の秤」もなるほどという感じで、Romlyさんの熱意には驚かされます。

さて、組み立てた軸の秤を使って、これまでキースイッチについて疑問に思っていたことを調査していきたいと思います。 とりあえず、デフォルトの設定を使っています。 本当はもっと細かなピッチで測定したいのですが、 そうするとプレス側の測定が終わった後に、リリース側の測定が始まらずに完了してしまうことが多くて、 あきらめました。 ファームウェアの課題だと思いますので、 将来的には解決されるでしょう。

キーがONになるActuation pointも測定したいので、 スイッチをセットして、ソケットから配線を出して軸の秤に接続する台座を作りました。 スイッチの軸にプローブをあてますが、十字型の軸に当てるのは安定しないので、 測定用キーキャップ(0.2〜0.3g、測定にほぼ影響なし)も作ってみました。

f:id:eswai:20220115174338j:plain

最初に、何度測定しても同じ結果を返すのか、を確認しておきたいと思います。 下は同じスイッチを5回測定して、結果を重ねてみました。 問題はなさそうですね。 これなら、何度も測定して平均化するという作業は不要そうです。 急激に荷重変化するところではばらつきますが、 これは測定ピッチが粗いからでしょう。 ファームウェアの問題が解決したら、ピッチを変えてやり直してみます。

f:id:eswai:20220115185923p:plain

ここで測定したのはGateron BOX INK V2 Blackというお高いスイッチです。 スペックは以下のようになります。

  • Total travel:3.4±0.4mm
  • Pre-Travel: 1.2±0.3mm
  • Operating pressure: 60±10gf

f:id:eswai:20220115201744j:plain

軸の秤の測定結果は原点のオフセットを修正すると、 Pre-travel 1.3、Total travel 3.3、Operating pressureは53gfでした。 公差内に入っているので、軸の秤の測定結果は確からしいですね。 十分、スイッチ研究に使えそうです。

PRK Firmwareをbuildする

この記事はPRK Firmware Advent Calendar 2021の12月22日のエントリです。

PRK Firmwareをbuildしたいのですが、M1 Macだと以下のエラーがでて、どうして良いのかわかりません。

ld: library not found for -lcrt0.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[7]: *** [all] Error 1
make[6]: *** [compiler.o] Error 2
make[5]: *** [libpicorbc] Error 2
make[4]: *** [host-production/alloc_libc_libs] Error 2
make[3]: *** [src/mrubyc/src/mrblib.c] Error 2
make[2]: *** [lib/CMakeFiles/picorbc] Error 2
make[1]: *** [lib/CMakeFiles/picorbc.dir/all] Error 2
make: *** [all] Error 2

PRK FirmwareにはDockerfileが同梱されているのですが、 これは特定のキーマップを含んだファームウェアを作成するためのものということです。

そこで、それをちょっと修正して、キーマップなしのファームウェアを作成するDockerfileを作ってみました。 docker -o . .とすると./prk_firmware/build/にuf2ファイルが出来上がりました。

さて、PRK Firmwareを少しずつ触っていきたいと思います。

gist.github.com

きゅうり改キーボードを作る

この記事はPRK Firmware Advent Calendar 2021の12月11日のエントリです。

Ruby界では、まつもとさんが「きゅうり改」という方式でローマ字かな入力されているのが有名ですが、 これはCannaの辞書定義で実現しているそうです。

きゅうり改以外にも、入力配列の試みはたくさんあって、 配列沼へのお誘い: 大岡俊彦の作品置き場 などを参照ください。

私は薙刀式使いで、最終的にはPRK薙刀式をファームウェアで実現するのが目標なんですが、 PRKの今のapiでは難しそうなので、 まずはきゅうり改にトライしてみました。

英字入力とカナ入力で配列を切り替える

「G」のキー(実際にはアルファベットのQキー)を押してから「U」のキー(アルファベットのJキー)を押すと「ぐ」が入力されます。

日本語入力モードではQWERTYではなく、 専用の配列になるのですが、 これは英字と日本語でレイヤーを切り替えることで、 きゅうり改用の配列に切り替えることができます。

https://gist.github.com/eswai/f857923e2cf00cbf4586db696400dc01#file-keymap-rb-L17-L24

ついでに、レイヤー切り替えとかなON/OFFを同時にやれば、 1アクションでOS側とキーボード側を切り替えられます。

https://gist.github.com/eswai/f857923e2cf00cbf4586db696400dc01#file-keymap-rb-L47-L58

1キーで複数文字を入力する

「きゃ」のように拗音(ようおん)を含む文字は、子音キーの後に「ゃ」キーのような拗音(ようおん)キーを打ちます。 ローマ字入力であいまいになりやすい「ん」と「っ」は独立したキーが割り当てている

マクロ機能を使います。 やゆよは1キーでya, yu, yoと2キー分出力します。オリジナルのきゅうり改ではxya, xyu, xyoを出すべきですが、子音とのつながりからya, yu,yoとしました。

複数文字入力はいくつかやり方を考えたのですが、 %i[KC_Y KC_A]で渡すと連続ではなく、同時押しになります。 Kbd.send_keyは最初の1キーしか出力されないようです。 macroしかなさそうですね。

https://gist.github.com/eswai/f857923e2cf00cbf4586db696400dc01#file-keymap-rb-L76-L80

キーの組み合わせで入力を変える

それ以外の小文字は「小」キーを使い、「H」「小」「A」→「ふぁ」というように入力します。

小キーは単純では機能しません。 あいうえおの前に小キーをおしたらxaとかxiと出力、しかし「H小A」ならfaと出力です。 前にどのキーを押したかで処理を変えなくてはいけません。 ここでは入力したキーを保存して、小キーを押したときに前の文字がHだったら、 バックスペースでHを消してからFを入力するようにしてみました。 前の文字がHでないときはXを出力します。

https://gist.github.com/eswai/f857923e2cf00cbf4586db696400dc01#file-keymap-rb-L63-L73

まとめ

Cannaの定義ファイルをみるとわかる様に、きゅうり改は実は非常に複雑です。 ここでは、本当に基本的入力のみ実装してみました。 きゅうり改を完全に実装するところまではできていないのですが、 基本的な機能は作れそうです。

2021の自作キーボード活動

この記事は キーボード #2 Advent Calendar 2021 - Adventar の12月8日のエントリです。

自作キーボードも2018年から始めて、4年目に入りました。 去年作成したOrtholinearの分割キーボード GitHub - eswai/742_keyboard を日常的に使用しており、 道具としては満足していますが、 相変わらずキーボードを作りたい欲は続いているようです。

カスタムキーボード SPACE65:CyberVoyager

自分の好きなように物理配列を設計したい、という欲求から始めた自作キーボードですが、 一方、カスタムキーボードも味わいたくて一つ組み立てみました。

比較的リーズナブルな価格で、見た目もかっこいいし、カスタムキーボードを触ってみたかったので、GraystudioのSPACE65:CyberVoyagerを購入しました。 塗装の品質も高いし各部品の合わせもよく、満足できる品質です。 打ち心地も確かにボトムマウントやPCBサンドイッチ構造よりもいいことは感じられました。 ガスケットマウントなんかも試してみたいな。

仕様は

  • スイッチ Gazzew Boba Gum サイレントリニアキースイッチ、SPRIT 30gスプリング
  • スタビライザー DUROCK V2
  • キーキャップ PBT Double Shot Keycap BoW

典型的なロースタッガードは好きではないので、将来的にプレートとPCBを自作して入れ替える予定です。

f:id:eswai:20210503155616j:plain

X60 MCU直のせPCB

ProMicroを使わずに、全ての部品を1枚のPCBに載せるのは自キ設計者の目指すところと思います。 GH60互換というケースやPCBがあって、マウントの位置やUSBコネクタの位置を守れば互換ケースに収まります。

ちょうどBLADE60というアルミ削り出しのケースをみて、一目惚れしました。 GH60互換のPCBがのるボトムマウントのケースです。 変則的な面で構成された形状がかっこいい。 MCUを直のせする練習にはちょうどいいと思って、TS配列っぽいPCBを設計した。 ai03さんのJP60のKiCADデータをベースにさせていただき、 手ではんだ付けできるようにMCUはQFPに変えました。 すばらしい基礎となるデータがあったので一発で動きました。ありがとうございます。 パーツはBOMをもとにLCSCから購入しました。

仕様としては

  • スプリットスペース
  • スペースの両脇にLOWER, RAISEをおく
  • TS配列風
  • カーソルキー有り
  • 一般的なキーキャップセットが使えるように (スペースは2.25Uと2.75U)

f:id:eswai:20211025222229j:plain

VpicoとPicoRubyマクロパッド

ファームウェアでカナ入力を実現するQMK薙刀式は細かな問題はのこっているものの 日常的に使えているので放置に近くなってきました。 正直なところ、アイデアはあっても、これ以上複雑なことをするのに、 C言語では気が進まないなという気持ちでした。 AVRではファームウェアサイズも上限に近いのこともあり、 新しいことをするのにためらっています。

そこに現れたのが、Rapberry Pi Pico (RP2040)とRubyで書けるキーボードファームウェアPRK firmwareです。 Rubyなら複雑な処理もシンプルに書けるのではないかと言う期待があり、 開発用に簡単なキーボードを設計してみました。

PRK firmwareの話はPicoRubyマクロパッドを作った - weblog.sy に書いています。

MacOS薙刀式入力ソフト Benkei

自作キーボードではないですが、 愛用のカナ入力である薙刀式をMacBookのキーボードでも使いたい、 Objective-CやSwiftで書けば、 もっと高度な処理ができるのではないかと思っていました。 親指シフト用の入力ソフトにLacailleというソフトがあり、 GPLソースコードが公開されています。 これをベースにすればできそうなので、 作ってみました。 そこそこ使えるようになったところです。 ごりゅごCASTで紹介いただいたりして、 薙刀式布教への一助になれたかなと。

より高度なロールオーバー処理などよりなどやるために、 Swiftで一から実装したいなと思っているところ。

github.com

まとめ

今年は、引っ越したり職場が変わったりして、生活面の変化が大きく、 半年ほどは生活ペースを作るに忙殺されていましたが、 ようやく後半は落ち着いて色々できるようになってきました。 来年もマイペースに楽しめればいいなと思っています。

PicoRubyマクロパッドを作った

この記事はPRK Firmware Advent Calendar 2021の12月4日のエントリです。

秋にPiceRubyのロゴを模したPRK firmwareで動作するマクロパッドを設計、試作しました。 その経緯を書いてみたいと思います。

Vpicoを作った

f:id:eswai:20211002194224j:plain

Rubyファンで、自作キーボード設計者なので、 PRK firmwareは試さないわけにいきません。 Rubyなら自作のQMK薙刀式をより進化させることができるのではないか、という目論見もあります。

そこで、まずPRK Firmwareで遊ぶために、 テスト用のキーボードを作りました。 モバイル用のミニマムキーボードのイメージです。 中央の一等地にラズパイPicoを鎮座させてみました。

ProMicroでキーボード設計するのと変わらない感覚ですね。 3Dプリンタでケースも作ってみました。

github.com

PicoRubyのロゴができた

そんなときに、hasumikinさんがPRK Firmwareのロゴを作っているのを発見。これはキーボードではないか。

レンダリング画像を作ってみた

とりあえず自作のレンダリングツールで早速ロゴを模したキーボードをレンダーしてみた。

反応があった

そしたらPRK firmware 作者のhasumikinさんから反応があり、本当に作るんですかという問いに、作りますと即答。 自作キーボード入門イベントを企画しているとのことで、題材に使いたいとのことでした。

マクロパッドを作ってみた

f:id:eswai:20211023111927j:plain

で、作ってみた。 Vpicoを作っていたので、設計は簡単だった。 本当はこのキー数ならダイオードは不要なんですが、PRK界のmeishiを目指すために、キーマトリックスを使って、ダイオードも入れました。 LEDも3個つけられます。

試作1号はロゴのシルク印刷がつぶれたのでロゴを修正してもらったりして、改善版2号機の設計までやりました。 自分用は3Dプリンタでケースも作ったんですが、イベント用にボトムプレートも設計しました。

github.com

基板はフリーのKiCadというツールで設計し、 JLCPCBで制作をしてもらいました。 費用は基板5枚で$2.5、送料 $2.56と格安です。 みなさんも気軽にキーボードを設計しましょう。私は自作キーボード設計入門で学びました。 このレベルなら素人でも 設計できるようになります。 並べて配線つないでいるだけです。

イベントで使ってもらえた

connpass.com

ということで、 hasumikinさん主催の今日のイベントで 使ってもらえるらしい。

みなさん、無事に完成できたでしょうか。

エンドゲームに近づいたのか?

キーボード #2 Advent Calendar 2020 - Adventar 6日目の記事です。

昨日はTakeshi Nishioさんの自キ活1年目で出来たものと、総当たりマトリクスのご紹介(ダイジェスト版) | 勢いだけでやるページ on GitHubでした。

明日はF_YUUCHIさんの2020年にやったこと/できなかったこと&これからの話 - ゆーちログです。

2020年の自作キーボード活動

2019年、自作キーボードについては、いろいろやりつくした感があったけれど、こうやってまとめてみると、まったくやりつくしてなかったと言わざるをえない。 今年もキーレイアウト遊びをふくめていろいろ試してみた。 2020年は、エンドゲームに近づいたのか?

今年作ったキーボード

  • Caravelle

積んでいるキーボード

  • SPACE65:CyberVoyager
  • NumATTACK16

設計したキーボード

  • X68 Treadstone配列風の68キー一体型
  • Gullwing エルゴノミック配列一体型BLEキーボード
  • 742BLE Ortholinear7x4分割BLEキーボード
  • 742 Ortholinear7x4分割キーボード

配列

742キーボード

さて、アドカレ記事の本題として742キーボードの設計制作過程を5ステップに分けて振り返ってみたいと思います。 7行4列で左右2あるので、プロジェクト名を742と名付けてそのまま今に至ります。

Phase 1 Plan and Define Program

2018年に自キ入門してから、 いろいろな配列を試してみて、 Ortholinearが自分に一番あうことは、だいたいわかってきました。 自作キーボードらしいcolumn staggeredも最初は大好きでしたが、 どのキーも満遍なく押しやすい、キー位置を把握しやすく、アルペジオしやすいのはOrtholinearだと思います。 一方、一体型のOrtholinearは手が意外と窮屈で、Ortholinearなら左右分割が ベストだと思っています。

キー数は40%でもなんとかはなるのですが、もうすこし多い50キーくらいあると安心というのが、今の感覚です。 これまで、Ortholinearは何個も作りましたが、親指1Uは指が迷う、押し間違えることが多かったので、2Uにしたら非常に安定しました。 親指2Uが、今年最大の発見かもしれません。

2018年時点で、HelixやErgo42というほぼ自分のエンドゲームに近いキーボードがあったのですが、 それに気づくだけの知識と経験を得るのに2年かかったということでしょう。 沼は深いです。

実はCaravelleをベースに、いきなり742のBLE版を最初につくって、これはエンドゲームか、と思ったのですが、 BLEは複数端末とのペアリング切り替えが安定しなかったし、最初は快調だったのに、数か月すると動作も安定しなくなってきました。 QMK薙刀式も、nrf用QMKで動作するには、それなりに変更が必要で、機能に制限もあり、有線版と同時にメンテしていくのは得策ではないと思いました。 私にはBLEは難易度が高すぎたようです。 そこで、この有線版742キーボードをつくります。 チップを全部PCBに実装するのはあこがれますが、BLEで苦労したので、今回はPro Microでかたくいきます。 Pro MicroやケーブルのレイアウトはErgo42を踏襲させていただきました。

英字配列は自作のColevrak配列です。 これはキーキャップにColevrakキットという、Dvorak配列とColemak配列の両方に対応できるキーキャップがありますが、 そのキーキャップと標準のQWERTYキットの範囲でできる英語専用の配列を目指しています。 配列屋さんからすると、そんなしばり意味ないと思いますが、 自キ勢のこだわりとして導入してみました。

かな配列は、もちろん、QMK薙刀式かな入力を搭載します。 今回はじめてOLEDを載せてみました。 QMK薙刀式はキーボード内で、英字入力とかなと入力のモードを切り替えるので、ここには入力モードの表示をやろうと思っていました。

だいたい仕様がきまりました。

Phase 2 Product Design and Development

設計に入ります。

ケースとプレートは3Dプリンタでつくるのが安くて手っ取り早いので、最近の定番です。 3D CADとの親和性は高いし、 すばやく試行錯誤でき、自宅で作れるメリットは大きいです。 3Dプリンターでつくるプレートもやわらかくて好きです。 Ortholinearなんでキーレイアウトの設計はほぼなしです。 Column Staggeredなんかだと、KLEで悩むんですが。

各部品のレイアウトが決まったら、最初にKiCADでPCBの設計に入ります。 この段階でケースの2Dレイアウトはおおむねやっておきます。

f:id:eswai:20201130061459p:plain

そして、KiCADでPCB設計、KiCADからSTEP形式でPCBをエクスポート、Fusion360へインポートしてケースを設計し、不具合をまたKiCADへフィードバックする、というサイクルを2、3周して設計をすすめます。 設計というのは、手戻りなく一発で決めよう、と思わないほうがいいと思っています。 CADは清書ツールじゃなくて、思考ツールですから。 さらに3Dプリンタモックアップを作成し、実際にキースイッチやキーキャップもつけてみて、レイアウトやデザインの確認をします。

f:id:eswai:20201130010651p:plain

OLEDはケースと隙間なく取り付けたかったので、ケースのパネルにはめ込んでから、取り付けるようにしました。

f:id:eswai:20201130010702p:plain

だいたい納得できたら、PCBをオーダーするタイミングです。 PCBは安くて速いJLCPCBを使いました。 1週間から10日くらいで到着するので、文句なしです。 PCBを待つ間に、もう1回モックアップをつくって寸法を調整しました。

薙刀式ロゴについては作者の大岡さんに使用許可をいただきました。権利は大岡さんに帰属します。 動画では英数と漢字で表示していましたが、直感的でないので、その後ABCと表示するように変更しました。

Phase 3 Process Design and Development

製造プロセスの設計も大切です。

PCBは上述のように外注しますので、プロセスというと3Dプリンタでケースを作るのと、はんだ付け、組み立てが、自宅製造プロセスです。

特に組み立てできるのかは、よく考えておかないといけません。 OLEDを先にPCBに取り付けると、ケースにひっかかって組み込めないこととがわかったので、 OLEDは最後にとりつけるように設計しなおしました。 おかげで、上記のようにOLEDをケースにピッタリつけることもできました。

ケースには60mmくらい橋渡しになる形状があり、3Dプリンタでサポートが必要な形状ですが、 サポート除去はめんどうですし、除去跡も美しくありません。 やってみると空中ブリッジ印刷で問題なくできたので、最終的にサポートはまったく不要でした。 ここは個人的に満足度の高いポイントです。

3DプリントケースのTipsとして、ケース底面の角などアンダーになるところは角Rではなく面取り、面取りは45度よりすこし大きめの角度にするときれいに印刷できます。 ねじ穴はインサートをはんだごてでいれるのが一般的ですが、最近はねじでセルフタッピングしてます。 外形2mmの六角形の穴をあけておけばM2ねじがいい感じで入ります。 頻繁につけ外ししないから、これでいいや、という感じです。

f:id:eswai:20201130010655p:plain

Phase 4 Product and Process Validation

実際に作って動作検証します。

PCB待ちのあいだにケースを3Dプリントします。 左右1セットの印刷に12時間くらいかかりました。

実際に組み立ててみると、モックアップまで作っているので大きな間違いはなかったのですが、OLEDの表示範囲が上下対称ではなかったので、左右対称の窓をあけると表示がきれてしまうことがわかりました。

OLEDの表示はすこし苦労しました。 だいたいglcdfont.cの一部にロゴをいれて、文字列としてロゴを表示するというのが一般的なようですが、同じようにやっても、うまくいったりいかなかったり。

キースイッチはKailh Box Silent Pinkを使ってみました。 がたつきが少なく、標準で比較的軽いのでこれも好きです。 スペース、エンター、レイヤーキーなど同時押しするキーは、25gに交換しました。

2Uキーにはスタビをつけてみましたが、25gのスプリングだとスタビが重くてキーが持ち上がりませんでした。 これは失敗。

Phase 5 Feedback, Assessment and Corrective Action

問題の修正にうつります。

OLEDの表示位置問題ですが、本来はPCBを直したいところですが、ケースを非対称に変更して、とりあえず修正しました。 3Dプリンターなので、不具合はすぐに直せます。 CADで悩むより、つくって試すほうが早い時もありますね。

OLEDの表示は、すこし富豪的ですが、画面サイズとおなじ128x32ドットの画像を3枚(かな、ABC、薙刀式ロゴ)用意して、 oled_write_raw_P関数で表示するというのが一番シンプルで思い通りに動作しました。

スタビはなしでつかうことにしました。 そもそもスプリングが軽いので、スタビなしでも問題はないんです。

成果物をこちらにおいておきます。

f:id:eswai:20201202220011j:plain

まとめ

ことしも自作キーボードをエンジョイしました。 しばらく742で満足できそうな気がします。 これはハード面でも、ソフト面でも、エンドゲームに近づいたのではないかという気もしています。 しかし、だいたい頂上が見えてからがつらいのは、ご存じのとおりです。 2021年も、また一歩エンドゲームにちかづけるように精進したいと思います。

最後に、本記事はもちろん742キーボードと薙刀式で書きました。

f:id:eswai:20201203202542j:plain

本家DvorakJ薙刀式で後置シフトを有効にする

新JISの定義をみてやったらできたのでメモしておきます。 なぜこれで後置シフトできるのかは、理解できていません。 後置シフトと認識される時間はかなり短いようです。 親指シフトになれていて、前置きシフトになれないとお悩みの方はお試しください。 もちろん、後置シフトが有効になるとロールオーバーはやりにくくなるので、ご注意ください。

29行目あたりのシフトの定義を変更します。

/* シフトキー */
{S}   | +space

99行目あたりに以下を追加します。

({S}{S}[
{!}|@|{#}|$|%    |{^}  |&        |* |( |) |_ |{+}|@@@|
  |ね|り|め|+{←}|+{→}|さ       |よ|え|ゆ|『|』|
せ|ぬ|に|ま|ち   |や   |の       |も|わ|つ|" |~ |
ほ|ひ|を|、|み   |お   |。{Enter}|む|ふ|れ|!|
{Space} |
]