Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

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

Ультразвуковой датчик расстояния HC-SR04
Скетч без использования библиотек
Библиотека NewPing

Ультразвуковые датчики расстояния широко применяются в робототехнике из-за своей относительной простоты, приемлемой точности и доступности. Датчики являются "глазами" робота и помогают объезжать препятствия, получать размеры предметов, моделировать карту помещения и сигнализировать о приближении или удалении объектов. Летающий дрон использует дальномер для полётов над землёй на заданной высоте. Также можно построить карту помещения, применив специальный алгоритм SLAM.

Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая импульсы ультразвука частотой 40 кГц и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Подобный способ используют летучие мыши (коты услышали знакомое слово). Ультразвуковые сигналы, генерируемые приёмником, отражаясь от препятствия, возвращаются к нему через определённый промежуток времени. Этот временной интервал становится характеристикой, помогающей определить расстояние до объекта.

Sonar

Датчик не реагирует на солнечный свет или чёрные предметы, но может давать ложные показания от ткани или тонких предметов, включая пористые материалы типа поролон.

Датчик не подходит для определения расстояния до звукопоглощающих объектов, в частности пушистых котов. Оптимальными для измерения являются предметы с ровной гладкой поверхностью.

Если сравнивать ультразвуковые и лазерные дальномеры, то у каждого из них есть свои преимущества и недостатки. Ультразвуковой датчик хорошо видит перед собой и может обнаружить тонкую ножку стула, в отличие от лазерного. Но для сканирования окружающей среды ультразвуковой датчик не очень хорош, так как даёт очень неточную и шумную картину. Также будут проблемы с измерением расстояния сверху с землёй с высокой травой. Кроме того, скорость звука не слишком высока (для обнаружения объекта на расстоянии 4 метра требуется около 24 микросекунд), что может быть критичным для объектов с большой скоростью, вы можете не успеть среагировать на стенку.

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

Популярная модель HC-SR04 доступна и проста в эксплуатации. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывают существенного воздействия электромагнитные излучения и солнечная энергия.

На передней части модуля расположено два ультразвуковых датчика, первый с надписью T (Transmiter) является передатчиком ультразвуковых волн (TCT40-16T), а второй с надписью R (Receive) служит приёмником отражённых ультразвуковых волн (TCT40-16R), по центру расположен выводной кварцевый генератор на 27 МГц.

HC-SR04

Технические характеристики

  • Напряжение питания: 5 В
  • Потребление тока в рабочем режиме: 15 мА
  • Потребление тока в пассивном состоянии: < 2 мА
  • Диапазон расстояний: 2–400 см
  • Точность: 0.3 см
  • Эффективный угол обзора: 15°
  • Рабочий угол наблюдения: 30°
  • Рабочая температура: 0°С … + 60°С
  • Габариты: 45мм×20мм×15мм

Подключение: Датчик оснащён четырьмя выводами (стандарт 2, 54 мм). Два стандартных вывода для питания и земли, вывод Trig подключается к цифровому пину Arduino в качестве сигнала входа, вывод Echo подключается к цифровому выводу Arduino в качестве сигнала вывода.


HC-SR04 | Arduino 
-----------------
    Vcc | 5V
   Trig | D   
   Echo | D
    Gnd | GND 
HC-SR04 Schema

Для получения данных используется следующий алгоритм:

На вывод Trig подаётся импульс длительностью 10 микросекунд. В датчике происходит преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед. Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приёмником R, что обеспечит наличие входного сигнала на выводе Echo. На стороне контроллера полученный сигнал следует перевести в расстояние. При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.

Точность датчика зависит от нескольких факторов:

  • Температура и влажность воздуха
  • Расстояние до объекта
  • Расположения относительно датчика

В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик, испуская волны и замеряя время до их возврата, не знает, в какой именно среде они будут распространяться и берёт для расчётов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.

Фактор расстояния до объекта важен, так как растёт вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.

Для повышения точности надо направлять датчик точно на объект, который должен находиться в рамках конуса диаграммы направленности.

HC-SR04

Для уменьшения ошибок и погрешности измерений следует усреднять значения (замеряем несколько раз, убираем резкие всплески, вычисляем среднее значение). С помощью датчиков влажности (например, 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

Для работы с датчиком расстояния есть несколько библиотек, доступных через менеджер библиотек. Среди них популярна библиотека NewPing (домашняя страница), которая имеет ряд полезных функций.

  • Позволяет работать с различными ультразвуковыми датчиками
  • Может работать с датчиком расстояния всего через один пин
  • Отсутствие отставания на 1 секунду при отсутствии пинга эха
  • Наличие цифрового фильтра для коррекции ошибок
  • Максимально точный расчёт расстояния

Поддерживает различные типы дальномеров: 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

Реклама