Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Ультразвуковой датчик расстояния HC-SR04
Скетч без использования библиотек
Библиотека NewPing
Ультразвуковые датчики расстояния широко применяются в робототехнике из-за своей относительной простоты, приемлемой точности и доступности. Датчики являются "глазами" робота и помогают объезжать препятствия, получать размеры предметов, моделировать карту помещения и сигнализировать о приближении или удалении объектов. Летающий дрон использует дальномер для полётов над землёй на заданной высоте. Также можно построить карту помещения, применив специальный алгоритм SLAM.
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая импульсы ультразвука частотой 40 кГц и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Подобный способ используют летучие мыши (коты услышали знакомое слово). Ультразвуковые сигналы, генерируемые приёмником, отражаясь от препятствия, возвращаются к нему через определённый промежуток времени. Этот временной интервал становится характеристикой, помогающей определить расстояние до объекта.
Датчик не реагирует на солнечный свет или чёрные предметы, но может давать ложные показания от ткани или тонких предметов, включая пористые материалы типа поролон.
Датчик не подходит для определения расстояния до звукопоглощающих объектов, в частности пушистых котов. Оптимальными для измерения являются предметы с ровной гладкой поверхностью.
Если сравнивать ультразвуковые и лазерные дальномеры, то у каждого из них есть свои преимущества и недостатки. Ультразвуковой датчик хорошо видит перед собой и может обнаружить тонкую ножку стула, в отличие от лазерного. Но для сканирования окружающей среды ультразвуковой датчик не очень хорош, так как даёт очень неточную и шумную картину. Также будут проблемы с измерением расстояния сверху с землёй с высокой травой. Кроме того, скорость звука не слишком высока (для обнаружения объекта на расстоянии 4 метра требуется около 24 микросекунд), что может быть критичным для объектов с большой скоростью, вы можете не успеть среагировать на стенку.
Популярная модель HC-SR04 доступна и проста в эксплуатации. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывают существенного воздействия электромагнитные излучения и солнечная энергия.
На передней части модуля расположено два ультразвуковых датчика, первый с надписью T (Transmiter) является передатчиком ультразвуковых волн (TCT40-16T), а второй с надписью R (Receive) служит приёмником отражённых ультразвуковых волн (TCT40-16R), по центру расположен выводной кварцевый генератор на 27 МГц.
Подключение: Датчик оснащён четырьмя выводами (стандарт 2, 54 мм). Два стандартных вывода для питания и земли, вывод Trig подключается к цифровому пину Arduino в качестве сигнала входа, вывод Echo подключается к цифровому выводу Arduino в качестве сигнала вывода.
HC-SR04 | Arduino
-----------------
Vcc | 5V
Trig | D
Echo | D
Gnd | GND
Для получения данных используется следующий алгоритм:
На вывод Trig подаётся импульс длительностью 10 микросекунд. В датчике происходит преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед. Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приёмником R, что обеспечит наличие входного сигнала на выводе Echo. На стороне контроллера полученный сигнал следует перевести в расстояние. При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Точность датчика зависит от нескольких факторов:
В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик, испуская волны и замеряя время до их возврата, не знает, в какой именно среде они будут распространяться и берёт для расчётов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.
Фактор расстояния до объекта важен, так как растёт вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.
Для повышения точности надо направлять датчик точно на объект, который должен находиться в рамках конуса диаграммы направленности.
Для уменьшения ошибок и погрешности измерений следует усреднять значения (замеряем несколько раз, убираем резкие всплески, вычисляем среднее значение). С помощью датчиков влажности (например, DHT11) можно определить температуру и влажность для внесения поправочных коэффициентов.
Можно запустить скетч без использования библиотек и самостоятельно делая необходимые вычисления.
// Используйте свои значения для выводов
int trigPin = 3;
int echoPin = 2;
void setup() {
Serial.begin (9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
int duration, distance;
// для большей точности установим значение LOW на пине Trig
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Теперь установим высокий уровень на пине Trig
digitalWrite(trigPin, HIGH);
// Подождем 10 микросекунд
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Узнаем длительность высокого сигнала на пине Echo
duration = pulseIn(echoPin, HIGH);
// Рассчитаем расстояние
distance = duration / 58;
// Выводим значение в Serial Monitor
Serial.print(distance);
Serial.println(" cm");
delay(100);
}
Для работы с датчиком расстояния есть несколько библиотек, доступных через менеджер библиотек. Среди них популярна библиотека NewPing (домашняя страница), которая имеет ряд полезных функций.
Поддерживает различные типы дальномеров: HC-SR04, SRF05, SRF06, DYP-ME007, JSN-SR04T, Parallax PING.
#include <NewPing.h>
// Используйте свои значения для выводов
#define PIN_TRIG 3
#define PIN_ECHO 2
#define MAX_DISTANCE 200 // Константа для определения максимального расстояния, которое мы будем считать корректным.
// Создаем объект, методами которого будем затем пользоваться для получения расстояния.
// В качестве параметров передаём номера пинов, к которым подключены выходы ECHO и TRIG датчика
NewPing sonar(PIN_TRIG, PIN_ECHO, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
}
void loop() {
// Стартовая задержка, необходимая для корректной работы.
delay(50);
// Получаем значение от датчика расстояния
unsigned int distance = sonar.ping_cm();
// Выводим в монитор порта
Serial.print(distance);
Serial.println(" см");
}
Купить на AliExpress