초음파(Ultrasonic)
초음파는 말 그대로 어떤 수준을 넘어서는 음파를 말 한다. 이 때 음파는 소리를 의미하고 인간의 가청 주파수는 20~20KHz이며, 그 이상의 주파수는 인간이 소리를 들을 수 없다. 이렇게 인간이 들을 수 있는 가청영역을 초월한다 하여 초음파라고 불린다.
초음파 센서(Ultrasonic Sensor)
초음파 센서는 이런 초음파의 성질을 이용하여 거리, 속도, 수위등을 측정할 수 있다.
초음파센서는 trig핀으로 음파를 쏘고, 벽이나 사물등에 음파가 닿으면 튕겨저 나오면서 메아리가 발생한다. 이 메아리는 ehco핀으로 들어간다. 즉, 초음파를 발생시켜 다시 튕겨져 나오는 시간을 계산하여 거리를 측정할 수있다.
자세한 내용은 위의 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[] = {5, 6, 7, 8, 9, 10, 11, 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 |
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[] = {5, 6, 7, 8, 9, 10, 11, 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 |
결과 영상
'아두이노 > 기초 예제' 카테고리의 다른 글
아두이노 예제 9. 토양수분센서로 led 제어하기 (4) | 2017.01.17 |
---|---|
아두이노 예제 8. 조도센서로 led 제어하기 (5) | 2017.01.16 |
아두이노 예제 6. 7 세그먼트로 숫자 표현하기 (13) | 2017.01.11 |
아두이노 예제 5. 피에조 부저로 연주하기 (7) | 2017.01.08 |
아두이노 예제 4. 가변저항으로 led 밝기 조절하기 (7) | 2017.01.06 |