====== Ультразвуковой датчик расстояния ====== //Необходимые знания: [HW] [[et:hardware:homelab:sensor]], [HW] [[et:hardware:homelab:lcd]], [AVR] [[et:avr:timers]], [LIB] [[et:software:homelab:library:timer]], [LIB] [[et:software:homelab:library:module:lcd_alphanumeric]], [LIB] [[et:software:homelab:library:module:sensor]], [PRT] [[et:examples:timer:hardware_delay]]// ===== Теория ===== [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_srf04.jpg?160|Ультразвуковой датчик расстояния SRF04}}] Ультразвуковой датчик расстояния определяет расстояние до объекта, измеряя время отображения звуковой волны от объекта. Частота звуковой волны находится в пределах частоты ультразвука, что обеспечивает концентрированное направление звуковой волны, так как звук с высокой частотой рассеивается в окружающей среде меньше. Типичный ультразвуковой датчик расстояния состоит из двух мембран, одна из которых генерирует звук, а другая регистрирует отображенное эхо. Образно говоря, мы имеем дело со звуковой колонкой и микрофоном. Звуковой генератор создает маленький, с некоторым периодом ультразвуковой импульс и запускает таймер. Вторая мембрана регистрирует прибытие отображенного импульса и останавливает таймер. От времени таймера по скорости звука возможно вычислить пройденное расстояние звуковой волны. Расстояние объекта приблизительно половина пройденного пути звуковой волны. [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_principle.png?280|Принцип работы ультразвукового датчика расстояния}}] У ультразвукового датчика расстояния в повседневной жизни множество применений. Их используют взамен измерительной рулетки в устройствах измерения расстояния, например в строительстве. Современные автомобили снабжены ультразвуковым датчиком и предупреждающим сигналом для защиты от наезда на стоящее позади препятствие. Помимо измерения расстояния они могут также регистрировать нахождение объекта в измеряемом диапазоне, к примеру, в опасной зоне производственных машин. Если излучатель и приемник ультразвука разделить, то можно измерять скорость потока текущего между ними вещества, потому что звуковая волна против течения распространяется медленнее, а по течению быстрее. ===== Практика ===== В комплекте модуля «Датчики» Домашней Лаборатории имеется ультразвуковой датчик расстояния Devantech SRF04 или SRF05. SRF04/SRF05 - это только датчик, который напрямую информацию о расстоянии не выдает. У датчика помимо выводов питания имеется ещё вывод триггера и вывод эха. При настройке вывода триггера высоким датчик генерирует 8-периодную 40 kHz ультразвуковую волну. В этот момент вывод эха становится высоким и остается высоким до того времени, пока отображенная звуковая волна достигнет датчика. Таким образом сигнал эха показывает время, в течение которого звук распространяется до объекта и обратно. Измерив это время, умножив его на скорость распространения и разделив на два, можно получить расстояние до объекта. Находящийся рядом график представляет связь между временем и сигналами, излучателя звуковой волны и эха. [{{ :examples:sensor:ultrasonic_distance:sensor_ultrasonic_signals.png?280|Сигналы SRF04}}] Для использования ультразвукового датчика Devantech с микроконтроллером AVR, нужно выводы триггера и эха соединить с какими-либо выводами AVR. Для измерения времени желательно использовать 16-битный таймер, к примеру, //timer3//. Далее приведена функция, которая производит всю процедуру измерения - генерирует сигнал триггера, запускает таймер, измеряет длину сигнала эха и переводит его в расстояние в сантиметрах. Функция блокирующаяся, т.е. процессор занят этим до тех пор, пока результат измерения не получен или измерение затягивается дольше разрешенного. Чем быстрее эхо прибывает, тем быстрее получаем результат измерения. Если эхо не прибывает, то функция ждет этого ~36 ms и возвращает 0. Важно между измерением оставить паузу в несколько десятков миллисекунд, чтобы звуковая волна от предыдущего измерения успела затихнуть и не нарушила новое измерение. Если в одно время используется несколько ультразвуковых датчиков, то придется так же следить за тем, чтобы звуковые волны не перекрещивались. #define ULTRASONIC_SPEED_OF_SOUND 33000 // cm/s // // Измерение ультразвука датчиком расстояния // unsigned short ultrasonic_measure(pin trigger, pin echo) { // Установка выводов pin_setup_output(trigger); pin_setup_input_with_pullup(echo); // Таймер 3 в нормальный режим // c периодом F_CPU / 8 timer3_init_normal(TIMER3_PRESCALE_8); // Вывод триггера высоким pin_set(trigger); // Обнуление таймера timer3_overflow_flag_clear(); timer3_set_value(0); // Ожидание ~10 us while (timer3_get_value() < 18) {} // Вывод триггера низким pin_clear(trigger); // Ожидание начала сигнала эха while (!pin_get_value(echo)) { // Слишком долго ожидается? if (timer3_overflow_flag_is_set()) { return 0; } } // Обнуление таймера timer3_set_value(0); // Ожидание конца сигнала эха while (pin_get_value(echo)) { // Слишком долго ожидается? if (timer3_overflow_flag_is_set()) { return 0; } } // Перевод измеренного времени в расстояние // растояние = время * (1 / (F_CPU / 8)) * скорость звука / 2 return (unsigned long)timer3_get_value() * ULTRASONIC_SPEED_OF_SOUND / (F_CPU / 4); } Приведенная функция позволяет пользователю выбрать выводы триггера и эха так, чтобы датчик можно было подключить туда, где удобнее или где есть место. Вдобавок, свобода выбора выводов дает возможность использовать функцию не только в комплекте Домашней Лаборатории. Приведенная функция принадлежит библиотеке Домашней Лаборатории, что позволяет не записывать её отдельно в свою программу. Но следует учитывать, что в библиотеке Домашней Лаборатории эта функция жестко связана с тактовой частотой в 14,7456 Mhz модуля «Контроллер» Домашней Лаборатории и при других тактовых частотах функция даст неправильный результат. При другой тактовой частоте придется эту функцию писать самому в свою программу. Приведенный далее программный код демонстрирует использование ультразвукового датчика SRF04/SRF05 с библиотекой Домашней Лаборатории. // // Пример программы ультразвукового датчика Домашней Лаборатории. // Функция измерения расстояния блокирующаяся. // #include #include #include #include #include // // Выводы ультразвукового датчика // pin pin_trigger = PIN(G, 1); pin pin_echo = PIN(G, 0); // // Основная программа // int main(void) { unsigned short distance; char text[16]; // Настройка LCD экрана lcd_alpha_init(LCD_ALPHA_DISP_ON); // Очистка LCD экрана lcd_alpha_clear(); // Название программы lcd_alpha_write_string("Ультразвук"); // Маленькая пауза sw_delay_ms(100); // Бесконечный цикл while (true) { // Измерение distance = ultrasonic_measure(pin_trigger, pin_echo); // Измерение удалось? if (distance > 0) { // Перевод расстояния в текст sprintf(text, "%d cm ", distance); } // При измерении произошла ошибка? else { // Текст ошибки sprintf(text, "Ошибка "); } // Отображение текста в начале второго ряда LCD lcd_alpha_goto_xy(0, 1); lcd_alpha_write_string(text); // Маленькая пауза sw_delay_ms(500); } }