Ультразвуковой датчик расстояния

В комплекте модуля «Датчики» Домашней Лаборатории имеется ультразвуковой датчик расстояния Devantech SRF04 или SRF05. SRF04/SRF05 - это только датчик, который напрямую информацию о расстоянии не выдает. У датчика помимо выводов питания имеется ещё вывод триггера и вывод эха. При настройке вывода триггера высоким датчик генерирует 8-периодную 40 kHz ультразвуковую волну. В этот момент вывод эха становится высоким и остается высоким до того времени, пока отображенная звуковая волна достигнет датчика.

Таким образом сигнал эха показывает время, в течение которого звук распространяется до объекта и обратно. Измерив это время, умножив его на скорость распространения и разделив на два, можно получить расстояние до объекта. Находящийся рядом график представляет связь между временем и сигналами, излучателя звуковой волны и эха. Для использования ультразвукового датчика Devantech с микроконтроллером AVR, нужно выводы триггера и эха соединить с какими-либо выводами AVR. Для измерения времени желательно использовать 16-битный таймер, к примеру,timer3. Далее приведена функция, которая производит всю процедуру измерения - генерирует сигнал триггера, запускает таймер, измеряет длину сигнала эха и переводит его в расстояние в сантиметрах. Функция блокирующаяся, т. е. процессор занят этим до тех пор, пока результат измерения не получен или измерение затягивается дольше разрешенного.

Чем быстрее эхо прибывает, тем быстрее получаем результат измерения. Если эхо не прибывает, то функция ждет этого ~36 ms и возвращает 0. Важно между измерением оставить паузу в несколько десятков миллисекунд, чтобы звуковая волна от предыдущего измерения успела затихнуть и не нарушила новое измерение. Если в одно время используется несколько ультразвуковых датчиков, то придется так же следить за тем, чтобы звуковые волны не перекрещивались. #define ULTRASONIC_S EED_OF_SOUND 33000 // cm/s//// Измерение ультразвука датчиком расстояния//unsigned short ultrasonic_measurepin trigger, pin echo// Установка выводовpin_setup_outputtrigger;pin_setup_input_with_pullupecho;// Таймер 3 в нормальный режим// c периодом F_C U / 8timer3_init_normalTIMER3_ RESCALE_8;// Вывод триггера высокимpin_settrigger;// Обнуление таймераtimer3_overflow_flag_clear;timer3_set_value0;// Ожидание ~10 uswhile timer3_get_value 18// Вывод триггера низкимpin_cleartrigger;// Ожидание начала сигнала эхаwhile! pin_get_valueecho// Слишком долго ожидается? if timer3_overflow_flag_is_setreturn 0;// Обнуление таймераtimer3_set_value0;// Ожидание конца сигнала эхаwhile pin_get_valueecho// Слишком долго ожидается? if timer3_overflow_flag_is_setreturn 0;// Перевод измеренного времени в расстояние// растояние = время * (1 / (F_C U / 8)) * скорость звука / 2return unsigned longtimer3_get_value *ULTRASONIC_S EED_OF_SOUND / F_C U / 4;Приведенная функция позволяет пользователю выбрать выводы триггера и эха так, чтобы датчик можно было подключить туда, где удобнее или где есть место.

Вдобавок, свобода выбора выводов дает возможность использовать функцию не только в комплекте Домашней Лаборатории.

Приведенная функция принадлежит библиотеке Домашней Лаборатории, что позволяет не записывать её отдельно в свою программу. Но следует учитывать, что в библиотеке Домашней Лаборатории эта функция жестко связана с тактовой частотой в 14,7456 Mhz модуля «Контроллер» Домашней Лаборатории и при других тактовых частотах функция даст неправильный результат. При другой тактовой частоте придется эту функцию писать самому в свою программу. Приведенный далее программный код демонстрирует использование ультразвукового датчика SRF04/SRF05 с библиотекой Домашней Лаборатории.

//// Пример программы ультразвукового датчика Домашней Лаборатории. // Функция измерения расстояния блокирующаяся. //#include stdio. h#include homelab/pin. h#include homelab/delay. h#include homelab/module/sensors. h#include homelab/module/lcd_alpha.

h//// Выводы ультразвукового датчика//pin pin_trigger = ING, 1;pin pin_echo = ING, 0;//// Основная программа//int mainvoidunsigned short distance;char text16;// Настройка LCD экранаlcd_alpha_initLCD_AL HA_DIS _ON;// Очистка LCD экранаlcd_alpha_clear;// Название программыlcd_alpha_write_stringУльтразвук;.