본문 바로가기

Programming/IoT_Embedded

풀업(Pull-up)저항,  풀다운(Pull-down)저항


아두이노와 같은 메이커들를 위한 플랫폼은 물론이고,  임베디드 개발 영역에 꼭 필요한게 전자회로 관련 지식인데요.
저 같은 소프트웨어 개발자 출신들이 이 분야에 들어서서 막막한게 바로 전자회로 분야 입니다.
그 중에서도 처음으로 만나는 장애물이 바로 풀업(Pull-Up), 풀다운(Pull-Down)저항을 이해하는 것같아서
오늘은 이것에 대해 이야기 해보려고 합니다.

아두이노나 AVR 등을  처음 접하면 LED 깜박이는 것 다음으로 하는 것이 스위치를 누르고 뗐을때
디지털 신호를 입력 받는 것일 겁니다.
아래 그림은 바로 그때 보라고 만들어 놓은 아두이노 사이트에 있는 버튼 스위치 입력 예제에서 가져온 그림입니다.

여기에 스위치와 함께 필요로 하는 부품이 바로 저항입니다.
근데 이게 왜 필요한 것인지, 그리고 어떤 원리로 동작하는 것인지 보통은 이것을 궁금해합니다.
저도 처음 이걸 이해 하려고 무척 애도 썼고, 전자공학을 전공한 주변 분들과 임베디드분야에 베테랑이신 분들에게 
여쭤 보기도 했지만, 속 시원한 설명을 들을 수 없어서 답답했습니다.

이제 그 답답함을 아두이노를 가지고 풀어 볼까요?
아래의 코드는 아두이노 예제 > 02.Digital > Button 에 있는 예제 코드 입니다.
이것을 우선 업로드 해 놓습니다.
const int buttonPin = 2;    
const int ledPin =  13;      

int buttonState = 0;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}



일반적으로 볼때 위의 그림과 같이 스위치의 한쪽은 5V에 연결하고 나머지 한쪽은 디지털 2번핀에 연결해서 
위의 코드와 같이 디지털 2번 핀을 INPUT 모드로 바꾸어 놓고 digitalRead() 함수로 읽어서 버튼 스위치의 상태를 읽도록
코드를 업로드하면 
스위치를 누르면 HIGH가 들어 오고,
스위치를 떼면 LOW가 들어올 것 같습니다.

그런데, 실제로 해보면 스위치를 누른 상태에는 정상이지만, 스위치를 뗀 상태에는 LOW와 HIGH가 뒤 섞여서 들어 오는 것을 알 수 있습니다.
그 이유는 스위치를 뗀 상태 그러니까 디지털 2번 핀에 아무 것도 연결이 안된 상태에는 평소에 주변에 떠 다니는 많은 전자가 디지털 핀에
입력으로 들어 오기 때문입니다. 특히 헤어 드라이기나 진공 청소기 같이 모터를 돌리는 전자제품을 사용하고 있을 때는 
더 심해지기도 하는데,  꼭 그 이유가 아니더라도 아두이노 디지털 2번핀 주변 핀의 상태에 따라서도 영향을 받게 됩니다.

이것을 그림으로 그리면 아래와 같아 지는 것입니다.

버튼 스위치를 누르면 디지털 핀이 5V와 맞닿게 되어서 항상 HIGH값을 보장하게 되지만,
버튼 스위치를 떼면 디지털 입력핀은 HIGH인지 LOW인지 그 상태를 보장 할 수 없게 됩니다.
이런 상태를 플로팅(floating) 상태라고 부르더군요.

그럼  디지털 핀이 LOW인 것을 보장 하기 위해서는 어떻게 해야 하느냐 인데요.
방법은 디지털 입력 핀을 GND와 연결하는 것입니다.


이제 회로를 위의 그림과 같이 GND에 연결해서 동작해 보면
스위치를 눌렀을 때는 항상 LOW가 나오는 것을 알 수 있습니다.
아래의 그림과 같은 상태가 되었기 때문입니다.


그러나 여전히 스위치를 떼었을때는 LOW인지 HIGH인지 보장할 수 없는 상태에 놓이게 됩니다.

아하! 그렇다면 이 두 상태를 혼합 하면 문제를 해결 할 수 있겠군요.
바로 아래의 그림과 같이 말입니다.

버튼 스위치를 뗀 상태에는 디지털 입력핀과 5v를 연결해 놓으면 항상 HIGH 값이 입력될 것이구요.
버튼 스위치를 누르면 5v와 GND가 연결되면서 모든 전기를 GND로 가져가서 디지털 입력핀엔 LOW가 입력될 겁니다.
우와!! 해결되었군요.(아쉽지만 사실은 아직 아닙니다.)

이것을 브레드 보드에 회로를 구성하면 아래의 그림 처럼 되겠군요.(경고: 실제로 이렇게 연결하지 마세요!)


이렇게 연결해서 버튼 스위치를 누르는 순간!  아두이노는 전원이 꺼집니다.
운이 나쁘면 아두이노가 영영 동작을 안할 수 도 있구요,
더 운이 나쁘면 아두이노와 연결해 놓은 컴퓨터의 USB 장치나 컴퓨터 까지 망가질 수 있습니다.

그 이유는 5V와 GND가 아무런 제한 없이 만났기 때문입니다.
이런 상태를 흔히 “합선”이라고 하고, 전문가들은 “쑈트” 났다고 하는 겁니다.

이것은 마치 아래의 그림과 같은 상황입니다.

위 그림 처럼 배터리의 양극(+)과 음극( -)을 직접 연결하면, 배터리는 점점 뜨거워 지면서 결국 녹아 버립니다.
배터리의 전압이 높을 수록 이런 상황은 무척 위험하죠.
제가 군대에서 운전병을 했는데요, 60(육공)트럭(이걸 아시는 분이 계실까요?)에 들어 가는 배터리를 점프하다가
실수로 선에 맞닿기라도 하면 배터리는 순간적으로 폭발하는데, 대포소리 저리 가라 할 정도 입니다.
무척 위험하죠.

이렇게 되는 이유는 순간적으로 너무 많은 전류가 양극에서 음극으로 흐르기 때문인데요.
전류가 흐르면서 열이 발생해서 전선이 약한경우 녹아 내리면서 주변에 있는 물질에 불을 내기도 합니다.
전기 합선으로 화재가 나는 경우가 이런 경우라고 보시면 되시겠습니다.
혹시라도 이런 경우를 대비해서 건물에는 차단기라는 것을 설치해서 일정한 전류 이상이 흐르면 전기를 차단하는 것이고,
전자제품이나 자동차에는 퓨즈(휴즈) 라는 것을 두어서 저절로 끊어 지게 해두는 것입니다.

이제 본론으로 다시 돌아가서, 그럼 이제 어떻게 해야 하는 것일까요?
바로 저항이 필요한 이유가 여기에 있습니다.


초등학교때 과학실험하면서 건전지로 꼬마 전구 한번씩은 켜 보았을텐데요,
그 때는 건전지가 녹아 내리거나 불탄적은 없었을 것입니다.
바로 꼬마 전구가 전류의 흐름을 방해해서 그 열로 불빛을 내기 때문입니다.
그래서 순간적인 전류가 흐르는 것이 아니고 건전지가 녹아 내리지도 않는 것입니다.
이 때 꼬마 전구와 같은 역할을 하는 것이 바로 저항입니다.
저항을 연결하면 전류의 흐름을 방해해서 건전지나 전선이 녹아 내리지 않게 됩니다.

그럼 앞서서의 마지막 회로에 저항을 연결하면 되겠군요.
그래서 최종적인 그림은 아래와 같게 됩니다.

이렇게 저항을 전압(5v) 쪽에 연결해서 구현한 회로를 풀업 저항이라고 부릅니다.
풀업저항을 구성했을때 스위치 조작과 입력을 정리하면 아래와 같습니다.

스위치 
입력
ON
LOW
Off
HIGH


반대로 스위치를 뗐을 때 LOW가 입력되고 스위치를 눌렀을때 HIGH가 입력되게 하고 싶다면
회로를 그 반대로 연결하면 됩니다.

이렇게 말이죠. 이런 형태로 GND 쪽에 저항을 두는 회로를 풀다운(Pull-Down) 저항이라고 합니다.
어때요? 아두이노 사이트에서 가져온 맨 처음 그림과 같아 졌죠?
풀다운 저항을 구성했을 때 스위치 조작과 입력을 정리하면 아래와 같습니다.

스위치 
입력
ON
HIGH
Off
LOW



끝으로 노파심에 의문이 남아 있을 수도 있는 부분을 짚어 보겠습니다.
별다른 의문이 남지 않았다면 아래의 글은 읽지 않아도 될겁니다.

풀업 저항에서 저항의 위치를 GND에 연결하면 왜 안 될까 하는 의문이 드실지도 모르겠습니다.
또, 풀다운 저항에서 버튼 스위치를 누르면 어차피 디지털 입력 핀과 GND가 연결되기 때문에
LOW가 입력되는 것 아니가 하는 의문이 드실지도 모르겠는데요.

아래의 그림을 보시죠.

저항의 기준으로 왼쪽 그러니까 A 지점에서 디지털 입력을 받게 되면 음극 그러니까 GND의 값이 입력되어 LOW가 입력되고
저항의 오른쪽 그러니까 B 지점에서 디지털 입력을 받게 되면 양극 그러니까 HIGH의 값이 입력됩니다.
이것을 전위차라고 하는데요. 이것 때문에 저항의 위치는 풀업의 경우는 Vcc 쪽에 풀다운의 경우는 GND 쪽에 위치해야 합니다.
그리고 풀다운의 경우 Vcc와 GND가 맞닿았는데도 B지점에서 디지털 입력을 받기 때문에 HIGH가 입력될 수 있게 됩니다.

이것을 이해해야만 저항이 직렬로 연결되었을때의 전압값이 어떻게 분할되는지 등을 이해 할 수 있고,
그래야만 트랜지스터나 캐패시터 등을 이용한 좀 더 복잡한 회로를 이해 할 수 있게 됩니다.

그럼 누군가에게는 도움이 되셨길 빕니다.