[아두이노 공부] 3. PWM을 이용한 LED 밝기 조절
공부/아두이노, 전자·전기

[아두이노 공부] 3. PWM을 이용한 LED 밝기 조절

오늘은 LED의 밝기 조절을 해보았다. 코드부터 쓰겠다.

void setup() {
  pinMode(6,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
 // 6,9,10번 핀을 OUTPUT 모드로 설정
}

void loop() {
  int digpin[3] = {6,9,10};
  for(int i=0; i<3; i++)
  {
    int k = digpin[i]; // k에 6,9,10을 차례대로 대입
    
    for(int j=0;j<256;j++)
    {
      analogWrite(k,j);
      delay(10);
      // k번째 핀의 출력값을 0에서 255까지 상승시킴
    }
  
    for(int j=255; j>=0; j--)
    {
      analogWrite(k,j);
      delay(10);
      // k번째 핀의 출력값을 255에서 0에서 감소시킴
    }
  }
}

 

 

3색 LED를 빨강,초록,파랑 순으로 6,9,10번 핀에 꽂고 실행시켰을 때, 다음 영상과 같은 모습이 나온다.

 

 

새로운 프로그램을 사용해보았다 하하;;;

 

 

지난 번에 LED 켤 때는

digitalWrite 함수를 사용하였는데,

 

이번엔,

1) 아날로그 신호를 출력해주는 analogWrite 함수를 사용하고, 출력값을 조절

2) 3핀을 모두 사용

한 것이 차이점이다.

 

analogWrite (pin, value) 는 아날로그 신호를 출력하는 함수이다.

value는 0~255 에서 유효하며,

255보다 더 큰 숫자를 넣으면, 256을 n번 차감(?)하여 출력하는 것을 알 수 있다.

 

그런데 여기서 재밌는 것은, 우리는 분명히 디지털 출력 핀에 전선을 꽂았다는 것이다.

 

출처 : https://www.allaboutcircuits.com/technical-articles/an-introduction-to-digital-signal-processing/

아날로그는 값을 연속적으로 표현할 수 있고,

디지털은 0과 1만 표현 가능하다는 것을 알고있을 것이다.

 

DAC(Digtal-Analog Converter)가 없는 아두이노는 어떻게 LED의 밝기를 조절하고 있는 것일까?

답은 PWM에 있다.


PWM이란?

 

PWMPulse Width Modulation의 약자로, 한국말로 '펄스폭 변조'라고 한다.

쉽게 말하면, 디지털 신호를 아날로그 신호처럼 보내서 기계한테 사기를 치는 것이다.

 

아두이노에서 자주 쓰는 5V를 예로 들어보자.

 

만약 아날로그로 2.5V를 10초 동안 출력했다고 생각하면,

디지털로 5V('1'값)와 0V('0'값)을 1:1 간격으로 10초 동안 바꿔가며 출력하는 것이다.

 

그러면

10 * 2.5 = 10 * (5+0)/2

가 성립하는 것을 알 수 있다.

 

정확한 설명은 아니지만, 이런 식으로 쉽게 이해할 수 있다.

 

 

이때, 1의 비율을 'duty cycle' 이라고 하며, 항상 1일 때 100% duty cycle, 항상 0일 때 0% duty cycle이다.

 

디지털 신호가 1이 되는 순간에만 전력을 소모하므로, 우리는 duty cycle을 조절해 전력량을 조절할 수 있고,

이를 통해 LED의 밝기를 조절할 수 있다.

이를 발전시켜 생각하면 모터의 rpm 또한 비슷하게 조절할 수 있을 것이다.

 


 

그럼 아두이노에서 PWM을 어떻게 사용하느냐?

 

노란색 부분을 보면 (PWM~) 표시가 있는데, 

숫자 옆에 ~가 붙은 핀에서 PWM을 사용할 수 있다는 뜻이다.

아두이노 우노 같은 경우, 3, 5, 6, 9, 10, 11번 핀에서 PWM을 사용할 수 있다.

 


결론적으로 아두이노는 PWM을 이용해

디지털 신호로도 아날로그(스러운) 출력이 가능하다는 것을 알게 되었다.

 

PWM은 아두이노 뿐만 아니라 전자산업 전반에서 사용되는 기술로, 유익한 정보를 얻게 되었다.

 

문득 떠오르는 생각,

 

digitalWrite와 delay 함수를 이용하여

PWM 역할을 할 수 있는 코드를 만들면, 비슷하게 출력이 될까?