안녕하세요. 메카럽입니다.
이번 포스팅에서는 아두이노 우노에서 아날로그 포트를 사용하는 법에 대해 알아보려 합니다.
■ 아날로그 포트
아날로그 포트는 입력과 출력으로 사용할 수 있도록 별도로 구성되어 있습니다. 아두이노 아날로그 신호를 입력받을 수 있는 포트는 A0에서 A5포트, 아날로그 신호를 출력할 수 있는 포트는 D3, 5, 6, 9, 10, 11입니다. 아날로그 입, 출력은 0~5V의 범위를 갖는데, analogRead( ) 함수를 사용하면 아두이노에서 0~1023 값으로 변환되어 나타납니다(이를 ADC라고 합니다). 가령 0V가 입력되면 0을 반환하고, 5V가 입력되면 1023을, 2.5V가 입력되면 512 정도를 반환합니다.
아두이노를 활용하여 아날로그 출력을 발생시킬 수 있는데, 이때는 analogWrite( ) 함수를 사용하며 이 또한 전압값으로 출력됩니다. 특이하게도 아날로그 출력을 위한 포트는 A0~A5가 아닌, 디지털 포트 중 일부인데, 이는 디지털 신호를 이용하여 아날로그 신호를 만들어내는 개념이기 때문입니다. 전압값을 1.2V, 4V, 5V 등으로 지정하지 않고, analogWrite( ) 함수처럼 0~255까지 밤위의 숫자로 구분하고 있으며 analogWrite( ) 함수를 통해 펄스신호로 출력됩니다.
가변 저항의 출력을 읽어보면 analogRead( ) 함수의 특성을 제대로 이해할 수 있습니다. 가변 저항은 세 개의 핀을 갖고 있습니다. 아두이노의 5V 핀과 GND 핀, 그리고 아날로그 입력 포트 A0에 연결합니다. 다양한 저항값의 가변 저항이 있으나, 500Ω, 1kΩ, 10kΩ 정도면 어떤 것을 써도 무방합니다.
준비물 : 아두이노 우노, 아두이노 우노 가변저항, 점퍼선, 브레드 보드, 아두이노 전원 USB |
void setup ( ) { Serial. begin(9600); } void loop ( ) { Serial.println(analogRead(A0)); } |
위 예제는 가변 저항의 신호선이 연결된 A0 포트의 전압(0~5V)을 읽어들여 0~1023까지의 값을 500ms 간격으로 반환합니다. 가변 저항의 노브를 처음에서 끝까지 돌려보면 0 또는 1023이 출력되며, 노브를 천천히 돌려보면 값이 변하는 것을 확인할 수 있습니다. 여기서 delay( ) 함수가 사용되었는데 이 명령어는 괄호 내의 숫자(ms) 만큼 다음 명령처리를 지연시킵니다. 위 예제에서는 500ms 지연 후 A0 포트의 값을 프린트합니다.
아래는 노브를 좌우로 돌렸을 때 결과값입니다. 시리얼 모니터를 통해 정확한 수치로 확인하거나, 변화량을 직관적으로 볼 수 있도록 시리얼 플로터를 활용해 그래프로도 확인할 수 있습니다.
아날로그 포트는 별도의 pinMode( ) 설정을 요구하지 않습니다. 다만 아날로그 포트를 다지털 포트로 활용하기 위해서는 pinMode( ) 설정을 해주어야 합니다. 아래와 같이 A2 핀을 디지털 출력으로, A3 핀을 디지털 입력으로 전환할 수 있습니다.
pinMode(A2, OUTPUT) pinMode(A3, INPUT) |
■ 전원, 접지 포트
아두이노는 할당된 전원핀, 접지핀(GND), 리셋(RST) 핀 등 특수한 포트 외에 D2~D13, A0~A7등 디지털 또는 아날로그 신호를 입, 출력할 수 있는 범용적인 포트들을 갖고 있습니다. 이 포트들을 통칭하여 GPIO라고 하며, 이 포트들을 활용하여 외부 센서, MCU, 트랜지스터, 릴레이 등을 제어할 수 있습니다. 이와 함께 digitalWrite( ) 함수를 이용해 해당 포트를 HIGH 또는 LOW 상태로 만들어주면 전원과 동일한 레벨 또는 접지 레벨과 동일한 레벨도 활용할 수 있습니다.
예를 들어, 아두이노 우노는 "GND"로 표기된 포트가 3개 존재하는데, GND 포트가 4개가 필요한 상황이라면 어떻게 해야할까요? 점퍼선과 브레드 보드를 이용해서 하나의 GND포트를 여러 개로 만드는 방법이 있지만, 브레드 보드가 없는 상황이라면 GPIO 포트 중 하나를 digitalWrite( ) 함수로 LOW 상태를 만들어 주면 해당 포트를 GND레벨과 동일한 포트로 사용할 수 있게 됩니다. 이는 HIGH 상태의 포트와 전원, 그리고 LOW 상태의 포트와 접지 레벨이 각각 같은 노드이기 때문입니다.
{ pinMode(A0, OUTPUT); // A0 핀을 출력으로 설정 pinMode(D2, OUTPUT); // D2 핀을 출력으로 설정 } void loop ( ) { digitalWrite(A0, HIGH); // A0핀 출력을 HIGH로 설정(5V 출력) digitalWrite(D2, LOW); // D2핀 출력을 LOW로 설정(0V 출력) } |
앞의 코드는 A0핀과 D2핀을 출력(OUTPUT)으로 설정하고, 각각 HIGH 상태와 LOW 상태로 만들어주는 과정을 나타내고 있습니다. MCU 작동전압이 5V인 모델(우노, 나노 등)은 HIGH 상태에서 5V 레벨을 출력하고, MCU 작동전압이 3.3V인 모델(프로미니 3.3V 모델)은 HIGH 상태에서 3.3V 레벨을 출력합니다. LOW의 경우에는 모두 접지레벨(0V)을 출력합니다.
GPIO를 전원으로 홀용하는 데 있어서 한 가지 주의해야 할 점은 모든 GPIO의 전류는 40mA 수준으로 제한된다는 것이며 LED나 전류 소모가 적은 센서를 켜고 끄는 것은 문제없으나, 전류를 많이 사용하는 소자를 사용하게 되면 작동하지 않거나 오작동하는 등 문제가 발생할 소지가 있습니다.
오늘도 가변저항을 통해 실습을 해보았는데 노브를 돌릴 때마다 출력 그래프가 변화되는 것을 보니 정말 신기했습니다. 점점 재미있어지는 아두이노 실습을 기초부터 탄탄하게 배워 꼭 3D프린터에 접목해서 만들어 보겠습니다.
오늘 하루도 행복한 하루되세요.
'3D프린터와 아두이노 > 아두이노' 카테고리의 다른 글
플로팅 없이 스위치 연결하는 방법 (4) | 2020.09.16 |
---|---|
풀업, 풀다운과 플로팅 (택트 스위치 연결 실습) (2) | 2020.09.15 |
아두이노 우노 디지털 포트(LED 램프 예제 실험) (2) | 2020.09.13 |
디지털과 아날로그 (2) | 2020.09.12 |
아두이노 IDE 라이브러리 (2) | 2020.09.11 |