본문으로 바로가기


초음파(Ultrasonic)


초음파는 말 그대로 어떤 수준을 넘어서는 음파를 말 한다. 이 때 음파는 소리를 의미하고 인간의 가청 주파수는 20~20KHz이며, 그 이상의 주파수는 인간이 소리를 들을 수 없다. 이렇게 인간이 들을 수 있는 가청영역을 초월한다 하여 초음파라고 불린다.


초음파 센서(Ultrasonic Sensor)



초음파 센서는 이런 초음파의 성질을 이용하여 거리, 속도, 수위등을 측정할 수 있다.

초음파센서는 trig핀으로 음파를 쏘고, 벽이나 사물등에 음파가 닿으면 튕겨저 나오면서 메아리가 발생한다. 이 메아리는 ehco핀으로 들어간다. 즉, 초음파를 발생시켜  다시 튕겨져 나오는 시간을 계산하여 거리를 측정할 수있다.

HC-SR04Users_Manual.pdf

HCSR04.pdf

자세한 내용은 위의 HC-SR04(초음파 센서)의 메뉴얼과 데이터시트를 참고하면 된다. (물론 영어)


거리 측정


우리가 실습할 내용은 초음파 센서를 이용하여 특정 거리 안에 들어오면 led들을 켜는 실습을 할 것이다. 그럼 이 거리를 측정하기 위해서는 속력과 시간이 필요하다. ( 거리 = 속력 x 시간 ) 

소리(음파)의 속도는 1초당 340m를 갈 수 있으므로 속도는 340m/s이다.

초음파가 반사되어 돌아오는 시간은 cm단위로 구하려 하므로 위의 식을 이용하여

1cm(0.01m) = 340 / 시간

따라서 시간 = 0.01 / 340 이므로 약 29.41us가 나오게 된다. 그러므로 1cm를 이동하는데 걸리는 시간은 약 29us가 된다. 

그러므로 초음파센서에서 측정된 값(이동하는데 걸린 시간) / 29 / 2를 해주어야 초음파 센서로부터의 거리를 구할 수 있다.


-정리-

이동하는데 걸린 시간(pulseIn 함수를 사용하므로 us시간으로 반환)

왕복하는데 걸린 시간을 반환했으므로 2로 나눠준다.

따라서 초음파 센서로부터의 거리 = pulseIn(echo, HIGH) / 29 / 2를 하면 우리가 원하는 거리를 cm단위로 측정할 수있다. 


거리 측정 동영상 강의 해설 : 3분 52초부터


pulseIn(핀, 상태);


이번 예제의 가장 핵심적인 함수인 pulseIn(핀, 상태(HIGH or LOW));은 지정된 핀의 상태를 기다리다가 해당 상태가 되면 시간을 측정하기 시작하고 다시 상태가 바뀌면 시간 측정을 종료한다. 이 때 측정된 시간을 us(microsecond)로 반환한다. 이 반환된 값으로 거리를 측정하여 초음파 센서를 제어한다.

자세한 내용은 https://www.arduino.cc/en/Reference/pulseIn 공식홈페이지 레퍼런스를 참고하기 바란다.



실습 내용


초음파 센서를 이용하여 led를 도미노처럼 순서대로 켜고 끄기.


준비물


아두이노 보드, 브레드 보드, led 9개, 저항 330Ω 9개, 점퍼선 23개


회로도





소스 코드


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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
int trig = 4;
int echo = 3;
int led[] = {567891011, 12, 13};
//각 핀 변수로 설정
 
void setup() {
  pinMode(trig, OUTPUT);  
  pinMode(echo, INPUT);   //음파를 받아야 하니 INPUT으로
  for(int i=0; i<9; i++)
    pinMode(led[i], OUTPUT); //각 변수 출력으로 설정
  Serial.begin(9600); //시리얼통신 시작
}
 
void loop() {
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  //초음파를 발사!
  
  int duration = pulseIn(echo, HIGH);
  //초음파가 발사되면 물체까지의 시간을 측정하여
  //변수 duration에 넣어준다.
  int dis = duration / 29 / 2;
  //측정된 시간을 cm단위로 바꿔준다.
  
  if(dis < 12)  //거리가 12cm보다 가까워지면
    digitalWrite(led[0], HIGH); //led[0]을 켜라
  else          //아니면
    digitalWrite(led[0],LOW); // led[0]을 꺼줘라.
  if(dis < 11)
    digitalWrite(led[1], HIGH);
  else
    digitalWrite(led[1],LOW);
  if(dis < 10)
    digitalWrite(led[2], HIGH);
  else
    digitalWrite(led[2],LOW);
  if(dis < 9)
    digitalWrite(led[3], HIGH); 
  else
    digitalWrite(led[3],LOW);
  if(dis < 8)
    digitalWrite(led[4], HIGH);
  else
    digitalWrite(led[4],LOW);
  if(dis < 7)
    digitalWrite(led[5], HIGH); 
  else
    digitalWrite(led[5],LOW);
  if(dis < 6)
    digitalWrite(led[6], HIGH);
  else
    digitalWrite(led[6],LOW);
  if(dis < 5)
    digitalWrite(led[7], HIGH);
  else
    digitalWrite(led[7],LOW);
  if(dis < 4)
    digitalWrite(led[8], HIGH);
  else
    digitalWrite(led[8],LOW);
  
  delay(100); 
  // 0.1초대기 작동을 빠르게 하고 싶다면 delay를
  // 낮춰주면 된다.
  
}
cs

ex7_ultrasonic.ino


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
33
34
35
36
37
38
39
40
int trig = 4;
int echo = 3;
int led[] = {567891011, 12, 13};
//각 핀 변수로 설정
 
void setup() {
  pinMode(trig, OUTPUT);  
  pinMode(echo, INPUT);   //음파를 받아야 하니 INPUT으로
  for(int i=0; i<9; i++)
    pinMode(led[i], OUTPUT); //각 변수 출력으로 설정
  Serial.begin(9600); //시리얼통신 시작
}
 
void loop() {
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  //초음파를 발사!
  
  int duration = pulseIn(echo, HIGH);
  //초음파가 발사되면 물체까지의 시간을 측정하여
  //변수 duration에 넣어준다.
  int dis = duration / 29 / 2;
  //측정된 시간을 cm단위로 바꿔준다.
  
  for(int i=12 ; i>3 ; i--// 12~4까지 1감소 실행
  {
    if(dis < i) // 12~4까지 비교
      digitalWrite(led[12-i], HIGH);
      //12-i를 하면 이전 코드와 같은 동작을 하게된다.
    else
      digitalWrite(led[12-i], LOW);
      //동영상강의를 참고하면 속 시원한 설명!
  }
  delay(100); 
  // 0.1초대기 작동을 빠르게 하고 싶다면 delay를
  // 낮춰주면 된다.
  
}
 
cs

ex7_ultrasonic2.ino


결과 영상




댓글을 달아 주세요

  1. 귀요미 2017.01.13 17:17 신고

    여태 본 아두이노 초음파 강의중에 제일 잘 알려주시네요 항상 감사합니다

  2. 귀요미 2017.01.14 12:07 신고

    이프문을 짧게 포문으로 바꾸는 과정도 흥미롭고요

  3. 스프콘 2017.02.22 10:49 신고

    업로드 하는 순간 불이 전부 다 들어오고...코드랑 핀 다 동일하게 따라했는데도 제대로 작동 안하면 센서불량이라고 봐야하나요? ㅠㅠ 힝..

    • BlogIcon 코딩런 2017.02.22 10:56 신고

      센서 불량일 경우도 있지만 잘못 꽂았거나 코딩실수일 확률이 훨씬 높습니다. 한번 더 확인해 보시고 그래도 안되시면 꽂으신 사진이랑 코드 보내주시면 확인해보겠습니다.

  4. 로오오닌 2017.04.11 09:49 신고

    led말고 진동모터를 거리에따라 울리게는 어떻게 하나요??

  5. 2017.08.09 19:59

    비밀댓글입니다

  6. jamie0202 2017.08.09 20:03 신고

    저항값은 꼭 330옴이여야 하나요?

  7. BlogIcon 사람 2017.08.19 13:53 신고

    케이블 잘 연결 한것 같은데
    avrdude: ser_open(): can't set com-state for "\\.\COM3"
    라고 오류가 뜨네요. 해결방법 없나요?

  8. 궁금 2017.09.13 18:01 신고

    이런거 어떻게 배워요?? 자세하게 배울려면 어떻게 해야하나요??제가 초음파거리측정이 필요해서 좀 자세히 알았으면해서요 답변 부탁드려요! 프로그램작이나 기타등등 키트구매하면 프로그램 업로드 보드도있는건가요??

  9. song 2017.10.21 23:33 신고

    강의를 들어면 이해가 잘 됩니다. 너무 감사드립니다.

티스토리 툴바