초음파 센서인 HC-SR04를 이용하여 거리를 측정해보자.
이 센서는 나의 테스트 결과 1m 안의 물체에 대해서는 상당히 정확한 거리값을 구해 준다.
하지만 1m를 넘어가면 값이 별로 정확하지는 않은 것 같다.
초음파로 거리를 계산하는 원리는 다음과 같다.
초음파의 속도는 340m/s 이다.(일반적인 소리의 속도와 같다.) 초음파가 발생되어 대상물체에 부딪히게 되면 반사되어 돌아오게 된다. 이의 시간차를 계산하면 거리를 계산할 수 있다. 박쥐가 동굴에서 빛 없이도 장애물을 파악하고 피해가는 원리와 비슷하며, 번개가 치고 1초뒤 천둥소리가 들렸다면 번개가 친 곳과의 거리가 340m 인 것을 파악하는 원리와 같다고 생각하면 된다.
초음파 센서를 보면 스피커 같은 것이 2개가 달려 있는데 한 쪽은 초음파를 발생시키고 다른 한 쪽은 물체에 반사되는 초음파를 감지하는 역할을 한다. 즉, 초음파 발생 시간과 물체에 부딪혀 반사되어 오는 시간의 차를 이용하여 거리를 측정하게 되는 것이다.
위의 단자에서 Trig 가 초음파를 발생하는 신호이며, Echo가 반사되어 오는 초음파를 받는 역할을 한다. 데이터시트와 매뉴얼은 다음과 같다.
HC-SR04 데이터시트:
HC-SR04 매뉴얼:
연결:
Vcc ---- 아두이노 5V
GND ---- 아두이노 GND
Trig ---- 아두이노 디지털 9번핀
Echo ---- 아두이노 디지털 8번핀
##소스##
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //출력핀(trig)과 입력핀(echo) 연결 설정, 다른 핀을 연결해도 됨. int trigPin = 9; int echoPin = 8; //시리얼 속도설정, trigPin을 출력, echoPin을 입력으로 설정 void setup(){ Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } //초음파를 보낸다. 다 보내면 echo가 HIGH(신호받기) 상태로 대기 void loop(){ float duration, distance; digitalWrite(trigPin, HIGH); delay(10); digitalWrite(trigPin, LOW); // echoPin 이 HIGH를 유지한 시간을 저장 한다. duration = pulseIn(echoPin, HIGH); // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다. // 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠준다. distance = ((float)(340 * duration) / 10000) / 2; //시리얼모니터에 Echo가 HIGH인 시간 및 거리를 표시해준다. Serial.print("Duration:"); Serial.print(duration); Serial.print("\nDIstance:"); Serial.print(distance); Serial.println("cm\n"); delay(500); } |
위의 소스를 업로드 후 초음파 센서에서 7cm 거리에 물체를 두었다.
약간의 오차가 있지만 시리얼모니터상에서 거의 근접한 거리를 보여준다.
'아두이노' 카테고리의 다른 글
[아두이노] 빛의 감지, 포토레지스터(Photo Resistor)의 사용 (0) | 2015.09.03 |
---|---|
[아두이노] 적외선(IR)센서의 사용 - VS1838B (4) | 2015.09.03 |
[아두이노] 초음파센서(HC-SR04)를 이용한 거리측정 (8) | 2015.08.31 |
[아두이노] 스텝핑 모터(Stepping Motor) 사용하기 (2) | 2015.08.31 |
[아두이노] 시계(RTC: Real Time Clock) 모듈의 사용 (4) | 2015.08.27 |
[아두이노] 아두이노 사운드 디텍트 센서(Sound Detect Sensor)의 이용 (0) | 2015.08.27 |
댓글을 달아 주세요
시리얼모니터에 나타난값을 저장할수는없나요?
2015.11.11 16:27 [ ADDR : EDIT/ DEL : REPLY ]저의 포스팅 중에서 시리얼모니터의 내용을 텍스트파일로 저장하는 방법에 대한 포스팅이 있습니다. 참고하세요. http://deneb21.tistory.com/230
2015.11.11 16:40 신고 [ ADDR : EDIT/ DEL ]감사합니다!! 혹시 더 궁금한거 있으면 한번더 여쭤볼께요
2015.11.11 16:48 [ ADDR : EDIT/ DEL ]센서 앞에 아무런 매질 없이 실험을 진행하신 건가요??
2016.07.05 16:40 [ ADDR : EDIT/ DEL : REPLY ]사진 센서 앞에 자세히 보시면 허연 판때기 같은게 있는걸 볼 수 있슴다. ^^
2016.07.05 16:43 신고 [ ADDR : EDIT/ DEL ]저상태에서 일정거리가 넘어가면
2016.11.21 10:28 [ ADDR : EDIT/ DEL : REPLY ]진동이나 램프가 동작하는 스케치 알수있을가요?
코딩은 직접 연구해서 짜야죠. 다만 질문에 힌트를 드리자면 진동이나 램프가 동작하는 소스를 loop() 에 if 문 안에 넣고 if문의 조건을 거리를 감지하다가 원하는 거리 이상의 값이 나올 경우로 지정한다면 간단하게 구현이 될 것 같네요.
2016.11.21 13:07 신고 [ ADDR : EDIT/ DEL ]비밀댓글입니다
2017.09.02 18:18 [ ADDR : EDIT/ DEL : REPLY ]