2017年11月20日月曜日

Arduinoでタッチセンサ その2

前にArduinoでタッチセンサを作ってみましたが
1ポートしか対応していなかったので複数ポートに対応してみた。

D2ポートとタッチセンサとして使用したいポートの間に
1MΩの抵抗を入れて下さい。

D2をタッチセンサ静電容量計測の為の出力に使っていますので
タッチセンサとしてしようするのはそれ以外をタッチセンサとして
使用できます。
因みに本ソースではD3をタッチセンサとしています。


//
//タッチセンサ
//

#define Version "TouchSence210"
//複数入力に対応
//#define Version "TouchSence200"

#define ouTouch 2 //タッチセンサ出力
#define inTouch 3 //タッチセンサ入力
#define ouLED 13 //検知状態モニタ

int threshold = 3; //判定レベル

void setup()
{
  pinMode(ouTouch,OUTPUT);
  pinMode(inTouch,INPUT);
  pinMode(ouLED,OUTPUT);
  
  Serial.begin(115200);
  Serial.println(Version);
}

struct stTouch{
  int stt;      //タッチセンサ出力
  int tt;        //タッチセンサ入力反転時間計測用
  int tH[8];  //立上り時間
  int tL[8];  //立下り時間
  int lev[8]; //タッチセンサ判定結果
} touch;

int touchMng(int touchPin)
{
  digitalWrite(ouTouch, touch.stt);
  //入力が出力と同レベルになるまでの時間カウント
  if (digitalRead(touchPin)!=touch.stt){
    touch.tt++;
  }
  //入力が出力と同レベルに変化なった
  else{
    //レベル反転とHiとLoの時間を保持
    if(touch.stt!=HIGH){
      touch.stt = HIGH;
      touch.tL[touchPin] = touch.tt;
    }
    else{
      touch.stt = LOW;
      touch.tH[touchPin] = touch.tt;
    }
    touch.tt = 0;
    //変化時間表示
    /*
    if(touch.stt!=HIGH){
      Serial.println();
      Serial.print("\ttL= ");
      Serial.print(touch.tL[touchPin]);
      Serial.print("\ttH= ");
      Serial.print(touch.tH[touchPin]);
      Serial.print("\tSUM= ");
      Serial.print(touch.tH[touchPin]+touch.tL[touchPin]);
      Serial.print("\tSUB= ");
      Serial.print(abs(abs(touch.tH[touchPin])-abs(touch.tL[touchPin])));
    }
    */
    //判定結果を確定
    if( touch.tH[touchPin]+touch.tL[touchPin] > threshold ){
      touch.lev[touchPin] = true;
    } else {
      touch.lev[touchPin] = false;
    }
  }
  //判定結果を返す
  return touch.lev[touchPin];
}
void loop()
{
  //検知状態をLED点灯
  if(touchMng(3) == true){
    digitalWrite(ouLED, HIGH);
  } else {
    digitalWrite(ouLED, LOW);
  }
}


立上り時間と立下り時間を加算してスレッシュホールドレベルと
比較していますが、どちらか片方では商用電源の誘導で引っ張られて
時々検知が外れてしまっていた為、両方を加算しました。