Mechanic 공방

10. 아두이노 LED 실습 (3) with PWM 제어 본문

아두이노 (Arduino)

10. 아두이노 LED 실습 (3) with PWM 제어

H-Mechanic 2020. 7. 19. 09:55
728x90
반응형

저번 포스팅까지는 단순히 LED의 on/off 제어를 해보았다.

 

이번 포스팅에서는 아두이노 디지털 핀의 기능 중 하나인 'PWM 제어'를 사용하여 LED의 밝기를 제어하며 on/off 시켜보도록 하겠다.

 

회로도 구성에 앞서, PWM 제어에 대하여 간단하게 알아보겠다.

 

[PWM 제어]

PWM 제어란, Pulse Width Modulation의 약자로서 디지털 신호의 주기를 조절하여 이를 아날로그 신호처럼 사용하게 해주는 제어 방식 중 하나이다.

 

아래 그림은 디지털 신호의 주기를 변화시키면 신호가 어떻게 변화하는지 쉽게 보여주는 그림이다.

 

위 그림과 같이, 기존에 0V5V의 두 가지 신호 형태만 가진 디지털 신호의 주기를 변화시킴으로써 아날로그 신호와 같은 형상의 신호를 생성해 내는 것이 PWM 제어의 핵심이다.

 

Duty Cycle의 퍼센트가 높아질수록 5V 신호를 더 많이 내보낸다고 생각하면 된다.

 

즉, LED를 PWM 방식으로 제어한다면 빠른 주기로 on/off 시킴으로써 밝기를 조절한다고 생각하면 된다.

 

이를 LED 밝기에 비유해보자면, 100% duty cycle에 가까워질수록 최대 밝기가 된다고 보면 된다.

 

아두이노에서는 이를 총 256단계로 나눌 수 있으며, 0부터 255까지의 숫자를 부여함으로써 PWM 제어를 수행하게 된다.

 

[회로 구성]

회로도의 경우 저번 포스팅과 동일한 구성이다.

마찬가지로 저항을 사용하고 싶다면 아래와 같이 구성하면 된다.

[코드 작성]

저번 포스팅에서는 LED를 순서대로 on/off 되도록 코드를 작성하였다면, 이번 포스팅에서는 순서대로 on/off가 되지만 각 on/off 과정이 보다 부드럽게 이루어지도록 (즉, 밝기를 조절하며 on/off 되도록) 작성하였다.

#define LED1 9
#define LED2 10
#define LED3 11

void setup() {
    pinMode(LED1, OUTPUT);
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
}

void loop() {
    for (int i=0;i<256;i++) {
        analogWrite(LED1,i);
        digitalWrite(LED2,LOW);
        digitalWrite(LED3,LOW);
        delay(10);
    }

    for (int i=255;i>-1;i--) {
        analogWrite(LED1,i);
        digitalWrite(LED2,LOW);
        digitalWrite(LED3,LOW);
        delay(10);
    }

    delay(50);

    for (int i=0;i<256;i++) {
        digitalWrite(LED1,LOW);
        analogWrite(LED2,i);
        digitalWrite(LED3,LOW);
        delay(10);
    }

    for (int i=255;i>-1;i--) {
        digitalWrite(LED1,LOW);
        analogWrite(LED2,i);
        digitalWrite(LED3,LOW);
        delay(10);
    }

    delay(50);

    for (int i=0;i<256;i++) {
        digitalWrite(LED1,LOW);
        digitalWrite(LED2,LOW);
        analogWrite(LED3,i);
        delay(10);
    }

    for (int i=255;i>-1;i--) {
        digitalWrite(LED1,LOW);
        digitalWrite(LED2,LOW);
        analogWrite(LED3,i);
        delay(10);
    }

    delay(50);
}

for문과 analogWrite() 함수를 사용하여 반복문으로 LED의 밝기 조절을 구현하였다.

 

analogWrite() 함수의 경우, 지정한 핀에 아날로그 신호를 입력시킬 수 있게 해주는 함수이다.

 

0부터 255까지의 숫자를 사용하여 신호를 입력하며, 이를 통해 LED의 밝기를 조절할 수 있다.

 

다만 아두이노 우노의 경우 PWM 신호를 출력할 수 있는 핀이 지정되어 있기 때문에, PWM 기능을 사용하기 위해서는 지정된 핀을 사용해야 한다. (D3,5,6,9,10,11)

 

for문의 경우 조건문을 사용하여 원하는 만큼 해당 구문을 반복하여 실행할 수 있게 해주는 구문이다.

 

조건문에는 3가지의 요소가 포함되며, 반복 횟수를 결정할 변수의 선언 및 초기화, 반복 횟수 결정을 위한 범위 설정, 변수의 단계별 증감 방식 결정의 3가지가 필요하다.

 

위 코드의 경우 ‘i’라는 변수를 반복 횟수를 결정하기 위한 변수로 선언하였으며, 0부터부터 256 미만까지 1씩 증가하는 for문과 255부터 -1 이전까지 1씩 감소하는 for문을 반복하게 된다.

 

결과적으로 각 for문은 총 255번 반복하면서 LED의 밝기를 조절하게 되는 것이다.

 

특이점으로는 for문 내부에 10ms씩의 delay() 함수를 추가하였는데, 이는 LED의 밝기가 변하는 것을 직접 확인하기 위해 밝기 변화 과정을 느리게 진행시키기 위함이다.

 

최종적으로 위 코드는 각 LED를 점점 밝게 켰다가 다시 점점 어둡게 끄는 동작을 반복하게 된다.

 

[동작 영상]

 

 

728x90
반응형