티스토리 뷰

요즘 자동차에는 대부분 물체를 감지하는 센서가 달려있습니다. 저는 작년 12월에 차가 오래되어 새 차를 구매하였는데 기존 차에는 후방감지 센서가 없었습니다. 그래서 뒤쪽 범퍼를 보면 크고 작은 흠집이 많이 있었습니다. 이번에 새로 구매한 차에는 뒤쪽은 물론 앞쪽에도 센서가 있어 주차하기가 아주 편합니다. 또 고속도로를 달릴 때 자동주행 기능을 켜면 앞차가 세팅한 거리 이내로 들어오면 알아서 속도도 줄여줍니다. 이렇듯 요즘 생산되는 차들은 운전을 쉽게 할 수 있게 하는 많은 기능을 가지고 있습니다. 오늘은 거리에 따라 알람음의 속도와 LED 색이 변하는 후방감지 시스템을 만들어 보겠습니다.

목차
1. 회로 구성
2. 소스 코드
3. 데모

1. 회로 구성

이번 프로젝트에 사용할 센서는 HC-SR04라고 불리는 초음파 센서입니다. 초음파를 이용하여 물체를 감지하는 센서이며 자동차의 후방 감지센서와 동일한 원리로 동작합니다. 

HC-SR04 핀 구조

송신부에서 초음파를 발생하여 물체에 닿은 후 수신부로 들어오게 되는데 전파가 이동한 시간을 측정하여 거리로 계산하는 방식으로 동작합니다.

동작 원리

이번 프로젝트에는 RBG가 같이 있는 LED를 사용해 보겠습니다. 같이 있다고 해도 각 색에 대한 컨트롤 신호는 따로 연결해 줘야 합니다.

회로 구성

2. 소스코드

int RLED = 2; // R,G,B LED를 아두이노 우노 보드 2,3,4번 핀에 연결
int GLED = 3;
int BLED = 4;
int BUZZER = 11; // Active BUZZER 핀을 11에 연결
int TRIGIN = 12; // Ultrasonic 센서의 TRIG pin 13에 연결
int ECHOPIN = 13; // Ultrasonic 센서의ECHO pin 12에 연결

//센서에서 보낸 신호가 되돌아 오는 시간, 물체와의 거리를 저장할 값 지정
float duration_us, distance_cm;

void setup()
{
pinMode(RLED, OUTPUT); //세가지 LED 핀을 출력으로 설정
pinMode(GLED, OUTPUT);
pinMode(BLED, OUTPUT);
pinMode(BUZZER, OUTPUT);//부저의 출력설정
pinMode(TRIGIN, OUTPUT);//센서에서 보내는 신호를 출력으로 설정
pinMode(ECHOPIN, INPUT);//센서에서 보내는 신호를 입력으로 설정

Serial.begin(9600); // 시리얼 모니터 시작

}
void loop()
{
digitalWrite(TRIGIN, HIGH);// 보내는 신호를 10 마이크로초 간격의 펄스로 만들어줌
delayMicroseconds(10);
digitalWrite(TRIGIN, LOW);

duration_us = pulseIn(ECHOPIN, HIGH);//받는 신호가 돌아오는 시간을 저장
distance_cm = 0.017 * duration_us;//물체와의 거리를 계산

if(distance_cm < 20) //거리가 20cm 미만일 때
{
digitalWrite(BLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(RLED, HIGH); //Red LED가 켜짐
digitalWrite(BUZZER,HIGH);//알람이 연속으로 울림
}

else if(distance_cm <= 30)//거리가 30cm 미만일 때
{
digitalWrite(BUZZER,LOW);//기존에 울리던 알람 off
digitalWrite(BLED, LOW);
digitalWrite(RLED, LOW);

digitalWrite(GLED, HIGH); //Green LED가 200ms 간격으로 깜빡거림
digitalWrite(BUZZER,HIGH);//알람이 200ms 간격으로 울림
delay(200);
digitalWrite(GLED, LOW);
digitalWrite(BUZZER,LOW);
delay(200);
}

else if( distance_cm <= 50)//거리가 50cm 미만일 때
{
digitalWrite(BUZZER,LOW);//기존에 울리던 알람 off
digitalWrite(GLED, LOW);
digitalWrite(RLED, LOW);

digitalWrite(BLED, HIGH); //BLue LED가 0.5초 간격으로 깜빡거림
digitalWrite(BUZZER,HIGH);//알람이 0.5초 간격으로 울림
delay(500);
digitalWrite(BLED, LOW);
digitalWrite(BUZZER,LOW);
delay(500);
// }
}
else //거리가 50cm 이상일 때

digitalWrite(BUZZER,LOW); //알림 없음
digitalWrite(RLED, LOW);
digitalWrite(GLED, LOW);
digitalWrite(BLED, LOW);
}
Serial.print("distance: "); //거리를 시리얼 모니터에 출력
Serial.print(distance_cm);
Serial.println(" cm");
delay(500);
}

감지 거리는 20,30,50cm로 세팅하고 거리가 가까워질수록 알람과 LED가 빨리 동작하도록 하였습니다. 거리가 20cm 미만일 때는 알람이 계속 울리게 세팅하고 실행을 했는데 감지하는 거리가 늘어나도 LED만 꺼질 뿐 소리는 계속 울려서 어디가 잘못되었는지 확인해 보니 거리가 변경될 때 기존의 알람을 끄지 않고 LED만 off 하도록 세팅해 놨던 것이었습니다. 아래와 같이 알람을 off 하는 코드가 추가되어있지 않아 각 거리마다 아래 코드를 추가하였더니 소리가 사라졌습니다. 

digitalWrite(GLED, LOW);
digitalWrite(RLED, LOW);
추가
digitalWrite(BUZZER,LOW); 

3.데모

 

실행 결과 원하는 대로 동작하였습니다. 제 차에는 이미 센서가 있기 때문에 좀 더 난이도가 높은 자율주행 자동차 프로젝트와 같은 곳에 사용해 봐야겠습니다.