Урок 7 — Подключаем HC-SR04 к Arduino. Библиотека NewPing

.Урок 7 — Подключаем HC-SR04 к Arduino. Библиотека NewPing

Ультразвуковой датчик HC-SR04 определения расстояния до предметов. Принцип роботы как у сонара, посылается пучок импульсов и получает отражения, и на основании задержки определяется расстояние до предмете. Так как датчик для определения расстояния основан на ультразвуки, он плохо работает для определения расстояния до звукопоглощающих предметов. Идеальными являются предметы с ровной и гладкой поверхностью например ПАНЕЛИ, ВАГОНКА ПВХ.

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

Описание ультразвукового дальномера HC-SR04

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

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры:

  • Рабочее напряжение
  • Сила тока в пассивном состоянии < 2 мА
  • Рабочий параметр силы тока – 15 мА
  • Измерительный угол — 30°
  • Обзорный угол — 15°

Ультразвуковой дальномер HC-SR04 имеет такие технические параметры

Контакты подключения:

  • Контакт питания +5В
  • Trig – выход сигнала входа
  • Echo – вывод сигнала выхода
  • GND – «Земля»


Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO

Схема подключения ультразвукового датчика HC-SR04 к Arduino UNO
Самой распространенной библиотекой для работы с датчиком HC-SR04 является NewPing. Описание и подледную версию можно найти на страничке проекта

подключения ультразвукового датчика HC-SR04 к Arduino UNO


Пример скетча который предложен на странице библиотеки NewPing


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
  Serial.begin(115200);
}
void loop() {
  delay(200);
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}


Откроем монитор Serial порта.

Откроем монитор Serial порта
Как видим датчик HC-SR04 работает но есть шум. Выводит через определенное время нулевые значения. Данный код можно улучшить.


#include <NewPing.h>
#define TRIGGER_PIN  12
#define ECHO_PIN     11
#define MAX_DISTANCE 200
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
float dist_3[3] = {0.0, 0.0, 0.0};   // массив для хранения трёх последних измерений
float middle, dist, dist_filtered;
float k;
byte i, delta;
unsigned long dispIsrTimer, sensTimer;
void setup() {
  Serial.begin(115200);
}
void loop() {
  if (millis() - sensTimer > 200) {                          // измерение и вывод каждые 50 мс
    // счётчик от 0 до 2
    // каждую итерацию таймера i последовательно принимает значения 0, 1, 2, и так по кругу
    if (i > 1) i = 0;
    else i++;
    dist_3[i] = (float)sonar.ping() / 57.5;                 // получить расстояние в текущую ячейку массива
    dist = middle_of_3(dist_3[0], dist_3[1], dist_3[2]);    // фильтровать медианным фильтром из 3ёх последних измерений
    delta = abs(dist_filtered - dist);                      // расчёт изменения с предыдущим
    if (delta > 1) k = 0.7;                                 // если большое - резкий коэффициент
    else k = 0.1;                                           // если маленькое - плавный коэффициент
    dist_filtered = dist * k + dist_filtered * (1 - k);     // фильтр "бегущее среднее"
   Serial.print("Ping: ");
  Serial.print(dist_filtered);
  Serial.println("cm");                // вывести
    sensTimer = millis();                                   // сбросить таймер
  }
}
// медианный фильтр из 3ёх значений
float middle_of_3(float a, float b, float c) {
  if ((a <= b) && (a <= c)) {
    middle = (b <= c) ? b : c;
  }
  else {
    if ((b <= a) && (b <= c)) {
      middle = (a <= c) ? a : c;
    }
    else {
      middle = (a <= b) ? a : b;
    }
  }
  return middle;
}

Как видим датчик HC-SR04 работает но есть шум


Данные стали более стабильные и немного точнее. Но идеальных значений не получить. Потому что значения зависит от расстояния измерения. Чем ближе предмет и более гладкая поверхность тем точнее будут измерения.


Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Вернуться в раздел: Уроки Arduino: Подключение датчиков и модулей к Arduino Дата публикации 19 ноября , 2018

Комментарии

Войдите или Зарегистрируйтесь И Вы сможете общаться на форуме и оставлять комментарии без капчи.

Mark
#3 Гость: Mark (29 марта, 2020 в 00:14)

А де умова щоб "пнути" таймер?)

Алексей
#2 Гость: Алексей (3 июня, 2019 в 20:56)

Я хоть дня 4 как чуть натаскался на ардуино, но не люблю я все эти вычисления в loop, мне кажется удобнее отдельной функцией это все вывести )и в loop уже перед проверками условий вызывать

Олег Богмат
#1 Гость: Олег Богмат (12 марта, 2019 в 19:43)

спасибо за ваш урок, пытаюсь совместить LCD экран от Nokia вот с этими библиотеками Adafruit-PCD8544 Adafruit-GFX

но пока безуспешно, буду очень благодарен если подскажите


Cлучайные товары

Посмотреть товар в Магазине »

Мы в соц сетях

Подпишись на канал Telegram

Portal-PK (Портал ПК) © 2015 - 2024
Разработка проектов
AT Block
DWIN Box