아두이노가 스위치의 누름이나 외부 센서의 신호를 읽어 들여 판단을 내리는 입력(Input) 제어 기법을 알아봅니다.
1. 입력 제어 용어 사전 (Glossary)
- Floating (플로팅): 핀이 5V나 GND 어디에도 확실히 연결되지 않아 정전기 잡음으로 논리 값이 무작위로 튀는 불안정 현상입니다.
- Pull-up / Pull-down (풀업/풀다운): 플로팅을 방지하기 위해 핀을 5V 전원(풀업) 또는 GND(풀다운)에 고저항($10\text{K}\Omega$)으로 묶어두는 회로 방식입니다.
- ADC (Analog-to-Digital Converter): 아날로그 연속 전압(0
5V)을 디지털 이진 정수값(01023)으로 변환해주는 장치입니다. - Debounce (디바운스): 스위치 물리 접점이 붙을 때 수 ms 동안 발생하는 미세 튕김(Chattering) 잡음을 소프트웨어/하드웨어적으로 제거하는 기술입니다.
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}$)로 읽습니다.
- 전압 $0\text{V} \rightarrow 0$
- 전압 $2.5\text{V} \rightarrow 511$
- 전압 $5.0\text{V} \rightarrow 1023$
// 가변저항(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 범위가 계산됩니다.