아두이노 아날로그 핀 디지털 핀 차이 - adu-ino anallogeu pin dijiteol pin chai

아두이노 기초 강좌는 아두이노를 처음 접하시는 전자분야 비 전공자를 위한 강좌입니다. 이해를 위해서는 간단한 프로그래밍 지식이 필요할 수 있습니다. 프로그래밍이 처음이라면 [아두이노 프로그래밍 기초] 강좌를 먼저 읽으시길 권해 드립니다.

  • 프로그래밍 기초 강좌 전체보기 <<<
  • 아두이노 기초 강좌 전체보기 <<<

=============================================================
.

지난 시간에 digitalRead, digitalWrite 함수 사용 방법을 알아봤습니다. 주로 on/off 동작을 제어하는 경우에 해당하는 작업이었습니다. 이번에는 0~5v까지 세분화된 값을 입력받거나 출력할 때 어떻게 하는지를 예제를 통해 알아보겠습니다.

1. AnalogRead 예제 – 포텐셔미터

먼저 살펴볼 예제는 아두이노 공식 홈페이지에 소개된 포텐셔미터 입력(AnalogReadSerial) 예제입니다.

http://arduino.cc/en/Tutorial/AnalogReadSerial

아두이노 아날로그 핀 디지털 핀 차이 - adu-ino anallogeu pin dijiteol pin chai

정리를 하면… analogRead() 함수를 사용해서 단계적인 값을 읽을 때는 아날로그 핀들을 사용하면 됩니다. 하지만 아날로그 핀을 통해 단계적인 0V~5V 사이의 값을 출력할 수는 없습니다. 이런 작업은 PWM 핀으로 지정된 digital 핀을 통해서 가능합니다. 이 때 analogWrite() 함수를 사용할 수 있습니다.

그리고 추가로 하나 더. analogRead는 0~1023 까지의 값을 읽을 수 있고, analogWrite는 0~255 사이의 값을 사용할 수 있습니다. 따라서 analogRead()를 통해 입력받은 값을 1/4 하면 analogWrite() 의 출력 단계값으로 사용할 수 있습니다.

 

그럼 예제를 한번 보겠습니다.

챕터 1에서 사용된 analogRead 예제를 변형해서 이용합니다. 포텐셔미터로 입력된 값을 이용해서 LED의 불빛을 조절하는 예제입니다. 챕터 1에서 사용한 회로에 LED 를 추가로 연결해서 쓰시면 됩니다. 아래 강좌에 사용된 회로를 참고해서 LED를 추가로 연결하세요.

https://www.hardcopyworld.com/?p=936

9번핀 -> 220 ohm 저항 -> LED 긴 다리 -> LED 짧은 다리 -> GND 순서로 연결하면 됩니다.

int ledPin = 9;

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);   // sets the pin as output
}

// the loop routine runs over and over again forever:
void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);

  // print out the value you read:
  Serial.println(sensorValue);

  analogWrite(ledPin, sensorValue / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

  delay(1);        // delay in between reads for stability
}

기존에 있던 코드에서 LED 불빛을 제어하기 위한 코드만 추가되었습니다. 따라서 포텐셔미터로 입력받은 값에 따라 LED 불빛이 변화합니다.

변경된 코드를 한 줄씩 보겠습니다.

int ledPin = 9;

디지털 9번핀(PWM 핀) 에 저항을 거쳐 LED 가 연결되어 있습니다. 그래서 9번핀을 미리 기억해 둡니다.

  pinMode(ledPin, OUTPUT);   // sets the pin as output

9번핀은 digital 핀이므로 INPUT/OUTPUT 모드를 설정해야 합니다. LED로 전원을 넣어줘야 하니까 OUTPUT 모드로 설정.

  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);

  // print out the value you read:
  Serial.println(sensorValue);

  analogWrite(ledPin, sensorValue / 4);  // analogRead values go from 0 to 1023, analogWrite values from 0 to 255

이 부분이 가장 중요한, 포텐셔미터의 값을 읽어서 LED 출력을 조절하는 부분입니다. A0 아날로그 핀에서 값을 읽어서(0~1023) PC로 값을 전송하고, analogWrite 함수를 사용해서 LED 핀으로 PWM 출력을(0~255) 합니다. 아날로그 입력값의 범위가 PWM 출력 범위보다 4배 넓기 때문에 sensorValue에 저장한 아날로그 입력값을 4로 나누어서 사용했습니다.

이번 포스팅부터는 아두이노의 입출력과 스위치에 대해 알아보려합니다. 그에 앞서 디지털과 아날로그에 대해 알아보려 하는데 디지털과 아날로그의 뜻에 대해 모르시는 분들은 없으리라 생각합니다.

하지만 개념을 이해하고 넘어간다면 진행될 아두이노의 입출력과 스위치에 대해 좀 더 명확하게 이해하실 수 있을 것으로 생각합니다.

■ 디지털과 아날로그

아두이노를 활용하여 시제품을 만들기 위해 여러 가지 센서와 액추에이터를 사용합니다. 이 구성품들은 개발자가 원하는 신호를 아날로그 신호나 디지털 신호로 출력하며, 아두이노를 통해 이 신호들을 해석하고, 이후 어떤 동작을 만들어낼지 결정합니다. 이런 신호들을 읽거나 출력하기 위해서는 구성품, 부품별로 그 특성을 고려해서 설계해야하는데 가령 가변 저항이나 ADXL-355 가속도 센서와 같이 아날로그 출력을 발생시키는 부품들은 analog( ) 함수를 사용해야 하므로 아날로그 포트와 연결되어야 합니다. 택트 위치나 초음파 센서와 같이 디지털 출력을 발생시키는 부품들은 pinMode( )와 digitalRead( ) 함수를 사용하며, 모터 제어와 같이 정밀한 제어를 위해 사용되는 PWM 신호는 별도의 디지털 포트를 사용해야 합니다.

아날로그 부품디지털 부품함 수analogReadpinMode, digitalRead포 트 (우노 기준)A0 ~ A5D0 ~ D13

아두이노 관련 서적이나 시제품 제작 관련 웹 포스트를 살펴보면 디지털, 아날로그 관련 이야기를 자주 접하게 됩니다. 아두이노의 핀 배열도 디지털 핀과 아날로그 핀으로 나누어져 있는 것을 보면 무엇인가 그 내용이 다르다는 것을 짐작하게 됩니다.

아두이노는 디지털 방식 또는 아날로그 방식으로 데이터 통신을 수행합니다. LED를 켜거나, 모터를 구동시키거나, GPS 신호를 받는 것 모두 여기에서 벗어나지 않습니다.

우리 주변에서 디지털 방식인 것을 찾는다면 손가락으로 수를 세는 것을 꼽을 수 있겠습니다. 손가락으로 수를 셀 때는 하나, 둘, 셋과 같이 손가락을 하나하나 굽혀 꼽는 행동을 하게 됩니다. 손가락으로 수를 셀 때, "0"과 "1"외에 그 사이에 있는 값을 계수하기가 쉽지 않고 보편적으로 손가락으로 수를 셀 때 그 상의 값을 가리키는 경우는 거의 없습니다.

시계는 디지털과 아날로그를 확연하게 표시하는 예시 중 하나입니다. 시침이 있는 시계와 숫자를 표시하는 디스플레이가 달린 시계를 생각해보겠습니다. 아래 그림은 10시 10분을 나타내고 있는 아날로그 시계와 디지털 시계입니다. 아날로그 시계는 시간의 흐름에 따라 초침과 분침, 시침이 함께 이동합니다. 시침과 분침은 10시 10분을 가리키고 있지만 시계가 지시하는 시간은 계속 이동합니다.

그러면 디지털 시계는 어떨까요? 시, 분, 초를 함께 디스플레이 하는 시계라고 하더라도 해당 시계가 가리키는 최소 시간 단위를 벗어난 범우에 대해서는 아날로그 시계와 같은 느낌을 받기가 힘듭니다. 디지털 시계는 그 변화가 아날로그 시계에 비해서 매우 불연속적이기 때문입니다.

아두이노 아날로그 핀 디지털 핀 차이 - adu-ino anallogeu pin dijiteol pin chai
아날로그 시계와 디지털 시계

디지털과 아날로그 개념을 아두이노로 옮겨와서 살표보겠습니다.

전자기기에서는 어떤 양이나 자료를 전기신호로 표현할 때는 대체로 전압의 높낮이를 사용합니다. 전압의 높낮이를 이야기할 때 디지털 방식이냐, 아날로그 방식이냐를 나눌 수 있습니다.

디지털 방식은 전압의 높낮이를 단 두 가지로 표현합니다. 마치 손가락을 펴면 "하나"를 세는 것, 굽히면 하나를 빼는 것과 마찬가지 의미입니다. 아날로그 방식은 전압의 높낮이를 정해진 단계로 나누어 표현합니다. 가령 아두이노는 0~5V를 1023개의 신호로 나누어 다루고 있습니다.

아두이노 아날로그 핀 디지털 핀 차이 - adu-ino anallogeu pin dijiteol pin chai
아날로그 신호 Vs 디지털 신호

이 내용을 위 그래프를 사용하여 그려보겠습니다. 그래프의 가로축은 시간, 세로축은 전압입니다. 세로축의 범위는 0~5V로 나타내었습니다. 여기서 또 디지털과 아날로그가 다른 점은 시간 축(가로축) 또한 나누어져 있다는 것입니다. 다시 말해서 디지털은 불연속적인 시간을, 아날로그는 연속적인 시간을 사용한다고 보아도 무방합니다.

아날로그 신호는 초침이 연속적으로 흐르는 오토매틱 시계처럼 0~5V를 연속적인 흐름(세로축)으로 나타내고 있습니다. 반면 디지털 신호는 0(0V)과 1(5V) 두 가지 상태만을 갖고 불연속적으로(세로축) 나누어 보여주고 있습니다. 마치 분 이하의 단위는 보여주지 않는 분 단위만 나타내는 디지털 시계를 생각하면 될 것 같습니다.

아두이노의 디지털 핀과 아날로그 핀은 이러한 신호를 출력하는 전용 핀입니다.디지털 핀은 D2, D3, D4처럼 핀의 이름 첫 글자가 D로 시작하여 그 뒤에 번호가 붙게 됩니다. 아날로그 핀은 A0, A1, A2와 같이 첫 글자가 A로 시작하는 핀들입니다.

이렇게 아날로그와 디지털이 아두이노에서 어떤 방식으로 통용되는지 개념이 조금은 잡히셨을 것으로 생각합니다. 이를 토대로 다음 포스팅부터는 입출력과 스위치에 대해 알아보도록 하며 이만 포스팅을 마치겠습니다.