Topre スイッチの押下検出はどうやるの?
静電容量式と言っても、その静電容量はせいぜい数 pF しかないようだ。タッチセンサの領域。STM32F042 マイコンの I/O ピンの容量が 5pF なので、浮遊容量と同程度ということ。デジタル回路もアナログ回路も作ったことがないので、そんな小さな容量変化を検知する回路を本当に作れるのか正直不安過ぎる。でも幸いにも、Realforce の回路はtmk_keyboard/keyboard/hhkb/doc/
で調査されている。ただ、肝心の回路は TP1683/4 というカスタムチップに入っていて詳細はよく分からない。だけど、同じく DIY で Topre clone を作っている人がいた。
Guidelines for designing a custom Topre keyboard
とりあえずこれをマネして作りますよ〜!
Topre スイッチの静電容量
まず、静電容量無接点スイッチのそもそも話を考えよう。つまり、スイッチの容量から。
キースイッチのコンデンサは、押しつぶされて円形になったバネと、基板の半円形パターンの間に出来る。したがって、下の写真と図のそれぞれ右端のように、半円コンデンサが2つ直列接続された格好になる。
![]() |
半円形パターンと、押してない時の円錐バネと、押下時の円錐バネ。 |
![]() |
上の写真に対応する、円錐バネの状態によるキースイッチ容量の変化 |
面積 S は、半円の半径を r=6mm として、
これが2つ直列だからこの半分になって、
Topre スイッチの検出回路!
検出回路は、まず上記ページを参考にして、そこで紹介されている次の回路をそのまま使うことにする。
![]() |
キー押下検出回路 |
この回路図で、
- k はキースイッチの容量で、1 ~ 5 pF
- r は GPIO のパッド抵抗や配線抵抗などで、100Ω 程度
- C は検出用コンデンサで、100 ~ 1000 pF
- R は C の放電用で、10kΩ のオーダー
非反転増幅にしているのは、これは微小電荷を扱う電流をあまり流さない回路なので、出力をハイインピーダンスで受けたいからではないかと思う。
この検出コンデンサ
コアの部分だけ取り出すと、下図のようになる。
![]() |
キー押下検出回路のコア部分 |
回路方程式を立てる
では、
検出コンデンサの端子電圧
上記の式を
近似の導入
ここから先は、上記の式で
s 式の極
上記
平方完成
これを解くには二次方程式の解の公式を使えばよいけど、ここでは丁寧に順を追って進められるように、原理原則に戻って平方完成で解いてみる。そこで少し技巧的だけど、次式のように変形する。
極の逆数 = 時定数
ここで2つの時定数を
検出コンデンサの過渡波形
最後に、上記
- 振幅が
- t=0 で初期振幅はゼロ
- 括弧内第 2 項は時定数
で充電されて、急速に立ち上がる - 括弧内第 1 項は時定数
で放電されて、緩やかに減衰する
SPICE シミュレーション
下図は、同じくコンデンサ C の過渡波形を SPICE でシミュレーションしたもの。まず振幅が 49mV で一致していることが分かる。充電は速過ぎて見えないけど、放電の様子は、時定数 T の 0.7 倍の 2.4μs 付近で半分の 25mV 前後になっているから、やはり符合している。
![]() |
v_C(t) の SPICE シミュレーション波形 |
充電時
時定数
![]() |
τ は k と C の直列コンデンサを r で充電する際の時定数 |
放電時
一方、時定数
![]() |
T は k と C の並列コンデンサを R を通して放電する際の時定数 |
この時、両コンデンサの電圧は同じであり、それらを流れる電流値は、両コンデンサの容量に比例する。したがって、コンデンサ k には、コンデンサ C に流れる電流の k/C 程度しか流れない。このことにより、Rから見た r の実効的な抵抗値は rk/C = 0.90Ω となり、ほぼ短絡とみなして問題ない。
これらの電荷が放電され終わると、C の電圧はゼロに、k の 3.3V への差分もゼロになって、つまり、k は 3.3V になって、定常状態に達する。
まとめると
ここでは、各時定数の1倍と、7倍経った時刻を目安に考える。それぞれ
イベント | |||
---|---|---|---|
0 | 0 | 0 | SW1 スイッチ投入 |
2.05V | 31mV | 直列に充電中 | |
3.25V=3.30V - 49mV | 49mV | 充電完了 | |
3.28V=3.30V - 18mV | 18mV | 並列に放電中 | |
3.30V=3.30V - 0mV | 0mV | 放電完了=定常状態 |
放電と言っても、コンデンサ k から見れば負電荷の放電なので、コンデンサ k は常に充電されていることになる。
まとめ
Topre スイッチの微小な容量 k に蓄えられた電荷を、その 100 倍前後の容量 C で一旦受け取る。それにより、電圧出力は容量比 k/(C+k) だけ低下するので、それをオペアンプの非反転増幅回路で増幅し戻す。検出コンデンサに現れる電圧波形は、ピークが
したがって、この過渡電圧波形の振幅 50mV を検出できれば、Topre スイッチの押下を検出できる。高速なオペアンプを使って、後段の非反転増幅器の増幅度を 20 倍ぐらいにしておけば、1V 程度と十分な出力になるので、マイコンの ADC でしっかり検知できる。
さて、ここで、もし検出コンデンサで一旦受けないと、どういう難しさがあるのだろうか?
例えば、5pF を直接 200kΩ の抵抗で受けると、時定数は 1μs。マイコンの ADC が 1MHz サンプリングなら、それほど悪い数字ではなさそうだ。この抵抗は大きい方が、時定数も大きくなり、抵抗にかかる電圧も高くなって、検出が楽に出来そうだ。
だけど、そうすると、GND との間の浮遊容量のインピーダンスが見えてきて、そちらに電流が流れてしまい、抵抗だけでは確実な出力を得るのが難しいのかも知れない。例えば、100kHz では、5pF の容量のインピーダンスはおおよそ 1/ωC = 320kΩ になる。検出用抵抗の 200kΩ とトントンだ。そこで、浮遊容量よりも十分にインピーダンスの低い、容量の大きなコンデンサで一旦受けるようにすると、検出が確実になるのかも知れない。
以上、久々に TeX を書いた・・・。
0 件のコメント:
コメントを投稿