// education

아두이노 입력 이해하기 (디지털 입력과 아날로그 입력)

아두이노가 스위치의 누름이나 외부 센서의 신호를 읽어 들여 판단을 내리는 입력(Input) 제어 기법을 알아봅니다.


1. 입력 제어 용어 사전 (Glossary)


2. 디지털 입력과 내부 풀업 (INPUT_PULLUP)

스위치 회로를 만들 때 외부 저항을 생략하고 아두이노 MCU 내부에 내장된 $20\text{K}\Omega \sim 50\text{K}\Omega$ 풀업 저항을 활성화하여 간편하게 스위치를 연결할 수 있습니다.

[내부 풀업 스위치 회로 연결]
아두이노 핀(D2) ------------ (스위치 핀 1)
                     (스위치 핀 2) ------------ GND
const int buttonPin = 2;
const int ledPin = 13;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP); // 내부 풀업 입력 모드 활성화
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // 스위치를 누르면 GND와 연결되어 digitalRead() 값은 LOW(0)가 됨
  int btnState = digitalRead(buttonPin);
  
  if (btnState == LOW) {
    digitalWrite(ledPin, HIGH); // 버튼 누름 상태 -> LED ON
  } else {
    digitalWrite(ledPin, LOW);  // 안 누름 상태 -> LED OFF
  }
}

3. 아날로그 입력 (analogRead)과 map() 함수

아두이노 우노의 A0 ~ A5 핀은 10-bit ADC가 적용되어 전압을 1024단계($2^{10}$)로 읽습니다.

// 가변저항(Potentiometer)으로 LED 밝기 실시간 제어
const int potPin = A0;
const int ledPin = 9; // PWM 핀

void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {
  int rawValue = analogRead(potPin); // 0 ~ 1023 읽기
  
  // 0~1023 아날로그 입력 범위를 0~255 PWM 출력 범위로 1:1 변환
  int pwmValue = map(rawValue, 0, 1023, 0, 255);
  
  analogWrite(ledPin, pwmValue); // 밝기 조절
  
  Serial.print("Raw ADC: "); Serial.print(rawValue);
  Serial.print(" -> PWM: "); Serial.println(pwmValue);
  delay(50);
}

4. 자주 묻는 질문 (Q&A)

Q. map() 함수를 직접 수학 공식으로 만들려면 어떻게 적어야 하나요? A. int pwmValue = rawValue / 4; (1024 / 256 = 4이므로 단순 4로 나누기)로 작성하셔도 동일하게 0~255 범위가 계산됩니다.

← 이전아두이노 출력 이해하기 (디지털 출력과 PWM) 다음 →아두이노 시리얼 통신 (UART 및 데이터 모니터링)