중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

풀업(Pull-up), 풀다운(Pull-down)장치

2015-10-05 13:24:19

개요

 

아두이노를 사용하다 보면 전류를 제어하는 기능을 사용하거나 버튼을 만들때 스위치를 사용해야 할 경우가 많이 생깁니다.

버튼식 스위치는 버튼 상태에 따라 다르게 출력되는 값을 통해 사물을 제어할 수 있습니다.

 

 

 

이때 종종 전기쪽 지식이 없는 사용자들은 그냥 무턱대고 연결하고 일반 센서처럼 사용하다가 버튼 스위치를 안 눌렀을때와 눌렀을때의 값이 차이가 없는 것을 보고 왜 안되는지 막히곤 합니다.

이번 글에서는 아두이노에서 스위치를 사용할 때 적용할 수 있는 풀업과 풀다운 장치에 대해 알아보겠습니다.

 

 

플로팅 상태

 

풀업, 풀다운 저항을 알기전에 알아야할 것이 먼저 있습니다. 바로 플로팅(Floating) 상태인데요.

플로팅(Floating)은 떠있다, 부유하는, 미끄러지는, 유동적인 이라는 사전적 의미를 가지고 있습니다.

 

<위 사진의 세빛섬은 물 위에 떠있는 섬이라 해서 플로팅 아일랜드라고 불리기도 합니다.>

 

 

스위치를 사용하는 법은 눌렀을때와 누르지 않았을때의 상태변화값을 통해 상태를 인지할 수 있는데요. 일반적인 연결로는 이 변화 상태를 인지할 수 없습니다.

 

일반적인 연결방법을 통해 알아보겠습니다.

아래 회로와 같이 기본적인 방법으로 오렌지보드와 버튼 스위치를 연결해줍니다. 

 

 

 

일반적으로 위의 연결은 아무런 문제가 없어보입니다. 스위치가 열려있으면 전류가 디지털 4번핀으로 흐르지 않기 때문에 0을 출력할 것이고,

스위치가 닫혀있을 경우 전류가 흐르기 때문에 1을 출력할 것을 예상할 수 있습니다.

 

소스는 예제에 있는 소스를 변형하여 사용합니다.


int pushButton = 4;


void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT);
}


void loop() {
  int buttonState = digitalRead(pushButton);
  Serial.println(buttonState);
  delay(1);    
}

 

위 방식대로 세팅이 끝난다음 실행시켜보면 눌렀을때와 누르지 않았을때에 값에 변화가 생겨 될거 같죠??

만약 됐다면 이걸로 글을 끝냈을 수도 있겠네요.

 

 

 

하지만 기대했던것과 달리 값의 변화를 볼 수 없습니다.

 

 

이유가 무엇일까요??

 

그것은 바로 위에서 설명한 플로팅 상태라는것 때문인데요.

설명하자면 위에서 연결하면 아래 그림과 같은 상태가 됩니다.

 

스위치가 닫히면 4번핀에는 1(HIGH)이 출력되고 스위치가 열리면 0(LOW)의 값이 출력될거 같지만

 

실제로는 스위치가 열리게 될때는 0도 아니고 1도 아닌 0과 1사이에서 방황하는 아무런 상태도 아니게 됩니다. 그렇기 때문에 닫혀있을때는 전류가 흐르기 때문에 1을 출력하지만 열려있을때는 값이 

이렇게 부유하고 있는 상태를 플로팅상태라고 합니다.

마치 0(LOW)과 1(HIGH)사이를 부유하고 있는 모습이죠.

 

<이때 4번핀에는 전류가 정말로 흐르는지 안흐르는지 예측할 수 없다>

 

 

이 플로팅 상태로 인해 일반적인 연결로는 스위치를 사용할 수 없습니다. 

그렇기 때문에 스위치를 사용할때는 이번글에서 소개하려는 풀업, 풀다운 저항을 사용하여 연결해주어야 합니다.

 

 

풀업(PULL-UP)과 풀다운(PULL-DOWN)

 

위에서 본것과 같이 일반적인 연결로는 입출력핀에 아무런 신호가 가지 않을 경우 0도 아니고 1도 아닌 플로팅 상태를 가지기 때문에 이 문제를 해결해 주어야 합니다.

이 문제를 해결하는 방법이 바로 풀업, 풀다운입니다.

 

풀업과 풀다운은 방법은 같고 VCC과 GND와 같이 서로 반대되는 개념이기 때문에 하나만 이해한다면 다른 하나는 이해하기 쉽습니다.

 

일단 풀업, 풀다운 장치에 대한 논리 표를 알아보겠습니다.

아래 표와 같이 풀업과 풀다운은 반대의 개념을 가지고 있습니다.

 

풀업(PULL-UP) 풀다운(PULL-DOWN)
ON 0(LOW) ON 1(HIGH)
OFF 1(HIGH) OFF 0(LOW)

 

 

풀업(PULL-UP)

 

풀업(PULL-UP)이라는 말의 의미는 플로팅 상태일때의 값을 끌어올린다는 의미입니다.

당연히 플로팅 상태의 값을 올리기 때문에 스위치가 열려있을때의 상태는 플로팅 상태가 아닌 값이 1이 되겠죠?

 

풀업을 사용할때의 연결방법을 알아보겠습니다.

연결은 아래와 같이 하면 되는데 저항을 VCC단자에 달아주는것이 중요합니다.(풀다운의 경우에는 반대로 VCC가 아닌 GND쪽에 저항을 달아줍니다.)

저항하나를 달아줌으로 플로팅상태를 방지할 수 있습니다.

 

 

 

스위치가 열려있을 때

 

풀업일때 스위치가 열려있으면 아래와 같은 전류 흐름을 볼 수 있습니다.

스위치가 열려있기 때문에 전류는 GND가 아닌 입출력핀으로 흐르게 되고 따라서 입출력핀에서는 1(HIGH)의 값을 읽을 수 있습니다.

 

 

 

 

스위치가 닫혀있을 때

 

반대로 스위치가 닫히게 되면 VCC와 GND가 서로 연결이 됩니다.

GND는 모든 전류가 도착하는 전압이 가장 낮은 지점이기 때문에 모든 전류는 GND 방향으로 흐르게 됩니다.

따라서 입출력핀에 흐르는 전류가 없기 때문에 이때는 0(LOW)가 출력 됩니다. 

 

 

 

풀다운(PULL-DOWN)

 

풀다운의 의미는 풀업과 반대로 플로팅 상태의 값을 다운시켜버린다는 의미를 가지고 있습니다.

그렇기 때문에 스위치가 열려있을때의 값은 다운되서 0이 됩니다.

 

풀다운은 풀업과 반대로 저항이 VCC가 아닌 GND쪽에 달려있습니다.

 

 

스위치가 열려있을 때

 

스위치가 열려있게 되면 VCC와 회로는 단절되기 때문에 입출력핀에서 흐르는 전류는 GND로 향하게 됩니다. 

따라서 입출력핀에는 0(LOW)을 출력합니다.

 

 

 

스위치가 닫혀있을 때

 

스위치가 닫히게 되면 열려있을 때 단절됐던 VCC부분이 회로와 연결됩니다. 

하지만 원래하면 VCC에서 흐르는 전류는 GND로 흘러야 하지만 GND부분에 설치된 저항으로 인해 전류는 GND로 흐르지 못하고 입출력핀으로 흐르게 됩니다.

따라서 입출력핀에서는 1(HIGH)이 출력됩니다. 

 

 

 

위와같이 풀업, 풀다운을 사용하면 값이 떠있는 플로팅 상태를 방지 할 수 있기 때문에 아두이노에서 스위치 사용에 있어서 필수적으로 사용하게 됩니다.

근데 일반적으로 풀다운 보다는 풀업이 노이즈나 충격에 강하기 때문에 풀업을 많이 사용합니다.

 

그리고 아두이노에서는 자체적으로 pinMode()에서 INPUT과 OUTPUT외에도 INPUT_PULLUP이라는 소프트웨어적인 풀업모드를 제공합니다.

 

pinMode(pinNum, INPUT_PULLUP)

 

아두이노의 각 핀에는 내부 풀업 저항이 달려있기 때문에 선언을 통해 자동으로 풀업을 사용할 수 있습니다.

 

위에 있는 소스를 수정한다면 아래와 같이 수정할 수 있겠죠.

 


int pushButton = 4;


void setup() {
  Serial.begin(9600);
  pinMode(pushButton, INPUT_PULLUP); //INPUT_PULLUP모드 적용
}


void loop() {
  int buttonState = digitalRead(pushButton);
  Serial.println(buttonState);
  delay(1);    
}

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

풀업, 풀다운, 아두이노, 기타