초음파 센서 모듈은 초음파를 발생시켜서 물체에 반사되어 돌아오는 시간을 측정해서 물체까리의 거리를 구할 수 있는 장치이다. 다음 그림은 parallax.com 사의 초음파 센서 모듈이다. (저가형 중국산 모듈은 4핀이 달린 것도 있으나 성능이나 사용법은 동일하다.)
전원핀, GND핀, 출력핀, 세 개로 동작한다. 2cm 부터 3m 범위를 측정할 수 있다. |
[그림 1] parallax.com 사의 초음파센서모듈
이 모듈의 사용법은 굉장히 간단하다. 일단 5V, GND 핀을 연결한 후 신호핀은 아두이노의 디지털 핀에 연결한다. 그리고 디지털핀으로 시작 신호(펄스)를 보낸 후 같은 핀에서 되돌아오는 펄스의 폭(시간)을 잰다.
[그림 2] 초음파 모듈의 동작 순서 | - 시작 펄스는 5micro-sec 동안 유지해야 한다. - 응답 펄스는 초음파가 발생한 후 되돌아온 시간 동안 HIGH를 유지한다. |
이 응답 펄스의 폭은 장애물과의 거리에 비례하며 초음파가 발생된 후 되돌아올 때 까지의 시간동안 HIGH로 유지된다. 오직 하나의 디지털 핀만을 사용하므로 시작 신호를 보낸 후 바로 핀의 모드를 입력으로 전환해야 한다. 시작 펄스는 5micro-sec 동안 유지해야 한다. 각 단계는 다음과 같다.
핀을 출력으로 설정한다.
LOW신호를 2micros 동안 유지한다.
HIGH 신호를 5micros동안 유지한다.
LOW로 신호를 내보냄과 동시에 핀을 입력으로 설정한다.
pulseIn() 함수를 이용하여 펄스가 HIGH인 구간 시간을 micros 단위로 받는다.
초음파 모듈 시간은 초음파를 송신함과 동시에 핀을 HIGH로 올리고 물체에 반사된 초음파를 수신하면 LOW로 내린다. 따라서 핀이 HIGH로 유지되는 경과 시간은 초음파가 나가서 물체에 반사되어 되돌아온 시간인 것이다.
이 시간을 이용한 계산으로 거리 값을 도출할 수 있는데 다음과 같은 식을 이용한다. 소리는 초당 343m를 이동하므로 1cm를 이동하는데 29.155micro-sec 이 걸린다. 따라서 측정된 시간(마이크로 초 단위)를 58.31 로 나누어야 한다. 2를 곱해주는 것은 측정된 시간이 왕복 시간이기 때문이다.
이제 이러한 내용을 바탕으로 코딩을 해보자.
#define MS_PER_CM 58.31f#define ULTRA_SONIC_SENSOR 2void setup() {Serial.begin(9600);}void loop() {float fDist = measureDist();if (fDist < 0) {Serial.println("No obstable or no sensor.");} else {Serial.print("Distance: ");Serial.print(fDist);Serial.println(" cm");}delay(100);}float measureDist() {pinMode(ULTRA_SONIC_SENSOR, OUTPUT); //(1)단계digitalWrite(ULTRA_SONIC_SENSOR, LOW); //(2)단계delayMicroseconds(2);digitalWrite(ULTRA_SONIC_SENSOR, HIGH); //(3)단계delayMicroseconds(5);digitalWrite(ULTRA_SONIC_SENSOR, LOW); //(4)단계pinMode(ULTRA_SONIC_SENSOR, INPUT);// (5) 단계unsigned long ulPulseTime = pulseIn(ULTRA_SONIC_SENSOR, HIGH);if (ulPulseTime == 0 )return -1.0f;elsereturn ulPulseTime / MS_PER_CM;} |
위 코드에서 measureDist() 함수를 실행하면 위에서 설명한 각 단계를 거쳐서 거리까지 계산한 float 값을 반환한다. 만약 pulseIn()함수의 반환값이 0이라면 -1.0f 를 반환하여 장애물이 감지되지 않은 것임을 표시한다.
'하드웨어 > 아두이노' 카테고리의 다른 글
아두이노 인터럽트를 이용한 터치센서 실험 (0) | 2015.05.22 |
---|---|
아두이노 인터럽트(interrupt) 개요 (0) | 2015.05.22 |
아두이노 시리얼 통신 예제들 (0) | 2015.05.22 |
아두이노 시리얼 통신 개요 (0) | 2015.05.22 |
아두이노 디지털포트를 이용한 인체 감지 센서 실험 (0) | 2015.05.21 |