반응형

터치센서를 구현하는 방법은 가변저항을 아날로그 입력 핀에 연결하여 전압을 측정하는 것과 비슷한 원리이다. 단지 차이점은 고정된 저항(10K 옴)을 기준으로 전압을 측정하고 이를 기준 전압으로 정하고 사람이 터치 핀을 만졌을 경우 발생하는 전압의 변동을 인지하여 작동하는 방식이다. 

 

저항: 10K 옴

1. 저항의 한쪽 끝을 3.3V에 연결한다. 

2. 다른 한쪽 끝에 아날로그 입력 핀 A0에 연결하고 아래 그림과 같이 터치용 핀을 A0핀에 연결된 쪽에 연결해준다. 

상기와 같이 아날로그 입력 핀(A0)에 10K 옴 저항을 연결한 상태에서 analogRead(A0); 함수로 값을 읽게 되면 그 값이 675 ~ 677 사이의 값으로 표시되고, 이 범위의 값을 기준값으로 정하면 된다.  이때 터치 핀을 만지면 값이 680 이상으로 증가하는 것을 볼 수 있다(인체의 미세전류 영향 때문이라고 한다). 하지만 오히려 기준값보다 떨어지는 경우도 발생하게 되어 떨어지는 값에 대한 조건도 걸어주어야만 터치는 되었는데도 반응을 하지 않는 오류를 막을 수 있다. 

 

코드 구현은 100 밀리 초마다 아날로그 입력 핀의 전압값을 읽어, 읽은 값이 기준값의 범위 안에 있는지의 여부를 판단하고 기준값의 범위를 벗어났을 경우 어떤 동작을 하는 코드를 실행하도록 해준다. 또한 연속해서 실행되는 것을 방지하기 위해 이전 글 "아두이노 - 입력 버튼 설정 방법"에서 처럼 입력 지연을 구현해 주면 되고, 토글 버튼 코드로 적용해주면 된다. 아래 코드를 업로드하고 코드의 정상 작동 여부를 판별하기 위해서는 터치 핀을 계속해서 만지고 있을 때 입력 지연으로 설정된 시간의 간격(delay_count == 3)으로 아두이노 기본 LED가 일정하게  점멸한다면 정상 작동하는 것이다.

int ledPin = 13;
int capSensePin = A0; // ADC pin (paperclip, conductive paint/fabric/thread, wire)
bool Led_state = LOW;

void setup(){
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(capSensePin, INPUT);
}

unsigned long int cap_button_delay = 0; // 100 밀리 초마다 터치핀 값 확인하기 위한 변수
bool cap_button_check = false;          // 터치핀 값 확인 코드 진입 트리거 플래그
uint8_t delay_count = 0;                // 터치핀 값 확인 코드 진입후 연속되는 입력 방지용 카운트
bool start_count = false;               // 중복 입력 방지용 카운터 트리거 플래그
int val;                                // 아날로그 읽은 값 저장 변수

void loop(){
  cap_button();  // 100 밀리초 마다 확인 delay() 함수 대체
  if (cap_button_check == true) { // 100 밀리초 이상 됐을 때 입력값 확인
    if (start_count == false) val = analogRead(capSensePin); // 기준값: 675 ~ 677(3.3V, 10K ohm)
    else  delay_count++; 
    if (delay_count == 0) {
      if(val > 680 || val > 500 && val < 670 ){  // 기준값보다 떨어지는 경우: 500 ~ 670 
        Led_state = !Led_state;
        digitalWrite(ledPin, Led_state);
        start_count = true;              // 조건에 맞아 LED 상태 변화를 줬으면 카운트 시작
      }                                  // 재실행 방지
    }
    else if (delay_count == 3) {         // 상태 변화후 300밀리초가 지나면 
      start_count = false;               // 다시 입력 받을 수 있도록 초기화 
      delay_count = 0;
    }
    cap_button_check = false; // 100 밀리 초 이내에는 입력 값 확인 중지
  }
}

void cap_button() {
  if (millis() - cap_button_delay >= 100) { // 100 밀리초가 지나면
    cap_button_delay = millis();
    cap_button_check = true;                // 아날로그 입력값 확인
  }
}

touchButton.ino
0.00MB

아두이노마다 기준값이 다를 수 있다. 상기의 코드로 정상 작동이 되지 않는다면 시리얼 모니터를 통해 기준값을 확인하고 조건값을 결정해서 적용해주면 된다. 

 

시리얼 모니터로 기준값의 범위를 확인하기 위해서는 상기 코드에서 아래 코드를 변경해주고 아두이노에 업로드하면 된다. 

// 수정 전
if (start_count == false) val = analogRead(capSensePin); // 기준값: 675 ~ 677(3.3V, 10K ohm) 

// 수정 후
if (start_count == false) {
  val = analogRead(capSensePin); // 기준값: 675 ~ 677(3.3V, 10K ohm) 
  Serial.println(val);
}

https://hester.mtholyoke.edu/idesign/SensorTouch.html

상기의 글을 참조했다. 

 

관련 글

[arduino] - 아두이노 - 입력 버튼 설정 방법, debouncing

[arduino] - 아두이노 - ADC 핀을 이용한 터치 센서의 구현

[arduino] - 아두이노 - 무드등 예제, RGB LED 제어

[arduino] - 아두이노 - 무드등, 블루투스 연결 스마트폰 원격제어

 

 

+ Recent posts