Датчик расстояния HC-SR04 и Arduino UNO R3

Posted by

Задача: Разобрать самим как подключить датчик расстояния HC-SR04 к

датчик расстояния HC-SR04Датчик расстояния который у меня в наличии HC-SR04 посредством него я смогу определять расстояние до какого либо объекта.

  • Какова его дальность?
  • Как его подключить к Arduino UNO R3
  • И какой скетч нужно использовать чтобы визуализировать работу, ведь мало того, что разобравшись с подключением, нужно же как-то увидеть плод своего труда.

IDE система для Arduino запускаемая на Ubuntu Trusty Desktop моего домашнего ноутбука.

Не спорю, что я все ниже указанное придумал сам, я всего лишь осваиваю уже сделанное(учусь), а не повторяя за кем-то вот так с наскоку в неизвестной мне области микроэлектронике увы я не смогу разобрать.

Ну что ж поехали:

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

Как работает датчик расстояния HC-SR04Диаграмма направленности

Диаграмма направленности датчика расстояния HC-SR04

  • Напряжение питания: 5V DC
  • Ток покоя: 2mA
  • Ток работы: 15mA
  • Угол наблюдения: <30°
  • Эффективный угол: <15°
  • Диапазон измерения расстояния: 2–400 cm
  • Разрешение: 0.3 cm

Как я понял исходя из картинки работы:

датчик отправляет ping до направления с ножки TRIG длительностью 10 микросекунд с частотой в 40кГц

ждет отраженного сигнала на ножке Echo

если датчик получает отраженный сигнал, то на выводе Echo появляется логический ноль, а в момент отправки импульса становится значение 1

следующий импульс идет только после того как сигнал вернулся — это время называется периодом цикла (cycle period)

измеряет расстояние по формуле: S (расстояние) = V (скорость) * T (время)

Как я подключаю:

Схема подключения датчика растояния HC-SR04 к Arduino UNO R3

датчик HC-SR04 GND (земля) — Arduino UNO R3 (Power: GND)

датчик HC-SR04 Echo () — Arduino UNO R3 (Цифровой вход: 11 порт)

  • датчик HC-SR04 Trig () — Arduino UNO R3 (Цифровой вход: 12 порт)
  • датчик HC-SR04 VCC () — Arduino UNO R3 (Power: 5V)

Теперь подключаю кабель USB (USB A — USB B) к плате Arduino UNO R3 и к ноутбуку.

Теперь разберу следующий скетч для получения дистанции от датчика до объекта, результат работы будет выведен на последовательный порт. Запускаю среду разработки Arduino: Приложения — Программирование — Arduino IDE

Теперь напишем скетч, определяющий расстояние до препятствия и выводящий его в последовательный порт. Сначала задаем номера выводов TRIG и ECHO – это 12 и 11 пины. Затем объявляем триггер как выход, а эхо – как вход. Инициализируем последовательный порт на скорости 9600 бод. В каждом повторении цикла loop() считываем дистанцию и выводим в порт.

const int trigPin = 12;

const int echoPin = 11;
void setup() {

pinMode(trigPin, OUTPUT); // триггер - выходной пин

pinMode(echoPin, INPUT); // эхо - входной

Serial.begin(9600); // инициализация послед. порта

}
void loop() {

long distance = getDistance(); // получаем дистанцию с датчика

Serial.println(distance); // выводим в последовательный порт

delay(100);

}
// Определение дистанции до объекта в см

long getDistance() {

long distacne_cm = getEchoTiming() * 1.7 * 0.01;

return distacne_cm;

}
// Определение времени задержки

long getEchoTiming() {

digitalWrite(trigPin, LOW);

delayMicroseconds(2);

digitalWrite(trigPin, HIGH); // генерируем импульс запуска

delayMicroseconds(10);

digitalWrite(trigPin, LOW);

// определение на пине echoPin длительности уровня HIGH, мксек:

long duration = pulseIn(echoPin, HIGH);

return duration;

}

Функция getEchoTiming() генерирует импульс запуска. Она как раз создаёт тот 10-микросекундный импульс, который является триггером для начала излучения дальномером звукового пакета в пространство. Далее она запоминает время от начала передачи звуковой волны до прихода эха.

Функция getDistance() рассчитывает дистанцию до объекта. Из школьного курса физики мы помним, что расстояние равно скорость умножить на время: S = V×t Скорость звука в воздухе 340 м/сек, время в микросекундах мы знаем (переменная duratuion). Чтобы получить время duratuion в секундах, нужно разделить его на 1 000 000. Так как звук проходит двойное расстояние – до объекта и обратно – нужно ещё разделить результат пополам. Вот и получается, что расстояние до объекта S = 34000 см/сек × duration / 1 000 000 сек / 2 = 1,7 см/сек / 100, что мы и написали в скетче.

Операцию умножения микроконтроллер выполняет быстрее, чем операцию деления, поэтому: 100 я заменил на эквивалентное ×0,01. А как это определить?

После все еще находясь в среде разработки нажимаю «Проверить», так у меня ошибок нет, теперь «Загрузить» на запрос через какой последовательный порт произвести загрузку скетча указываю что через устройство: /dev/ttyACM0 и нажимаю OK.

Если скетч загружен, то должна быть надпись «Загрузка выполнена». С этим у меня также нет проблем.

Чтобы проверить, а работает ли все выше указанное открываем из Arduino IDE окно вывода информации с последовательного порта: Сервис — Монитор порта и вот побежали циферки:

Датчик выводит результаты замеров на консоль в см

Направляя датчик или загораживая его ладонью, информация на последовательном порту будет изменяться.

Работает.

Теперь то же самое подключение датчика и Arduino, но с применением библиотеки, к примеру: библиотека

ekzorchik@navy:~$ wget http://robocraft.ru/files/sensors/Ultrasonic/HC-SR04/ultrasonic-HC-SR04.zip

ekzorchik@navy:~$ unzip ultrasonic-HC-SR04.zip

чтобы использовать данную библиотеку ее нужно поместить в каталог предустановленных библиотек среды разработки Arduino IDE:

ekzorchik@navy:~$ sudo updatedb

ekzorchik@navy:~$ locate libraries | grep arduino

библиотеки находятся в каталоге: /usr/share/arduino/libraries

ekzorchik@navy:~$ sudo mkdir /usr/share/arduino/libraries/ultrasonic

ekzorchik@navy:~$ sudo mv Ultrasonic/* /usr/share/arduino/libraries/ultrasonic/

Теперь сам скетч с ее применением, но сперва нужно очистить записанное в Arduino UNO R3, для этого создаем скетч вида: Файл — Создать

void setup(){};

void loop(){};

Нажимаю «Проверить» — «Загрузить».

Создаю новый скетч с применение библиотеки: Файл — Создать

#include <Ultrasonic.h> // подключаем библиотеку

Ultrasonic ultrasonic(12, 11); // Trig - 12, Echo - 11

void setup() {

Serial.begin(9600); // инициализация послед. порта

}

void loop() {

float dist_cm = ultrasonic.Ranging(CM); // дистанция в см

Serial.println(dist_cm); // выводим дистанцию в порт

delay(100);

}

Результат его работы тот же – в мониторе последовательного порта выводится дистанция до объекта в сантиметрах.

После все еще находясь в среде разработки нажимаю «Проверить», так у меня ошибок нет, теперь «Загрузить» на запрос через какой последовательный порт произвести загрузку скетча указываю что через устройство: /dev/ttyACM0 и нажимаю OK.

Если скетч загружен, то должна быть надпись «Загрузка выполнена». С этим у меня также нет проблем.

Чтобы проверить, а работает ли все выше указанное открываем из Arduino IDE окно вывода информации с последовательного порта: «Сервис» — «Монитор порта» и вот побежали циферки:

Посредством библиотеки ultrasonic.h расстояние получается быстрее чем написания кода с нуля

Это значения в сантиметрах.

Из библиотеки ultrasonic.h

  • CM — это сантиметры
  • INC — это дюймы

Если в скетче написать float dist_cm = ultrasonic.Ranging(INC); – дистанция будет отображаться в дюймах.

Преимущество использования библиотеки в том, что количество кода значительно сокращается и улучшается читаемость программы, вам не приходится вникать в тонкости работы устройства и вы сразу же можете его использовать. Но в этом же кроется и недостаток: вы хуже понимаете, как работает устройство и какие в нём происходят процессы. А потому важно не только разбирать примеры из интернета, но также и не лениться посмотреть что есть в библиотеках, какие там комментарии, почитать отдельно про данную библиотеку, составить свои вопросы и найти на них ответы.

А теперь мои вопросы к разобранному выше:

  • а как узнать какие аргументы у функции за что отвечают
  • если ли справка на использование библиотеки

В каталоге с самой библиотекой нашел пример с комментариями, что нога от датчика HC-SR04

  • Trigподключение к 12 порту от датчика к плате Arduino
  • Echoподключение к 13 порту от датчика к плате Arduino

Serial.begin(9600) → подключение к последовательному порту Arduino через интерфейс /dev/ttyACM0 на скорости 9600

В библиотеки ultrasonic.h предопределены параметры:

  • #define CM 1 → это сантимерты
  • #define INC 0 → это дюймы
  • float dist_cm = ultrasonic.Ranging(CM) → получение дистанции в сантиметрах
  • Serial.println(dist_cm) → вывод полученной дистанции

Также в каталоге /libraries/ultrasonic присутствуют примеры, к примеру пример UltrasonicDemo.pde в нем описано, как подключить датчик дисплей и Arduino в месте, чтобы измеряемое расстояние выводилось не на «Монитор порта», а на подключенный дисплей.

Вот так вот, сколько всего нового я узнал погрузившись в интересуемое. У Вас все будет точно также если захотите. А пока у меня всё, с уважением автор блога Олло Александр aka ekzorchik.