Ультразвуковой датчик расстояния HC-SR04 поможет мобильным роботам определять расстояния до объектов, объезжать препятствия и строить карту помещения. Дальномер также выступит в роли сенсора уровня воды, детектора движения или триггерам в охранных системах.
Общие сведения
Ультразвуковой дальномер измеряет расстояние между датчиком и объектом с помощью эхолокации. Передатчик излучает ультразвуковую волну на частоте, неуловимой человеческим слухом. Достигая препятствие, сигнал отражается и возвращается на эхо-приёмник. Зная время, за которое звук проходит от передатчика до приемника, рассчитывается расстояние до объекта.
Элементы платы
Ультразвуковой передатчик и приёмник
На модуле расположена пара ультразвуковых преобразователей сигналов.
- Передатчик (Transmitter)
AW8T40-16OA00
предназначен для передачи ультразвуковых волн в окружающее пространство. - Приёмник (Receive)
AW8R40-16OA00
предназначен для приёма отраженных ультразвуковых волн от предметов окружающего мира.
Ультразвуковой передатчик и приемник подключены к электронной обвязки модуля.
Электронная обвязка модуля
Электронная обвязка модуля выполнена на трёх чипах MAX232
, LM324
и EM78P153S
. На плате также распаян кварцевый резонатор на 8 МГц и обвязка из конденсаторов и резисторов.
Контакты подключения
Датчик расстояния подключается к управляющей электронике через группу из четырёх контактов.
Контакт | Функция | Подключение |
---|---|---|
GND | Земля | Подключите к земле микроконтроллера. |
ECHO | Контакт приёма сигнала | Подключите к пину ввода-вывода микроконтроллера. |
TRIG | Контакт отправки сигнала | Подключите к пину ввода-вывода микроконтроллера. |
VCC | Питание | Подключите к питанию микроконтроллера. |
Подробности работы
Давайте ещё раз более детально рассмотрим принцип работы ультразвукового дальномера.
Фаза | Действие | Линия TRIG | Линия ECHO |
---|---|---|---|
0 | Датчик в режиме ожидания. | 0 | 0 |
1 | Подайте стартовый импульс с внешнего контроллера на линию TRIG длительностью 10 мкс. | 1 | 0 |
2 | Датчик в режиме посылки звуковой волны. Через 250 мск датчик сгенерирует восемь импульсов на ультразвуковой передатчик (Transmitter). | 0 | 0 |
3 | Датчик в режиме приёма звуковой волны. По спаду последнего из восьми сгенерированных импульсов на передатчик, датчик устанавливает высокий уровень на линии ECHO и входит в режим приёма получения отраженной волны на ультразвуковой приёмник (Receive). | 0 | 1 |
4 | Датчик в режиме приёма звуковой волны.Если отражённая волна пришла на приёмник (Receive): после получения последнего импульса волны, датчик переходит в режим ожидания и устанавливает низкий уровень на линии ECHO . Время наличия высокого уровня на линии ECHO равно времени прохождения ультразвуковой волны от датчика до препятствия и обратно.Если в течении 38 мс датчик не принял отраженную волну: датчик переходит в режим ожидания и устанавливает высокий уровень на линии ECHO . | 0 | 1 |
Рекомендуется выдерживать паузу не менее 50 мс между двумя измерениями, т.к. отражённая волна первого измерения может отразиться от удалённых объектов и стать причиной искажения результатов второго измерения.
Примеры работы с Arduino
Библиотеки
Для поиска расстояния до объекта, необходимо вручную посылать и контролировать время отклика импульса. Но вы можете не задумываться о временных рамках, мы написали целых три библиотеки для упрощения работы с датчиком. Каждая библиотека имеет преимущества и недостатки.
Посылка и приём импульсов происходит программно.
- Преимущества:
- Совместимость со всеми платами 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;
Схема устройства с Trema Shield
Схема устройства через 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); }