PWM 신호
아날로그 값 출력
0V ~ 5V의 연속적인 아날로그 값을 출력하려면 DAC
(Digital-Analog Converter, 디지털-아날로그 변환기)가 필요합니다.
DAC 내장 아두이노 보드에서만 아날로그 값을 출력할 수 있습니다. 예를 들자면 '아두이노 듀에'가 있습니다.
저희 학교에서 실습하는 보드는 '아두이노 우노'이기 때문에 아쉽게도 아날로그값 제어를 할 수 없습니다.
PWM (Pulse Width Modulation, 펄스폭 변조)
PWM
는 아날로그 신호는 아니지만 아날로그 신호와 비슷한 효과를 얻을 수 있습니다.analogWrite()
함수를 사용하여 PWM 신호를 출력할 수 있습니다.
PWM 신호는 주기 내에서 HIGH의 비율인 듀티 사이클(duty cycle)에 의해 결정됩니다.
주기 내에서 50% 듀티라면 절반이 HIGH(5V), 나머지 절반은 LOW(0V) 라는 의미이고, 평균값으로 2.5V 정도를 얻을 수 있습니다.
PWM 신호로 아날로그 신호 효과를 얻을 수 있는 장치는 제한적이며, 핀 번호에 물결무늬(~)가 표시된 핀에서 PWM 신호를 출력할 수 있습니다.
PWM 신호 사용
8비트 값을 사용합니다. 따라서 0 (0% 듀티 사이클) 에서 255 (100% 듀티사이클) 값을 출력합니다.
const int LED = 9; // PWM 신호 출력이 가능한 핀
void loop()
{
analogWrite(LED, 0); // 항상 꺼짐
analogWrite(LED, 255); // 항상 켜짐
analogWrite(LED, 127); // 절반 정도 밝기로 켜짐
// ... 0~255 값을 조절하여 마치 '아날로그 인 것 처럼' 보이게 제어할 수 있음
}
RGB LED 실습
음극 핀을 제어하므로 0% 듀티 사이클에서 완전히 (가장 밝게) 켜지고, 100% 듀티 사이클에서 완전히 꺼진다. 바로 위에 있는 일반 LED와 반대 => 뭔소린지? 아날로그로 하면 그렇다는 건가? 아닌디?
디지털 신호로 실습하기
RGB LED 에서 빨간색과 초록색이 1초마다 바뀌도록 해보겠습니다.
const int RED = 9;
const int GREEN = 10;
const int BLUE = 11;
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
}
void setRed() {
digitalWrite(RED, HIGH); // on
digitalWrite(GREEN, LOW); // off
digitalWrite(BLUE, LOW); // off
}
void setGreen() {
digitalWrite(RED, LOW); // off
digitalWrite(GREEN, HIGH); // on
digitalWrite(BLUE, LOW); // off
}
void loop() {
setRed();
delay(1000);
setGreen();
delay(1000);
}
아날로그 신호로 실습하기
PWM 신호를 사용하여 LED의 밝기가 점차 커졌다가, 다시 점차 작아지도록 해보겠습니다.
RGB LED를 사용하기 때문에 Red → Green → Blue 순서로 위의 동작을 진행하도록 해보겠습니다.
코드를 아두이노에 업로드 하면, tx
(tranmission)와 rx
(receiver)가 반짝이는걸 볼 수 있습니다.
아두이노와 PC가 시리얼 통신을 주고 받았다는 의미입니다.
const int RED = 9;
const int GREEN = 10;
const int BLUE = 11;
void setup() {
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
}
void loop() {
for (int i = 9; i < 12; i++) {
// crescendo
for (int j = 0; j < 256; j++) {
analogWrite(i, j);
delay(10);
}
// decrescendo
for (int j = 255; j >= 0; j--) {
analogWrite(i, j);
delay(10);
}
}
}
Red, Green, Blue와 연결된 핀이 9~11번으로 연속되므로 중첩 for문으로 제어해주었습니다.
물론 중첩 for문을 사용하지 않고 처음에 지정한 const값을 사용하여 직접 해당 포트에 write 할 수도 있습니다.