초음파를 쏘고 반사되어 돌아 오는 초음파를 감지 해서 물체까지의 거리를 측정하는 원리입니다.
스펙상 약간씩 차이가 있는데 대략 2cm ~ 2m까지 범위의 측정이 가능하다고 합니다.
장애물 검출 할때 가장 흔하게 사용하는 센서 인듯합니다.
장점은 첫째로 매우 싸다는 것입니다. 국내에서도 2000원 이하 가격대에서 구매 가능합니다.
가격에 비해서 꽤 쓸만한 정도의 측정치를 제공합니다.
그리고 사용하기 매우 쉬운편입니다.
단점은 일단 그렇게 정밀하지 않습니다. 오차가 꽤 있는 편이고 환경조건에 따라서 오차가 커집니다.
두번째 단점은 초음파를 반시 시키지 않고 통과 또는 흡수 하는 재질에서는 측정이 안되거나 측정오차가 있습니다.
흔히 이불같은 천 재질에서는 측정이 잘안되는것 같습니다.
사용법은 다음과 같습니다.
Vcc와 GND에는 전원을 연결합니다. Vcc에는 5v를 공급합니다. 3.3v를 공급해도 동작은 하는데 측정치가 다르게 나옵니다.
Echo외 Trig핀에는 아두이노 디지털 핀을 연결합니다.
Trig핀은 초음파 발산제어를 Echo핀은 수신된 초음파 관련 데이터를 수신하는 통로입니다.
트리거핀에 2us 동안 LOW 출력 후 다시 5us동안 HIGH를 가합니다. 이후 다시 LOW를 가합니다.
에코핀을 통해서 펄스 입력 형태로 측정된 데이터를 수신합니다.
아래는 제어 소스 코드입니다.
#include <Arduino.h>
class CSonicSensorMng
{
protected:
char m_cTrig;
char m_cEcho;
public:
CSonicSensorMng(char trig, char echo)
{
m_cTrig = trig;
m_cEcho = echo;
}
//아두이노 setup함수내에서 한번호출해줍니다.
void Init()
{
pinMode(m_cTrig, OUTPUT);
pinMode(m_cEcho, INPUT);
}
//장애물과의 거리를 센티미터로 구함
float GetDistance() {return GetDistanceOne();}
float GetDistanceMulti()
{
//5회 센서값 읽기를 시도해서, 최소, 최대값을 제한 나머지값의 평균을 구함
float dist[5];
float fMin = 1000.0f;
float fMax = -1000.0f;
for (int i = 0;i < 5; ++i)
{
dist[i] = GetDistanceOne();
if (fMin > dist[i])
fMin = dist[i];
if (fMax < dist[i])
fMax = dist[i];
}
float fAvr = 0.0f;
bool bMin = true;
bool bMax = true;
for (int i = 0;i < 5; ++i)
{
if (bMin && dist[i] == fMin)
{
bMin = false;
continue;
}
if (bMax && dist[i] == fMax)
{
bMax = false;
continue;
}
fAvr += dist[i];
}
return fAvr * (1.0f / 3.0f);
}
//cm단위로 거리 측정
float GetDistanceOne()
{
digitalWrite(m_cTrig, LOW);
delayMicroseconds(2);
digitalWrite(m_cTrig, HIGH);
delayMicroseconds(5);
digitalWrite(m_cTrig, LOW);
long lp = pulseIn(m_cEcho, HIGH, 11600);
return (float)lp/29.0f/2.0f;
}
};
소스 사용법은 대략 아래처럼합니다.
#define TRIG_PIN 4
#define ECHO_PIN 5
CSonicSensorMng g_SonicSensor(TRIG_PIN, ECHO_PIN);
void setup()
{
Serial.begin(9600);
g_SonicSensor.Init(); //초음파 센서와 연결된 핀의 입출력 관련 초기화를 합니다.
}
void loop()
{
float fDistance = g_SonicSensor.GetDistance();
Serial.print("distance = ");
Serial.print(fDistance, 2);
Serial.println("cm");
delay(300);
}
'아두이노' 카테고리의 다른 글
아두이노 visual studio 연동 (0) | 2015.05.16 |
---|---|
아두이노 tone()함수 (0) | 2015.05.12 |
digitalRead() 함수 (0) | 2015.05.10 |
아두이노 digitalWrite() 함수 (0) | 2015.05.10 |
아두이노 나노 (0) | 2015.05.07 |