아두이노 입출력 핀에 전압을 내보내는 출력(Output) 제어는 가장 기본적인 액추에이터 제어 방식입니다.
1. 출력 제어 용어 사전 (Glossary)
- digitalWrite: 지정한 디지털 핀에 5V(HIGH) 또는 0V(LOW)의 이분법적 논리 전압을 내보내는 함수입니다.
- PWM (Pulse Duty Modulation): 디지털 신호의 ON/OFF 고속 스위칭 비율을 조절하여 의사(Pseudo) 아날로그 전압 효과를 연출하는 기술입니다.
- Duty Cycle (듀티 사이클): 한 주기의 전체 시간 중 신호가 HIGH(5V)를 유지하는 시간의 비율(%)입니다.
- Piezo Buzzer (피에조 부저): 압전 효과를 이용하여 전기 신호의 주파수(Hz)에 따라 물리적 진동판을 울려 소리를 내는 소자입니다.
2. 디지털 출력 (Digital Output) 실습
// 8번 핀에 연결된 외부 LED를 0.5초 간격으로 점멸
const int ledPin = 8;
void setup() {
pinMode(ledPin, OUTPUT); // 8번 핀의 모드를 출력(OUTPUT)으로 지정
}
void loop() {
digitalWrite(ledPin, HIGH); // 8번 핀 5V 출력 (LED ON)
delay(500);
digitalWrite(ledPin, LOW); // 8번 핀 0V 출력 (LED OFF)
delay(500);
}
3. PWM (펄스 폭 변조) 원리와 analogWrite()
아두이노 우노의 디지털 핀 중 물결표시(~)가 있는 3, 5, 6, 9, 10, 11번 핀은 약 490Hz (5, 6번은 980Hz)의 주파수로 PWM 출력을 지원합니다.
analogWrite(pin, 0): Duty Cycle 0% $ ightarrow$ 실질 전압 0V (최저 밝기)analogWrite(pin, 127): Duty Cycle 50% $ ightarrow$ 실질 전압 2.5V (중간 밝기)analogWrite(pin, 255): Duty Cycle 100% $ ightarrow$ 실질 전압 5.0V (최고 밝기)
// 9번 PWM 핀을 활용한 LED Fade(숨쉬기) 효과
const int pwmPin = 9;
void setup() {
pinMode(pwmPin, OUTPUT);
}
void loop() {
// 밝기가 0에서 255까지 솟구침
for (int b = 0; b <= 255; b += 5) {
analogWrite(pwmPin, b);
delay(20);
}
// 밝기가 255에서 0으로 떨어짐
for (int b = 255; b >= 0; b -= 5) {
analogWrite(pwmPin, b);
delay(20);
}
}
4. 피에조 부저 음계 제어 (tone() / noTone())
tone(pin, frequency, duration) 함수를 사용하면 구형파(Square Wave)를 발생시켜 음계를 연주할 수 있습니다.
| 음계 (Note) | 주파수 (Hz) | 비고 |
|---|---|---|
| 도 (C4) | 262 Hz | 4옥타브 도 |
| 레 (D4) | 294 Hz | |
| 미 (E4) | 330 Hz | |
| 파 (F4) | 349 Hz | |
| 솔 (G4) | 392 Hz | |
| 라 (A4) | 440 Hz | 표준 음고 |
| 시 (B4) | 494 Hz | |
| 도 (C5) | 523 Hz | 5옥타브 도 |
const int buzzerPin = 5;
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};
void setup() {
for (int i = 0; i < 8; i++) {
tone(buzzerPin, melody[i], 250); // 0.25초 동안 해당 음 출력
delay(300);
}
noTone(buzzerPin); // 소리 끄기
}
void loop() {}
5. 자주 묻는 질문 (Q&A)
Q. digitalWrite(13, 128) 같이 숫자를 적으면 어떻게 되나요?
A. digitalWrite 함수는 0(LOW)이 아닌 모든 숫자를 단순히 HIGH(5V)로 인지하여 켜버립니다. 아날로그처럼 밝기를 조절하려면 반드시 analogWrite()를 써야 합니다.