본문 바로가기

아두이노 IDE/핵심프로그래밍 언어

4. 아날로그핀 입출력

핵심 아두이노 프로그래밍 언어 4 - 아날로그핀 입출력



1. analogWrite() : 아날로그 출력
2. analogRead() : 아날로그 입력
3. analogReference() : 아날로그 입력 기준 변환




아두이노 보드는 디지털 입출력 뿐 아니라 아날로그 입출력도 가능합니다.

아날로그 입출력은 0~5V(3.3V 보드는 0~3.3V) 사이의 전압을 자유롭게 내보내거나 읽어내는 기능을 말합니다.

0V(LOW) 또는 5V(HIGH) 두 가지 기능만 사용하는 디지털 입출력에 비해, 아날로그 입출력 기능은 좀 더 세밀하고 폭넓은 작업 수행을 가능하게 만듭니다.

일반적인 아두이노 보드에서 아날로그 입출력을 위해 사용되는 함수는 3가지입니다.

첫째는 아날로그 출력에 사용되는 analogWrite(),

둘째는 아날로그 입력에 사용되는 analogRead(),

셋째는 아날로그 입력 값의 기준을 조정해주는 analogReference()입니다.




1. analogWrite()


PWM 핀을 아날로그 값으로 출력하고 싶을 때 사용합니다.

예를 들면 LED 불빛 밝기 조절하거나 모터를 원하는 속도로 돌릴 때 anlaogWrite()가 쓰입니다.

아날로그 출력은 PWM(Pulse With Modulation, 펄스 폭 변조) 방식으로 이뤄집니다.

5V 보드의 경우에는 0V와 5V의 반복 주기를 이용해 0 ~ 5V 사이의 전압이 출력되는 것처럼 만드는 것이지요.

예를 들어 2.5V의 출력을 원하면 0V 한 번에 5V 한 번의 주기를, 1V의 출력을 원하면 0V 4번에 5V 1번의 주기를 반복하는 것입니다.

이 주기는 매우 빨리 반복됩니다.

아두이노의 대부분의 핀에서는 대략 1초에 490번, 5번과 6번 핀은 대략 1초에 980번 반복되기 때문입니다.

그렇다면 아두이노 보드에서 어떤 핀이 아날로그 출력을 실행할 수 있을까요?

대부분의 아두이노 보드의 경우에는 3,5,6,9,10,11번 핀이 PWM 출력을 지원합니다.

아두이노 메가의 경우에는 2~13번, 44~46번 핀이 지원하지요.

PWM핀을 찾는 방법은 쉽습니다.

보드에 표시된 핀 숫자 앞에 ~표가 있기 때문입니다.

사용 방법을 아래와 같습니다.


analogWrite(핀번호, 값)


핀 번호에는 사용하기 원하는 PWM핀의 숫자를 넣습니다.

값은 0~255 사이의 숫자를 선택해 넣을 수 있습니다.

0은 LOW 상태로 0V를 출력하고, 255는 HIGH 상태로 5V(3.3V 보드는 3.3V)를 출력합니다.

만약 2.5V를 출력하기 원하면 어떤 숫자를 넣어야 할까요?

0 ~ 255의 중간 값인 127을 넣으면 됩니다.

예를 한 번 보겠습니다.


void setup() {
    pinMode(9, OUTPUT);    // 9번 핀을 출력으로 설정합니다.
}

void loop() {
    analogWrite(9, 0);         //  9번 핀에 0V가 출력됩니다.
    delay(1000);                  //  1초 동안 기다립니다.
    analogWrite(9, 127);    //  9번 핀에 약 2.5V가 출력됩니다.
    delay(1000);                 //  1초 동안 기다립니다.
    analogWrite(9, 255);   //  9번핀에 5V가 출력됩니다.
    delay(1000);                 //  1초 동안 기다립니다.
}


만약 LED를 9번 핀에 연결하고 위의 스케치를 실행하면 어떻게 될까요?

LED가 1초 동안 꺼졌다가, 1초 동안 중간 밝기였다가, 1초 동안 밝게 켜지는 걸 반복하게 될 것입니다.

 

2. analogRead()


아날로그 핀으로부터 아날로그 값을 읽어낼 때 사용합니다.

예를 들어 빛 세기를 감지하는 조도 센서나 비의 양을 감지하는 우적 센서의 아날로그 데이터 값을 읽을 때 쓰이지요.

아날로그 핀은 아두이노 우노의 경우 6개, 나노와 미니의 경우 8개, 메가의 경우 16개가 있습니다.

아날로그 핀은 숫자 앞에 A가 붙습니다.

아두이노는 아날로그 신호를 디지털 신호로 변환하는데 10비트로 분해할 수 있는 능력(분해능)을 가집니다.

쉽게 말하면 5V 보드의 경우에 0~5V 사이에 입력되는 전압 값을 0 ~ 1023으로 변환해서 파악할 수 있는 능력을 가지고 있다는 것입니다.

전압의 세기를 이용해 1024(10비트) 사이의 데이터 값을 아날로그처럼 읽는 것이지요.

5V가 1024로 나눠지기 때문에 0.0049V(4.9mV)마다 데이터 값은 1씩 차이가 생깁니다.

아두이노는 아날로그 신호를 0.0001초 마다 한 번씩 읽을 수 있습니다.

1초에 최대 10000번의 데이터 값을 받아들일 수 있다는 것입니다.

사용 방법은 아래와 같습니다.


analogRead(핀번호)


핀번호에는 데이터를 읽고자 하는 아날로그 핀의 번호를 입력합니다.

아날로그 핀 번호는 숫자 앞에 A를 붙여도 되고 붙이지 않아도 됩니다.

만약 A1 핀에서 데이터를 읽고자 할 때, 핀번호를 A1 또는 1로 써도 상관없다는 뜻입니다.

입력 핀에 아무 것도 연결되어있지 않으면, 핀의 주변의 영향에 따라 아날로그 입력 값이 수시로 바뀌게 됩니다.

예제를 보겠습니다.


int val = 0;    // 아날로그 입력 값을 저장하기 위해 val을 변수로 지정합니다.

void setup() {
    pinMode(9, OUTPUT);   //  9번 핀을 출력으로 설정합니다.
}

void loop() {
    val = analogRead(A1);   //  A1번 핀에서 읽어 들인 값을 val에 저장합니다.
    analogWrite(9, val / 4);   //  0~1024 사이로 읽어 들인 아날로그 값을 4로 나눠 0~255값으로 변환해 9번 핀에 출력합니다.
}


만약 A1번 핀에 조도센서를, 9번 핀에 LED를 연결하고 위의 스케치를 업로드하면 어떻게 될까요?

먼저 조도센서가 읽어낸 빛의 밝기는 0~1023 사이의 데이터 값으로 아두이노에 변환될 것입니다.

그 다음에는 0~1023가 0~255로 바뀌어 LED에 출력 될 것입니다.

즉 빛의 밝기에 따라 LED의 밝기가 수시로 변하도록 작동할 것입니다.



3. analogReference()


아날로그 입력을 위한 기준(reference) 전압을 정할 때 사용합니다.

5V 보드의 경우에는 5V를 기준으로 0~5V 사이의 전압 값을 아날로그 입력 데이터를 받아들이는데, analogReference()를 사용하면 전압의 기준을 바꿀 수 있습니다.

먼저 사용 방법을 보겠습니다.


analogReference(유형)


유형에 들어갈 수 있는 것은 5가지로 DEFAULT, INTERNAL, INTERNAL1V1, INTERNAL2V56, EXTERNAL입니다.

DEFAULT는 아두이노 보드에서 사용되는 전압을 기준으로 하는 것입니다. 5V 보드의 경우에는 5V, 3.3V 보드의 경우에는 3.3V가 되겠지요.

INTERNAL은 보드에 내장된 기준을 사용하는 것입니다. ATmega168 또는 ATmega328 칩을 사용하는 보드의 경우에는 1.1V를 기준 접압으로 사용하고, ATmega8을 사용하는 보드는 2.56V를 기준 전압으로 사용합니다. 단 아두이노 메가에서는 사용할 수 없습니다.

INTERNAL1V1은 아누이노 메가에서만 사용할 수 있는 유형으로 보드에 내장된 1.1V를 기준으로 합니다.

INTERNAL2V56은 아누이노 메가에서만 사용할 수 있는 유형으로 보드에 내장된 2.56V를 기준으로 합니다.

EXTERNAL은 AREF핀에 연결된 전압을 기준 전압으로 사용하는 것입니다. 단 AREF핀에 연결 할 수 있는 전압은 0~5V 사이입니다.

다만 analogReference()로 기준전압을 변경하고 나서 읽어 들이는 최초의 몇몇 아날로그 입력 값은 정확하지 않을 수 있습니다.

특히 주의해야 할 것은 AREF 핀에 0V 이하나 5V 이상의 전압을 연결하면 안 된다는 것입니다.

또한 AREF 핀에 연결된 전압을 기준으로 아날로그 입력 값을 읽으려면 반드시 anlalogRead() 이전에 analogReferece(EXTERNAL)를 설정해야 합니다.

그렇지 않으면 내부 전압과 외부 전압이 부딪혀 보드가 망가질 수 있습니다. 


'아두이노 IDE > 핵심프로그래밍 언어' 카테고리의 다른 글

6. 상수-2  (0) 2017.02.22
5. 상수 - 1  (0) 2017.02.22
3. 디지털핀 입출력  (0) 2017.02.22
2. 기호  (0) 2017.02.22
1. 기본 구조  (0) 2017.02.22