GPIO 기본 개념 - 3. 풀업 저항과 풀다운 저항 개념

2025. 2. 11. 13:43프로그래밍/시스템

풀업 저항과 풀다운 저항 개념

GPIO 입력 핀은 기본적으로 전압이 연결되지 않은 상태일 때 떠 있는 상태(Floating)가 될 수 있다.
이러한 상태에서는 GPIO 입력이 불안정하여 예상치 못한 값(랜덤하게 HIGH 또는 LOW)이 읽힐 수 있다.
이를 해결하기 위해 풀업 저항(Pull-up Resistor)풀다운 저항(Pull-down Resistor)을 사용하여 신호를 안정적으로 유지한다.


📌 1. 풀업 저항 (Pull-up Resistor)

풀업 저항은 GPIO 핀을 기본적으로 HIGH(1) 상태로 유지하는 역할을 한다.
이후 버튼이 눌리면 회로가 GND(0V)와 연결되면서 LOW(0) 상태로 변한다.

✔ 풀업 저항의 동작 원리

  • 기본적으로 GPIO 핀은 HIGH(1) 상태(3.3V 또는 5V) 로 유지됨.
  • 버튼을 누르면 GND(0V)와 연결되면서 LOW(0) 상태로 변함.
  • 버튼이 눌리지 않으면 다시 HIGH(1) 상태로 복귀.

💡 풀업 저항이 필요한 이유

✅ 버튼이 눌리지 않았을 때 GPIO 핀이 떠 있는 상태(Floating)가 되는 것을 방지.
✅ GPIO 입력이 HIGH(1) 상태에서만 LOW(0)로 변하므로 노이즈 영향을 줄일 수 있음.


🔧 풀업 저항 설정 예제 (Arduino C)

아래 코드는 아두이노에서 내장 풀업 저항을 사용하여 버튼 입력을 안정적으로 감지하는 코드이다.

int buttonPin = 2;  // 버튼이 연결된 GPIO 핀

void setup() {
    pinMode(buttonPin, INPUT_PULLUP);  // 내장 풀업 저항 활성화
    Serial.begin(9600);
}

void loop() {
    int buttonState = digitalRead(buttonPin);  // 버튼 상태 읽기
    if (buttonState == LOW) {  // 버튼이 눌리면 LOW (GND와 연결)
        Serial.println("버튼이 눌렸습니다!");
    } else {
        Serial.println("버튼이 눌리지 않았습니다.");
    }
    delay(100);
}

🔹 동작 방식

  • pinMode(2, INPUT_PULLUP); → 아두이노의 내장 풀업 저항을 활성화하여 기본적으로 HIGH(1) 상태 유지.
  • digitalRead(2); → 버튼이 눌리지 않으면 HIGH(1), 버튼이 눌리면 LOW(0) 값 읽음.
  • 버튼이 눌렸을 때만 LOW(0)로 감지되므로 안정적인 신호 처리 가능.

📌 2. 풀다운 저항 (Pull-down Resistor)

풀다운 저항은 GPIO 핀을 기본적으로 LOW(0) 상태로 유지하는 역할을 한다.
이후 버튼이 눌리면 회로가 전원(VCC, 3.3V 또는 5V)와 연결되면서 HIGH(1) 상태로 변한다.

✔ 풀다운 저항의 동작 원리

  • 기본적으로 GPIO 핀은 LOW(0) 상태(0V, GND) 로 유지됨.
  • 버튼을 누르면 VCC(3.3V 또는 5V)와 연결되면서 HIGH(1) 상태로 변함.
  • 버튼을 떼면 다시 LOW(0) 상태로 복귀.

💡 풀다운 저항이 필요한 이유

✅ 버튼이 눌리지 않았을 때 GPIO 핀이 랜덤한 값(Floating)이 되는 것을 방지.
✅ GPIO 입력이 LOW(0) 상태에서만 HIGH(1)로 변하므로 정확한 신호 감지가 가능.


🔧 풀다운 저항 설정 예제 (wiringPi, C++)

아래 코드는 라즈베리파이에서 풀다운 저항을 설정하고 버튼 입력을 감지하는 코드이다.

#include <wiringPi.h>
#include <stdio.h>

#define BUTTON_PIN 2  // 버튼이 연결된 GPIO 핀

int main() {
    wiringPiSetup();
    pinMode(BUTTON_PIN, INPUT);  // GPIO 2번 핀을 입력 모드로 설정
    pullUpDnControl(BUTTON_PIN, PUD_DOWN);  // 풀다운 저항 활성화 (기본값 LOW 유지)

    while (1) {
        int buttonState = digitalRead(BUTTON_PIN);  // 버튼 상태 읽기
        if (buttonState == HIGH) {  // 버튼이 눌리면 HIGH (전원과 연결)
            printf("버튼이 눌렸습니다!\n");
        }
        delay(100);
    }
    return 0;
}

🔹 동작 방식

  • pinMode(2, INPUT); → GPIO 핀을 입력 모드로 설정.
  • pullUpDnControl(2, PUD_DOWN); → 풀다운 저항 활성화하여 기본적으로 LOW(0) 상태 유지.
  • digitalRead(2); → 버튼이 눌리지 않으면 LOW(0), 버튼을 누르면 HIGH(1) 값 읽음.
  • 버튼이 눌렸을 때만 HIGH(1)로 감지되어 안정적인 신호 처리 가능.

📌 풀업 저항 vs 풀다운 저항 비교

비교 항목 풀업 저항 (Pull-up Resistor) 풀다운 저항 (Pull-down Resistor)
기본 상태 HIGH (1) LOW (0)
버튼을 누르면 LOW (0) HIGH (1)
전압 연결 내부적으로 VCC(3.3V/5V)에 연결 내부적으로 GND(0V)에 연결
활용 예시 아두이노 기본 설정 (INPUT_PULLUP), I2C 통신 일부 센서 및 특수한 입력 조건
장점 안정적인 신호 유지, 노이즈에 강함 특정 회로에서 HIGH 상태 감지가 필요할 때 사용

📌 풀업/풀다운 저항을 언제 사용할까?

풀업 저항을 사용할 때

  • 아두이노의 INPUT_PULLUP을 활용하는 경우
  • 기본적으로 HIGH(1) 상태를 유지해야 하는 버튼 회로
  • I2C 통신에서 SDA/SCL 신호를 안정적으로 유지할 때

풀다운 저항을 사용할 때

  • GPIO 핀을 기본적으로 LOW(0) 상태로 유지하고 싶을 때
  • 센서가 HIGH 신호를 보낼 때만 활성화되도록 설정할 때
  • 모터 드라이버, 릴레이 등과 함께 사용할 때

결론

  • GPIO 핀이 떠 있는 상태(Floating)를 방지하기 위해 풀업 저항과 풀다운 저항을 사용한다.
  • 풀업 저항(Pull-up Resistor): 기본적으로 HIGH(1) 상태 유지, 버튼이 눌리면 LOW(0).
  • 풀다운 저항(Pull-down Resistor): 기본적으로 LOW(0) 상태 유지, 버튼이 눌리면 HIGH(1).
  • 아두이노는 INPUT_PULLUP을 사용하면 내장 풀업 저항을 활성화할 수 있음.
  • 라즈베리파이는 pullUpDnControl(pin, PUD_UP/PUD_DOWN); 함수를 사용하여 풀업/풀다운 저항을 설정할 수 있음.

GPIO 신호를 안정적으로 유지하려면 상황에 따라 적절한 저항을 설정하는 것이 중요하다. 🚀