Ультразвуковые датчики в настоящее время находят применение во многих приложениях: обнаружение препятствий, измерение расстояние, мониторинг глубин и многое другое. А такие варианты ультразвуковых датчиков как SR04T и SR04M, помещенные в водонепроницаемый корпус, позволяет им работать в жестких погодных условиях и даже под водой. По функционалу в ряде вещей они также превосходят обычный ультразвуковой датчик HC-SR04.
В данной статье мы рассмотрим подключение водонепроницаемого ультразвукового датчика SR04T/SR04M к плате Arduino для измерения расстояния до препятствия. В статье также достаточно подробно описаны принципы работы данного датчика.
Подключение аналогичного датчика к плате Arduino мы уже рассматривали ранее на нашем сайте, но эта статья является более свежей и значительно более подробной.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Ультразвуковой датчик SR04T/SR04M (купить на AliExpress).
Принципы работы модуля ультразвукового датчика SR04T/SR04M
Распиновка датчика SR04T/SR04M
Распиновка датчика SR04T/SR04M показана на следующем рисунке. Он имеет 6 контактов: RST, 5V, RX, TX, GND и SWIM. Используются из них только 4, контакты SWIM и RST не используются.
Назначение контактов датчика SR04T/SR04M
5V – контакт подачи питания на модуль датчика. Мы будем подавать на него 5V.
RX – триггерный контакт датчика. Чтобы запустить датчик в работу на него необходимо подать импульс длительностью 10 мкс.
TX – выходной контакт датчика. После подачи на триггерный контакт датчика запускающего импульса датчик испускает в пространство ультразвуковую волну и после ее отражения от препятствия формирует на своем выходном контакте импульс, длительность которого равна времени распространения ультразвуковой волны до препятствия и обратно.
GND – контакт общего провода (земли) датчика, используется в качестве второго провода подачи питания на датчик.
SWIM – не используется.
RST – не используется.
Как работает водонепроницаемый ультразвуковой датчик
Ультразвуковые датчики испускают в пространство звуковые волны такой высокой частоты, которую не может услышать человеческое ухо. После этого они ждут когда отраженная от препятствия волна вернется к ним обратно, и принимают ее. На основе времени распространения волны до препятствия и обратно можно, зная скорость звука в воздухе, рассчитать расстояние до препятствия. Фактически, работа ультразвукового датчика очень похожа на работу радара, который обнаруживает и измеряет расстояние до объектов с помощью радиоволн. Принцип работы ультразвукового датчика показан на следующем рисунке.
Водонепроницаемый ультразвуковой датчик SR04T/SR04M испускает в окружающее пространство ультразвуковую волну частотой 40 кГц. После приема отраженного от препятствия сигнала он усиливается операционным усилителем в составе модуля датчика и затем обрабатывается встроенным микроконтроллером STM8, который и формирует результирующий импульс на выходе датчика (echo pin). Длительность этого импульса равна времени распространения ультразвуковой волны до препятствия и обратно.
Если мы обозначим время распространения ультразвуковой волны до препятствия и обратно как “T”, мы получим следующую формулу для расчета расстояния до препятствия:
Компоненты датчика SR04T/SR04M
Компоненты ультразвукового датчика SR04T/SR04M показаны на следующем рисунке.
Микроконтроллер STM8
Это основной микроконтроллер модуля датчика, который производит обработку сигналов и управляет режимами работы датчика. Данный микроконтроллер также формирует частоту 40 кГц, необходимую для работы датчика.
Операционный усилитель LMV324
Микросхема операционного усилителя LMV324 содержит 4 ступени усилителя, присутствующие на плате, которые каскадом соединены друг с другом для обработки отраженного от препятствия сигнала (Echo Signal). Эти 4 ступени усиления необходимы в связи с тем, что отраженный от препятствия сигнал часто бывает очень низкого уровня.
Cердечник трансформатора (Transformer Core)
Используется для преобразования прямоугольной волны 40 кГц к уровню напряжения, с которым работает модуль ультразвукового датчика. Может настраиваться пользователем для повышения точности считываемых значений.
Коннектор для подключения ультразвукового модуля (Ultrasonic Unit Connector)
Двухпиновый разъем (коннектор), который используется для подключения модуля к ультразвуковому блоку.
Джампер R27
Помещая в этот джампер различные значения резисторов мы можем управлять режимом работы ультразвукового модуля.
Наиболее часто задаваемые вопросы про ультразвуковой датчик
Где используется водонепроницаемый ультразвуковой датчик?
Данный датчик применяется для решения следующих задач:
1. В качестве устройства измерения расстояния по горизонтали.
2. Для предупреждения о подводных препятствиях.
3. Для управления трафиком (даже в условиях жестких погодных условий).
4. Измерения уровня жидкости в цистернах.
Какое рабочее напряжение у модуля датчика SR04T/SR04M?
Модули SR04T и SR04M имеют рабочее напряжение 5 Вольт.
Какое минимальное и максимальное расстояние способен измерять модуль ультразвукового датчика?
Минимальное измеряемое расстояние для водонепроницаемого ультразвукового датчика составляет 2,5 см, а максимальное – 4,5 метра.
С каким максимальным разрешением может работать ультразвуковой датчик?
Максимальное разрешение, которое может обеспечить ультразвуковой датчик, равно 0,5 см.
Схема датчика
Схема водонепроницаемого ультразвукового датчика SR04T/SR04M представлена на следующем рисунке.
Режимы работы модуля ультразвукового датчика SR04T/SR04M
Модуль ультразвукового датчика SR04T/SR04M может работать в 5 различных режимах, переключать которые можно с помощью джампера R27 на печатной плате модуля.
Режим 1: Standard Trigger Mode (R27 открыт) (стандартный режим)
В этом режиме модуль работает как и другие широко распространенные модули SR04, в котором для запуска модуля в работу необходим импульс длительностью 10 мкс. Ток в режиме ожидания в данном случае <2.5mA, а рабочий ток – 30mA.
Режим 2: Low Power Trigger Mode (R27 переключен на резистор 300kΩ) (режим с пониженной мощностью)
Данный режим похож на выше рассмотренный режим 1 (Standard Trigger Mode), отличие состоит лишь в том, что запускающий импульс (Trigger pulse) должен быть длительностью не менее 1 мс. В этом режиме значительно снижено потребление электроэнергии – <40uA в режиме ожидания.
Режим 3: Serial Port Automatic Mode (R27 переключен на резистор 120kΩ) (режим автоматической работы)
В этом режиме данные передаются в виде последовательных пакетов, запускающие импульсы в этом режиме не оказывают никакого влияния на работу модуля. Модуль автоматически испускает серию ультразвуковых импульсов с интервалом (периодом) 120 мс и передает данные на свой выходной контакт ECHO в форме последовательных пакетов. Средний потребляемый в этом режиме модулем ток составляет 5mA.
Режим 4: Serial Low Power Mode (R27 переключен на резистор 47kΩ) (последовательный режим с низкой потребляемой мощностью)
Этот режим является комбинацией стандартного режима (режим 1) и автоматического последовательного режима (режим 3). В этом режиме мы сначала подаем пакет последовательных данных на контакт TRIGGER датчика. Этот пакет данных ((0X01) запускает модуль в работу и модуль излучает серию ультразвуковых импульсов, после чего пользователю передается выходной сигнал на контакт ECHO в форме последовательных импульсов. После этого модуль переходит в режим пониженного энергопотребления, в котором потребляет ток 20uA.
Режим 5: Computer Printing Mode (R27 замкнут накоротко)
Данный режим похож на режим 4. В нем также последовательная команда (0X01) подается на модуль на контакт TRIG, после чего модуль испускает в окружающее пространство серию ультразвуковых импульсов. В этом режиме модуль автоматически рассчитывает расстояние в миллиметрах и передает закодированный в ASCII-коде пакет на свой выходной контакт ECHO. Это позволяет непосредственно использовать модуль с любым последовательным терминалом.
В данном проекте мы будем использовать режим, в котором модуль находится по умолчанию – это режим 1 (Mode 1).
Временные диаграммы работы модуля
Чтобы получить от ультразвукового датчика данные, мы сначала должны подать запускающий импульс длительностью 10 мкс на его контакт Trigger. При получении данного импульса датчик излучает в окружающее пространство 8 импульсов с частотой 40 кГц.
После этого датчик принимает отраженный от препятствия сигнал, обрабатывает его и формирует на своем контакте Echo импульс, длительность которого в точности равна времени распространения ультразвукового сигнала до датчика и обратно.
Мы с помощью платы Arduino считываем длительность этого импульса и на его основании, зная скорость звука в воздухе, рассчитываем расстояние до препятствия.
Схема проекта
Схема подключения водонепроницаемого датчика SR04T/SR04M к плате Arduino представлена на следующем рисунке.
Между платой Arduino и датчиком необходимо сделать следующие соединения:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Как следует из выше изложенного, нам в программе необходимо будет подавать импульс длительностью 10 мкс на контакт TRIGGER датчика и после этого измерять длительность импульса на его контакте ECHO. Для реализации этого функционала мы будем использовать библиотеку “NewPing”, которую можно установить выполнив следующую последовательность действий:
1. Откройте меню инструментов (Tools Menu) в Arduino IDE и выберите в ней менеджер библиотек (library manager).
2. В открывшемся менеджере библиотек выполните поиск библиотеки “NewPing” и после того как менеджер вам ее найдет, установите ее последнюю версию.
Использование библиотеки NewPing
Вначале в программе зададим контакты платы Arduino, которые будем использовать, а также объявим необходимые переменные. Дополнительно создадим объект для работы с ультразвуковым датчиком класса NewPing.
1 2 3 4 5 6 7 8 |
#include <NewPing.h> #define TRIGGER_PIN 3 #define ECHO_PIN 2 #define MAX_DISTANCE 400 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); float tempval1; float tempval2; int finalval; |
Функция Setup
В функции Void Setup() мы инициализируем последовательный порт для работы на скорости 57600 бод.
1 2 3 |
void setup() { Serial.begin(57600); } |
Функция Loop
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void loop() { delay(20); Serial.print("Ping: "); int iterations = 5; tempval1=((sonar.ping_median(iterations) / 2) * 0.0343); if(tempval1-tempval2>60 || tempval1-tempval2<-60) { tempval2=(tempval1*0.02 )+ (tempval2*0.98); } else { tempval2=(tempval1*0.4 )+ (tempval2*0.6); } finalval=tempval2; Serial.print(finalval); Serial.println("cm"); } |
1. Основную и самую важную часть операций нашей программы мы будем выполнять именно в этой функции.
2. Мы будем использовать функцию “sonar.ping_median()” чтобы получить 5 значений расстояния и потом вычислить их среднее значение – это позволит нам улучшить стабильность получаемых результатов.
3. Чтобы преобразовать полученное от датчика значение времени в значение расстояния нам нужно умножить его на 0.0343 (скорость звука в см/мкс) и затем взять половину полученного значения (поскольку датчик нам передал время распространения ультразвукового сигнала до препятствия и обратно).
4. Это значение мы будем сохранять во временной переменной “Tempval1”. Используемое значение мы будем хранить в переменной “Tempval2”.
5. При обновлении значений если разница между Tempval1 и Tempval2 будет существенна (>60 OR <-60) мы будем использовать меньший вес для нового считанного значения с датчика при расчете значения для переменной Tempval2.
6. Если разница между значениями мала мы будем рассчитывать Tempval2 при помощи добавления 40% нового значения с датчика (Tempval1) с 60% старого значения (Tempval2).
7. Все рассмотренные выше операции призваны сгладить флуктуации значений, которые могут возникнуть при работе датчика вследствие шумов различного происхождения.
8. В конце мы присваиваем значение переменной вещественного типа Tempval2 переменной целого типа Finalval, которую выводим в окно монитора последовательной связи с помощью команды Serial.print.
Пример вывода значений нашей программы в окно монитора последовательной связи показан на следующем рисунке.
Пример работы нашего проекта показан в следующем видео.
Если датчик работает как то странно и выдает некорректные показания попробуйте отрегулировать трансформатор, находящийся в левом верхнем углу модуля датчика как показано на следующем рисунке.
Исходный код программы (скетча)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#include <NewPing.h> #define TRIGGER_PIN 3 #define ECHO_PIN 2 #define MAX_DISTANCE 400 NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); float tempval1; float tempval2; int finalval; void setup() { Serial.begin(57600); } void loop() { delay(20); Serial.print("Ping: "); int iterations = 10; tempval1=((sonar.ping_median(iterations) / 2) * 0.0343); if(tempval1-tempval2>60 || tempval1-tempval2<-60) { tempval2=(tempval1*0.02 )+ (tempval2*0.98); } else { tempval2=(tempval1*0.4 )+ (tempval2*0.6); } finalval=tempval2; Serial.print(finalval); Serial.println("cm"); } |
Все необходимые файлы для проекта можно скачать по следующей ссылке.
3 132 просмотров
В этой плате есть маленький затык. На ней не впаян резистор по схеме R24, месторасположение которого рядом с местом резистора R25 определяющего режим работы ( резистор R27, про который говорит автор, на схеме отсутствует ). Так вот без резистора R24 работоспособность модуля под вопросом.
Вам попалась модификация датчика, в котором роль резистора R27 выполняет другой резистор? И даже если это так не может же быть неработоспособным датчик (если он только не бракованный с завода) который производится миллионами штук в год.
Здравствуйте! Спасибо большое за статью, отличная отправная точка для работы с датчиком. У меня возник вопрос, может чего-то не понимаю, почему на видео датчик показывает расстояние порядка 60 см, хотя на глаз по масштабам датчика и кисти расстояние составляет порядка 20 см?
Добрый день. Честно говоря, не знаю, видео ведь склеено из двух частей и нет же никаких гарантий что эти 2 части записывались одновременно
Почему в воде не показывает
Должен показывать, он же для этого и создан. Может быть, вам попался неисправный экземпляр датчика?
В воду отпускаешь перестает воздух показывает раньше и в воде и воздухе показывал
Ну может слегка бракованный экземпляр датчика вам попался или уронили вы его где-нибудь случайно, повредили
30 комплектов и все не работают
Да, это совсем тоска. Может с чем то другим тогда в схеме проблема. К другой плате попробовать подсоединить. Удаленно мне так сложно вам что то конкретное подсказать, к сожалению
Может прошивается как-то?
А вы во всех режимах его работу пробовали? У него же целых 5 режимов работы. Если в моей статье информации по ним вам не хватает, то вот здесь они подробно описаны - dronebotworkshop.com/waterproof-ultrasonic/. Также есть еще одна англоязычная статья хорошая на эту тему - makerguides.com/jsn-sr04t-arduino-tutorial/, вдруг программа из нее вам больше понравится. Ну а здесь - arduino.ru/forum/apparatnye-voprosy/dalnomer-aj-sr04m-ukroshchenie-stroptivogo, уже на русском можете прочитать про "мучения" одного из энтузиастов с этим датчиком
А почему бы не обойтись одной платой Ардуино и датчиком, без платы со вторым процессором СТМ?
Ведь любой Ардуино-процессор, наверное, и 40 кГц может выдать, и сигнал принять, и вычисления сделать.
Зачем это усложнение?
Так плата с микроконтроллером STM находится в составе модуля датчика, без нее данный датчик не выпускают. Не будете же вы готовый модуль разбирать чтобы выпаять из нее данную плату.
И, я думаю, решение о том, чтобы выпускать этот модуль именно с платой с микроконтроллером STM было принято не просто так потому что все подобные ультразвуковые датчики, которые я знаю, выпускаются точно также с этой платой