047_도깨비신호잡기_풀업저항 🚦🎛️

도로시와 지니가 함께하는 흔들리는 도깨비 신호를 닻처럼 꽉 잡아주는 풀업 저항과 INPUT_PULLUP 완벽 정복
- 👧 도로시: “지니야 큰일 났어! 스위치에 손도 안 댔는데 시리얼 모니터에 0과 1이 도깨비처럼 마구 뒤섞여서 찍혀! 손을 가까이 가져가기만 해도 불이 제멋대로 번쩍거려! 혹시 아두이노에 유령이 들린 거야?!”
- 👨🏫 이호진 교수님: “하하, 유령이 아니라 전자공학의 가장 유명한 불청객인 ‘플로팅(Floating, 부유) 현상’ 때문이란다! 전선이 공중에 둥둥 떠서 주변 공기의 미세한 정전기를 안테나처럼 주워 먹고 있는 상태지! 이 도깨비 신호를 닻처럼 바닥이나 천장에 꽉 묶어주는 부품이 바로 풀업(Pull-up) 저항이란다!”
-
🐶 토토: “바우! 도깨비 신호를 단칼에 쫓아내는 마법의 저항이다 멍!”
- 🖥️ 강의 슬라이드: slides.md
1. 도로시의 공포: 버튼을 안 눌렀는데 혼자 깜빡이는 이유

👻 공중에 붕 뜬 핀(High Impedance)의 비극
스위치를 5V 전원과 2번 핀 사이에만 달랑 달아놓으면, 스위치를 누르지 않았을 때 2번 핀은 5V에도, GND(0V)에도 연결되지 않은 허공 상태가 됩니다.
- 안테나 효과 (Antenna Effect):
- 마이크로컨트롤러 입력 핀의 내부 저항은 $100\text{M}\Omega$ 이상으로 극도로 높아서, 주변 형광등의 교류 자기장이나 사람 손의 미세한 정전기 유도만으로도 전압이 0V에서 5V 사이를 정신없이 오르내립니다.
- 결과:
- 아두이노가 “HIGH인가? LOW인가?” 혼란에 빠져 1초에 수천 번 0과 1을 번갈아 읽는 오작동을 일으킵니다.
2. 플로팅(Floating) vs 풀업(Pull-up) 전압 상태 비교

⚓ 닻을 내려 기준 전위를 명확히 고정하라!
스위치 회로의 기본 철칙은 스위치를 떼고 있을 때도 전압이 확실히 5V 또는 0V 중 하나로 고정되어 있어야 한다는 것입니다.
graph LR
subgraph 위험한 플로팅 상태
Pin1["아두이노 입력 핀"] --- Air["공중에 붕 뜸 (0V~5V 요동) ❌"]
end
subgraph 안전한 풀업 상태
VCC["+5V 전원"] --- R["풀업 저항 (10kΩ)"]
R --- Pin2["아두이노 입력 핀 (평소 5V 확정!) ✔️"]
end
3. 외장 풀업 저항(Pull-up Resistor) 회로의 동작 원리

📈 평소에는 5V로 당겨두고, 누르면 접지로 방전!
5V 전원과 입력 핀 사이에 10k$\Omega$ 고정 저항을 연결하고, 입력 핀과 GND 사이에 스위치를 배치합니다.
| 스위치 상태 | 전류의 이동 경로 | 2번 핀 전압 레벨 | digitalRead(2) 값 |
|---|---|---|---|
| 안 눌렀을 때 (평상시) | 10k$\Omega$ 저항을 통해 5V 전원과 연결됨 | 5.0 V (HIGH) | HIGH (1) |
| 버튼을 꾹 눌렀을 때 | 저항 없는 GND(0V) 경로로 전류가 직행! | 0.0 V (LOW) | LOW (0) |
[!CAUTION] 풀업 회로의 역논리(Negative Logic): 풀업 회로에서는 버튼을 누르지 않았을 때가 HIGH(1) 이고, 버튼을 꾹 눌렀을 때가 LOW(0) 가 됩니다! 초보자들이 가장 헷갈려하는 부분이므로 꼭 기억하세요.
4. 아두이노의 특급 선물: 내부 풀업 저항 INPUT_PULLUP

🎁 외장 저항 없이 점퍼선 2가닥으로 끝내는 마법!
매번 브레드보드에 10k$\Omega$ 저항을 꽂고 5V 선을 따오는 것은 번거롭습니다. ATmega328P 칩 내부에는 각 GPIO 핀마다 약 20k$\Omega$ ~ 50k$\Omega$의 내장 풀업 저항이 이미 심어져 있습니다!
void setup() {
// 외장 저항 10kΩ 완벽 불필요! 내부 풀업 저항 가동!
pinMode(2, INPUT_PULLUP);
pinMode(13, OUTPUT);
}
void loop() {
int buttonState = digitalRead(2);
// 버튼을 꾹 누르면 접지(GND)로 떨어져 LOW가 됨!
if (buttonState == LOW) {
digitalWrite(13, HIGH); // LED 점등
} else {
digitalWrite(13, LOW); // LED 소등
}
}
- 배선법: 스위치의 한쪽 다리를 디지털 2번 핀, 다른 쪽 다리를 아두이노 GND에 바로 꽂으면 끝납니다!
5. 기계식 스위치의 잔상: 채터링(Chattering)과 디바운싱

🔨 1번 눌렀는데 10번 카운트되는 바운싱 현상 해결법
스위치 내부의 금속 접점은 스프링 탄성 때문에 닿는 찰나의 순간(수 ms) 동안 미세하게 튀면서 수십 번 붙었다 떨어졌다를 반복합니다.
sequenceDiagram
autonumber
participant Finger as 손가락
participant Switch as 금속 접점
participant MCU as 아두이노 입력 핀
Finger->>Switch: 버튼 1번 클릭!
Switch->>MCU: 0V -> 5V -> 0V -> 5V -> 0V (수 ms 동안 수십 번 진동!)
Note over MCU: 채터링(Bouncing)으로 인해 10번 연속 누른 것으로 착각!
- 소프트웨어 디바운싱(Debounce) 해결법:
- 버튼이 눌린 것을 감지한 직후
delay(30~50);의 짧은 안정화 시간을 주어 금속의 기계적 떨림이 완전히 잦아든 뒤 신호를 확정합니다.
- 버튼이 눌린 것을 감지한 직후
🌟 도로시와 지니의 핵심 요약 노트!

- 👧 도로시: “플로팅은 핀이 공중에 떠서 노이즈를 타는 거였고,
pinMode(2, INPUT_PULLUP)한 줄만 쓰면 외부 저항 없이도 스위치와 GND 연결만으로 도깨비 신호를 완벽히 잡을 수 있구나!” - 👨🏫 이호진 교수님: “맞아! 풀업에서는 누르면 LOW, 떼면 HIGH라는 역논리만 익숙해지면 어떤 버튼 회로든 가장 안전하게 만들 수 있단다.”
- 🐶 토토: “바우! 이제 버튼을 누르면 경쾌한 멜로디가 삑- 울리는 부저 스위치를 만들러 가보자 멍!”
서브목차