아두이노로 아날로그 센서를 읽기 위해 analogRead()
매소드를 사용해보도록 하겠습니다.
신호
디지털 신호
디지털 신호는 0과 1의 이산적인 값으로 표현되는 신호를 말합니다.
아두이노 프로그램에서 처리할 수 있습니다.
아날로그 신호
자연적으로 얻을 수 있는 값이며, 무수히 많은 연속적인 값으로 표현되는 신호를 말합니다.
아두이노 프로그램에서 처리할 수 없기 때문에, ADC로 디지털로 변환 후 처리합니다.
아날로그 신호의 디지털 변환
ADC (Analog Digital Converter, 아날로그 디지털 변환기)
정해진 범위의 아날로그 값을 정해진 해상도로 디지털 값으로 변환하는 장치입니다.
해상도
변환된 디지털 값을 표현하는 비트 수를 말합니다.
N비트 해상도에서는 2^N개의 서로 다른 디지털 값으로 표현할 수 있습니다.
아두이노 우노의 ADC
아두이노 우노의 해상도는 10비트 입니다. 즉, 1024개의 서로 다른 값으로 표현할 수 있습니다.
아날로그 값의 범위는 기준 전압으로 결정되는데, 디폴트 값인 5V가 흔히 사용됩니다.
5V를 인가했다면 센서의 최저값이 0V, 최고값이 5V로 치환됩니다.
0~5v를 1024개의 값으로 표현하기 때문에
기준 전압이 0V라면 0, 5V라면 1023, 2.5V라면 512라는 값으로 표현됩니다.
가변 저항 (potentiometer, pot)
센서는 마치 가변 저항 인 것 처럼 작동하는데, 때문에 센서 테스트용으로 가변 저항을 사용하기도 합니다.
가변 저항은 손잡이를 동이면 저항 값이 변하는 부품입니다.
오디오, 스피커, 온도 조절기, 자동차 등에서 흔히 사용합니다.
가변 저항은 3개의 핀으로 구성되어 있는데 바깥쪽 2개의 핀을 VCC와 GND에 연결하면 가운데 핀을 통해 변화하는 저항에 의한 전압이 출력됩니다.
아두이노에서 가변 저항의 가운데 핀을 아날로그 입력 핀에 연결하여 출력할 수 있습니다.
실습
가변 저항의 값에 따라 RGB LED의 색상을 조절하는 예제입니다.
가변 저항의 값이 0~340이면 빨간색, 340~680이면 초록색, 680 이상이면 파란색이 나오도록 해보겠습니다.
현재 가변저항의 값을 시리얼 통신을 통해 컴퓨터에서 확인하고 있고, 의도적으로 딜레이를 1초 주고 있습니다.
시리얼 통신
시리얼 통신을 하기 위해 아래와 같은 매소드를 사용해보도록 하겠습니다.
Serial.begin(통신 속도);
Serial.println(analogRead 매소드를 통해 읽은 값);
시리얼 통신을 통해 연결된 두 장치는 같은 통신 속도를 가져야 합니다. 만약 양쪽의 전송/수신 속도가 다르다면 데이터를 처리하는 속도가 다르기 때문에 정상적인 값을 주고받을 수 없습니다.
시리얼 통신 속도는 보통 9600을 사용합니다.
Serial.println
은 아두이노에서 시리얼을 통해 컴퓨터로 보낸 데이터를 컴퓨터의 시리얼 모니터에 출력하는 매소드입니다.
소스 코드
const int POT =0;
const int RED = 11;
const int GREEN = 10;
const int BLUE= 9;
const int LOWER_BOUND = 340;
const int UPPER_BOUND = 680;
int val = 0;
void setup() {
Serial.begin(9600); // 초기화
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
}
void loop() {
val = analogRead(POT);
Serial.println(val);
delay(1000);
if (val < LOWER_BOUND) {
// RED
digitalWrite(RED, HIGH);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, LOW);
} else if (val < UPPER_BOUND) {
// GREEN
digitalWrite(RED, LOW);
digitalWrite(GREEN, HIGH);
digitalWrite(BLUE, LOW);
} else {
// BLUE
digitalWrite(RED, LOW);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, HIGH);
}
}