1. 기초이론
지금까지 작성된 글을 기반으로 봤을 때 아두이노는 0 아니면 1만을 인식하는 디지털 시스템인걸 알 수 있습니다. 디지털 시스템의 문제는 아날로그 시스템을 이해할 수 없다는 것입니다. DIO 강의 때 보면 특정 전압 이상은 1, 특정 전압 이하는 0으로 분류를 해버리니 입력 전압이 몇 볼트인지 알 수가 없습니다. ADC는 이를 해결하기 위한 모듈로 제 생각으로는 마이크로컨트롤러 단가에 큰 영향을 주는 모듈이라 생각됩니다. 쉽게 생각해서 번역기라고 생각하면 될 것 같습니다.
본론으로 들어가기 앞서 아날로그와 디지털의 개념을 잡고 가는 게 좋을 것 같습니다. 먼저 디지털 신호란 딱딱 정수로 떨어지는 신호를 말합니다. 소수점이란 없으며, 딱 떨어지는 정수로 표현되는 신호들입니다. 우리가 여태껏 다뤄왔던 0 아니면 1, High 아니면 Low, On 아니면 Off 등 모두 디지털 신호라 할 수 있죠. 아날로그 신호는 반대로 모든 자연에 모든 신호라고 볼 수 있습니다. 가장 가까운 데서 찾아봤을 때 소리 빛의 세기 모두 아날로그 신호입니다. 정확하게 딱 떨어지는 정수로 표현이 불가능하죠. 이러한 것들을 마이크로컨트롤러가 이해할 수 있도록 도와주는 게 ADC(Analog-to-Digital Converter)입니다. ADC가 있기에 우리는 실생활에 필요한 유용한 디바이스를 설계할 수 있는 것입니다. 센서에서 전달되는 값은 대부분 주변 환경을 전압으로 바꿔서 전달해주는데, 그 값을 마이크로컨트롤러가 이해하려면 ADC가 필요하게 되는 것입니다.
제가 좋아하는 자동차로 예를 들어봅시다. 요즘 개발되는 자동차에 대부분 탑재되는 전방 추돌 방지(FCA, Forward Collision-Avoidance Assist) 시스템 또한 센서에서 전달된 아날로그 신호를 디지털 신호로 변환하여 판단하는 로직입니다. 차에 부착된 거리 감지 센서(초음파 센서, 라이다, 레이더 등)가 수시로 차량 전방 거리를 측정하게 됩니다. 그렇게 측정된 거리는 전기적 신호로 변환되어 차량 내부 마이크로 컨 롤러로 전달되죠. 전달된 신호는 ADC를 통해 디지털 값으로 변환되어 마이크로컨트롤러가 이해할 수 있는 정수 값으로 변환되고 그 값을 기준으로 거리를 구하는 계산을 때리면 마이크로컨트롤러는 거리를 알게 되고 안전거리를 계산하게 됩니다. 계산된 안전거리에 따라 위험하다 판단하여 차량을 급정거시키게 되는 거죠.
다시 본론으로 돌아와서 이제 코드 기반으로 이해해 봅시다. 우선 arduino.cc에 들어가 reference를 열어봅시다. 해당 페이지에 보면 analogRead() 함수가 보입니다. 직관적으로 봤을 때도 'analog신호를 읽는다(Read)'라고 말하고 있는 함수입니다. 그럼 괄호 안에는 어떤 값을 넣어야 할까요? 페이지를 보면 analogRead(pin)이라 적혀있습니다. 하지만 모든 핀에서 아날로그 값을 읽어올 순 없습니다. ADC 모듈이 연결되어있는 핀에서만 읽어올 수 있습니다. 보드의 가격이 올라갈수록 좀 더 섬세한 신호를 읽어오면서 많은 포트로 받아올 수 있는 ADC가 내장되게 됩니다.
아두이노 우노 기준으로 ADC 핀은 총 6개가 있으며, 보드 별로 Resolution과 Pin개수는 상이합니다. 여기서 Resolution은 직역하면 분해능이라 하는데, Resolution이 높을수록 더 정밀한 전압 센싱이 가능합니다. 표현할 수 있는 소수점 자릿수가 많아진다고 보면 이해하기 쉽습니다.
2. 실습 예제
아두이노 키트를 구매하셨다면 아마 조도 센서는 99.9% 확률로 있을 겁니다. 조도 센서가 ADC 예제로 쓰기에 매우 만만한 센서 입니다. 조도 센서는 우리 일상 속에서도 많이 쓰이는데, 간단하게 말해서 빛의 밝기를 전기적 신호로 바꿔주는 역할을 합니다. 더 딥하게 얘기하면 재미없으니 바로 설계 진행해봅시다.
* 동작 특성
- 주위 밝기가 어두워지면 LED On
- 주위 밝기가 밝아지면 LED Off
여기서 우리는 Calibration이라는 작업이 필요합니다. 우리가 '밝다' / '어둡다'라고 판단하는 기준을 정해주어야 하는데요. 이게 사실상 해당 센서의 Data Sheet를 기반으로 전기적 신호를 기반으로 분석하여 기준을 정하는 것이 맞지만, 우리는 아마추어니까요. 직접 센서를 가려보면서 전기적 신호가 어떻게 나오는지 추이를 보고 판단 기준을 삼으면 됩니다.
int sensorPin = A0;
int ledPin = 13;
const int threshold = 300;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
val = analogRead(analogPin); // read the input pin
Serial.println(val); // debug value
if(val < threshold){
digitalWrite(ledPin, HIGH);
}
else{
digitalWrite(ledPin, LOW);
}
}
오늘은 간단하게 조도센서를 활용하여 밝기를 전압으로 변환하여 읽어와 로직을 구성해 보았습니다. 이 코드를 기반으로 여러분은 이제 각종 센서의 전압 값을 판단하여 로직을 구성할 수 있게 되었습니다.
'임베디드 일지 > 아두이노 기초' 카테고리의 다른 글
[아두이노 기초] Serial 통신 (0) | 2023.03.30 |
---|---|
[아두이노 기초] Interrupt (0) | 2022.04.22 |
[아두이노 기초] GPIO Input (0) | 2022.04.09 |
[아두이노 기초] Arduino Mega 2560 - 2 (0) | 2021.12.17 |
[아두이노 기초] Arduino Mega 2560 - 1 (0) | 2021.12.16 |