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

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

Sensor Proximity HC-SR04 Info 1

Общие сведения

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

Sensor Proximity HC-SR04 Info 2

Элементы платы

Sensor Proximity HC-SR04 Annotation

Ультразвуковой передатчик и приёмник

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

  • Передатчик (Transmitter) AW8T40-16OA00 предназначен для передачи ультразвуковых волн в окружающее пространство.
  • Приёмник (Receive) AW8R40-16OA00 предназначен для приёма отраженных ультразвуковых волн от предметов окружающего мира.

Ультразвуковой передатчик и приемник подключены к электронной обвязки модуля.

Электронная обвязка модуля

Электронная обвязка модуля выполнена на трёх чипах MAX232LM324 и EM78P153S. На плате также распаян кварцевый резонатор на 8 МГц и обвязка из конденсаторов и резисторов.

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

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

КонтактФункцияПодключение
GNDЗемляПодключите к земле микроконтроллера.
ECHOКонтакт приёма сигналаПодключите к пину ввода-вывода микроконтроллера.
TRIGКонтакт отправки сигналаПодключите к пину ввода-вывода микроконтроллера.
VCCПитаниеПодключите к питанию микроконтроллера.

Подробности работы

Давайте ещё раз более детально рассмотрим принцип работы ультразвукового дальномера.

ФазаДействиеЛиния TRIGЛиния ECHO
0Датчик в режиме ожидания.00
1Подайте стартовый импульс с внешнего контроллера на линию TRIG длительностью 10 мкс.10
2Датчик в режиме посылки звуковой волны. Через 250 мск датчик сгенерирует восемь импульсов на ультразвуковой передатчик (Transmitter).00
3Датчик в режиме приёма звуковой волны. По спаду последнего из восьми сгенерированных импульсов на передатчик, датчик устанавливает высокий уровень на линии ECHO и входит в режим приёма получения отраженной волны на ультразвуковой приёмник (Receive).01
4Датчик в режиме приёма звуковой волны.Если отражённая волна пришла на приёмник (Receive): после получения последнего импульса волны, датчик переходит в режим ожидания и устанавливает низкий уровень на линии ECHO. Время наличия высокого уровня на линии ECHO равно времени прохождения ультразвуковой волны от датчика до препятствия и обратно.Если в течении 38 мс датчик не принял отраженную волну: датчик переходит в режим ожидания и устанавливает высокий уровень на линии ECHO.01
Sensor Proximity HC-SR04 Info 2

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

Примеры работы с Arduino

Библиотеки

Для поиска расстояния до объекта, необходимо вручную посылать и контролировать время отклика импульса. Но вы можете не задумываться о временных рамках, мы написали целых три библиотеки для упрощения работы с датчиком. Каждая библиотека имеет преимущества и недостатки.

Библиотека iarduino_HC_SR04

Посылка и приём импульсов происходит программно.

  • Преимущества:
    • Совместимость со всеми платами Arduino.
    • Дальномер можно подключать к любым выводам Arduino.
  • Недостатки:
    • Библиотека ждёт ответа от датчика, который может длиться до 38 мс.

Библиотека iarduino_HC_SR04_tmr

Посылка и приём импульсов происходит через аппаратный таймер — Timer2.

  • Преимущество:
    • Библиотека не ждёт ответа от датчика, который может длиться до 38 мс.
  • Недостатки:
    • Совместимость только с платами Arduino с ядром AVR: Uno, Leonardo, Mega, Nano и их аналоги.
    • Нельзя использовать ШИМ на контактах: 3 и 11
    • Нельзя подключить более четырёх дальномеров.
    • Нельзя работать с библиотеками которые так же используют аппаратный таймер — Timer2.

Библиотека iarduino_HC_SR04_int

Посылка и приём импульсов происходит через аппаратные прерывания.

  • Преимущество:
    • Библиотека не ждёт ответа от датчика, который может длиться до 38 мс.
  • Недостатки:
    • Совместимость только с платами Arduino, которые поддерживают прерывания.
    • Контакт ECHO нужно подключать только к тем выводам Arduino, которые поддерживают внешние прерывания. Контакт TRIG можно подключать к любому выводу Arduino.
    • Количество подключаемых датчиков ограничено количеством выводов с прерыванием.

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

Рассмотрим по одному примеру для каждой библиотеки.

Пример работы с iarduino_HC_SR04

Библиотека iarduino_HC_SR04 позволяет использовать любые платы Arduino. Для примера возьмём контроллер Arduino Uno.

Что понадобится

  • 1× Arduino Uno
  • 1× Дальномер HC-SR04
  • 1× Соединительные провода «папа-мама»
  • 1× Кабель USB

Схема устройства

Библиотека iarduino_HC_SR04 позволяет использовать для коммуникации с дальномером любые пины ввода-вывода. Для примера повесим контакты датчика расстояния TRIG и ECHO на пины контроллера 12 и 11.

 // Назначаем пины датчика расстояния
  constexpr uint8_t PIN_SENSOR_TRIG = 12;
  constexpr uint8_t PIN_SENSOR_ECHO = 11;
Sensor Proximity HC-SR04 Wiring 1.1

Схема устройства с Trema Shield

Sensor Proximity HC-SR04 Wiring 1.2

Схема устройства через ICSP-переходник

При коммуникации дальномера через ICSP-переходник, используйте инициализацию пинов ECHO и TRIG приведённую ниже.

// Назначаем пины датчика расстояния
  constexpr uint8_t PIN_SENSOR_TRIG = PIN_SPI_MISO;
  constexpr uint8_t PIN_SENSOR_ECHO = PIN_SPI_MOSI;

Программный код

 // Библиотека для работы с дальномером
  #include <iarduino_HC_SR04.h>
  
  // Назначаем пины датчика расстояния
  constexpr uint8_t PIN_SENSOR_TRIG = 12;
  constexpr uint8_t PIN_SENSOR_ECHO = 11;
  
  // Создаем объект для работы с дальномером
  // и передаем в него пины TRIG и ECHO
  iarduino_HC_SR04 sensor(PIN_SENSOR_TRIG, PIN_SENSOR_ECHO);
  
  void setup(){
    // Открываем Serial-порт
    Serial.begin(9600);
  }
  
  void loop(){
    // Вычисляем расстояние до объекта
    int sensorDistance = sensor.distance();
    // Выводим расстояние в Serial-порт
    Serial.print(sensorDistance);
    Serial.println(" cm"); 
    // Ждём 100 мс
    delay(100);
  }