Эффект Доплера – кажущаяся разница между частотой, с которой звуковые или световые волны покидают источник, и частотой, с которой они достигают наблюдателя, вызванная относительным движением наблюдателя и источника волн. Это явление используется в астрономических измерениях, в исследованиях эффекта Мессбауэра, а также в радиолокации и современной навигации. Впервые описан (1842 г.) австрийским физиком Кристианом Допплером.

Для того, чтобы продемонстрировать эффект Доплера, например, в классах физики, необязательно приобретать дорогостоящее оборудование. Его можно продемонстрировать с помощью Arduino и ультразвукового датчика.
Точнее вам понадобится ультразвуковой передатчик (верхняя часть изображения с Arduino NANO, подключенном к бирюзовому кабелю) и ультразвуковой приемник (Arduino NANO, подключенный к красному кабелю). Вы можете приобрести модули отдельно или разобрать один из дешевых модулей HC-SR04, которые предназначены для измерения расстояния. Ультразвуковые модули имеют очень острый луч, поэтому им обоим приходится смотреть друг на друга. Для этого достаточно разрезать картон и придать ему форму рейки.
После загрузки приведенного далее кода и включения установки результат будет отображен в плоттере последовательного монитора и может дать вам подобные изображения:

Передатчик непрерывно посылает звук на частоте 40435 Герц. Когда мы начали приближать его к приемнику, частота, регистрируемая приемником, медленно выросла до 40441 Герц. Когда мы перестали двигать передатчик, все вернулось в норму. При обратном движении вместо холма мы получим долину. Программное обеспечение очень простое. Сначала ПО передатчика:
void setup() {
Serial.begin(115200);
Serial.println(__FILE__);
DDRB = B00000110;
TCCR1A = B10110010;
TCCR1B = B00011001;
byte ocr1a = 198;
ICR1 = 2 * ocr1a;
OCR1A = ocr1a;
OCR1B = ocr1a;
Serial.print("ICR1 = ");
Serial.println(ICR1);
Serial.print("freq = ");
Serial.println(F_CPU / ICR1);
}
void loop() {}
Выходы – контакт 9 и контакт 10 (push/pull), без подключения GND. Контакты 9 и 10 управляются Таймером 1, поэтому эти контакты нельзя изменить. Далее приемник:
void setup() {
Serial.begin(115200);
Serial.println(__FILE__);
Serial.flush();
initTimer();
}
void loop() {
long t = getTime();
float freq = 0.5 * F_CPU * flankenZuZaehlen / t;
float avg = mean(freq);
if (drucke++ > N) Serial.println(avg);
}
word getTime() {
byte countDown = flankenZuZaehlen;
byte a;
byte b = PINC;
do {
a = b;
b = PINC;
} while (a == b);
noInterrupts();
TCNT1 = 0;
while (countDown) {
b = PINC;
if (a != b) countDown--;
a = b;
}
interrupts();
return TCNT1;
}
void initTimer() {
TCCR1A = 0;
TCCR1B = 0b00000001;
DDRC = B11111110;
}
float mean(float w) {
summe = summe - buffer[zeiger];
buffer[zeiger] = w;
summe = summe + buffer[zeiger];
if (++zeiger >= N)zeiger = 0;
return summe / N;
}
Приемник должен быть подключен к GND и A0, но в программе можно определить любой другой контакт. Все просто.
© digitrode.ru