磁気式(ホール効果)分割キーボードを自作してみた

磁気式キーボードを作るのは大変そうと思っていたのですが、ちゃんと調べてみるとそこまで難しくなさそうに思えたので試しに作ってみました。 名前は croissant36 magnet です。corne mini の親指キーを自分好みの位置に配置、小指側の列を 0.25u 上げる配置にしました。

注: ホール IC を使用したキーボードの世間一般的な呼称がよくわかりませんが、ここでは磁気式キーボードと呼ぶことにします。リードスイッチや磁気抵抗素子を使用したものは扱いません。

磁気式スイッチ

便宜上ここでは磁石を内包したケース及び磁石を上下に動かす機構を備えたものを磁気式スイッチと呼びホールICはスイッチに含めずに扱います。 ホールICがない場合は極論ただの磁石でありそれ単体では何かを on/off する機能は有していないため厳密にはホールICも含めてセットで磁気式スイッチと呼ぶのが正しいと思います。

今回は以下3種類のスイッチで動作検証しました。

2024/3/17 時点では TalpKeyboard でも取り扱っているようなので国内でも比較的入手しやすいスイッチだと思います。

フットプリントはこんな感じ。穴の位置は普通の Cherry 互換スイッチと一緒です。

Gateron KS-20 が底面N極に対し、他2つはS極らしいです。市販の磁気式キーボードだと極性異なるスイッチでは動作しないのかもしれませんが、ホール IC の選び方と firmware の書き方次第でどちらの極が底面でも問題なく動作させることができるので自作キーボードの場合は極性にはあまりこだわらなくて良い気はします。

初期構想としてはこれらの市販の磁気式スイッチを使わず niztyl のように静電容量式パーツを流用することを考えていたのですが、磁石を埋め込める穴が空いた自作プランジャーが求める精度で作ることができなかったので諦めてしまいました。

ホールIC

ホールICを使うの初めてなので何個か買って実験しました。

初めはデジタル出力のホール IC を使おうと思っていました。デジタル出力ならばメカニカルキーボードのファームウェアを流用できそうで、自分でファームウェアのキースキャン部を書かずに済んで楽だと思ったからです。 ですが実験してみると動作点をキースイッチとして丁度よい位置に持っていくためには「磁力の強さ」、「ホールICの感受性」、「磁石とホールICの距離」の絶妙な組み合わせを見つけなければならないと気づき難しすぎるので諦めました。ちなみに OSS として公開されている磁気式キーボードの殆どはアナログ出力のホール IC を使用しておりデジタル出力のものを使っているのは前途の niztyl くらいな気がします。

市販のキーボードのアクチュエーションポイントは 2〜4 mm 前後だと思いますが、たった数 mm の変化で on/off 切り替わるホールICと磁石の組み合わせを探すのは私には無理でした。 そんなわけで消極的な理由でアナログ出力のホールICを使いました。

ファームウェア

ホール IC のアナログ出力値が閾値を上回る/下回るかをチェックするだけでとりあえずキー入力判定はできます。 今回使ったホール IC では磁場がない状態でも一定の電圧を出力しており、ホール IC 上側から磁石のN極が近づくと電圧が上がり、S極が近づくと電圧が下がります。 出力電圧を  V, 磁束密度を  B, 磁場がないときの出力電圧を  C, 比例係数を  \alpha > 0 とすると

 \displaystyle
V = \alpha B + C

という関係が成り立ちます。今回書いたファームウェアでは  |V - C|しきい値よりも超えたらキーを押された、しきい値よりも下回ったらキーが離されたとみなすファームウェアを書きました。これによりN極が近づく場合でもS極が近づく場合でもファームウェアを書き換えることなく極性の異なるスイッチに対応できるようにしました。

回路

こちらの記事を参考にキーマトリックスを作りました。

telcontar.net

静電容量式キーボードと比較して

製作難易度

静電容量式キーボード製作経験からアナログ出力を扱うのはハードウェア的にもソフトウェア的にも大変そうと思っていましたが、アナログ回路の面倒な部分はホールICにパッケージングされていますし、ファームウェアも単に IC の出力値読んで閾値以上か否か見ればいいだけだったので難しいところはありませんでした。

市販の磁気式キーボードで対応しているのが当然っぽい(?)ラピッドトリガーを実装したらさすがに大変だと思いますが、単にアクエーションポイント変えられるキーボードという体であれば複雑な処理出てこないので手軽です。

費用

ホール IC が安くないので静電容量式と比べると原価は高いです。キー数分の IC を買わなければならないのはどうしてもコストは掛かります。

niztyl 方式で作った場合は手軽に静電容量式キーボードの打鍵感を得られるので大変な部分をお金で解決したと思えば割り切れる額かもしれません。

KS-20 などのメカニカルスイッチ風のスイッチで組む場合はアクチュエーションポイントが変えられることに相当強いこだわりでもない限り、素直に高級スイッチを使ったメカニカルキーボードを作ったほうが幸せになれそうな気がします。

今後

今回は諦めた niztyl 方式は余裕があったら挑戦したいと思っています。 ここ数年は静電容量式キーボードを使用してきましたが、静電容量式スイッチのコニカルスプリングよりもホール IC や磁石のほうが圧倒的に入手性が良いので静電容量式から磁気式に乗り換えは前向きに検討しようと思っています。

参考にした先駆者たちの磁気式キーボード

回路の組み方が人それぞれ違って面白いです。

Let's Split 風 静電容量無接点方式キーボードを自作した

Let's Split 風静電容量式キーボードを作ってみました。名前は Let's EC です。

今回は主に以下の2点を試してみたくて作りました

  1. 左右の通信を USB Type-C ケーブルにする
  2. マイコンボードを表面から見えなくする

左右通信

左右の通信には USB Type-C ケーブルを採用しました。自作キーボードだと TRRS ケーブルがよく使われますが、キーボードを持ち運ぶ際に TRRS ケーブルを忘れると人からも借りられるようなものでもないので詰みますが USB Type-C ケーブルであればスマホ充電用に持っていたり買える場所も多いのでつぶしが利くかなと。

ただしあくまで電気流すための導線という意味でしか使っておらず、左右通信用の USB を PC に繋ぐと壊れます。QMK Firmware の Spilit Keyboard の項目でも配線の仕方によっては左右通信用のケーブルを PC に間違って指すと壊れる可能性があるので左右通信に USB ケーブルは勧めない1 旨が書かれています。 それでも今回なぜ USB Type-C を選んだかというと TRRS ジャックよりも高さを抑えたかったのと TRRS と違い活線挿抜ができるからです。XIAO RP2040 も左右通信も USB Type-C ですが、XIAO RP2040 側が PC につなぐ方、左右通信はハンダ付けしたレセプタクル同士とさえ覚えておけば事故るようなものでもないので運用でカバーです。

USB C のレセプタクルは電源供給用の 6pin のものを使いました。16pin や 24pin のものもありますが、私が自力でハンダ付けできないので不採用。 6pin の構成は GND, VCC, CC1, CC2, VCC, GND となっており、CC1, CC2 を短絡させれば端子をどっち向きに挿しても CC 通して電気が流れるので、左右通信に必要な最低限の導線3本は確保できます。

2023/12/25 追記

運用でカバーと思っていたものの、メリットよりもデメリットの方が勝りそう。 左右通信用の TRRS ケーブルを PC に刺す可能性はほぼないであろうが、USB ケーブルは PC に間違えて刺す可能性高そう。左右通信用のケーブルに5V印加しても問題ない設計をできるようになるまでは TRRS を使うのが無難と思い直した

実装部品

高さを抑えるために MCU 直付けできたらカッコいいのですが

  • そもそも設計したことないので作り方がわからない
  • 自らの手ではんだ付けできる気がしない
  • PCBA 代高そう

等の理由から今回は XIAO RP2040 を端面スルーホールでハンダ付けしました。静電容量式キーボードの場合、PCB の裏にソケットなどの出っ張りがなくマイコンボードを基板裏に設置しても大して厚みは増えないので製造コストのことを考えると MCU 直付けで作るモチベは今のところ上がっていません。

XIAO RP2040 の使用することのできるピンを全て使い切っていて余裕がないので rp2040 supermini あたりを使うことも考えましたが、入手性に心配があったので国内で取り扱い店舗が多い XIAO RP2040 を無難に選びました。

その他の部品は不器用な私でもハンダ付けできそうな SOP-8, SOP-16, 1206(inch) と前途の USB C レセプタクル 6pin で構成しました。

ノイズの心配がありましたが、実用に耐えるレベルには収まってくれました。

ケース

オリジナルの Let's Split のようなプレートでのサンドイッチマウントだとマイコンボード側の厚みが手前側にまで波及してしまうので約4度チルトしたケースを作ってマイコンボード側の高さを自然と稼げるようにしました。 私の場合は普段70度のテンティングしてキーボードを使っているので厚みがあってもなくてもあまり関係ありませんが、販売も視野に入れていたので市販のものでもありそうな無難な感じに作りました。

ケースはトレイマウント風2とHHKB 式3の2種類を作ってみました。


  1. https://github.com/qmk/qmk_firmware/blob/c3773587e910f80c063a3edcaaefa76d3d844157/docs/feature_split_keyboard.md?plain=1#L48
  2. 上下から PCB を挟んでいるだけなので多分サンドイッチマウントです
  3. HHKB 式: ここではハウジングとトッププレートが一体化している方式のことを指します

分割キーボード用テンティングスタンドを作った

長らく100均で買ったタブレットスタンドに滑り止めを付けたものをテンティングに使用してきましたが、使い続けていると滑り止めにホコリが付いてきて滑ってキーが打ちづらくなってしまうという問題を抱えていました。

この問題を解決すべく新たなテンティング環境を構築しました。

パーツ構成

構成としてはキーボードケースとテンティングスタンドを磁石で固定、テンティングスタンドとデスクに敷いたトタン板を磁石で固定としてみました。

テンティングスタンドは持ち運ぶことを考え分解しやすいように斜面、サポート、底面の3つのパーツを組み合わせて作りました。

キーボードケース底に磁石

テンティングスタンド底面の磁石

モデリングしているときは斜面の磁石は表面につけようと思っていましたが、実際に組み立てる際は裏面からつけるように変更しました。

完成形

実際に使うときはこんな感じです。私の場合、分割キーボードには手を広げて使えるということよりもテンティングして使えることの方に重きをおいているのでトタン板は横幅 30 cm と 60% キーボードくらいの長さのものを購入しました。ノートPCの横幅と同じくらいなのでこれくらいの長さならば持ち運びも苦ではありません。幸い私の職場のデスクの天面はなぜか磁石がくっつくのでトタン板を持ち運ぶことはおそらくないでしょうが。

スタンドとトタン板は直径 6 mm, 厚さ 2.5 mm のネオジム磁石5つの磁力でくっついており、結構強く叩いてもずれることなく安定感がありました。

安定感を増そうと各テンティングパーツを厚めに作ったせいで製造コストは掛かりましたが、打っている最中に腕の開き具合がどんどん狭くなっていくなんてことにはもうならなさそうなので満足してます。

謎のノーブランド静電容量式スイッチを使ってみる

AliExpress で詳細不明の静電容量式スイッチが販売されていたので試しに買ってみました。軸は MX 互換になっていますが、常用する場合はキーキャップ自作推奨です。

購入したもの

ハウジングのサイズは東プレスイッチとほぼ同じだと思います。そのためトッププレートの穴サイズは 14.0x14.6 mm が丁度良いです。

ノーブランド品のプランジャーは東プレと比較して 1 mm くらい短くなっています。

プランジャー比較: 紫がノーブランド、黒が 東プレ

プランジャーが短いせいで底打ちをしたときにキーキャップとトッププレートが衝突します。キーキャップを薄いものにするとトッププレートとの衝突はしませんが、ハウジングとキーキャップの梁が衝突します。 キーキャップの厚さに限らず常にどこかに衝突するのでタイプするごとにカツンカツンとうるさい音が響きます。

キーキャップに静音リング(Oリング) を2つくらい付けると衝突問題は回避できましたが、プランジャーに刺さっている距離が短くなるので簡単に外れるようになってしまいました。

市販品を組み合わせた創意工夫ではどうにもならなさそうでしたが、一気に100個近く買ってしまっていて使わないというのももったいないので衝突問題を回避するために軸を長くしたキーキャップを作ってみました。

色々なステム長で作ってみましたが、1.5 mm 前後突き出したモデルにするとちょうどよく感じました。 ステムを長くしたキーキャップを使えば普通の静電容量スイッチという感じです。

特段安いわけでもないのでこのスイッチを買うよりは NiZ のスイッチを買うことをおすすめしますが、「キーキャップは自作派」という場合であれば買っても良いかもしれません。キーキャップの自作方法は別記事にまとめてあります。

goropikari.hatenablog.com

今回購入したプランジャーを東プレハウジングにつけることはできたので、Adapter-X が終売してしまった現在において REALFORCE や HHKB にアルチザンキーキャップを付けたい場合は重宝するかもしれません(打たない前提なら使える)。

東プレ軸・MX 軸兼用キーキャップを自作した

ありそうでなかった(?) 東プレ軸・MX 軸兼用キーキャップを作ってみました。

作り方ダイジェスト

rsheldiii/KeyV2 を使い

  • $rounded_cherry_stem_d5.7 に設定
  • stem type を rounded_cherry に設定する
  • stem を長くする

終わり

想定読者

  • 規格の違う様々な静電容量式スイッチを使用している方
  • 東プレスイッチ用キーキャップを手軽に自作したい方
  • 東プレスイッチ、MX スイッチどちらを使う場合でも同じキーキャップを使用したい方

はじめに

東プレスイッチには MX 向けのキーキャップはつかず 1、逆に MX スイッチに東プレスイッチ向けキーキャップはつかないというのが世間の一般的な認識だと思います。 キーキャップを自作しているという方でもどちらか一方に特化したものを作っていると思います。

諸般の事情でステムの長い MX 互換キーキャップが欲しくなり、自分でモデル作っているうちに東プレ軸互換にもできそうな雰囲気を感じたので試しに作ってみました。

ステム形状の方針立て

東プレスイッチのプランジャーを見ると内側2箇所に突起があることがわかります。また最上面よりも若干下にあることもわかります。

キーキャップのステムの方は縦に2本スリットが入ったパイプになっています。ステムが長くキーキャップの傘部分から飛び出してもいます。スイッチ側と引っかかるようなところはないのでプランジャーとの摩擦で固定していることがわかります。

以上を踏まえこんな形のステムを作ったら東プレ、MX スイッチ両方に使えそうです。

スリット幅は MX の十字に合わせると東プレキーキャップの幅より狭くなりますが、見た目的にはいけそうな気がします(実際に計れるとよいのですが精度の良いノギス持っていないので目測で判断してます)。

ステムの直径が一般的な MX キーキャップのステムより大きいので MX スイッチで使うときにハウジングと干渉して押せない可能性がありますが、直径を小さくしたら東プレスイッチに固定できなくなってしまうので押せると信じてこのまま突き進みます。

KeyV2 を使ってモデリング

1から好みのプロファイルのキーキャップを作るのは大変なので、今回は KeyV2 を使って作成していきます。KeyV2 は様々なプロファイルのキーキャップを簡単にモデリングできる大変便利なライブラリです。

git clone -b v2.4.0 https://github.com/rsheldiii/KeyV2

clone してきたら keys.scad を OpenSCAD で開きモデルを作っていきます。

基本の形を作成

今回は cherry profile なキーキャップを作っていきます。

include <./includes.scad>

row = 3;
unsupported_stem() rounded_cherry() cherry_row(row) key();

行の数え方は上から 1, 2, 3, 4 と数えるか、下から 1, 2, 3, 4 と数えるかは宗派によって違いますが、KeyV2 は上から数える派です。すなわち数字行が R1 で Z がある行(QWERTY配列の場合)が R4 です。

都合の良いことにステムを rounded cherry にすると十字の縦棒の方にはスリットが入っているのでこのままステムの直径を大きくすれば東プレスイッチに嵌められそうな形状をしています。

デフォルト値の直径 5.5 mm だと東プレスイッチに固定できないので 5.7 まで増やします。直径の値は fernandodeperto /topre_key の値を使いました。

include <./includes.scad>

$rounded_cherry_stem_d = 5.7;

row = 3;
unsupported_stem() rounded_cherry() cherry_row(row) key();

ステム延長

KeyV2 の設定だけではキーキャップの傘の部分(?)よりも下に突き出したステムを作ることは多分できないので、ステムだけ作って基本となるのキーキャップのデータと結合してステムを延長します

include <./includes.scad>

$rounded_cherry_stem_d = 5.7;
extend_stem_height = 4; // 打鍵面より飛び出さない適当な長さ

row = 3;

union() {
    unsupported_stem() rounded_cherry() cherry_row(row) key();
    translate([0, 0, -1.35]) rounded_cherry_stem(extend_stem_height);
}

以上で東プレ・MX 兼用キーキャップのモデルができました。

STL ファイル形式で出力して、3Dプリンターで印刷します。

openscad -o keycap.stl keys.scad

印刷結果

実際に印刷したものがこちら。ステムが飛び出ていることを除きパット見は普通の MX 用 keycap です。

東プレスイッチ、MX 互換スイッチともにつけてみましたが逆さにしても落ちない程度にはハマりました。ただ、MX の方は若干緩いです。 また、東プレ軸に合わせてステムを長くしているので MX 互換スイッチにつけるとひょろ長くなりますね。普通に使うには向かないと思います。

懸念していた MX スイッチで押せるのか?ということですが、ハウジングに干渉することなく普通に押せました。昨年、遊舎工房のお苦しみ袋かお楽しみ袋に入っていた種類ごちゃまぜスイッチで使えないものはとりあえずなかったです。

検証済みスイッチ

おわりに

兼用キーキャップとして使いたい人はほぼいないと思いますが、東プレスイッチ向けのキーキャップを簡単に作れるので、「REALFORCE を分解して40%自作キーボード2台分くらいのスイッチを手に入れたけどキーキャップがなくて困っている」という方は試してみるとよいかもしれません。

または、打つことをそもそも想定していないアルチザンキーキャップを作られている方は、今後このステムサイズで作れば東プレ軸、MX 軸両方いけるようになるので新規顧客を獲得できるかも(?)


  1. Realforce GX1 は例外的にプランジャーが MX 互換になっているので使えます