플밍

아두이노 기초강좌 - 7. 아날로그 출력 본문

프로그래밍/아두이노

아두이노 기초강좌 - 7. 아날로그 출력

너구리안주 2015. 7. 21. 00:33


본 강좌는 지인의 사이트에서 허락받고 퍼온 강좌입니다.

다른곳으로 불펌하시면 곤란합니다.

그리고 제가 아두이노를 그리 잘 알지는 못합니다.

저한테 물어보시는것도 곤란.... ^^

#ads_1

아날로그 출력은 입력에 비해 그렇게 간단하지는 않습니다.

말은 아날로그 출력이지만 실제로는 디지털 출력입니다.  아두이노는 디지털로만 출력할 수 있기 때문이죠.

그럼 어떻게 아닐로그 출력을 흉내 낼까요?

 

아래 그림을 보세요

 

 

[그림 1]


컴퓨터가 신호를 출력하는 펄스의 모습입니다.  HIGH 면 1,  LOW 는 0 이죠
아두이노 출력이 5V니까 HIGH이면 5V, LOW이면 0V겠죠?

이 펄스를 이용합니다.  다시 아래 그림을 보세요

[그림 2]


1에 해당하는 HIGH 신호 즉, Ton 이 길고 0에 해당하는 Toff 가 짧죠?
바로 이걸 이용하는겁니다.  펄스의 한 주기 즉, HIGH가 되었다가 그 다음 HIGH가 되기 전까지를 한 주기로 보고요
HIGH (Ton) 가 전체에서 차지하는 비율을 계산해서 그 값을 아날로그 신호로 보냅니다.
이런 방식을 PWM(펄스 폭 변조 : Pulse Width Modulation) 이라고 합니다.
보낼 수 있는 값의 범위는 8bit인 0~255 까지이며 아두이노의 주파수는 500Hz 니까 한 주기는 2ms 가 되겠네요 (1/500)

[그림 2]에서 Ton 에 해당하는 부분이 전체에서 몇 %를 차지하는가를 듀티비(Duty rate)라고 합니다.
이 그림에서는 0.75%니까 듀티비는  5V * 0.75 = 3.75V 가 되겠네요.  즉 [그림 2]에서는 3.75V가 출력됩니다.

코드로 출력할 수 있는 범위가 0~255까지니까 255로 하면 5V가 되고 0은 0V가 되는겁니다.

자 이론적인건 다 설명했으니 실습을 해봅시다.

먼저 준비할 부품들은 아래와 같습니다.





제일 왼쪽이 LED, 중간이 저항, 오른쪽이 가변저항입니다.

아, 이 기회를 빌어 저항값 계산하는 방법을 알아야겠네요
그전에 먼저알아야 할것은 다음 공식입니다.


 V = IR


 V : 전압, I : 전류, R : 저항



이거 아주아주 중요합니다. "브이는 아이알"  이렇게 외우세요.

봅시다. 먼저 아두이노가 5V를 씁니다.
그리고 LED는 제가 사용한게 2V(볼드) 10mA(밀리 암페어) 입니다.

5V - 2V = 3V 입니다.  3V에 해당하는 저항을 달아서 LED에 2V만 공급해줘야겠죠?

그럼 얼마짜리 저항을 사용해야 할지 계산해 봅시다

V = IR 이고 우리가 구해야 할 겂은 저항 R입니다.  그럼 공식을 바꿔보면
R = V / I 가 됩니다. (I는 전류고 A(암페어)도 전류입니다.  헤깔리게 왜 기호를 다르게 쓰는지 모르겠네요)
R = 3 / 0.01 (5V-2V = 3V,  10mA는 0.01A)
R = 300

즉, 300옴 저항을 쓰면 됩니다.
그럼 300옴 저항은 어떻게 아냐고요?  그건 저항에 있는 띠의 색깔로 계산합니다.
구글님아한테 "저항 읽는 법" 이렇게 물어보시면....(떠 넘기는 여유 ^^)


#ads_2

이제 회로대로 연결해 봅시다.
앞장의 아날로그 입력 회로에서 LED 출력 부분만 추가해 줍니다.






가변저항에서 아날로그 입력을 받은 결과대로 LED의 조도를 변경해 주는 것입니다.
위에서 주의해야 할 부분은 아두이노에는 PWM을 출력할 수 있는 핀이 따로 존재합니다.
아무핀이나 되는게 아닙니다.
아날로그 핀은 입력만 가능하고 출력은 디지털출력만 됩니다.
보드의 PCB에 보면 디지털 핀소켓앞에 물결무늬(~)가 있는게 보일겁니다.  그 무늬가 있는 포트만 PWM이 가능합니다.

UNO보드의 경우 3, 5, 6, 9, 10, 11번이 PWM 가능한 핀이네요.
예제에서는 3번을 사용했습니다.

코드를 보죠

 

 #define LED_PIN 3

 

 void setup() {

   Serial.begin(9600);

 }

 

 

 void loop() {

   float val = analogRead(A0);

   int pwm_val = (int)(255 * (val / 1023));

   Serial.println(pwm_val);

   analogWrite(LED_PIN, pwm_val);

   delay(100);

 }

 



가변저항으로부터 입력받는건 앞에서 했으니까 넘어갑니다.

 

int pwm_val = (int)(255 * (val / 1023));

가변저항으로부터 입력받은 아날로그 값은 0~1023까지 입니다.

그런데 아날로그 출력은 0~255까지입니다.

그래서 입력된 값의 백분률로 곱해주면 출력할 값이 나옵니다.

 

analogWrite(LED_PIN, pwm_val);

위에서 계산된 결과를 analogWrite() 로 출력을 해줍니다.

 

 

업로드를 하시고 가변저항을 천천히 돌려보세요.

LED의 불빛 세기가 저항값에 따라 바뀌는게 보이시나요? 

#ads_3

Comments