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つ直列接続された格好になる。
半円形パターンと、押してない時の円錐バネと、押下時の円錐バネ。 |
上の写真に対応する、円錐バネの状態によるキースイッチ容量の変化 |
\[C=\epsilon\frac{S}{d}\] で与えられる。ε は今の場合は空気中なので、真空の誘電率 \(\epsilon_0\) で大丈夫。
面積 S は、半円の半径を r=6mm として、
\[S=\frac{\pi r^2}{2}=56.5\,{\rm mm}^2\] ここで電極間距離 d が難しいけど、まずはバネの線径の半分で 0.125mm と見積もってみる。そうすると、半円コンデンサ1個で
\[C_1=C_2=\epsilon_0\frac{S}{d}=8.85\cdot10^{-15}\cdot\frac{56.5}{0.125}=4.0\,{\rm pF}\]
これが2つ直列だからこの半分になって、
\[\frac{C_1}{2}=\frac{C_2}{2}=2.0\,{\rm pF}\] となる。実測では、キーを押してないときは C0=1pF ぐらいで、押してる時は C1/2=C2/2=6pF 程度だったので、実効的な電極間距離 d はもう少し短くて、0.04mm 程度相当のようだ。
Topre スイッチの検出回路!
検出回路は、まず上記ページを参考にして、そこで紹介されている次の回路をそのまま使うことにする。
キー押下検出回路 |
この回路図で、
- k はキースイッチの容量で、1 ~ 5 pF
- r は GPIO のパッド抵抗や配線抵抗などで、100Ω 程度
- C は検出用コンデンサで、100 ~ 1000 pF
- R は C の放電用で、10kΩ のオーダー
非反転増幅にしているのは、これは微小電荷を扱う電流をあまり流さない回路なので、出力をハイインピーダンスで受けたいからではないかと思う。
この検出コンデンサ \(C\) にはどんな電圧波形が現れるのか?せっかくなので、回路方程式を立てて計算してみよう。もちろん、最終的な結果は元のページにも書かれている。
コアの部分だけ取り出すと、下図のようになる。
キー押下検出回路のコア部分 |
回路方程式を立てる
では、\(t=0\) で SW1 を投入したときの過渡波形 \(v_C(t)\) を調べよう。回路方程式は、
\begin{eqnarray}
E&=&ri_k(t)+v_k(t)+v_C(t) \\
i_k(t)&=&k\frac{dv_k}{dt} \\
i_C(t)&=&C\frac{dv_C}{dt} \\
i_k(t)&=&i_C(t)+\frac{v_C(t)}{R}
\end{eqnarray}となる。初期電荷をすべてゼロとしてラプラス変換すると、
\begin{eqnarray}
\frac{E}{s}&=&rI_k(s)+V_k(s)+V_C(s) \\
I_k(s)&=&skV_k(s) \\
I_C(s)&=&sCV_C(s) \\
I_k(s)&=&I_C(s)+\frac{V_C(s)}{R}
\end{eqnarray}が得られる。
検出コンデンサの端子電圧
上記の式を \(V_C(s)\) について解く。まず、第2, 3式の電流 \(I_k, I_C\) を第1, 4式に代入・消去して、
\begin{eqnarray}
\frac{E}{s}&=&(1+skr)V_k(s)+V_C(s) \\
skV_k(s)&=&sCV_C(s)+\frac{V_C(s)}{R}=(\frac{1}{R}+sC)V_C(s)
\end{eqnarray}この第1式の両辺に \(skR\) をかけて、第2式を代入する。
\begin{eqnarray}
kRE&=&[(1+skr)(1+sCR)+skR]V_C(s)
\end{eqnarray}これより、検出用コンデンサの端子電圧が
\begin{eqnarray}
V_C(s)&=&\frac{kRE}{1+(CR+kr+kR)s+krCRs^2}
\end{eqnarray}と求められる。
近似の導入
ここから先は、上記の式で \(s\) の極を求めるのだけど、そのまま解析的に求めるのは難しいので、ここで一部近似を行う。最初の仮定から、
\begin{eqnarray}
\frac{k}{C+k}&\simeq&\frac{5\,\rm pF}{330+5\,\rm pF}=0.015 \\
\frac{r}{R}& \simeq&\frac{100\,\rm Ω}{10\,\rm kΩ}=0.01
\end{eqnarray}程度と見積もれるので、これらの2次以上は微小量として無視することにする。特に、両者を掛け合わせたものは、
\begin{eqnarray}
\delta=\frac{rk}{R(C+k)}&\simeq&0.00015=1.5\cdot10^{-4}
\end{eqnarray}であるから、これは 1 に比べて十分に小さく、無視して構わないとする。
s 式の極
上記 \(V_C(s)\) の式で、\(s\) の極の逆数を \(s_1, s_2\) とおく。 すなわち、\begin{eqnarray}
V_C(s)&=&\frac{kRE}{(1-s_1s)(1-s_2s)} \\
&=&\frac{kR}{s_1-s_2}\left(\frac{s_1}{1-s_1s}-\frac{s_2}{1-s_2s}\right)E
\end{eqnarray}ただし、ここで \begin{eqnarray}
s_1+s_2&=&-(CR+kr+kR)=-R(C+k)-kr \\
s_1s_2&=&krCR
\end{eqnarray}が成り立つ。
平方完成
これを解くには二次方程式の解の公式を使えばよいけど、ここでは丁寧に順を追って進められるように、原理原則に戻って平方完成で解いてみる。そこで少し技巧的だけど、次式のように変形する。
\begin{eqnarray}
(s_1-s_2)^2&=&(s_1+s_2)^2-4s_1s_2 \\
&=&(-R(C+k)-kr)^2-4krCR \\
&=&R^2(C+k)^2+2R(C+k)kr+k^2r^2-4krCR \\
&=&R^2(C+k)^2\left[1+\frac{2kr-4krC/(C+k)}{R(C+k)}+\frac{k^2r^2}{R^2(C+k)^2}\right] \\
&=&R^2(C+k)^2\left[1-2\frac{rk}{R(C+k)}\cdot\frac{C-k}{C+k}+\frac{r^2k^2}{R^2(C+k)^2}\right] \\
\end{eqnarray}ここで、最後の大括弧内の第3項は \(\delta\) の 2 次式だから無視し、平方根のテーラー展開
\[\sqrt{1+x}\simeq 1+\frac{x}{2}+O(x^2)\] を使うと
\begin{eqnarray}
s_1-s_2&\simeq&R(C+k)\left[1-\frac{rk}{R(C+k)}\cdot\frac{C-k}{C+k}\right] \\
&=&R(C+k)-rk\frac{C-k}{C+k}
\end{eqnarray}ただし、\(s_1>s_2\) となる解を選んだ。これより、
\begin{eqnarray}
s_1&\simeq&\frac{(s_1+s_2)+(s_1-s_2)}{2}=\frac{1}{2}\left[-kr-rk\frac{C-k}{C+k}\right]=-r\frac{Ck}{C+k} \\
s_2&\simeq&\frac{(s_1+s_2)-(s_1-s_2)}{2}=-R(C+k)+\frac{1}{2}\left[-kr+rk\frac{C-k}{C+k}\right] \\
&=&-R(C+k)-rk\frac{k}{C+k} \\
&=&-R(C+k)\left[1+\frac{rk}{R(C+k)}\frac{k}{C+k}\right] \\
&\simeq&-R(C+k)
\end{eqnarray}となる。ただし、最後の式では、最後から2番目の式の第2項が第1項に比べて、3次の微小量になるので無視した。
極の逆数 = 時定数
ここで2つの時定数を
\begin{eqnarray}
T&=&R(C+k) \\
\tau&=&r\frac{Ck}{C+k} \\
\end{eqnarray}とおく。これらを使うと、
\begin{eqnarray}
s_1&\simeq&-\tau \\
s_2&\simeq&-T \\
s_1-s_2&\simeq&T-\tau\simeq T
\end{eqnarray}となり、
\begin{eqnarray}
V_C(s)&=&\frac{kR}{s_1-s_2}\left(\frac{s_1}{1-s_1s}-\frac{s_2}{1-s_2s}\right)E \\
&\simeq&\frac{kR}{R(C+k)}\left(\frac{-\tau}{1+\tau s}-\frac{-T}{1+Ts}\right)E \\
&=&\frac{k}{C+k}\left(\frac{1}{s+1/T}-\frac{1}{s+1/\tau}\right)E
\end{eqnarray}と求まる。
検出コンデンサの過渡波形
最後に、上記 \(V_C(s)\) を逆ラプラス変換すると、
\begin{eqnarray}
v_C(t)&\simeq&\frac{k}{C+k}\left(e^{-t/T}-e^{-t/\tau}\right)E
\end{eqnarray}を得る。この式から、
- 振幅が \(\displaystyle\frac{k}{C+k}E\)
- t=0 で初期振幅はゼロ
- 括弧内第 2 項は時定数 \(\tau\) で充電されて、急速に立ち上がる
- 括弧内第 1 項は時定数 \(T\) で放電されて、緩やかに減衰する
\begin{eqnarray}
&&\frac{k}{C+k}E=\frac{5}{330+5}\cdot 3.3=49\,{\rm mV} \\
&&\tau=r\frac{Ck}{C+k}=100\,{\rm Ω}\cdot\frac{330\cdot 5}{330+5}{\rm pF}=0.49\,{\rm ns} \\
&&T=R(C+k)=10\,{\rm kΩ}\cdot 335\,{\rm pF}=3.4\,{\rm \mu s}
\end{eqnarray}となる。
SPICE シミュレーション
下図は、同じくコンデンサ C の過渡波形を SPICE でシミュレーションしたもの。まず振幅が 49mV で一致していることが分かる。充電は速過ぎて見えないけど、放電の様子は、時定数 T の 0.7 倍の 2.4μs 付近で半分の 25mV 前後になっているから、やはり符合している。
v_C(t) の SPICE シミュレーション波形 |
充電時
時定数 \(\tau=r\frac{Ck}{C+k}\) は、kとCの直列コンデンサを、r で充電する形をしている。下図で、赤矢印の電流の流れに対応する。この式で R が無視できるのはなぜか?
τ は k と C の直列コンデンサを r で充電する際の時定数 |
放電時
一方、時定数 \(T=R(C+k)\) は、k と C の並列コンデンサを、R で放電する形をしている。下図で、2本の赤矢印の電流を合わせた流れに対応する。ここで先程と同様に、r を無視できるのはなぜか?
T は k と C の並列コンデンサを R を通して放電する際の時定数 |
この時、両コンデンサの電圧は同じであり、それらを流れる電流値は、両コンデンサの容量に比例する。したがって、コンデンサ k には、コンデンサ C に流れる電流の k/C 程度しか流れない。このことにより、Rから見た r の実効的な抵抗値は rk/C = 0.90Ω となり、ほぼ短絡とみなして問題ない。
これらの電荷が放電され終わると、C の電圧はゼロに、k の 3.3V への差分もゼロになって、つまり、k は 3.3V になって、定常状態に達する。
まとめると
ここでは、各時定数の1倍と、7倍経った時刻を目安に考える。それぞれ \(e^{-1}=0.37\) と \(e^{-7}=0.00091\) なので、これらは 37% 及び約 0.1% に減衰する時間に相当する。
\(t\) | \(v_k\) | \(v_C\) | イベント |
---|---|---|---|
0 | 0 | 0 | SW1 スイッチ投入 |
\(\tau=0.49\,{\rm ns}\) | 2.05V | 31mV | 直列に充電中 |
\(7\tau=3.4\,{\rm ns}\) | 3.25V=3.30V - 49mV | 49mV | 充電完了 |
\(T=3.4\,{\rm \mu s}\) | 3.28V=3.30V - 18mV | 18mV | 並列に放電中 |
\(7T=24\,{\rm \mu s}\) | 3.30V=3.30V - 0mV | 0mV | 放電完了=定常状態 |
放電と言っても、コンデンサ k から見れば負電荷の放電なので、コンデンサ k は常に充電されていることになる。
まとめ
Topre スイッチの微小な容量 k に蓄えられた電荷を、その 100 倍前後の容量 C で一旦受け取る。それにより、電圧出力は容量比 k/(C+k) だけ低下するので、それをオペアンプの非反転増幅回路で増幅し戻す。検出コンデンサに現れる電圧波形は、ピークが
\[v_C=\frac{k}{C+k}E\]の指数関数的減衰波形で、その時定数は、
\[T=R(C+k)\]となる。今回のモデルパラメータでは、それぞれ
\begin{eqnarray}
&&v_C=49\,{\rm mV} \\
&&T=3.4\,{\rm \mu s}
\end{eqnarray}である。
したがって、この過渡電圧波形の振幅 50mV を検出できれば、Topre スイッチの押下を検出できる。高速なオペアンプを使って、後段の非反転増幅器の増幅度を 20 倍ぐらいにしておけば、1V 程度と十分な出力になるので、マイコンの ADC でしっかり検知できる。
さて、ここで、もし検出コンデンサで一旦受けないと、どういう難しさがあるのだろうか?
例えば、5pF を直接 200kΩ の抵抗で受けると、時定数は 1μs。マイコンの ADC が 1MHz サンプリングなら、それほど悪い数字ではなさそうだ。この抵抗は大きい方が、時定数も大きくなり、抵抗にかかる電圧も高くなって、検出が楽に出来そうだ。
だけど、そうすると、GND との間の浮遊容量のインピーダンスが見えてきて、そちらに電流が流れてしまい、抵抗だけでは確実な出力を得るのが難しいのかも知れない。例えば、100kHz では、5pF の容量のインピーダンスはおおよそ 1/ωC = 320kΩ になる。検出用抵抗の 200kΩ とトントンだ。そこで、浮遊容量よりも十分にインピーダンスの低い、容量の大きなコンデンサで一旦受けるようにすると、検出が確実になるのかも知れない。
以上、久々に TeX を書いた・・・。
0 件のコメント:
コメントを投稿