3-4 아날로그 입력

공부하는 학생 A·2024년 2월 5일

아두이노 

목록 보기
16/74

아날로그 입력

PWM 방식으로 LED의 밝기를 점점 밝게 하거나 점점 어둡게 제어하는 것과 부저로 음악을 만드는 것은 아날로그 출력에 해당한다.

아날로그 데이터는 자연에서 발생하는 데이터로, 대부분의 센서 값은 연속형 데이터로 이루어진 아날로그 데이터이다. 조도센서, 온도센서는 대표적인 아날로그 값이다. 그러나 반도체 소자를 이용하여 디지털 값으로 변환하여 사용하는 센서도 있다. 이번에는 가변저항기를 이용해서 아날로그 값을 입력하는 실습을 해볼것이다.

가변 저항기는의 내부는 저항 물질이 둥글게 연결되어 있다. 가변저항기의 가운데 손잡이(와이퍼,wiper)를 돌려서 1~2번 사이가 가까워지면 2~3번 사이가 멀어지고 2~3번 사이의 저항 값이 증가한다. 이와 같이 저항 물질의 길이 변화에 따라 저항 값이 변한다.

아두이노에서 아날로그 값을 읽는 함수는 analogRead()를 사용한다. 아두이노는 입력된 전압의 크기를 10비트, 즉 1~1023의 정수 값으로 대응시킨다. 전압의 크기가 5V이면 입력 값은 1023이 된다.

가변저항기의 손잡이의 위치에 따라 전압이 달라진다.손잡이를 반시계 방향으로 돌리면 전압이 OV가 걸리게 되고 아두이노의 입력 값은 '0'이 된다. 반대로 손잡이를 시계 방향으로 돌리면 전압이 5V가 걸리게 되고 아두이노의 입력 값은 '1023'이 된다. 손잡이가 가운데 위치하면 전압에 따라 값이 달라지는 것을 알 수 있다. 가변저항기의 값의 변화는 스케치를 업로드 한 후 시리얼 모니터를 열어서 볼 수 있다.

아두이노에서 아날로그 입력 값을 읽을 수 있는 핀은 A0부터 A5까지의 핀으로 정해져 있다. 아날로그 값을 입력 받기 위해서 ADC 기능을 사용한다. ADC는 아날로그 신호 값을 디지털로 변환하여 사용할 수 있게 하는 기능이다. 아날로그 값은 연속적인 신호인데 이 신호를 디지털로 변환하여 MCU에서 사용하는 장치이다.

3-5 회로 만들기

가변저항기에는 세 개의 다리가 있다. 가변저항기의 (+)와 (-)가 바뀌어도 값을 읽을 수 있다. 반대로 연결해도 회로에 오류는 없고 숫자가 커지거나 작아지는 것이 반대로 나타난다. 가변저항기의 1번과 3번 다리의 위치가 바뀌어도 에러는 나지 않으나 값의 범위가 달라진다. 가운데 선만 정확하게 연결하면 테스트는 가능하다.

스케치 3-5 가변저항기 테스트

void setup(){
  Serial.begin(9600);
}
void loop(){
  int a = analogRead(A0);
  Serial.println(a);
  delay(100);
}

스케치 3-5 설명

Serial.begin(9600);

  • 시리얼 통신을 시작하고 통신속도는 9600bps로 설정한다.

analogRead(A0);

  • analogRead(핀번호);
  • 지정한 아날로그 핀에서 입력 값을 읽는다. 아두이노 우노 보드는 6개의 핀을 사용할 수 있다. 10비트의 값을 읽는다. 0에서 5V 사이의 입력 전압을 0에서 1023 사이의 정수 값으로 대응시킨다.

Serial.println(a);

  • 시리얼 모니터에서는 데이터가 ASCII 텍스트로 표시된다. Serial.println()은 값을 (ASCII 13 또는 '\r')로 표시하므로 다음 줄에 표시된다.

3-5 실행결과



3-6 회로 만들기

가변저항을 연결하고 LED를 연결하여 밝기를 제어해보자

스케치 3-6 가변저항기 값을 읽고 LED로 보내기

int ledPin = 13;
int val = 0;
void setup(){
  pinMode(ledPin,OUTPUT);
}
void loop(){
  val = analogRead(A0);
  digitalWrite(ledPin,HIGH);
  delay(val);
  digitalWrite(ledPin,LOW);
  delay(val);
}

스케치 3-6 설명

int ledPin = 13;

  • LED를 13번 핀에 연결한다.

val = analogRead(A0);

  • 변수 val에 analogRead(A0)로 읽는 값을 저장한다.

digitalWrite(ledPin, HIGH);

  • 디지털 값으로 'HIGH'를 입력하여 LED를 켠다.

digitalWrite(ledpin, LOW);

  • 디지털 값으로 'LOW'를 입력하여 LED를 끈다.

delay(val);

  • val에 저장된 값을 delay 시간 값으로 적용한다.

조도센서(CDS)를 이용하여 조도 측정하기

빛의 밝기를 측정하는 센서를 이용하는 전자 장치는 우리 주변에서 자주 볼 수 있다. 도로의 가로등은 주변이 어두워지면 자동으로 켜지고 다시 새벽이 되어 거리가 밝아지면 꺼진다. 자동차의 전조등도 주변이 어두워지면 자동으로 켜지는 기능이 있다.

아두이노에서 빛을 측정하는 센서로 자주 사용하는 것은 CDS 조도센서이다. CDS는 cad mium sulfide(황화카드뮴)의 약자이며, 빛이 많이 들어오면 저항이 작아지고 빛이 적게 들어오면 저항이 커지는 성질이 있다. 이 저항 성질을 이용하여 조도를 측정하는 센서로 활용된다. 즉 CDS 조도센서는 빛의 양에 따라 저항의 크기가 달라지는 저장형 센서이다. 극성이 없어서 음극과 양극을 구별하지 않아도 된다.

3-7 회로 만들기

스케치 3-7 조도센서 값 읽기

void setup(){
  Serial.begin(9600);
}
void loop(){
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  delay(200);
}

스케치 3-7 설명

Serial.begin(9600);

  • 9600 보드레이트 속도로 시리얼 통신을 시작한다. 9600 보드레이트는 1초에 9600 비트를 주고받겠다는 뜻이다.

int sensorValue

  • 아날로그 입력 값을 저장하기 위한 정수형 변수를 선언한다.

int sensorValue = analogRead(A0);

  • A0 핀에서 읽은 값을 변수 'sensorValue'에 저장한다.

Serial.println(sensorValue);

  • 입력 핀에서 읽은 값을 저장한 sensorValue 값을 시리얼 모니터에 표시한다.

3-7 실행결과

어둡게 하였을 때

밝게 하였을 때

3-8 회로 만들기

스케치 3-8 조도 값에 따라 LED 제어하기

void setup(){
  Serial.begin(9600);
  pinMode(4,OUTPUT);
}
void loop(){
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
  if (sensorValue > 50) digitalWrite(4,LOW);
  else digitalWrite(4,HIGH);
  //delay(200);
}

스케치 3-8 설명

Serial.begin(9600);

  • 시리얼 통신으로 데이터를 읽기 위해 Serial.begin(9600);에서 통신속도를 설정한다.

int sensorValue;

  • 아날로그 입력 값을 저장하기 위해 정수형 변수를 선언한다.

if (sensorValue > 제어 값)

  • sensorValue의 값이 제어 값 보다 클 때 다음 명령을 실행하는 의미이다. 제어 값의 숫자는 테스트 과정에서 밝을 때와 어두울 때를 측정하여 계산한 평균값을 사용하였다. 이 값은 설계에 따라 변경될 수 있다.

else

  • if() 값이 참이 아닐 때 실행하는 명령어이다.

delay(200);

  • '//'는 주석문이기 때문에 실행되지 않는다. 프로그램 작성 중 실행시키지 않을 부분은 '//'으로 실행을 중단 시킬 수 있다.

3-8 실행결과

밝을 때

어두울 때

profile
Shine like a star, Just like a star

0개의 댓글