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 신호를 안정적으로 유지하려면 상황에 따라 적절한 저항을 설정하는 것이 중요하다. 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
JFFS2 (0) | 2025.02.21 |
---|---|
임베디드 시스템 파일 시스템 (0) | 2025.02.21 |
GPIO 기본 개념 - 2. 입력(센서, 버튼) vs 출력(LED, 모터) 개념 (0) | 2025.02.11 |
GPIO 기본 개념 - 1. 디지털 신호와 아날로그 신호의 차이 (0) | 2025.02.11 |
GPIO 개요 - 3. GPIO가 사용되는 대표적인 플랫폼 (0) | 2025.02.11 |