티스토리 뷰

PWM 이해하기

아두이노 내친구전압의 세기로 엘이디(LED) 밝기를 바꿀 수 있습니다. 따라서 엘이디(LED)의 밝기를 바꾸려면 1.5볼트, 1.8볼트, 2.3볼트 같은 아날로그 전압이 필요합니다. 아날로그는 연속된 값을 말하는데 나중에 자세하게 배우겠습니다.

 

하지만 아두이노 보드에는 5볼트와 3.3볼트 핀밖에 없습니다. 아두이노는 수학으로 이 문제를 해결했습니다. 여기서 평균의 개념을 조금 알아야 합니다. 평균은 이렇게 생각하면 편합니다.

 

유명한 축구선수가 있는데 이 선수는 미친 듯이 골을 잘 넣는 선수입니다. 첫 번째 경기에서 5골을 넣었습니다. 두 번째 경기에서도 5골을 넣었습니다.

 

하지만 세 번째, 네 번째, 다섯 번째 경기에서는 몸이 아파서 한 골도 넣지 못했습니다. 5경기에서 모두 10골을 넣었습니다.

 

이것을 이렇게 말할 수도 있지 않을까요?

‘이 축구선수는 경기마다 2골을 넣었다.’

 

어때요? 평균이 조금 이해가 되나요? 골을 볼트로 바꿔보면 5볼트와 0볼트를 이용해서 2볼트를 만드는 겁니다. 이와 같은 방법으로 0볼트부터 5볼트 사이의 어떤 전압도 만들 수 있습니다. 이런 방법을 펄스폭 변조(Pulse Width Modulation: PWM)라고 합니다.

 

디지털 핀에서 아날로그처럼 다양한 값이 나오게 하기 위해서는 피더블유엠(PWM) 핀을 사용해야 합니다. 모든 디지털 핀을 피더블유엠(PWM) 핀으로 사용할 수는 없습니다. 번호 앞에 물결(~) 표시가 있는 핀만 피더블유엠(PWM) 핀으로 사용할 수 있습니다. 우노 보드인 경우 3, 5, 6, 9, 10, 11이 피더블유엠(PWM) 핀입니다.

 

여기에서 또 한 가지 비트라는 것을 알아야 합니다. 비트는 0 아니면 1 둘 중 하나의 숫자만 들어갈 수 있는 사물함과 같습니다. 변수와 비슷합니다.

 

비트 한 개는 2개의 값을 나타낼 수 있습니다.

 

비트 두 개는 4개의 값을 나타낼 수 있습니다.

 

비트 세 개는 8개의 값을 나타낼 수 있습니다.

 

여러분, 곱하기 알죠? 비트 하나가 2개의 값을 나타내니까 2씩 곱하면 됩니다. 비트가 네 개면 2×2×2×2, 즉 16개의 값을 나타낼 수 있습니다. 아두이노 우노의 피더블유엠(PWM) 핀은 8비트입니다. 2×2×2×2×2×2×2×2, 즉 256개의 값을 나타낼 수 있습니다.

 

그런데 우리는 1부터 숫자를 세기 때문에 1부터 256까지의 값을 피더블유엠(PWM) 핀에 사용할 수 있다고 생각할 수 있습니다. 하지만 컴퓨터는 0부터 숫자를 셉니다. 즉 0부터 255까지의 값을 나타내는 거죠. 256에서 1을 하나 뺀 겁니다.

 

5볼트 값은 255를 뜻하고 0볼트 값은 0을 뜻합니다. 만약 디지털 5번에서 5볼트의 전압이 나가게 하고 싶다면 그림 4-10과 같이 피더블유엠(PWM) 핀 블록을 사용하면 됩니다.

그림 4-10 피더블유엠(PWM) 핀 블록

 

어때요? 참 쉽죠?

 

곱하기도 했으니 나누기도 한 번 해봅시다. 5볼트를 반으로 나누면 2.5볼트입니다. 그렇다면 255를 반으로 나누면 약 127이됩니다. 이것을 바꿔서 말하면 피더블유엠(PWM) 5핀에 127을 보내면 약 2.5볼트 값이 나가게 되는 겁니다. 그림 4-11을 참고하세요.

그림 4-11 볼트와 숫자의 관계

 

우리는 평균, 곱하기, 나누기를 사용하여 아두이노 코딩에서 아주 중요한 것을 배웠습니다. 여러 번 반복하여 읽어서 여러분의 머릿속에 확실하게 넣어두세요. 지금까지 한 것을 다음과 같이 쉽게 말할 수 있습니다.

 

피더블유엠(PWM) 핀을 사용하여 0에서 255 사이의 값을 보내서 엘이디(LED) 전구의 밝기를 바꾼다. 숫자가 클수록 엘이디(LED) 전구는 더 밝아진다.

 

어때요? 참 쉽죠?

 

9번 핀에 엘이디(LED)를 연결하여 밝기를 바꿔보겠습니다. 다시 한 번 중요한 내용을 복습하겠습니다.

 

▶디지털 핀은 전압이 나가니 플러스 극이다. 그러므로 디지털 핀을 엘이디(LED) 의 긴 다리와 연결한다.

▶그라운드 핀(GND)은 마이너스 극이다(0볼트). 따라서 그라운드 핀(GND)을 엘이디(LED)의 짧은 다리와 연결한다.

엘이디(LED)는 큰 전류가 흐르면 고장이 나므로 저항을 연결한다.

 

이 내용을 기억하면서 그림4-12와 같이 회로를 만듭니다.

그림 4-12 엘이디(LED) 밝기 조절 회로

 

엘이디(LED)가 점점 밝아지다가 점점 어두워지게 하려면 어떻게 코딩을 해야 할까요?

여기에서 코딩의 중요한 원칙을 다시 한 번 생각해 봅시다.

 

한 번에 한 가지 문제만 생각한다.”

 

두 가지를 동시에 생각하려면 문제가 복잡해 보입니다. 따라서 한 번에 한 가지 문제만 생각해서 문제를 해결하는 것이 매우 중요합니다.

 

우선 엘이디(LED)가 점점 밝아지는 것만 생각해 보겠습니다. 여러 가지 방법이 있을 수 있지만, 우리는 변수와 그림 4-13의 <~까지 반복하기> 블록 사용하겠습니다. <~까지 반복하기> 이렇게 이해하면 좋습니다.

 

내가 배가 부를 때까지 반복하여 밥을 먹겠다. 이 말은 다르게 생각하면 배가 부르면 밥을 먹지 않겠다는 말과 같은 뜻입니다. 어떤 조건이 될때까지 계속 반복하다가 그 조건이 되면 반복하지 않는 것입니다. 블록을 만들 때는 항상 색깔을 보고 찾도록 합시다.

그림 4-13 ~까지 반복하기

어떤 뜻인지 곰곰이 생각해보면 이해가 잘 됩니다.

 

그렇다면 엘이디(LED)가 점점 밝아지게 하기 위해서는 어떻게 해야 할까요?그림 4-14의 빈칸에 점점 큰 숫자를 넣으면 되지 않을까요? 피더블유엠(PWM) 핀에 최대 255까지 숫자를 넣을 수 있습니다.

그림 4-14 피더블유엠(PWM) 핀

 

값에 따라서 엘이디(LED) 밝기가 변한다면 변수를 만들어서 피더블유엠(PWM) 핀에 그 변수 값을 보냅니다. 변수 값이 커지면 엘이디(LED)도 밝아진다고 생각하면 어떨까요? 그림 4-15처럼 [밝기]이라는 변수를 하나 만듭니다.

 

처음에는 0으로 정합니다. 피더블유엠(PWM) 핀에 255를 넘는 값을 보낼 수 없으니, 255보다 클 때까지 계속해서 [밝기] 변수에 1씩 더합니다. 그리고 이 값을 피더블유엠(PWM) 9번 핀에 보냅니다.

 

[밝기] 변수는 0, 1, 2, 3, 4 이렇게 변하다가 256이 되면 255보다 크므로 더 이상 피더블유엠(PWM) 9번 핀에 값을 보내지 않습니다.

그림 4-15 엘이디(LED) 점점 밝아지기

 

프로그램을 한 번 실행해 볼까요? 첫 번째 문제를 해결했습니다. 엘이디(LED)가 점점 밝아지고 있습니다. 스크래치 무대를 보면 그림 4-16처럼 곰돌이가 [밝기] 변수 값을 말하는 것을 볼 수 있습니다.

그림 4-16 곰돌이 밝기 말하기

 

그리고 두 번째 문제를 해결해야 합니다. 점점 어두워지게 하려면 어떻게 하면 될까요? 이럴 때는 반대로 생각해 봅시다. 밝기 변수 값에 1씩 더하고 피더블유엠(PWM) 9번 핀에 그 값을 보내면 엘이디(LED)가 밝아졌습니다.

 

점점 어두워지게 하려면 [밝기] 변수 값에서 1씩 계속 빼면 되지 않을까요? 네, 맞습니다. 이제는 반대로 [밝기] 변수 값이 0이 될 때까지 1씩 빼는 겁니다. <그림 4-17>

 

두 번째 문제도 해결했습니다. 이제 그림 4-18처럼 두 프로그램을 합치면 모든 문제를 해결하게 됩니다.

그림 4-18 엘이디(LED) 밝기 바꾸기

 

이렇게 문제를 나눠서 생각하면 보다 쉽게 문제를 해결할 수 있습니다.

 

이번 포스팅과 함께 보면 좋을 내용을 소개하겠습니다. 아두이노 스케치로 LED의 밝기를 바꿀 수 있는 방법을 아래 링크의 포스팅에서 설명했습니다. 스케치로 아두이노 코딩을 하는데 관심있는 분은 아래 글을 보면 좋을 것 같습니다.

 

아두이노 스케치 PWM

 

아두이노프로그램 PWM이해하기

아두이노프로그램 포스팅을 시작합니다 아두이노프로그램에서 LED 밝기를 컨트롤 하려면 1.5V, 1.8V, 2.3V, 4.5V 같은 아날로그 전압이 필요합니다. 하지만 앞에서 배운 것처럼 아두이노 우노에는 디지털 값을 보..

www.itple.co.kr

 

 

댓글
댓글쓰기 폼