안녕하세요. 오늘은 지난 시간에 배운 PWM을 활용해서 LED의 밝기를 조절하는 것을 해볼까 합니다.

1. PWM을 사용할 수 있는 핀

아두이노 보드의 모든 핀이 PWM을 지원하고 있는 것은 아닙니다. 어떤 보드이냐에 따라 PWM을 사용할 수 있는 핀이 달라지게 되는데요, 저는 제가 사용하고 있는 UNO 보드를 기준으로 설명 드리겠습니다.

그림 1 : UNO 보드 PWM 표시
[그림 1 : UNO 보드 PWM 표시]

아두이노 UNO보드의 경우 그림 1과 같이 디지털 핀 부분을 살펴보면 DIGITAL(PWM~)이라고 되어 있습니다.
여기에 배치되어 있는 핀들은 모두 디지털 핀들인데, 특히 ~(물결) 표시가 되어 있는 핀은 PWM핀이라는 의미입니다.

3, 5, 6, 9, 10, 11번 핀의 숫자 왼쪽을 보면 ~(물결) 표시가 되어 있는 것을 알 수 있습니다. 따라서 이 핀들이 PWM을 사용할 수 있는 핀입니다.

2. analogWrite()함수

위에서 우리가 사용하게 될 PWM 핀들이 모두 디지털 핀임을 알게 되었습니다. 그런데 우리는 digitalWrite()가 아닌 analogWrite()를 사용해야 한다는 점에 유의해 주세요.

digitalWrite()는 HIGH 또는 LOW의 값만 넣어 줄 수 있는 함수이고, analogWrite()는 0~255까지의 값을 넣어 줄 수 있는 함수입니다.(그리고 PWM 핀에서만 사용할 수 있는 함수임에 꼭 유의해주세요!)
analogWrite()를 호출해주면, 해당 핀은 정해진 duty cycle의 square wave1를 계속해서 출력하게 됩니다.

3. 회로

그림 2 : LED Fade 회로
[그림 2 : LED Fade 회로]

그림 2와 같이 회로를 구성합니다.
LED와 220옴 저항을 직렬로 연결하고 LED의 긴쪽(anode)을 디지털 3번 핀에 연결합니다. LED의 짧은 쪽(cathode)는 그라운드(GND) 핀에 연결합니다.

4. 코드

const int LED_PIN = 3;

int brightness = 0;
int fadeAmount = 5;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  analogWrite(LED_PIN, brightness);

  brightness += fadeAmount;

  if(brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }

  delay(30);
}
  • 1번 줄 : 3번 PWM핀을 사용합니다.
  • 6~8번 줄 : 3번 핀을 출력모드로 설정합니다.
  • 11번 줄 : 3번 핀에 brightness 값을 아날로그 출력으로 보냅니다.
  • 13번 줄 : brightness에 fadeAmount 값을 더해줍니다.
  • 15~17번 줄 : brightness값이 경계값(0또는 255)에 도달한 경우에 fadeAmount 값의 부호를 바꿔줘서 반대로 동작하게 해줍니다. 예를들어 점점 밝아지고 있는 상황에서는 fadeAmount값이 5일 것이고, brightness가 255에 도달하게 되면 경계값이므로 fadeAmount는 -5로 변하게 됩니다. 그 후로는 brightness값이 점점 줄어들면서 LED가 점점 어두워지고 brightness값이 0이 되면 다시 fadeAmount가 5가 되면서 점점 밝아지는 로직으로 변하게 됩니다. 이러한 동작을 무한 반복하게 됩니다.
  • 19번 줄 : 30ms 동안 대기합니다. (현재 LED의 밝기를 30ms 동안 유지하는 것입니다.)


5. 결과

그림 3 : LED fade 결과
[그림 3 : LED fade 결과]


  1. square wave를 업계에서 한글로 어떻게 번역해서 쓰고 있는지를 잘 모르겠네요. 어쨌든 0또는 1의 두가지 값만을 갖는 각진 형태의 파형을 말합니다.

+ Recent posts