|
|
# Touch Sensor
|
|
|
|
|
|
Touch 센서는 감압식과 정전식 두 가지가 있습니다.
|
|
|
감압식은 눌리는 압력을 감지하여 작동하는 방식이고, 정전식은 손의 전류를 감지하여 작동하는 방식입니다.
|
|
|
최근에는 정전식을 많이 사용하고 있습니다.
|
|
|
|
|
|
정전식 터치센서의 경우 금속으로되어 첩촉을 감지하는 부분이 있습니다.
|
|
|
여기에는 발신 전극과 수신 전극이 있고 이 사이에 적은 양의 전류가 흐르고 있습니다.
|
|
|
이는 동작 대기 상태이며, 동작 대기 상태에서 신체를 첩촉하면 수신 전극으로 향하던 전류 중 일부가 신체로 이동합니다.
|
|
|
수신 전극에서는 약해진 전기장을 감지하고 HIGH 값을 반환합니다.
|
|
|
|
|
|
![http://news.samsungdisplay.com/wp-content/uploads/2018/01/4_%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC%EC%97%90%EB%94%B0%EB%A5%B8TSP%EA%B5%AC%EB%B6%84.jpg](http://news.samsungdisplay.com/wp-content/uploads/2018/01/4_%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC%EC%97%90%EB%94%B0%EB%A5%B8TSP%EA%B5%AC%EB%B6%84.jpg)
|
|
|
|
|
|
정전식 센서는 신체가 닿으면 HIGH(1) 디지털 입력 값을 반환하고, 신체가 닿지 않으면 LOW(0) 디지털 입력 값이 반환하기 때문에
|
|
|
버튼 스위치 처럼 사용할 수 있습니다.
|
|
|
(스위치들 처럼 기계의 진동으로 인한 바운스 현상은 발생 할 것 같지 않습니다.)
|
|
|
|
|
|
다음은 접촉 횟수를 세는 예제 코드 입니다.
|
|
|
|
|
|
```C++
|
|
|
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 밝기 조절 코드 입니다.
|
|
|
|
|
|
```c++
|
|
|
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; // 현재 상태를 이전 상태로 저장
|
|
|
}
|
|
|
``` |
|
|
\ No newline at end of file |