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라는 역논리만 익숙해지면 어떤 버튼 회로든 가장 안전하게 만들 수 있단다.”
  • 🐶 토토: “바우! 이제 버튼을 누르면 경쾌한 멜로디가 삑- 울리는 부저 스위치를 만들러 가보자 멍!”
서브목차