1. 초음파(Ultra Sonic) 센서로 거리 측정하기 실습
페이지 정보
작성자 관리자 댓글 0건 조회 3,399회 작성일 18-11-03 21:46본문
1. 초음파(Ultra Sonic) 센서로 거리 측정하기 실습
초음파(Ultra Sonic)센서는 가까운 거리에 있는 물체 혹은 사람의 유무, 거리측정, 속도측정 등에 사용된다. 초음파는 사람의 귀로 들을 수 없는 20kHz 대 이상의 음을 말한다. 초음파 센서는 센서 자신이 갖는 고유 진동 주파수와 똑같은 주파수의 교류 전압을 가하면 좀더 효율이 좋은 음파를 발생할 수 있다. 그래서 물체에서 반사된 음파를 센서로 입력(진동)시켜서 발생된 전압을 회로에서 처리함으로써 측정거리를 계산할 수 있다.
초음파 센서 동작방식
초음파의 속도는 340m/s 이다.(일반적인 소리의 속도와 같다.) 초음파가 발생되어 대상물체에 부딪히게 되면 반사되어 돌아오게 된다. 이의 시간차를 계산하면 거리를 계산할 수 있다. 박쥐가 동굴에서 빛 없이도 장애물을 파악하고 피해가는 원리와 비슷하며, 번개가 치고 1초뒤 천둥소리가 들렸다면 번개가 친 곳과의 거리가 340m 인 것을 파악하는 원리와 같다고 생각하면 된다.
초음파 센서를 보면 스피커 같은 것이 2개가 달려 있는데 한 쪽은 초음파를 발생시키고 다른 한 쪽은 물체에 반사되는 초음파를 감지하는 역할을 한다. 즉, 초음파 발생 시간과 물체에 부딪혀 반사되어 오는 시간의 차를 이용하여 거리를 측정하게 되는 것이다.
위의 단자에서 Trig 가 초음파를 발생하는 신호이며, Echo가 반사되어 오는 초음파를 받는 역할을 한다.
초음파센서는 1m 안의 물체에 대해서는 상당히 정확한 거리값을 구해 준다. 하지만 1m를 넘어가면 값이 별로 정확하지는 않은 것 같다.
싱커캐드의 초음파 센서는 4핀이 아닌 3핀 방식으로 된 선서 모듈로 서 디지털 핀 7번에 연결한다.
(1) 회로도 구성
(2) 소스코딩
pulseIn(pin, value)
pulseIn(pin, value, timeout)
디지털 핀에서 HIGH, LOW 값을 읽는다 .해당 핀에서 HIGH가 될 때 까지 기다리며 타이머를 시작하고 LOW가 될 때까지 기다리고 타이머를 멈춘다. 펄스의 길이를 마이크로 초단위로 반홚나다. 전해진 timeout안에 펄스가 시작되지 않으면 0을 반환한다.
함수의 타이머는 10 마이크로초부터 3분까지 펄스에 대해 동작한다.
pin : 보드 핀번호 : int
value : HIGH 또는 LOW
timeout(옵션) : 펄스 시작을 기다리는 시간(마이크로초 단위) 기본값 1초
(3) 실행 결과
초음파 센서를 선택하면 거리를 조정할 수 있다.
(4) 4핀 방식 초음파 센서
HC-SR04는 최대 4m까지 거리 측정이 가능하고 측정 각도는 약 15도 이다. HC-SR04는 VCC, GND, Trigm, Echo 총 4핀으로 이루어져 있다.
Trig핀에 최소 10us의 펄스를 입력하면 Echo 핀으로 거리에 비례하는 펄스가 반사되어 돌아온다. 우리는 Trig 핀에 펄스를 입력한 시점에서부터 Echo 핀으로 펄스가 출력되는 시점의 시간만 알게 되면 거리를 측정 할 수 있다.
Vcc ---- 아두이노 5V
GND ---- 아두이노 GND
Trig ---- 아두이노 디지털 2번핀
Echo ---- 아두이노 디지털 4번핀
(5) 4핀 방식 초음파 센서 실습 예제
const int trigPin = 2; //Trig 핀 할당
const int echoPin = 4; //Echo 핀 할당
void setup()
{
Serial.begin(115200); //시리얼 초기화
Serial.println("Hello Arduino!!");
pinMode(trigPin, OUTPUT); //Trig 핀 output으로 세팅
pinMode(echoPin, INPUT); //Echo 핀 input으로 세팅
}
void loop()
{
long duration, distance; //기본 변수 선언
//Trig 핀으로 10us의 pulse 발생
digitalWrite(trigPin, LOW); //Trig 핀 Low
delayMicroseconds(2); //2us 유지
digitalWrite(trigPin, HIGH); //Trig 핀 High
delayMicroseconds(10); //10us 유지
digitalWrite(trigPin, LOW); //Trig 핀 Low
//Echo 핀으로 들어오는 펄스의 시간 측정
duration = pulseIn(echoPin, HIGH); //pulseIn함수가 호출되고 펄스가 입력될 때까지의 시간. us단위로 값을 리턴.
//음파가 반사된 시간을 거리로 환산
//음파의 속도는 340m/s 이므로 1cm를 이동하는데 약 29us.
//따라서, 음파의 이동거리 = 왕복시간 / 1cm 이동 시간 / 2 이다.
distance = duration / 29 / 2; //센치미터로 환산
Serial.print(distance);
Serial.print("cm");
Serial.println();
delay(100);
}
pulseIn 함수는 지정된 핀의 상태(HIGH 또는 LOW)가 되기를 기다렸다가 해당되는 상태가 되면 시간을 재기 시작하고, 핀의 상태가 바뀌면 시간 재기를 중지한 후 경과 시간을 마이크로 초로 반환한다. 예를 들어 인수 값을 HIGH로 지정하면 핀의 상태가 HIGH가 되는 순간부터 측정하여 LOW가 될 때까지의 시간을 마이크로 초 단위로 반환한다. 지정된 시간 동안 해당 펄스가 발생하지 않으면 0을 반환한다.
음파의 속도는 약 340m/s이다. 그렇기 때문에 1cm를 이동하는 약 29us가 걸린다. 그러면 2cm를 이동하면 38us, 10cm를 이동하면 290us가 걸린다. 우리는 pulseIn 함수를 이용해서 음파가 반사된 시간을 us 단위로 받았기 때문에, 그 값을 29로 나누게 되면 거리가 나온다. ex) duration / 29
하지만, pulseIn 으로 받은 시간이 음파가 반사되어 돌아온 왕복 시간이므로 나누기 2를 하게 되면 정확한 물체의 거리가 나온다. ex) duration / 29 / 2
댓글목록
등록된 댓글이 없습니다.