본문 바로가기
코딩/아두이노

[아두이노 강좌] 예제로 배우는 아두이노 #5 analogWrite( ), 아두이노로 pwm 출력하기

by DIYver 2020. 3. 25.

<목표>

 

 

- analogWrite() 함수를 이용하여 전압 출력을 pwm 신호로 출력할 수 있다.

 


<준비물>

 

 

- 아두이노(나노, 우노, 메가), 시리얼 통신 케이블, 브레드보드, led

 

아두이노 우노 / 시리얼 통신 케이블(USB-B타입) /  브레드보드 / LED

LED 사용하는데에는 저항이 필수적으로 필요하지만, 간단히 테스트를 위해서 이번에는 LED(백색)을 이용한다.

적색과 노란색, 녹색의 LED를 사용하시려면 저항이 필요합니다. 110옴 저항 사용 권장.


<회로도>

 

 

LED의 긴다리(+극)를 9번핀에 연결한다.


<코드>

 

int led = 9;           // the PWM pin the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup() {
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
}


// the loop routine runs over and over again forever:
void loop() {
  // set the brightness of pin 9:
  analogWrite(led, brightness);

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade:
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }
  // wait for 30 milliseconds to see the dimming effect
  delay(30);
}

코드는 아두이노 - 파일 - 예제 - 01.Basics - Fade 의 예제 파일과 동일 합니다.

예제파일을 쓰셔도 되고, 위의 코드를 복사하여 붙여넣으셔도 됩니다.

 


<실행 결과>

 

 

 

led의 밝기를 아두이노로 제어할 수 있음을 확인할 수 있었다.

아두이노의 디지털 핀은 출력이 0 V 아니면 5 V 밖에 낼 수 없는데, 위와같이 밝기를 조절할 수 있는 이유는 PWM 신호 때문이다.

 

PWM 제어는 "펄스 폭 변조" 라고 부르며, 아래 링크에서 자세하게 확인 할 수 있다.

https://ko.wikipedia.org/wiki/%ED%8E%84%EC%8A%A4_%ED%8F%AD_%EB%B3%80%EC%A1%B0

 

펄스 폭 변조 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 펄스 폭 변조의 변조된 펄스 폭(0%,25%,%0%,75%,100%) 0v~5v기준 펄스 폭 변조(Pulse Width Modulation, PWM) 방식은 펄스의 폭을 조절하는 방식으로 변조한다. 때때로 PDM(pulse-duration modulation)라고도 한다. 이러한 펄스폭변조제어(pulse幅變調制御)는 임의의 정해진 출력 파형을 유도해내기 위하여 각 기본 주기에서 펄스폭이나 주파수, 또는 그 두 가지 모두를

ko.wikipedia.org

 

간단하게 설명하자면, 0V의 신호와 5V의 신호를 1초 동안 얼마나 유지하고 반복하느냐의 차이로 0~5 범위의 전압을 출력할 수 있다.

 

 

아두이노 코드 중 새로운 함수를 소개하고 넘어가보자.

analogWrite( pin_number , value ) : pin_number 에 해당하는 단자에 value (0~255)에 해당하는 PWM 신호를 출력한다.

 

원래는 duty 비로 제어를 해야하지만, 아두이노에서는 0~255의 값으로 제어가 가능하다.

쉽게 생각하자면,

값이 0 일 때에는 duty 비가 0으로 0V 출력이 된다.

값이 127 일 때에는 duty 비가 50% 로 2.5V 출력이 된다.

값이 255 일 때에는 duty 비가 100% 로 5V 출력이 된다.

 

이 때, 중요한 것은 아두이노의 모든 디지털 핀에서 PWM 제어가 가능한 것이 아니라,

사용할 수 있는 핀이 지정되어 있다는 것이다.

쉽게 알아볼 수 있는 방법을 핀번호 옆에 ~ 의 물결표시가 있는 핀에서만 PWM 제어를 사용할 수 있다.

 

 

위의 내용을 바탕으로 코드의 내용을 살펴보면

 

전역변수(글로벌 변수) 선언에서

led 핀9번으로 설정한다.

brightness 라는 변수에 초기값 0으로 설정한다.

fadeAmount 라는 변수에 밝기 변화값으로 5로 설정한다.

 

setup 에서

led핀에 해당하는 9번핀을 출력으로 설정한다.

 

loop 에서

analogWrite()함수를 통해서 9번핀에 PWM신호를 주며, 그 값으로 밝기 변수인 brightness를 사용한다.

밝기 변수 brightness를 원래 값에다 fadeAmount값인 5만큼 증가 시켜 저장한다.

만약 밝기가 0이하 이거나, 255이상이면 fadeAmount 의 값의 부호를 바꿔준다.

(PWM 신호가 한계치인 0과 255를 넘어가면 반대로 밝기 조절을 해주기 위함)

led가 밝기를 유지하는 시간을 30ms 로 한다.

 

 

 

PWM 제어가 안되는 디지털 핀에서는 사용자가 코드를 작성하면 비슷하게 구현할 수 있다.

PWM 제어는 led 밝기보다도 모터 제어에서 많이 사용한다.

이를 이용하면 3.3V 출력도 만들어 낼 수 있다.


※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!

 

 

 

 

댓글