Arduino を使って、タッチセンサー(静電容量センサー)を波形から理解する

Evaluated a capacitive sensor by Arduino Uno.  Captured some waveforms to show what is happening on terminals.

今日は、Arduino を使ってタッチセンサー(静電容量センサー)の評価をしてみました。タッチセンサーのライブラリやデモについては、以下のサイトなどに参考になる情報がありますが、実際に波形を見てみないと分かりにくい部分もあるため、私も実験してみました。

まず最初に、高抵抗を通じてセンス側の端子に電流を供給する側(上記 Capacitive Sensing Library サイトでいう send pin)と、センス側(receive pin)にオシロスコープを当てて波形を見てみます。ここでは高抵抗として 470kΩ を使っています。

DS1Z_QuickPrint6_charge_delay_width

黄色が send pin、青が receive pin の電位です。このように波形が「ゆっくり」と立ち上がるのは、高抵抗と寄生容量(上記サイト Capacitive Sensing Library にある、C_pin や C_sensed)がローパスフィルタ(低域通過フィルタ)を形成するためです。

ローパスフィルタとは、低い周波数の信号(変化が遅い)は通しても、高い周波数の信号(変化が早い)は通しにくい性質を持つフィルタです。矩形波の立ち上がり(高い周波数成分)が伝わりにくくなるため、波形がゆっくりと立ち上がるようになります。

センス側の端子はこれをデジタル値として読み取る訳ですが、このゆるやかな立ち上がりにより、LOW から HIGH への判断が若干遅延することになります。(470kΩ を使った場合で、評価環境にもよりますが、数〜数十マイクロ秒くらい。) 以下の図は、この判断遅延をデジタル的にグラフ表示したものです。

DS1Z_QuickPrint6_charge_delay

これは人体が触れていない場合の波形ですが、青のグラフの HIGH 部分は、センス側の端子が入力を HIGH と判断するまでの遅延時間を示しています。ここではおおむね 6マイクロ秒です。(黄色の波形の立ち上がりと青色の波形の立ち上がりがずれていますが、これは間に他の処理が入っているためです。)

さて、センス側端子を人が触ったときにそれを検出したい訳ですが、検出の根拠は「人体がセンス側端子に触れることで、センス側端子と電源グラウンドの間の寄生容量 C_sensed が増加する」ことによります。もっと簡単に言うと、人体がセンス側端子を触れるとローパスフィルタの特性が変化するために、波形の立ち上がりが「さらにゆっくり」となるため、それをプログラムで検出してあげれば良いということです。人体が接触している場合、使用する高抵抗の値や動作環境にもよりますが、遅延時間はおおむね数十マイクロ秒以上になります。

プログラムを設計する場合には、

  • この遅延が短ければ「人体が非接触」
  • 遅延が長ければ「人体が接触」

と判断してあげれば良いわけです。具体的には、遅延時間を何らかの閾値時間で切り分けます。(上記 Capacitive Sensing Library にあるライブラリでは、最初にキャリブレーションという処理をすることで、この閾値を決定することができるようです。)