본 강좌는 지인의 사이트에서 허락받고 퍼온 강좌입니다.
다른곳으로 불펌하시면 곤란합니다.
그리고 제가 아두이노를 그리 잘 알지는 못합니다.
저한테 물어보시는것도 곤란.... ^^
#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