#7 기획 및 검토 - 로터리 딥 스위치
기존에는 3 states 토글 스위치를 사용해 대기 시간을 조정하는 기능을 구현했었는데, 크기가 너무 큰 데다가 3가지 선택 밖에 안 되서 좀 부족하다는 생각이 들었다. 다른 방식의 스위치를 찾아보던중 로터리 방식의 딥 스위치가 적당한 거 같아 이걸 테스트해보기로 했다.
내가 선택한 스위치는 SSR-04 라는 제품으로, 총 4가지 선택 값을 가지고 있다. SSR-10 이라고 총 10가지 선택 값을 갖는 제품도 있는데, 기본적인 사용법은 동일할 거 같아 우선 SSR-04 로 테스트 했다.
스위치의 바닥 부분을 보면 똑같이 생긴 핀이 6개나 있다. 설명서를 보면 가운데에 있는 2개의 "C" 핀은 전원 연결이고, 나머지 4개의 핀들 중에서 "1" 핀과 "2" 핀 2개만 사용하게 돼 있다. 스위치에서 선택 가능한 값(경우의 수)이 총 4개이므로, 핀 2개만 사용해도 이 4가지 경우의 수를 모두 표현할 수 있다.
4개의 핀 들중 어느 것이 "1" 이고 "2" 인지를 표시해 놓지 않아 좀 혼란스러웠는데, 설명서를 보니 스위치를 위에서 내려다봤을 때 숫자 3과 2 사이의 핀이 "1" 핀이고 숫자 0과 1 사이의 핀이 "2" 핀임을 알 수 있었다.
그 다음으로 "C" 핀을 VCC 에 연결해야 하는지, 아니면 GND 에 연결해야 하는지 궁금했다. 일반적으로 아두이노에서는 스위치에 연결된 디지털 핀을 INPUT_PULLUP 모드로 설정해 사용하는 것을 권장한다고 한다. 이렇게해서 해당 디지털 핀이 풀업 상태가 되면, 스위치가 연결되지 않은 평상시에는 HIGH 값을 갖고 있다가 스위치가 연결되는 순간 LOW 값을 갖게 된다. 이를 위해 "C" 핀을 GND 에 연결하여 스위치 연결 시 전류가 디지털핀에서 "C" 핀으로 즉, HIGH 에서 LOW 로 흐르도록 했다.
스위치의 "1" 핀과 "2" 핀을 각각 아두이노 Micro 보드의 디지털 2번과 3번에 연결했고, "C" 핀은 GND 에 연결했다.
아두이노 IDE 에서 아래와 같은 코드를 업로드했다.
보통은 스위치를 연결해 전기가 통하면 1 혹은 + 또는 HIGH 값을 갖는 것을 생각하게 되는데, 풀업 상태에서는 정 반대로 스위치가 연결되면 0 혹은 - 또는 LOW 값을 갖는다는 점을 주의해야 한다.
int rotary1Pin = 2;
int rotary2Pin = 3;
int buzzerPin = 4;
int touchButtonPin = 5;
int switch1Value;
int switch2Value;
int delaySeconds;
void setup() {
Serial.begin(9600);
while(!Serial && millis()<5000) {
}
pinMode(rotary1Pin, INPUT_PULLUP);
pinMode(rotary2Pin, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
pinMode(touchButtonPin, INPUT);
}
void get_delay() {
// "1" 핀과 "2" 핀 모두 선택 됨
if ( (digitalRead(rotary1Pin) == LOW) && (digitalRead(rotary2Pin) == LOW) ) {
delaySeconds = 800;
}
// "1" 핀은 선택 안 되고, "2" 핀만 선택 됨
else if ( (digitalRead(rotary1Pin) == HIGH) && (digitalRead(rotary2Pin) == LOW) ) {
delaySeconds = 600;
}
// "1" 핀만 선택 되고, "2" 핀은 선택 안 됨
else if ( (digitalRead(rotary1Pin) == LOW) && (digitalRead(rotary2Pin) == HIGH) ) {
delaySeconds = 400;
}
// "1" 핀과 "2" 핀 모두 선택 안 됨
else if ( (digitalRead(rotary1Pin) == HIGH) && (digitalRead(rotary2Pin) == HIGH) ) {
delaySeconds = 200;
}
}
void loop() {
if (digitalRead(touchButtonPin) == HIGH) {
digitalWrite(buzzerPin, HIGH);
get_delay();
Serial.println(delaySeconds);
}
else {
digitalWrite(buzzerPin, LOW);
}
delay(500);
}
로터리 딥 스위치 상단의 노브를 돌려 0 부터 3까지 선택하면서 각각의 경우에 터치 스위치를 누르면, 다음과 같이 결과가 출력되는 것을 확인할 수 있다.