![]() |
製作した 3x3 キーパッド |
Guidelines for designing a custom Topre keyboard
を参考に、というかほぼそのまま?!、3x3 キーパッドを作ってみる!
3x3 キーパッドの回路図
![]() |
3x3 キーパッド(デバッグ用にピンヘッダをいくつか配置してみた) |
また、各 row 線の抵抗は、パラメータ調整のための実験として、3つとも変えてみた。
んで、いきなり早速 PCB を発注してしまう気の早い人(笑)確かに PCB を買う方が、下手するとユニバーサル基板より安いけど、ブレッドボードで組んでテストする前にいきなり発注するのも、送料がバカにならない。でもガマンできずに発注〜♫
3x3 キーパッドの PCB
そして届いたのが、こちらの3x3の半円形 Topreスイッチの並んだ基板。![]() |
3x3 キーパッド PCB の表面 |
う〜ん、しまった。col線を表面で直接配線してしまったので、半円形コンデンサを貫いてしまっている。カッコ悪い・・・。本家はきちんと裏面で配線して、表の半円形は綺麗に残されている。次回は改善することにする。
![]() |
3x3 キーパッド PCB の裏面 |
動作確認
さて、とりあえずハンダ付けして、つないで、ファームウェアをちゃらちゃらっと書いて、ADC の出力を観測してみる。
が、あっさりおかしい(汗)
非反転増幅器のゲインが高過ぎたらしく、出力が常に Vdd に張り付いてしまっていた。ということで、ゲインを x150 から x20 に下げてやり直し・・・。
キー非押下時の出力波形
波形が取れるようになったので、まず、キーを押してない時の、各キーに対するオペアンプの出力電圧波形を計測した。
![]() |
キー非押下時の出力電圧波形 |
この波形は何を測定したものかと言うと、各キーごとに、
- マルチプレクサで row 線を選択する
- 100μs 待つ
- ADC を開始する
- 8μs 待つ
- col 線を High にする
- ADC が 54 サンプル取得するのを待つ
また、54 サンプルというのは、3x3=9 キーで、間に 1 サンプルのゼロを入れて、arduino のシリアルプロッタの横幅= 500 サンプルに収まるようにした数。各波形の間で 1 サンプルだけゼロに落ちているところが各キーの切れ目になっている。
使用しているマイコン STM32F042 の ADC は、48MHz のバスクロックの 1/4 で駆動させて、1サンプルあたり 14 クロックのモードに設定している。したがって、サンプリングレートは、48/4/14=0.85MS/s になる。1サンプルあたり 1.17μs。
また、縦軸については、ADC の精度が 12-bit なので、4,096 が 3.3V に対応する。
キー押下時の出力波形
では次に、キーを押したら波形はどう変わるか?9 個全部のキーを押して、オペアンプの出力電圧波形を計測してみる。
![]() |
全キー押下時の出力電圧波形 |
おぉ〜!1つ1つの波形が大きくなっている!比較のために、col0 と col1 の 6 キーだけを押して、もう一度計測してみよう。
![]() |
col0, col1 のキーのみ押下時の出力電圧波形 |
ふむふむ。結構明らかな違いがある。この違いを検知するようにファームを書けば、キーの押下は検出出来るゾ!
謎のオフセット電圧
だけど、row ごとに、高さの違うゲタがあるのは何なんだろう?元のサイトでキー毎にキャリブレーションが必要だと書いてあったけど、それはこのゲタのためなのだろうか?(注:おそらく違う)
このオフセット電圧があると、全部のキー波形を上手く ADC の範囲内に収めるために、押下時の振幅を制限するように素子値を調整したり、row 毎に押下検出のスレッショルドを調整したりしないといけない。何よりも原因を知っておかないと気持ち悪い・・・。
オフセットの高さが row 毎に違っているのは、各 row の放電抵抗の値を変えておいたからだろう。そこで、各 row 線の素子値と波形のオフセット電圧を並べてみる。
row | R | 出力オフセット電圧 | 入力オフセット電圧 | V/R |
---|---|---|---|---|
row0 | 18kΩ | 935 = 0.75V | 33.8mV | 1.88μA |
row1 | 33kΩ | 1849 = 1.49V | 66.8mV | 2.02μA |
row2 | 43kΩ | 2465 = 1.99V | 89.1mV | 2.07μA |
出力オフセット電圧が、ADC の読みに対応する。オペアンプのゲインは 1+10kΩ / 470Ω = 22.3倍なので、出力オフセット電圧を 22.3 で割ったものが入力オフセット電圧。さらにこれを抵抗値 R で割ったものが、右端のカラムになっている。
う〜ん、どうも入力オフセット電圧と抵抗の比をとると、どれも 2μA 程度になるようだ。どこかから電流源的に電流が漏れているということ?
アナログマルチプレクサ 74HC4051 のデータシートを見ると、漏れ電流は 0.1μA 程度のようだ。だから、これでは無さそう・・・。
それなら、col 線から、つまりマイコンの GPIO の Low レベル出力から電流が漏れ出てきたりするのだろうか?確かに元のサイトの回路図には、各 col 線が抵抗とコンデンサの並列接続で終端されている。何の意味があるのだろうと思って、ガン無視していたけど、実は何か漏れ電流を抑えるための意味があったのかも知れない。
ということで、PCB 裏面のレジストを少し削って、抵抗とコンデンサを付けてみた。こんなこともあろうかと(嘘)col 線をピンに出して置いてよかった。
![]() |
col 線のピンヘッダ用パターン |
![]() |
レジストを削って、無理やり抵抗とコンデンサをハンダ付け |
だけどしかし、これをしても漏れ電流には何の変化も無かった・・・。col 線の終端インピーダンスとは関係なかったようだ。
となると?
後はオペアンプ?と思って調べていると、オペアンプにはオフセット電流というものがあるらしいと分かった。素人過ぎてスミマセン。
バイポーラ オペアンプ
元のサイトに、「オペアンプは高速なものを使え!」と書いてあったので、今回購入したのは、秋月で「高速・単電源・SOT-23パッケージ」で検索して出てきた、こちらのもの。
単電源高速オペアンプ NJM2716F
今回の検出信号の時定数は数usと1MHz程度の帯域で、ゲインが 20 倍なので、利得帯域幅積として、 20MHzぐらいあるものを選んだ。上記ページによると、このオペアンプの特性は、以下のようになっている。
- 高スルーレート:40V/μs
- 入力バイアス電流:2.5μA 以下
- ユニティゲイン周波数:30MHz
今回は 0 ~ 200mV 付近の領域で使うので、レールツーレールのまさしく下のレールの部分だから、この最大値を踏んでしまったのだろうか?
NJM2716 のデータシートの回路図を見ると、入力段が PNP 型バイポーラトランジスタの差動増幅になっている。今回の用途では、ベース電圧が常に 0V 付近なので、スペックの最大に近い 2μA が流れ出てくるのかも知れない。まさか 2μA の漏れ電流でこんなに差が出るとは!
CMOS オペアンプ
オペアンプの入力バイアス電流は、CMOSタイプなら 1pA とかでほとんどゼロらしい。再度秋月で検索すると、こちらが見つかった。
低雑音 フルスイング高速CMOSオペアンプ NJU77701F (4個入)
こちらの特性は、
- 入力バイアス電流:1pA
- スルーレート:35V/μs
- 利得帯域幅積:34MHz
ということで、何かのついでにアキバに行って買ってきた。PCB は大体 5 枚届くので、大体いつも使わずに余っている。なので今回はオペアンプを変えつつ、新しい基板に実装し直した。そして、測定したものがこちら。
![]() |
キー非押下時の出力電圧波形(CMOS オペアンプ) |
うん、いい!(笑)オフセット電圧が消えている!
では先程と同様に、キー押下時の出力電圧波形も計測する。
![]() |
全キー押下時の出力電圧波形(CMOS オペアンプ) |
さらに同様に、col0, col1 だけ押したもの。
![]() |
col0, col1 のキーのみ押下時の出力電圧波形(CMOS オペアンプ) |
元のサイトでは、OPA350A というオペアンプを使ったと書いてあった。これも CMOS タイプのようなので、今回のオフセット電圧は現象として現れてはいなかったと思われる。
Topre スイッチの静電容量(実測)
次に、出力波形のピーク電圧から、Topre スイッチの容量を計算してみよう。C1=330pF だから、スイッチ容量を k とすると、出力ピーク電圧は
キー非押下時
row | ADC の読み | 出力ピーク電圧 | 容量 |
---|---|---|---|
row0 | 279, 237, 246 | 0.23V, 0.19V, 0.20V | 1.00pF, 0.86pF, 0.89pF |
row1 | 127, 203, 259 | 0.10V, 0.16V, 0.21V | 0.46pF, 0.74pF, 0.94pF |
row2 | 174, 341, 208 | 0.14V, 0.28V, 0.17V | 0.63pF, 1.23pF, 0.75pF |
キー押下時
row | ADC の読み | 出力ピーク電圧 | 容量 |
---|---|---|---|
row0 | 1324, 1421, 1182 | 1.07V, 1.15V, 0.95V | 4.79pF, 5.14pF, 4.27pF |
row1 | 1257, 1422, 1275 | 1.01V, 1.15V, 1.03V | 4.55pF, 5.14pF, 4.61pF |
row2 | 1450, 1407, 1365 | 1.17V, 1.13V, 1.10V | 5.24pF, 5.09pF, 4.94pF |
これを見ると、それなりにバラツキはあるものの、非押下時は 1pF 前後、押下時は 5pF 前後となっている。
時定数
また、時定数
row | R | 測定 T | |
---|---|---|---|
row0 | 18kΩ | 5.9μs | 6.1μs |
row1 | 33kΩ | 10.9μs | 12.3μs |
row2 | 43kΩ | 14.2μs | 16.4μs |
どうやら若干大きめの時定数になっているようだけど、一応合っていると言えそうだ。
col を Low に戻すと?
さて、ここまでは、col 線を High にした時の波形を見てきたが、実際にはその後に Low に戻している。元のサイトのやり方ではむしろ、High にした後、割とすぐに Low に戻すようにしている。
Low に戻すと出力波形はどうなるか? 線形回路なので、High にした時と同じ過渡波形が、符号が反転して下向きに重ね合わされるはずだ。
やってみようこ!こういう時は、むしろオフセットがある方が分かりやすいので、まずバイポーラ オペアンプで試してみる。
- マルチプレクサで row 線を選択する
- 100μs 待つ
- ADC を開始する
- 8μs 待つ
- col 線を High にする
- 20μs 待つ
- col 線を Low にする
- ADC が 54 サンプル取得するのを待つ
![]() |
20μs 後に col 線を Low にする(バイポーラ オペアンプ) |
確かに下にもブレる。したがって、col 線を Low に戻した後、次のキーをスキャンする前には、こうしてブレた row 線が落ち着くのを待つ必要がある。
キースキャンを速くするには、col 線を Low に落とすのを早くするのが1つの手だ。元のサイトでは、これに加えて別途 drain 端子を付けて、コンデンサ C1 を直接放電している。
この drain も試してみたけど、コンデンサ C1 が 0V に一瞬で放電はするものの、その後にバイポーラ オペアンプのバイアス電流による電圧オフセットまで充電され直すので、結局それが完了するまでの時間がかかり、早くならなかった。
負電圧!?
では、CMOS オペアンプの時はどうなるだろう?波形を計測すると、以下のようになった。
![]() |
20μs 後に col 線を Low にする(CMOS オペアンプ) |
何か、波形がすっと落ち着いていて、むしろいい感じに見えるのだけど、実際の回路ではどうなっているのだろうか??
多分、コンデンサ C1 の電圧が一時的に負になって、オペアンプに入力されていると思われる・・・。
とはいっても、最大でも -100mV 程度だろうから、オペアンプの定格電圧は -0.3V なので、壊れることにはならない。でも気になる・・・。
何とかしたい。
ということで、次回に続く・・・。
0 件のコメント:
コメントを投稿