цифровая электроника
вычислительная техника
встраиваемые системы

 



Демонстрация эффекта Доплера с помощью Arduino

Автор: Mike(admin) от 13-11-2023, 03:55

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


Демонстрация эффекта Доплера с помощью Arduino

Для того, чтобы продемонстрировать эффект Доплера, например, в классах физики, необязательно приобретать дорогостоящее оборудование. Его можно продемонстрировать с помощью Arduino и ультразвукового датчика.


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


После загрузки приведенного далее кода и включения установки результат будет отображен в плоттере последовательного монитора и может дать вам подобные изображения:


Демонстрация эффекта Доплера с помощью Arduino

Передатчик непрерывно посылает звук на частоте 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


Теги: Arduino, эффект Доплера




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий