Для беcконтактного измерения расстояния существует много различных способов, но
все они основаны на отражении звуковой или электромагнитной волны от предмета,
до которого измеряется расстояние. Мы рассмотрим ультразвуковой способ
измерения, основанный на отражении ультразвуковой волны от объекта, на примере
распространенного ультразвукового датчика HC-SR04
Модуль ультразвукового датчика HC-SR04 обеспечивает бесконтактное измерение
расстояния до объекта от 2 до 400 см, с точностью до 3 мм. Модуль включает
в себя ультразвуковой передатчик, приемник и схему управления. Основной принцип
работы:
На вход датчика подается управляющий импульс высокого уровня длительностью
не менее 10 мкс.
Модуль автоматически отправляет восемь импульсов частотой 40 кГц и
определяет, есть ли отраженный сигнал.
Если сигнал вернулся обратно, то на выходе устанавливается высокий уровень,
длительностью пропорционально расстоянию до объекта.
Измеренное расстояние = (время высокого уровня * скорость звука (340 м/с) / 2
Временная диаграмма показана ниже. Вам нужно только подать короткий импульс
10 мкс на триггерный вход для запуска измерения, а затем модуль отправит
8 ультразвуковых импульсов (40 кГц) и примет отраженный сигнал.
Ширина импульса на выходе датчика (Т) пропорционально расстоянию.
Согласно приведенной выше формуле
Дистанция (м) = Т (с) * 340 (м/с) / 2;
Так как Т измеряется в микросекундах, а расстояние мы измеряем в сантиметрах,
то можно записать:
Дистанция (см) = Т (мкс) * 0.034 (см/мкс) / 2 = Т (мкс) * 0.017 (см/мкс);
Если записать в виде обыкновенной дроби, то получим:
Дистанция (см) = Т (мкс) * 17/1000 ≈ T/58
Так как датчик позволяет измерять расстояние до 400 см, не трудно посчитать что
максимальная ширина выходного импульса будет примерно 24 мс, а с учетом
ширины управляющего импульса и отправляемых импульсов цикл измерения составляет
не более 30 мс, но на практике, рекомендуется делать измерения с интервалом
более 60 мс, чтобы не возникло накладок между сигналом запуска к эхо-сигналом.
Подключим датчик HC-SR04 к плате Arduino:
Напишем программу, которая будет выводить в монитор измеренное расстояние:
void setup() {
Serial.begin (9600);
pinMode(12, OUTPUT);
pinMode(11, INPUT);
}
void loop() {
int distance; // переменная, в которой будет храниться измеренное расстояние
digitalWrite (12, 1); //
delayMicroseconds(10); // формируем на выводе 12 управляющий импульс длительностью 10 мкс
digitalWrite (12, 0); //
distance = pulseIn(11, HIGH)/58; // измеряем ширину импульса поступающего на 11 вывод и сразу переводим в сантиметры
Serial.print(distance); // выводим измеренное расстояние в монитор порта
Serial.println("cm");
delay(1000); // просто подождем секундочку :)
}
Как работает программа понятно из комментариев, сначала мы формируем импульс
длительностью 10 мкс на выводе 12, с которого этот импульс поступает на вход
TRIG датчика, а с выхода датчика ECHO импульс попадает на вывод 11, с которого
функцией pulseIn() считываем его длительность. Преобразовав длительность
импульса в расстояние в сантиметрах (разделив значение на 58) - выводим его
в монитор порта. Меняя расстояние до объекта в программе, можно увидеть как
меняется значение в мониторе порта:
Количество строк кода можно существенно уменьшить, используя библиотеку,
например библиотеку SR04.h
Математические функции
min(), max(), abs(), constrain(), map(), pow(), sq(), sqrt()
Функция min(x,y) возвращает меньшее из двух сравниваемых значений.
Функция max(x,y) возвращает большее из двух сравниваемых значений.
Функция abs(x) возвращает модуль числа.
Функция constrain(x,a,b) проверяет и если надо задает новое значение,
так чтобы оно была в области допустимых значений, заданной параметрами.
Например, возвращает x, если x входит в область допустимых значений [a..b].
Возвращает a, если x меньше a или возвращает b, если x больше b.
Функция map(x, fromLow, fromHigh, toLow, toHigh) пропорционально
переносит значение (x) из текущего диапазона значений (fromLow .. fromHigh) в
новый диапазон (toLow .. toHigh).
Функция pow(x,y) вычисляет значение (x) возведенное в заданную степень (y).
Функция pow() может возводить в дробную степень.
Функция sq(x) возвращает квадрат числа, заданного параметром.
Функция sqrt(x) возвращает квадратый корень числа, заданного параметром.