오늘은 푸시버튼과 푸시버튼을 사용하기 위해 기본적으로 필요한 개념인 pull-up, pull-down에 대해 이야기 해보려고 한다.
스위치의 일종으로, 다리가 4개 달려있다.
그러나 실제로 필요한 것은 2개뿐이다. 이 중 각각 두개씩은 이미 연결이 되어 있고, 버튼을 누르면 가운데가 연결되어 4개 모두가 연결이 되는 방식이다.
출처
이 스위치를 누르고 있는 동안 Buit in LED가 켜지는 회로를 구성해보자.
그럼 간단하게 생각하면 이렇게 생각할 수 있다.
void setup() {
pinMode(7, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (digitalRead(7) == HIGH){ // switch on
digitalWrite(LED_BUILTIN, HIGH);
} else { // switch off
digitalWrite(LED_BUILTIN, LOW);
}
}
이렇게 연결해서, 7번 pin이 HIGH인 순간을 잡으면 되는거 아닌가?
그런데 실제로 해보면, 작동이 제대로 되지 않는다.
플로팅 현상이 발생하기 때문이다. 플로팅 현상이란, 단순히 말해서 기준점이 없기 때문에 발생하는 현상인데, 지금 상황을 보면, 버튼을 누를 때는 5V에 연결이 되어 있다. 그러나 버튼을 누르지 않는다면? 회로는 끊겨있고, 따라서 이때 신호는 HIGH일 지 LOW일지 예측이 불가능하다. 실제로 저대로 회로를 구성하고 손을 버튼 가까이 갖다대면, 버튼을 누르지 않아도 LED에 불이 켜졌다 꺼졌다 한다.
따라서, 이 점을 보안하기 위해서 스위치를 연결하지 않을 때 그라운드에 연결이 되게 해야 한다.
그렇다면... (아래 회로대로 연결 XXX)
이렇게 하면 어떻게 될까?
우선 저 상황을 단순화해서 표현하면
이런 상황이다.
우선 스위치가 눌리지 않았을 때는, pin7이 Gnd와 잘 연결되어 있다. 따라서 신호가 LOW로 잡힐 것이다. 그러나 스위치를 누르면? 우선 전원과 그라운드가 직결되어 있다. 즉, 쇼트가 날 수 있다. 전원과 그라운드는 반드시 저항을 거쳐서 연결이 되어야 한다.
이렇게 되면 어떨까?
이제 스위치를 누르지 않으면 7번 핀과 Gnd가 연결이 되고, 스위치를 누른다면 저항이 없는 7번 핀 쪽이 5v와 연결이 된다. 일반적으로 저항은 10k옴 정도를 사용한다.
(코드는 위와 동일하다)
방금까지 설명한 것이 바로 pull-down
이다.
스위치를 켜면 1(HIGH
), 끄면 0(LOW
)가 들어오는 방식이다.
pull-up
은 pull-down
과 반대라고 생각하면 된다. 즉, 스위치를 누르지 않으면 5v, 스위치를 누르면 Gnd
와 연결이 되는 방식이다.
따라서 코드는 HIGH와 LOW를 바꿔서 작성해야 한다.
void setup() {
pinMode(7, INPUT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
if (digitalRead(7) == LOW){ // switch on
digitalWrite(LED_BUILTIN, HIGH);
} else { // switch off
digitalWrite(LED_BUILTIN, LOW);
}
}
그러나 "간단한" 스위치라기엔 너무나도 복잡하다. 우선 선이 3개에 저항에... 하지만 이렇게 버튼마다 저항을 달아줄 필요가 없다. PULL UP 저항의 경우, 아두이노 내부 저항을 사용할 수 있기 때문이다.
사용 방법은 간단하다.
setup()
pinMode(7, INPUT_PULLUP);
설정을 할 때 이런식으로 내부 저항을 사용할거라고 설정을 해주면 된다.이렇게 쓰면 전원선과 저항을 제거하여 그라운드와 핀에 연결된 선만 남겨주면 되어 회로가 훨씬 간단해진다.
이쯤 되면 한가지 의문이 생긴다. 왜 pull-up
이 기본으로 내장되어 있고, 사람들은 왜 pull-up
형식을 쓰는가. 스위치를 눌렀을 때 HIGH
인게 뭔가 더 자연스러운데... 라는 생각도 든다.
답은 전력 때문이다.
뭔가 이상하다. 따지고보면 pull-up
은 항상 전원을 공급하고 있는건데, 이게 더 전력이 많이 소모되어야 하는거 아닌가? 하지만 실질적으로는 그렇지 않다.
기본적으로 전원을 끌어올리는 것이 전력 소모가 더 크가 때문이다. 전원을 켜는 상황과 전원을 끄는 상황을 생각해보면 쉽다. 전원을 켜는 것이 훨씬 에너지 소모가 심하기 때문에, 버튼을 누를 때마다0v -> 5v
의 변화가 일어나는 pull-down
보다, 버튼을 누를 때 5v -> 0v
가 되는 pull-up
방식이 더 효율적이다.