도플러 효과
고등학교 물리 시간에 도플러 효과를 떠올리면, 흔히들 엠뷸런스를 생각하게 합니다.
멀리서 다가오는 사이렌소리가 가까이 오게 되면 점점 높은 소리로 변하다가 멀어져가면서 낮은 음으로 바뀝니다.
소리가 왜곡되는 것 같은 효과를 느낄 수 있죠. 이러한 현상을 도플러 효과의 예로 배웠습니다.
위의 그림에서 엠뷸런스가 정지해 있는 사람에게 가까이 오게 되면, 파장이 짧아지고 이에 따른 주파수(진동수)가 올라가게 됩니다.
이를 이용해서 속도를 측정할 수 있는데, 그 예로 스피드건을 대표적으로 들 수 있습니다.
스피드건은 레이더파를 발사하고, 이 레이더파가 차량에 반사되어 돌아오는 것을 측정합니다.
레이더파는 전자기파의 일종으로 보낼 때의 주파수와 반사되어 돌아오는 주파수를 비교하여 속도를 측정하게 됩니다.
예를 들어, 스피드건이 내보내는 주파수가 f 라고 가정하고, 전자기파의 속도는 빛의 속도인 c, 그리고 측정된 주파수의 차이가 Δf 라면, 자동차의 속도는 다음과 같습니다.
이러한 도플러 효과를 이용하여 속도를 측정할 수 있는 장비를 소개하면 다음과 같은 소자들이 있습니다.
https://goo.gl/PkkQSc
iSYS-101, IPM-165 : 제품 바로가기
아두이노 및 라즈베리파이와 연결해서 어렵지 않게 사용할 수 있는데, 자율주행자동차에 대한 교육 및 연구에서도 많이 활용할 수 있을 것이라 생각됩니다.
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); } |
최신댓글