본문 바로가기
아두이노

[아두이노] PWM (Pulse Width Modulation) 으로 LED 밝기 제어

by 배전이 2020. 7. 28.

아두이노 우노보드는 PWM 출력이 가능한 포트가 지정되어 있습니다. 보드에 디지털 출력 핀 부분을 자세히 보시면 핀번호가 써져있는부분에 ~ 표시가 되어있는 번호가 있으실겁니다. 그 포트는 PWM 출력이 가능하다는 표시입니다.

 

PWM이란 Pulse Width Modulation의 약자로 펄스폭 변조라고도 합니다. 한 주기 내에서 HIGH 상태와 LOW 상태의 폭을 통해 값을 전송하는 방법으로 초기에는 통신용으로 개발되었지만 현재는 통신보다는 모터 제어나 조명 제어 등에 널리 사용되고있습니다. 간단히 그림을 통해 PWM에 대해 알아보겠습니다. 

 

 

 

그림에서 총 3개의 파형을 볼 수 있는데, 각각 일정한 주기로 반복되는 파형이며 편의상 2개 주기만 나타냈습니다. 첫번째 파형은 전체 주기에서 25%만 HIGH 상태이며 나머지는 LOW 상태입니다. 이와 마찬가지로 두번째 파형은 50%, 세번째 파형은 75%가 HIGH 상태입니다. 이때 비율을 dutycycle 이라고 하며, 이와같이 HIGH 상태의 펄스폭을 변조하는것을 PWM이라고 합니다. 

 

그렇다면 아두이노에서 PWM은 어떤방식으로 사용할 수 있을까요? 우선 첫번째로 LED 제어에 사용할 수 있습니다. 아두이노에서 디지털 출력은 5V 와 0V 만 출력 할 수 있습니다. 따라서 아날로그 출력이 필요할 경우 아두이노의 기본 기능으로는 불가능합니다. 하지만 PWM을 사용한다면 거의 같은 효과를 얻을 수 있습니다. 예를 들어 50%의 PWM 파형을 내보낼 때 주기가 길다면 LED가 꺼졌다 켜졌다를 반복하게 되겠지만 주기가 매우 짧아지면 LED가 점멸하는것은 보이지 않게 되고 LED가 중간밝기로 빛나는것으로 보이게됩니다. 이와 같이 HIGH인 비율을 조절하여 LED의 밝기를 조절할 수 있습니다. 

 

아두이노 보드들은 각각 PWM 출력이 가능한 포트들이 지정되어있습니다. 우노보드에서는 3,5,6,9,10,11번 핀에서 PWM 출력이 가능합니다. 우노보드의 경우 PWM 출력의 주파수는 5,6번 핀은 980Hz, 나머지 핀은 490Hz를 출력하게됩니다. 주파수가 너무 낮으면 LED가 깜빡거리는게 눈에 보이는 현상이 있을 수 있으니 주파수는 어느정도 이상은 되야합니다. 

 

이제 아두이노에서 PWM을 출력하는 함수를 알아보도록 하겠습니다. 

 

analogWrite(pin, value)

 

analigWrite 함수는 지정한 핀에 PWM을 출력하는 함수입니다. 여기서 pin은 PWM 출력이 가능한 핀을 사용해야하고, value는 0부터 255 범위의 값을 넣을 수 있는데, 0은 dutyCycle 0%. 255는 dutyCycle 100%를 나타냅니다. 

 

그럼 아두이노를 통해 LED의 밝기를 제어해보도록 하겠습니다. 회로는 아래 그림과 같이 꾸며봤습니다. LED 제어는 PWM 출력이 가능한 핀들중 6번핀으로 사용하였습니다. LED의 허용전류를 넘지 않도록 하기위해서는 저항을 꼭 추가해 주셔야합니다. 저는 단색 LED가 없어서 RGB LED에서 한가지 색만 연결하여 사용하였고, 저항은 가변저항을 대체하여 회로를 구성하였습니다. 

 

 

제가 작성한 LED 밝기 제어 코드를 보도록 하겠습니다. 

 

int light;
int plus;

void setup() {
  pinMode(6,OUTPUT);
  light=0;
  plus=1;
}

void loop() {
 analogWrite(6,light);
 light=light+plus;
 if(light==255)plus=-1;
 if(light==0)plus=1;
 delay(5);
}

 

light 변수는 dutyCycle을 정하는 수로 증가 또는 감소시키도록 구성하였고, plus 변수를 통해 light를 증가시키거나 감소시키도록 하였습니다. 이때 증가 또는 감소가 light가 최소값인 0과 최대값인 255에서 변경되도록 코딩하였습니다.

 

동작은 아래와 같이 정상적으로 밝아졌다가 어두워지는것을 반복하게 됩니다. 

 

댓글