아두이노를 이용한 자동차 후방 센서 구현 : 초음파 거리센서+LED+피에조
회로구성
• 초음파 거리센서 + LED + 피에조
동작 요구사항
• 아두이노에 전원이 인가되면 LED와 피에조는 꺼져있는 상태이다.
• 초음파 센서로 거리를 측정하여 일정 거리 임계값보다 작으면 LED에 불이 들어오고, 피에조에서 소리가 발생한다.
• 측정 거리가 임계값보다 커지면 LED와 피에조 소리는 꺼진다.
• 자동차 후방 센서 (3단계 경보)
피에조(piezo)
• 피에조는 압전 물질에 얇은 판을 대어 압전 효과에 의해 소리가 나도록 한 소자
• 압전물질 : 압력을 가하면 전위차가 발생하거나 반대로 전압을 인가하면 물리적 변위가 생기는 물질
• 압전효과 : 압력을 가했을 때 전압이 발생되거나, 전압을 가했을 때 압력(신장, 응축)이 생기는 효과
초음파 거리 센서(ultrasonic sensor)
초음파
• 인간이 들을 수 있는 가청 주파수(20Hz~20kHz)의 최대 한계 범위를 넘어서는 주파수를 갖는 주기적인 음압(sound pressure)
• 응용분야 : 소나(sonar), 의료 초음파, 초음파 거리 탐사, 비파괴검사, 초음파 세척기
초음파 센서
• 펄스 송신부에서 펄스를 보낸 뒤 반사파가 수신부에 도달하는 시간으로 거리 측정
동작 원리
초음파 센서 종류
초음파 센서 거리 측정
물체와의 거리(D)[m] = 음속(V)[m/s] x 시간(t)[s] = (331.5 + 0.60714 x T) x (t/2)
여기서, T는 현재 온도, Output echo pulse는 거리를 왕복하는 시간이므로 실제 거리에 대한 시간은 Output echo pulse의 1/2이다.
데이터 시트
- 30도 각도 안에서 최적의 성능을 보임
- Trigger핀으로 최소 10us의 펄스를 입력하면 Trigger 소자에서 8 개의 40kHz 펄스를 출력
- Echo 소자로 반사파가 입력되면 Echo핀으로 거리에 비례하는 펄스파를 출력
초음파 센서 HC-SR04
• 동작전압 5V / 발생주파수 40kHz / 측정거리 2~400cm
• Key Code
int Trig = DP1, Echo = DP2;
digitalWrite(Trig, HIGH);
delayMicroseconds(10);
digitalWrite(Trig, LOW);
unsigned long t = pulseIn(Echo, HIGH); //us
초음파 센서 Parallax #28015
• 동작전압 5V / 측정거리 3.3m이하 / SIG 핀에 2㏀ 사용
• Key Code
int SIG = DP1;
pinMode(SIG, OUTPUT);
digitalWrite(SIG, LOW);
delay(1); // >200us
digitalWrite(SIG, HIGH);
delayMicroseconds(10);
digitalWrite(SIG, LOW);
pinMode(SIG, INPUT);
unsigned long t = pulseIn(SIG, HIGH); //us
• Key Code 설명
아두이노 제어 함수
데이터 직렬통신을 위한 함수
• Serial.begin(), Serial.print(), Serial.println()
소리 관련 함수
• tone(), noTone()
시간 측정 관련 함수
• pulseIn()
Serial
• 아두이노와 컴퓨터 또는 다른 디바이스와 직렬 통신을 위한 클래스
• Uno, Nano, Mini 및 Mega에서는 0번 핀과 1번 핀이 컴퓨터와 통신에 사용된다. 이 핀에 무엇이든 연결하면 보드 업로드 실패를 포함, 통신을 방해 할 수 있다.
• 아두이노 IED 환경의 내장 직렬 모니터를 사용하여 아두이노 보드와 통신 할 수 있다.
아두이노 시뮬레이션
전체코드
int led = 6;
int piezo = 12;
int sig = 3;
int freq = 440; // A4(라)음
float T = 21; // 온도 21(degree)
float V = 331.5 + 0.60714*T; // 음속(m/s)
unsigned long t = 0; // 왕복시간(us)
float D = 0; // 거리(cm)
float Dth1 = 150; // 1차 경고 임계거리(cm)
float Dth2 = 100; // 2차 경고 임계거리(cm)
float Dth3 = 50; // 3차 경고 임계거리(cm)
int ledFlag = 0; // led on/off 상태 표현
unsigned long u28015()
{
pinMode(sig, OUTPUT);
digitalWrite(sig, LOW);
delay(1);
digitalWrite(sig, HIGH);
delayMicroseconds(10);
digitalWrite(sig, LOW);
pinMode(sig, INPUT);
return pulseIn(sig, HIGH); // microsecond
}
void setup()
{
Serial.begin(9600);
pinMode(piezo, OUTPUT);
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}
void loop()
{
t = (float)u28015(); // 초음파센서-물체간 왕복시간
D = (V*t/10000)/2; // m -> cm, us -> s로 단위 변환
Serial.print("Distance : ");
Serial.print(D);
Serial.print("cm (V : ");
Serial.print(V);
Serial.print("m/s, t : ");
Serial.print(t);
Serial.println("us)");
if (D <= Dth3)
{
tone(piezo, freq);
digitalWrite(led, HIGH);
}
else if (D <= Dth2)
{
tone(piezo, freq, 200);
delay(200);
digitalWrite(led, ledFlag);
ledFlag = !ledFlag;
}
else if (D <= Dth1)
{
tone(piezo, freq, 300);
delay(300);
digitalWrite(led, ledFlag);
ledFlag = !ledFlag;
}
else
{
noTone(piezo);
digitalWrite(led, LOW);
}
delay(300);
}
Tinkercad 시뮬레이션 결과
실제 구현
코드
시연 동영상