[電子工作]Arduinoを使ったタッチセンサの作り方

この前、タッチパネルを作って、予想以上に上手くいったので、作り方を紹介します。

もっと簡単に作る方法見つけたので、興味ある方はこちら

今回作るタッチセンサーの仕組み

今回作るタッチセンサーは静電容量方式・充電時間計測型と言われるものです。人間の身体は電気を通すため、電位差のある金属板に触れるとき、金属板と人間の間がコンデンサーのような働きをします。

静電容量方式とは「人間の身体と電極をコンデンサに見立てて、その静電容量の変化を読み取れば触れているかどうか分かる」というもので、充電時間計測型というのは「充電時間を測れば、静電容量の変化が読み取れる」という考え方に基づいています。

要は、「人間と電極の間でコンデンサを作り、そのコンデンサが充電する時間を計測して、静電容量を読み取る」というものです。

用意するもの

  • Arduino
  • 金属板
  • 抵抗(ある程度抵抗値の大きなもの)

接続

大まかな流れ

  1. 13番ピンをLOWからHIGHに上げる
  2. 12番ピンの入力がHIGHになるまでの時間を計測する
  3. ノイズの影響を減らすためにハイパスフィルタをかける
  4. 出力された平均充電時間がある一定の値(threshold)以上になったとき触れていると判定

コード

//ハイパスフィルタのバッファ数
int const N = 10;
int a[N];
void setup(){
  for(int i=0; i<N; i++){
    a[i] = 0;
  }
  Serial.begin(9600);

  //タッチパネル本体
  pinMode(13,OUTPUT);
  pinMode(12,INPUT);
  
  //確認用LED
  pinMode(5, OUTPUT);
}

void loop(){
  //充電時間用の変数 a[0] = 0;
  //一度HIGHにして
  digitalWrite(13, HIGH);

  //12番ピンがHIGHになるまで(=充電時間)をカウント
  while (digitalRead(12)!=HIGH){
    a[0]++;
  }

  //LOWに戻す
  digitalWrite(13, LOW);

  //たまに値がぶれるのでローパスフィルタをかける。
  float ave = 0;
  for(int i=0; i<N; i++){
    ave += a[0];
  }
  ave /= N;

  //値チェック
  Serial.println(a[0]);

  //この20という数字が大きければ鈍感に、小さければ敏感になります
  if(ave > 20){
    digitalWrite(5, HIGH);
  }else{
    digitalWrite(5, LOW);
  }

  //変数をずらす。
  for(int i=0; i<N-1; i++){
    a[i+1] = a[i];
  }
}

まとめ

実験したところ、アルミホイルでも正しく動きました。

しっかりしたアルミ板などはホームセンター等で購入できるので、是非、お試しあれ。

参考サイト

http://kousaku-kousaku.blogspot.jp/2008/10/arduino.html