おもちゃラボ

Unityで遊びを作ってます

【Arduino】抵抗1本で作る静電容量式のタッチセンサ

静電容量式タッチセンサは、主にスマートフォンなどの液晶タッチセンサとして使われいます。

この静電容量式タッチセンサですが、スマートフォンのように2次元ではなく、1次元(タッチしたか、していないか)を判別するだけであれば、簡単に作ることができます

f:id:nn_hokuson:20170322195708p:plain

作成する回路

今回作成する静電容量式のタッチセンサは次のようになります。Arduinoの8番ポートから9番ポートへ1MΩの抵抗がつながっているだけです。

f:id:nn_hokuson:20170322193051p:plain:w350

タッチセンサになるのは9番ポートに刺さっている部分です。タッチしにくいようでしたら、みのむしクリップなどで延長してください。

回路の原理

「こんな簡単な回路で、タッチ判別できるのかいな?」と思うかもしれませんが、ちゃんとできます( ー`дー´)キリッ

原理は簡単で、8番ポートからはパルスを出して、9番ポートが立ち上がる(HIGHになる)までの時間を計測します。
タッチしていない状態では単に1MΩの抵抗を介して9番ポートへつながっているだけなので、一瞬で立ち上がります。

f:id:nn_hokuson:20170322184553p:plain:w250

一方、タッチしている場合は人間がキャパシタとなるため、抵抗とキャパシタでRC回路を作ることになります。

f:id:nn_hokuson:20170322193204p:plain:w250

CR回路はローパスフィルタとしても使われる回路で、パルスの立ち上がりが鈍ります
鈍り方はCとRの時定数で決まるのですが・・・考え出すと大変なので大きな値の抵抗を使えば使うほど、立ち上がりも鈍ると考えて問題ありません。

f:id:nn_hokuson:20170322184545p:plain:w250

この時間の差を使うことでタッチされているか、されていないかを検出します。

タッチ検出プログラム

タッチ検出プログラムは次のようになります。実際に入力してArduinoに転送してみてください。

int prevt = 0;
int t = 0;
int threshold = 5;

void setup()
{
  pinMode(8,OUTPUT);
  pinMode(9,INPUT);
  pinMode(13,OUTPUT);
}

void loop()
{ 
  t = 0;

  // パルスの立ち上げ
  digitalWrite(8, HIGH);

  // 立ち上がりまでの時間計測
  while (digitalRead(9)!=HIGH) t++;

  // 放電するまで待つ
  digitalWrite(8, LOW);  
  delay(1);

  // ローパスフィルタ
  //t = 0.8 * prevt + 0.2 * t;
  //prevt = t;

  // LED点灯
  if( t > threshold ){
    digitalWrite(13, HIGH);
  } else {
    digitalWrite(13, LOW);
  }  
}

このプログラムでは、センサをタッチしたら13番ポートに接続されているLEDが点灯するようにしてみました。Arduinoを使ってLEDを光らせる方法はこちらの記事で紹介しています。

nn-hokuson.hatenablog.com

センサから得られるデータにはばらつきがあるため、LEDが常時点灯しない場合には、ローパスフィルタで平滑化する部分のコメントを外してみてください。

最後にArduinoを使った静電容量式のタッチパネルの動画を載せておきます。
簡単に作れるので、Arduinoをお持ちの方は是非試してみてください!

www.youtube.com

参考サイト

こちらのサイトを参考にさせていただきました!
kousaku-kousaku.blogspot.jp

[asin:B01CZQANN0:detail]