Рейтинг@Mail.ru
Модуль HC-SR04
Модуль HC-SR04

Как подключить ультразвуковой дальномер HC-SR04 к Arduino

2 комментарии Arduino
Print Friendly, PDF & Email
В этой статье мы подключим ультразвуковой дальномер-эхолокатор HC-SR04 к Arduino и научимся с помощью него определять расстояние до цели.

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

Нам понадобится:

1 Принцип действияультразвукового дальномера HC-SR04

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

Запуск звуковой волны начинается с подачи положительного импульса длительностью не менее 10 микросекунд на ножку TRIG дальномера. Как только импульс заканчивается, дальномер излучает в пространство перед собой пачку звуковых импульсов частотой 40 кГц. В это же время на ножке ECHO дальномера появляется логическая единица. Как только датчик улавливает отражённый сигнал, на выводе ECHO появляется логический ноль. По длительности логической единицы на ножке ECHO («Задержка эхо» на рисунке) определяется расстояние до препятствия.

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

Диапазон измерения расстояния дальномера HC-SR04 – до 4 метров с разрешением 0,3 см. Угол наблюдения – 30°, эффективный угол – 15°. Ток потребления в режиме ожидания 2 мА, при работе – 15 мА.

2Схема подключения датчика расстояния

Питание ультразвукового дальномера осуществляется напряжением +5 В. Два других вывода подключаются к любым цифровым портам Arduino, мы подключим к 11 и 12.

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

3Получение дистанции до объекта с датчика HC-SR04

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

const int trigPin = 12;
const int echoPin = 11;

void setup()  {
  pinMode(trigPin, OUTPUT); // триггер - выходной пин
  pinMode(echoPin, INPUT); // эхо - входной
  digitalWrite(trigPin, LOW);
  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, HIGH); // генерируем 10 мкс импульс запуска
  delayMicroseconds(10);  
  digitalWrite(trigPin, LOW);
  // определение на пине echoPin длительности уровня HIGH, мкс:
  long duration = pulseIn(echoPin, HIGH); 
  return duration;
}

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

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

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

4Библиотека для работы с эхолокатором HC-SR04

Также для работы с ультразвуковым дальномером написано множество библиотек. Например, вот эта библиотека Ultrasonic. Установка библиотеки происходит стандартно: скачать, разархивировать в директорию /libraries/, которая находится в папке с Arduino IDE. После этого библиотекой можно пользоваться.

Установив библиотеку, напишем новый скетч.

#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);
}

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

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

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

5 Подключение ультразвукового датчика HC-SR04 в режиме UART

В последнее время стали популярны ультразвуковые датчики HC-SR04 с цифровым интерфейсом. Эти датчики гораздо проще и удобнее в использовании. Они содеражт в своём составе какой-нибудь контроллер типа RCWL-9600, RCWL-9300 или аналогичные. Данные контроллеры поддерживают как аналоговый интерфейс, который мы рассмотрели в предыдущих разделах, так и цифровые: UART и I2C.

В приложении к статье можно скачать переведённое мной с китайского языка (привет, нейронки) руководство по работе с контроллером RCWL-9600. В нём описаны возможности данного контроллера, его технические характеристики, структурная схема и схема подключения. Также там описано, как вводить поправку на температуру окружающей среды (т.к. скорость звука зависит от температуры воздуха).

По умолчанию сенсоры с цифровым интерфейсом настроены на работу по аналоговому интерфейсу. Если ваш модуль HC-SR04 поддерживает цифровые интерфейсы, то на его обратной стороне будет следующая маркировка:

Модуль HC-SR04 с цифровыми интерфейсами, настроенный на работу по UART
Модуль HC-SR04 с цифровыми интерфейсами, настроенный на работу по UART

Обратите внимание на обозначения R4/IIC и R5/UART. Для перевода модуля в режим UART необходимо на посадочное место R5 установить резистор сопротивлением ~10 кОм (R4 не подключён). Для перевода модуля в режим IIC – на место R4 установить резистор номиналом ~10 кОм (R5 не подключён). Чтобы вернуться в аналоговый режим необходимо отпаять R4 и R5.

Кстати, резистор R3 отвечает за дальность работы сенсора HC-SR04. Если линейка 753 (номинал 75 кОм), то максимальная дистанция работы 4.5–5 метров, а если 563 (номинал 56 кОм), то до 4-х метров.

Когда резистор R5 припаян, можно подключать модуль к любому устройству, поддерживающему UART: хоть к Arduino, хоть к компьютеру. Для подключения к компьютеру подойдёт любой адаптер USB-UART (крайне дешёвые и распространённые устройства, которые мы уже неоднократно использовали в своих проектах). Я подключу через такой переходник к ПК. Соединим земли, питание 3.3 В, вывод Trig модуля подключим к TX переходника, вывод Echo – к RX переходника.

Подключение HC-SR04 по UART
Подключение HC-SR04 по UART

Теперь запустим любую терминалку (в которой можно отправлять данные в HEX) и подключимся на скорости 9600 бит/сек, без бита чётности, 8 бит данных, 1 стоповый бит (9600/8-N-1).

Считывание показаний HC-SR04 по UART
Считывание показаний HC-SR04 по UART

Управление состоит всего из двух шестнадцатеричных команд:

  • 0xA0 – возвращает 3 байта дистанции;
  • 0xF1 – возвращает информацию о производителе и версию.

Отправим команду A0. В ответ приходят 3 байта в следующем порядке: BYTE_H, BYTE_M, BYTE_L. Для перевода прочитанного значения в миллиметры: D = ((BYTE_H*256*256) + (BYTE_M*256) + BYTE_L) / 1000

Для примера давайте возьмём первые 3 байта со скриншота – 08 6A 38 – и воспользуемся приведённой формулой; получим 0x086A38/1000 = 551 мм или 55.1 см.

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

Теперь посмотрим, что датчик ответит на команду F1. Я обвёл на рисунке красной рамкой ответ модуля – массив из 34-х байтов. Чтобы понять, что тут пришло, воспользуемся программой преобразования кодировок. В нижнее поле введём пришедшие байты, выберем произвольную кодировку, нажмём значок лупы, в окне поиска введём "chin" и «примерим» различные китайские кодировки.

Определение версии модуля HC-SR04
Определение версии модуля HC-SR04

Видно, что упрщённая китайская вполне подходит: в верхней части окна появился текст, который очень похож на тот, который написан на каждой странице даташита. Очевидно, что это название компании, производящей данные модули (китайцы не стесняются использовать национальные иероглифы в своих продукатх), и версия самого модуля RCWL-9xxx.

Скетч Arduino для работы HC-SR04 в режиме UART может быть, например, такой:

const int BUFFER_SIZE = 3;
byte buf[BUFFER_SIZE]; // буфер для байтов BYTE_H, BYTE_M и BYTE_L

void setup() {
 Serial.begin(9600);
 while (!Serial) {
    ; // ждём инициализации последовательного порта
 }
}

void loop() {
  Serial.write(0xA0); // отправляем сенсору HC-SR04 команду запроса дальности
  delay(100); // даём сенсору вермя на измерение (пока вернётся эхо)
  if (Serial.available() >= BUFFER_SIZE) {
    int rlen = Serial.readBytes(buf, BUFFER_SIZE); // читаем показания
    float distance = (((long)buf[0]<<16) | ((long)buf[1]<<8) | (long)buf[2]); // считаем дальность
    distance /= 1000;
    Serial.println((String)distance + " mm"); // плохая идея выводить в тот же порт, куда подключён датчик
  }
}

Естественно, переменную distance необходимо где-то использовать; здесь это не показано.

6 Подключение ультразвукового датчика HC-SR04 в режиме IIC

Для перевода модуля HC-SR04 в режим IIC необходимо припаять на место R4 резистор сопротивлением около 10 кОм, как уже было сказано ранее. На месте R5 резистора быть не должно.

Подключение тут немного сложнее. Trig подключаем к SDA мастера I2C, Echo – к SCL мастера, питание и землю как и раньше. Плюс к этому каждую из линий – данных SDA и синхронизации SCL – следует подтянуть к питанию через резисторы номиналом примерно 4.7 кОм. Я воспользуюсь микросхемой FT2232H и программой "SPI via FTDI" для чтения показаний дистанции с датчика.

Подключение модуля HC-SR04 по I2C
Подключение модуля HC-SR04 по I2C

Запустим программу, переключимся в режим I2C. Сканером просканируем шину. Если всё подключено правильно, в программе появится одно устройство с адресом 87 (0x57). Это совпадает с информацией из руководства: адрес RCWL-9600 как раз 0x57. Выставим настройки, как на рисунке ниже.

Запуск измерений осуществляется подачей команды 0x01, а затем нужно вычитать те же 3 байта. Команду 0x01 следует подавать перед каждым чтением. Время между подачей команды и вычитыванием должно составлять как минимум 100 мс. Это время, необходимое сенсору HC-SR04 для отправки зондирующего импульса и получения эха.

Чтение дальности с модуля HC-SR04 по IIC
Чтение дальности с модуля HC-SR04 по I2C

В приложенном к статье руководстве RCWL-9600 приведены детальные диаграммы чтения и записи в режиме I2C. Пример временной диаграммы, снятой логическим анализатором, показан ниже.

Диаграмма чтения измерений модуля HC-SR04 по I2C
Диаграмма чтения измерений модуля HC-SR04 по I2C

Перевод в дистанцию точно такой же, как и в режиме UART. Например, перевод данных "08 D9 C8" со скриншота выше даёт 0x08d9c8/1000 = 580 мм или 58 см.

Рекомендую скачать datasheet RCWL-9600 (см. вложение) и ознакомиться с ним. Вообще говоря, найти его на просторах интернета непросто.

Скачать вложения:

Последнее изменениеСреда, 10 Январь 2024 19:46 Прочитано 53515 раз

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email

2 комментарии

  • Samurai
    Samurai 24.02.2020 08:01 Комментировать

    Как можно вывести монитор порта на сайт?

  • aave1
    aave1 24.02.2020 17:39 Комментировать

    Samurai, прошу прощения, я не понял вопроса. Что значит вывести монитор порта на сайт?

Оставить комментарий