Touch Sensor
Touch 센서는 감압식과 정전식 두 가지가 있습니다. 감압식은 눌리는 압력을 감지하여 작동하는 방식이고, 정전식은 손의 전류를 감지하여 작동하는 방식입니다. 최근에는 정전식을 많이 사용하고 있습니다.
정전식 터치센서의 경우 금속으로되어 첩촉을 감지하는 부분이 있습니다. 여기에는 발신 전극과 수신 전극이 있고 이 사이에 적은 양의 전류가 흐르고 있습니다. 이는 동작 대기 상태이며, 동작 대기 상태에서 신체를 첩촉하면 수신 전극으로 향하던 전류 중 일부가 신체로 이동합니다. 수신 전극에서는 약해진 전기장을 감지하고 HIGH 값을 반환합니다.
정전식 센서는 신체가 닿으면 HIGH(1) 디지털 입력 값을 반환하고, 신체가 닿지 않으면 LOW(0) 디지털 입력 값이 반환하기 때문에 버튼 스위치 처럼 사용할 수 있습니다. (스위치들 처럼 기계의 진동으로 인한 바운스 현상은 발생 할 것 같지 않습니다.)
다음은 접촉 횟수를 세는 예제 코드 입니다.
const int touchSensorPin = 7; // TouchSensor의 핀 번호를 7번으로 설정
int touchCounter = 0; // 동작 후 접촉 수 계수기
int lastState = 0; // 이전의 Touch Sensor 상태. 초기는 접촉 없음으로 설정
void setup() {
pinMode(touchSensorPin,INPUT); // Touch Sensor를 입력 모드로 설정
Serial.begin(9600); // Serial 속도 9600으로 통신 시작
}
void loop() {
int curState = digitalRead(touchSensorPin); // 현재 TouchSensor의 상태를 읽음
if(curState != lastState){ // Touch Sensor의 현재 상태와 이전 상태 비교
if(curState == HIGH){ // 현재 상태가 이전 상태와 다르고 Touch가 이뤄진 상태일 때 동작 실행
touchCounter++; // 접촉 횟수 1회 증가
Serial.println("Touched"); // 접촉 했음을 Serial Monitor에 출력
Serial.print("Touch Number : "); // 현재 까지의 접촉 횟수 출력
Serial.println(touchCounter);
}else{
Serial.println("Not Touched"); // 손가락을 뗴어내면 출력
}
}
lastState = curState; // 현재 상태를 이전 상태로 저장
}
다음은 접촉 횟수에 따른 LED 밝기 조절 코드 입니다.
const int touchSensorPin = 7; // TouchSensor의 핀 번호를 7번으로 설정
const int redPin = 9; // RGB LED의 붉은색 핀 번호를 9번으로 설정
const int greenPin = 10; // RGB LED의 녹색 핀 번호를 10번으로 설정
const int bluePin = 11; // RGB LED의 파란색 핀 번호를 11번으로 설정
int touchLevel = 0; // 접촉 수에 따른 밝기 단계
int lastState = 0; // 이전의 Touch Sensor 상태. 초기는 접촉 없음으로 설정
int level_0 = 0; // 0단계 밝기 duty value = 0, 즉 꺼짐 상태
int level_1 = 85; // 1단계 밝기 duty value = 85, 최대 밝기의 1/3 밝기
int level_2 = 170; // 2단계 밝기 duty value = 170, 최대 밝기의 2/3 밝기
int level_3 = 255; // 3단계 밝기 duty value = 255, 최대 밝기
void setup() {
pinMode(touchSensorPin,INPUT); // Touch Sensor를 입력 모드로 설정
Serial.begin(9600); // Serial 속도 9600으로 통신 시작
}
void loop() {
int curState = digitalRead(touchSensorPin); // 현재 TouchSensor의 상태를 읽음
if(curState != lastState){ // Touch Sensor의 현재 상태와 이전 상태 비교
if(curState == HIGH){ // 현재 상태가 이전 상태와 다르고 Touch가 이뤄진 상태일 때 동작 실행
Serial.println("Touched"); // 접촉 했음을 Serial Monitor에 출력
// 이전의 touch level을 기준으로 접촉이 발생하면 touch level을 한단계 씩 올리고 해당 단계 밝기로 LED 출력
// 3단계에서 접촉시 0단계 즉 꺼짐 상태가 됨
switch(touchLevel){
case 0 :
touchLevel++;
Serial.print("Touch Level : ");
Serial.println(touchLevel);
analogWrite(redPin,level_1);
analogWrite(greenPin,level_1);
analogWrite(bluePin,level_1);
break;
case 1 :
touchLevel++;
Serial.print("Touch Level : ");
Serial.println(touchLevel);
analogWrite(redPin,level_2);
analogWrite(greenPin,level_2);
analogWrite(bluePin,level_2);
break;
case 2:
touchLevel++;
Serial.print("Touch Level : ");
Serial.println(touchLevel);
analogWrite(redPin,level_3);
analogWrite(greenPin,level_3);
analogWrite(bluePin,level_3);
break;
case 3:
touchLevel = 0;
Serial.print("Touch Level : ");
Serial.println(touchLevel);
analogWrite(redPin,level_0);
analogWrite(greenPin,level_0);
analogWrite(bluePin,level_0);
break;
}
}else{
Serial.println("Not Touched"); // 손가락을 뗴어내면 출력
}
}
lastState = curState; // 현재 상태를 이전 상태로 저장
}