도플러 효과란? 레이더센서 / 아두이노 코드 / 물체 감지 / 속도 측정

메이커 2018-09-16 (일) 18:34 5년전 11356  

도플러 효과


고등학교 물리 시간에 도플러 효과를 떠올리면, 흔히들 엠뷸런스를 생각하게 합니다.


멀리서 다가오는 사이렌소리가 가까이 오게 되면 점점 높은 소리로 변하다가 멀어져가면서 낮은 음으로 바뀝니다. 


소리가 왜곡되는 것 같은 효과를 느낄 수 있죠. 이러한 현상을 도플러 효과의 예로 배웠습니다. 


0461dd20a1f8b52e13fa0ac668d6543c_1537088

 

위의 그림에서 엠뷸런스가 정지해 있는 사람에게 가까이 오게 되면, 파장이 짧아지고 이에 따른 주파수(진동수)가 올라가게 됩니다. 


이를 이용해서 속도를 측정할 수 있는데, 그 예로 스피드건을 대표적으로 들 수 있습니다. 


스피드건은 레이더파를 발사하고, 이 레이더파가 차량에 반사되어 돌아오는 것을 측정합니다. 


0461dd20a1f8b52e13fa0ac668d6543c_1537089


레이더파는 전자기파의 일종으로 보낼 때의 주파수와 반사되어 돌아오는 주파수를 비교하여 속도를 측정하게 됩니다.

 

예를 들어, 스피드건이 내보내는 주파수가 f 라고 가정하고, 전자기파의 속도는 빛의 속도인 c, 그리고 측정된 주파수의 차이가 Δf 라면, 자동차의 속도는 다음과 같습니다. 


{v}={\frac  {\Delta f}{f}}{\frac  {c}{2}}\, 



이러한 도플러 효과를 이용하여 속도를 측정할 수 있는 장비를 소개하면 다음과 같은 소자들이 있습니다. 


https://goo.gl/PkkQSc 

0461dd20a1f8b52e13fa0ac668d6543c_1537090

 iSYS-101, IPM-165 : 제품 바로가기


아두이노 및 라즈베리파이와 연결해서 어렵지 않게 사용할 수 있는데, 자율주행자동차에 대한 교육 및 연구에서도 많이 활용할 수 있을 것이라 생각됩니다. 

 

 

0461dd20a1f8b52e13fa0ac668d6543c_1537090
 


1) 속도 측정 아두이노 소스코드 (iSYS-101)


int ledPin = 13;        // onboard LED

int sensorPin = 7;      // OC connected to digital Pin 7
int val = 0;            // variable to store the read value

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(sensorPin, INPUT_PULLUP);
}

void loop()
{
  val = digitalRead(sensorPin); //read the Sensor input pin
  if (val == 0)
  {
    digitalWrite(ledPin, HIGH);
    delay(1000);
  }
  else
  {
    digitalWrite(ledPin, LOW);
    delay(1000);
  }
}



아두이노 소스코드


1) 속도 측정 아두이노 소스코드 (IPM 165)


int v, vmax, pin =  7 ;

void  setup ()

{Serial.begin ( 9600 );

  pinMode (pin, INPUT);

}

 

void  loop ()

{ unsigned  long T;          // period in us 

 double f;                 // frequency in MHz 

 char s [ 20 ];               // output 

 string vmax = 0 ;                   // 

 Serial.println ( "ready" );  // trigger; 

 while (digitalRead (pin)); 

 while ( ! digitalRead (pin));

 for ( int i = 0 ; i <16 ; i ++ )      // 16 measurements (LCD) 

 {T =pulseIn (pin, HIGH) + pulseIn (pin, LOW);

  f = 1 / ( double ) T;           // f = 1 / T    

  v = int ((f * 1e6 ) /44.0 );     // 24 GHz radar 

  vmax = max (v, vmax);        // 

  slave pointer Serial.print ( ">" );       // 16 points (LCD)

 } 

 sprintf (s, "% 3d km / h" , vmax);

 Serial.println (s);        // output 

 delay ( 2000 );              // 2 seconds

}



 

2) 속도 측정 아두이노 소스코드 + 16x2 LCD 디스플레이  (IPM 165)


#include <LiquidCrystal.h>  

LiquidCrystal lcd ( 12 , 11 , 5 , 4 , 3 , 2 );

int v, vmax, pin =  7 ;

 

void  setup ()

{lcd.begin ( 16 , 2 );

  lcd.print ( "Arduino radar" );

  pinMode (pin, INPUT);

  pinMode ( 13 , OUTPUT);

}

 

void  loop ()

{ unsigned  long T;          // period in us 

 double f;                 // frequency in MHz 

 char s [ 20 ];               // output 

 vmax = 0 ;                   // 

 lcd.setCursor ( 0 , 1 ); lcd.print ( "Ready ..." );

 while (digitalRead (pin)); 

 while ( ! digitalRead (pin));

 for ( int i = 0 ; i <16 ; i ++ )     // 16 measurements (LCD)

 {T = pulseIn (pin, HIGH) + pulseIn (pin, LOW);

  f = 1 / ( double ) T;          // f = 1 / T    

  v = int ((f * 1e6 ) /44.0 );    // 24 GHz radar 

  vmax = max (v, vmax);       // 

  slave pointer lcd.setCursor (i, 1 ); lcd.print ( ">" );

 } 

 sprintf (s, "% 3d km / h" , vmax);

 lcd.setCursor ( 0 , 0 );

 lcd.print ( "Measured" ); lcd.print (s);

 lcd.setCursor ( 0 , 1 ); lcd.print ( "===============" );

 delay ( 2000 );             // 2 seconds

}

 

3) 모션 감지 아두이노 코드  (IPM 165)

 

#define LED 13

#define PIN 7

 

void  setup ()

{PinMode (PIN INPUT); pinMode (LED, OUTPUT);}

 

void  loop ()

{ while ( ! digitalRead (PIN)); while (digitalRead (PIN));

 delay ( 50 ); digital write (LED, HIGH);

 delay ( 4000 ); digitalWrite (LED, LOW); // 4 seconds

}

 

 

4) 모션 감지 아두이노 코드 + 블루투스 모듈  (IPM 165) 

 

#define LED 13

#define PIN 7

 

void  setup ()

{

 pinMode (PIN INPUT); 

 pinMode (LED, OUTPUT); 

 Serial.begin ( 9600 ); 

} 

 

void  loop ()

 

{ while ( ! digitalRead (PIN));

 while (digitalRead (PIN)); 

 delay ( 50 );

 Serial.println ( "This is the Arduino." ); 

 digital write (LED, HIGH); 

 delay ( 4000 );            // 2 seconds 

 digital write (LED, LOW); 

} 

 

5) 속도 측정 + 블루투스 모듈 (IPM 165)

 

int v, vmax, pin =  7 ;

 

void  setup ()

{Serial.begin ( 9600 );

 pinMode (pin, INPUT); pinMode ( 13 , OUTPUT);

}

 

void  loop ()

{ unsigned  long T;        // period in us 

 double f;               // frequency in MHz 

 char s [ 40 ];             // output 

 vmax = 0 ;                 // maximum value 

 while (digitalRead (pin)); while ( ! digitalRead (pin));

 digitalWrite ( 13 , HIGH);

 for ( int i = 0 ; i <5 ; i ++ )     // 5 measurements 

 {T = pulseIn (pin, HIGH) + pulseIn (pin, LOW);

  f = 1 / ( double ) T;         // f = 1 / T    

  v = int ((f * 1e6 ) /44.0 );   // 24 GHz radar 

  vmax = max (v, vmax);      // slave pointer

 }

 // For the smartphone via HC06-Bluetooth 

 sprintf (s, "Maximum speed:% 3d km / h" , vmax);

 Serial.println (s);      // output 

 delay ( 4000 );            // 4 seconds 

 digitalWrite ( 13 , LOW);   

}

 

 

 

메카리워즈 Image Map


모바일 버전으로 보기