Как сделать ультразвуковой дальномер на hc-sr04 и arduino
Содержание:
- Введение
- Пример работы HC-SR04
- Step 6: Next, Try…
- Примеры использования датчика расстояния
- Step 2: Setup
- Step 2: Add Proximity Sensor
- 4Библиотека для работы с эхолокатором HC-SR04
- 4Калибровка ультразвукового дальномера
- Interfacing of Multiple Ultrasonic Sensor With Arduino
- Примеры использования датчика расстояния
- Шаг 3: теория
- Step 5: Build a Physical Circuit (Optional)
- Шаг 6: тестирование
- Датчик расстояния в проектах Arduino
- Выбор дальномера для подключения к arduino
- Примеры использования датчика расстояния
- Датчик уровня жидкости (Water Sensor Arduino)
- Скетч ультразвукового дальномера на arduino с помощью HC-SR04 и TM1637
- Краткие выводы
- Краткие выводы
Введение
В данной статье объясняется, как определить местоположение объекта с помощью Arduino, двух ультразвуковых датчиков и формулы Герона для треугольников. Движущихся частей в проекте нет.
Формула Герона позволяет рассчитать площадь любого треугольника, для которого известны все стороны. Как только вы узнаете площадь треугольника, вы сможете рассчитать положение одного объекта (относительно известной базовой линии), используя тригонометрию и теорему Пифагора.
Точность отличная. При использовании распространенных ультразвуковых датчиков HC-SR04 или HY-SRF05 возможны большие области обнаружения.
Конструкция проста: всё, что вам нужно, это острый нож, два сверла, паяльник и ножовка по дереву.
Изображения:
- видеоролик, показывающий работу устройства;
- фото 1 показывает собранный эхолокатор;
- на фото 2 показан типовой дисплей. Объект отображается красной (мигающей) точкой;
- на фото 3 показана тестовая установка, используемая на видео. Было необходимо установить два ультразвуковых датчика HY-SRF05 на 50 см ниже базовой линии, чтобы полностью «осветить» зону обнаружения со звуком.
Рисунок 1 – Собранный эхолокатор на двух датчиках и Arduino
Рисунок 2 – Скриншот экрана обнаружения объектаРисунок 3 – Тестовый стенд для проверки эхолокатора на Arduino
Пример работы HC-SR04
Для испытаний HC-SR04 написан небольшой код, который осуществляет измерение расстояния и выводит информацию на 7-сегментный индикатор TM1637, про который я уже писал.
Для измерения расстояния с помощью HC-SR04, необходимо сначала отправить сигнал, а потом получить его обратно и замерить время, за которое сигнал прошел туда и обратно, тем самым легко высчитать расстояние до препятствия. Зная, что скорость звука в воздухе составляет, примерно, 340 м/с, получаем скорость 0.034 м/мкс. Но так как, сигнал должен пройти туда и обратно, скорость будет в два раза медленней, то есть будет равна 0.017 м/мкс. Итого получаем, формулу: расстояние = время умножить на 0.017 и умножить на 10, чтобы перевести в миллиметры. Или можно перевести пропорцию к более читабельному виду: расстояние = время / 5.8
Step 6: Next, Try…
Congratulations! You have learned to detect distance using an ultrasonic sensor. You also learned about standalone functions in this lesson, and used and the serial monitor to track changes inside your Arduino. You could expand this project by making it a proximity alarm by adding a piezo buzzer that turns on when all three LEDs are lit up (closest distance). Consider swapping the distance sensor for a temperature sensor. Or add motors to create a robot with obstacle detection!
You can also learn more electronics skills with the free Instructables classes on Arduino, Basic Electronics, LEDs & Lighting, 3D Printing, and more.
Примеры использования датчика расстояния
Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.
Подключение датчика к ардуино
При написании скетча использовалась следующий вариант распиновки подключения датчика:
- VCC: +5V
- Trig – 12 пин
- Echo – 11 пин
- Земля (GND) – Земля (GND)
Пример скетча
Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.
В данном скетче мы выполняем такую последовательность действий:
- Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
- Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
- Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
- Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).
Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).
Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.
Скетч с использованием библиотеки NewPing
Теперь давайте рассмотрим вариант скетча с использованием библиотеки NewPing. Код существенно упростится, т.к. все описанные ранее действия спрятаны внутри библиотеки. Все, что нам нужно сделать – создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта. В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().
Пример подключения ультразвукового дальномера HC SR04 с одним пином
Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.
Step 2: Setup
The photo above shows the setup of the project. The jumper wires should be connected as follows: Connect a jumper wire from the 5 volt pin on the Arduino to the bottom channel of the breadboard Connect another jumper wire from a ground pin on the arduino to the upper channel of the breadboard Buzzer -> pin 3 (On Ultrasonic Sensor) Echo -> pin 6 Trig -> pin 7 (In Order from Right to Left) LED1 -> pin 8 LED2 -> pin 9 LED3 -> pin 10 LED4 -> pin 11 LED5 -> pin 12 LED6 -> pin 13 The jumper wires connected to the LEDs should be connected to the lead on the right, while the left lead of the LED should connected to the ground channel via a 330 ohm resistor.
Step 2: Add Proximity Sensor
Proximity sensors come in multiple flavors. Here in Tinkercad Circuits, you can choose between a three-pin sensor or a four-pin sensor. In general, ultrasonic rangefinders have one pin that connects to ground, another that
connects to 5 volts, a third for sending a signal, and a fourth for receiving a signal. The ‘send’ and ‘receive’ pins are combined into one pin on the three-pin flavor.
In the circuits editor, find the ultrasonic rangefinder in the components drawer. To find the four-pin sensor, view «All» in the components panel (using the dropdown menu).
Place the sensor on the breadboard to the left of the LEDs in row E, as shown in the figure.
Wire up the sensor so the 5V pin connects to the 5V voltage
rail, the GND pin connects to the ground rail, the SIG or TRIG pin to Arduino pin 7, and, if using the four-pin flavor, the ECHO pin connects to Arduino pin 6.
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); – дистанция будет отображаться в дюймах.
4Калибровка ультразвукового дальномера
После небольшого опыта использования данного прибора, выявилось, что измеренное расстояние отличается от действительного, причём чем больше расстояние от датчика до цели, тем больше отклонение. В связи с этим возникла необходимость в корректировке показаний дальномера.
Для этого я измерил на всём рабочем диапазоне датчика (от 0 до 400 см) расстояния и составил таблицу из двух столбцов: реальное расстояние и показания датчика. По этим данным построил график:
График отклонения показаний ультразвукового дальномера
Здесь зелёным цветом показан график для идеального дальномера, как должно быть, а красным – реального, который в моём случае занижает показания.
Зависимость получилась линейная. Прекрасно! Из курса геометрии мы помним, что уравнение прямой, проходящей через две точки: (x − x1)/(x2 − x1) = (y − y1)/(y2 − y1)
Подставив вместо x1, 2 и y1, 2 значения из таблицы и упростив выражение, я получил уравнение для графика измерений ультразвукового дальномера: y = 0,97x + 0,27
В уравнении прямой коэффициент 0,97 возле «икс» является тангенсом угла наклона прямой к оси абсцисс. Назовём его tg(α). Можно посчитать, что угол наклона прямой равняется 44,13 градусам (арктангенс от 0,97), а в идеальном случае он должен быть равен 45 градусам (и уравнение прямой идеального дальномера очень простое: y = x, то есть каждому измеренному числу соответствует точно такое же реальное расстояние). Постоянная 0,27 – это смещение графика относительно нуля по оси ординат.
Посмотрим на следующий рисунок. Видны два прямоугольных треугольника, приподнятые над осью OX. Один из катетов, назовём его h, треугольника с углом α равен измеренному дальномером расстоянию Rизм за вычетом константы b, равной 0,27. Катет другого треугольника равен реальному расстоянию Rреал. У обоих треугольников катеты h равны. Зная длину катета h и тангенс угла α (равный 0,97), мы узнаем реальное расстояние Rреал, поделив, длину катета h на tg(α),
Последовательность коррекции показаний ультразвукового дальномера
Таким образом, для того чтобы скорректировать ошибку при измерениях дальномера, нужно следовать формуле: Rреал = (Rизм − b) / tg(α) = (Rизм − 0,27) / 0,97 Обратите внимание, что это выражение можно было получить из предыдущего уравнения, выразив x через y. В вашем случае коэффициент и константа, естественно, будут отличаться
Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно
В вашем случае коэффициент и константа, естественно, будут отличаться. Эту коррекцию следует внести в скетч для Arduino. После этого ультразвуковой дальномер на датчике HC-SR04 будет показывать расстояние более точно.
Напоследок приведу видеодемонстрацию работы готового ультразвукового дальномера (до калибровки).
Interfacing of Multiple Ultrasonic Sensor With Arduino
- Let me first summarize the working of ultrasonic sensor again. With ultrasonic sensor, what we need to do is to generate a trigger signal on its trigger pin for around 10 microsecond.
- As soon as the ultrasonic sensor gets this trigger signal, it sends out an ultrasonic signal.
- This ultrasonic signal then hits something and bounced back.
- Now, in order to check this bouncing signal, we have to read the Echo pin and check for how long it remains HIGH, and on the basis of this duration we calculate our distance with the object.
- This is the process for single ultrasonic sensor and when we are using multiple ultrasonic sensors, what we need to do is simply repeat the whole procedure for all the sensors one by one.
- First of all, we will generate the trigger pulse for first sensor and the read its echo pin and get the distance, then we generate the trigger pulse for second sensor and read its echo pin and so on for the third.
- So, here I am gonna use three ultrasonic sensor and the circuit diagram is shown below:
- I have tried my best while designing this image to make it simple but as there are too much wires so it has become a little complex.
- I am pointing out the pin configuration here so it will be easy for you to interface your sensors with arduino. The pin configuration is as follows:
- Vcc of all sensors will go into +5V of Arduino.
- GND of all sensors will go into GND of Arduino.
- Trig Pin of first sensor into Pin # 3 of Arduino.
- Echho Pin of first sensor into Pin # 2 of Arduino.
- Trig Pin of second sensor into Pin # 4 of Arduino.
- Echo pin of second sensor into Pin # 5 of Arduino.
- Trig Pin of third sensor into Pin # 7 of Arduino.
- Echo pin of third sensor into Pin # 8 of Arduino.
- After connecting the pins as discussed above, now copy the below code and upload it in your arduino board.
- After uploading the code in your arduino, open the Serial Terminal of Arduino software and you will start receiving the distances for all the three sensors.
#define trigPin1 3 #define echoPin1 2 #define trigPin2 4 #define echoPin2 5 #define trigPin3 7 #define echoPin3 8 long duration, distance, RightSensor,BackSensor,FrontSensor,LeftSensor; void setup() { Serial.begin (9600); pinMode(trigPin1, OUTPUT); pinMode(echoPin1, INPUT); pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT); pinMode(trigPin3, OUTPUT); pinMode(echoPin3, INPUT); } void loop() { SonarSensor(trigPin1, echoPin1); RightSensor = distance; SonarSensor(trigPin2, echoPin2); LeftSensor = distance; SonarSensor(trigPin3, echoPin3); FrontSensor = distance; Serial.print(LeftSensor); Serial.print(" - "); Serial.print(FrontSensor); Serial.print(" - "); Serial.println(RightSensor); } void SonarSensor(int trigPin,int echoPin) { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; }
- The code is quite similar to the one we used while interfacing single ultrasonic sensor with arduino, the only thing we changed here is the repetition.
- Before, we were using the same function SonarSensor() but calling it only once for our single sensor interfaced with arduino but now we are calling it three times for all the three sensors.
- Its kind of a generic code, you can interface more sensors with it if you want and what you need to do is only calling this function for the next interfaced sensor.
Arduino Projects for Beginners
JLCPCB – Prototype 10 PCBs for $2 (For Any Color)China’s Largest PCB Prototype Enterprise, 600,000+ Customers & 10,000+ Online Orders DailyHow to Get PCB Cash Coupon from JLCPCB: https://bit.ly/2GMCH9w
Примеры использования датчика расстояния
Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.
Подключение датчика к ардуино
При написании скетча использовалась следующий вариант распиновки подключения датчика:
- VCC: +5V
- Trig – 12 пин
- Echo – 11 пин
- Земля (GND) – Земля (GND)
Пример скетча
Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.
В данном скетче мы выполняем такую последовательность действий:
- Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
- Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
- Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
- Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).
Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).
Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.
Скетч с использованием библиотеки NewPing
Теперь давайте рассмотрим вариант скетча с использованием библиотеки NewPing. Код существенно упростится, т.к. все описанные ранее действия спрятаны внутри библиотеки. Все, что нам нужно сделать – создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта. В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().
Пример подключения ультразвукового дальномера HC SR04 с одним пином
Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.
Шаг 3: теория
Рисунок 6 – Область обнаружения объектаРисунок 7 – Формулы
Диаграммы направленности лучей
На левом рисунке 6 выше показаны наложенные диаграммы направленности для преобразователя A и преобразователя B.
Датчик A получит эхо от любого объекта в «красной зоне».
Датчик B будет получать эхо, только если объект находится в «лиловой зоне». Вне этой зоны определить координаты объекта невозможно (целевая зона может быть полностью «освещена» звуком, если расположить датчики ниже базовой линии).
Большие «лиловые» зоны обнаружения возможны, если датчики расставлены широко.
Расчеты
Что касается правого рисунка 7 выше.
Площадь любого треугольника может быть вычислена по формуле:
\[площадь = основание \cdot высота/2 \qquad (1)\]
Преобразование уравнения (1) дает нам высоту (координату Y):
\[высота = площадь \cdot 2 / основание \qquad (2)\]
Пока всё хорошо… Но как мы вычислим площадь?
Ответ заключается в том, чтобы разместить два ультразвуковых преобразователя на известном расстоянии друг от друга (базовая линия) и измерить расстояние, на котором каждый датчик находится от объекта, используя ультразвук.
На рисунке 7 показано, как это сделать.
Преобразователь A посылает импульс, который отражается от объекта во всех направлениях. Этот импульс слышат оба преобразователя, и A, и B. Преобразователь B не передает импульсов, он только слушает.
Обратный путь к преобразователю A показан красным цветом. Если разделить его на два и учесть скорость звука, мы можем рассчитать расстояние d1 с помощью формулы:
\[d1 _{(см)} = время_{(микросекунды)}/59 \qquad (3)\]
Значение 59 для константы получается следующим образом:
- Скорость звука составляет примерно 340 м/с, что составляет 0,034 см/мкс (сантиметр/микросекунда).
- Обратное значение 0,034 см/мкс составляет 29,412 мкс/см, которое при умножении на 2 (чтобы получить длину обратного пути) дает в результате 58,824 или 59 при округлении.
- Это значение можно подстроить вверх/вниз, чтобы учесть температуру, влажность и давление воздуха.
Путь к преобразователю B показан синим цветом. Если из этого пути вычесть расстояние d1, мы получим расстояние d2. Формула для d2 будет следующей:
\[d2 _{(см)} = время_{(микросекунды)}/29,5 — d1 \qquad (4)\]
Величина 29,5 для константы получается следующим образом:
Тут нет обратного пути, поэтому мы используем 29,5, что является половиной значения, используемого в формуле (3) выше.
Теперь у нас есть длины всех сторон треугольника ABC… погуглите «Герон».
Формула Герона
Формула Герона использует нечто, называемое «полу-периметром», в который вы добавляете каждую из трех сторон треугольника и делите результат на два:
\[s = (a + b + c)/2 \qquad (5)\]
Теперь полощадь может быть рассчитана по следующей формуле:
\
Как только мы узнаем эту площадь, мы сможем вычислить высоту (координату Y) из формулы (2) выше.
Теорема Пифагора
Теперь координату X можно вычислить, отложив из вершины треугольника перпендикулярную линию до базовой линии, чтобы получить прямоугольный треугольник. Теперь координату X можно вычислить с помощью теоремы Пифагора:
\
Step 5: Build a Physical Circuit (Optional)
If you build a physical version of this circuit, you can try it out with the Arduino software’s serial monitor (magnifying glass button in the upper right of the sketch window), activating the sensor with your hand, body, notebook, etc.
If using a physical board, put something in front of the sensor and observe the distance reading using the serial monitor, and set distanceThreshold to that value.
Adjust your different distance threshold «buckets» to a range suitable to your initial value, for instance if your hand was 60cm away, your ranges might be 60-40, 40-20, and 20-0.
Upload your code again, and try moving in front of the sensor. As the distance shortens, you should see the LEDs turn on one by one.
Шаг 6: тестирование
Рисунок 10 – Скетч ProcessingРисунок 11 – Графический экран Processing
Подключите USB кабель Arduino к компьютеру.
Запустите “dual_sensor_echo_locator.pde”, нажав кнопку запуска вверху слева в Processing 3 IDE.
На вашем экране должны начать появляться числа, разделенные запятой (рисунок 10).
Сообщение об ошибке при запуске
При запуске может появиться сообщение об ошибке. Если это так, то измените в строке 88 (рисунок 10) на номер, связанный с вашим COM портом.
В зависимости от вашей системы могут быть указаны несколько COM портов. Один из номеров будет работать.
На рисунке 10 номер связан с моим «COM4»
Расположение датчиков
Расположите датчики на расстоянии 100 см друг от друга и 100 см от объекта, фронтальной стороной к нему.
Медленно поворачивайте оба датчика к диагонально противоположному углу воображаемого квадрата со стороной 1 метр.
Когда вы будете вращать датчики, то найдете положение, в котором на графическом дисплее появится мигающая красная точка.
Также, когда датчики захватят ваш объект, будут отображаться дополнительные данные (рисунок 11):
- расстояние d1
- расстояние d2
- базовая линия (base)
- смещение (offset)
- полупериметр (s)
- площадь (area)
- координата X
- координата Y
Датчик расстояния в проектах Arduino
Способность ультразвукового датчика определять расстояние до объекта основано на принципе сонара – посылая пучок ультразвука, и получая его отражение с задержкой, устройство определяет наличие объектов и расстояние до них. Ультразвуковые сигналы, генерируемые приемником, отражаясь от препятствия, возвращаются к нему через определенный промежуток времени. Именно этот временной интервал становится характеристикой помогающей определить расстояние до объекта.
Описание датчика HC SR04
Датчик расстояния Ардуино является прибором бесконтактного типа, и обеспечивает высокоточное измерение и стабильность. Диапазон дальности его измерения составляет от 2 до 400 см. На его работу не оказывает существенного воздействия электромагнитные излучения и солнечная энергия. В комплект модуля с HC SR04 arduino также входят ресивер и трансмиттер.
Ультразвуковой дальномер HC SR04 имеет такие технические параметры:
- Питающее напряжение 5В;
- Рабочий параметр силы т ока – 15 мА;
- Сила тока в пассивном состоянии -6 с.
Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):
- Контакт питания положительного типа – +5В;
- Trig (Т) – выход сигнала входа;
- Echo (R) – вывод сигнала выхода;
- GND – вывод «Земля».
Схема взаимодействия с Arduino
Для получения данных, необходимо выполнить такую последовательность действий:
- Подать на выход Trig импульс длительностью 10 микросек;
- В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
- Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
- На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.
При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.
Подключение HC SR04 к Arduino
Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.
Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:
Библиотека для работы с HC SR04
Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.
К особенностям библиотеки можно отнести:
- Возможность работы с различными ультразвуковыми датчиками;
- Может работать с датчиком расстояния всего через один пин;
- Отсутствие отставания на 1 секунду при отсутствии пинга эха;
- Для простой коррекции ошибок есть встроенный цифровой фильтр;
- Максимально точный расчет расстояния.
Скачать бибилотеку NewPing можно здесь
Точность измерения расстояния датчиком HC SR04
Точность датчика зависит от нескольких факторов:
- температуры и влажности воздуха;
- расстояния до объекта;
- расположения относительно датчика (согласно диаграммы излучения);
- качества исполнения элементов модуля датчика.
В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.
Фактор расстояния до объекта важен, т.к. растет вероятность отражения от соседних предметов, к тому же и сам сигнал затухает с расстоянием.
Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря, “глазки” HC-SR04 должны смотреть прямо на предмет.
Для уменьшения ошибок и погрешности измерений обычно выполняются следующие действия:
- усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
- с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
- датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.
Выбор дальномера для подключения к arduino
Для определения расстояния есть несколько способов – инфракрасный датчик приближения, лазерный дальномер и ультразвуковой дальномер. Возможно, есть еще какие-то варианты, но я их сходу не нашел. Поэтому выбирал из трех вариантов. Датчик приближения был сразу забракован, поскольку он не умеет измерять, а только настраивается на определение конкретных расстояний. Лазерный датчик умеет делать измерения и довольно точно, но стоит он не мало, из-за этого выбор был остановлен на ультразвуковом датчике, который стоит в 8-10 раз дешевле лазерного, а точность измерения отличается не на много.
Очевидно, что выбор пал на более дешевый датчик HC-SR04, который стоит 50 руб и способен измерять расстояние от 2 до 400 см с точностью до 3 мм, а эффективный угол наблюдения 15 градусов.
Примеры использования датчика расстояния
Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.
Подключение датчика к ардуино
При написании скетча использовалась следующий вариант распиновки подключения датчика:
- VCC: +5V
- Trig – 12 пин
- Echo – 11 пин
- Земля (GND) – Земля (GND)
Пример скетча
Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.
В данном скетче мы выполняем такую последовательность действий:
- Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
- Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
- Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
- Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).
Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).
Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.
Скетч с использованием библиотеки NewPing
Теперь давайте рассмотрим вариант скетча с использованием библиотеки NewPing. Код существенно упростится, т.к. все описанные ранее действия спрятаны внутри библиотеки. Все, что нам нужно сделать – создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта. В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().
Пример подключения ультразвукового дальномера HC SR04 с одним пином
Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.
Датчик уровня жидкости (Water Sensor Arduino)
Рабочее напряжение аналогового сенсора — 5v. Выходное напряжение (показания датчика) зависит от степени погружения датчика в жидкость и от параметров, влияющих на коэффициент передачи напряжения, например, проводимость жидкости. Это простой в использование и недорогой датчик уровня жидкости, который широко применяется в системах автоматизации и при разработке Умного дома.
Подключение к Ардуино датчика воды (Water Sensor)
Как вы уже заметили на фото к этому занятию, датчик уровня жидкости имеет три контакта. Правый контакт (-) подключается к Земле (GND), средний к питанию 5v, а левый к аналоговому входу, например, A0. При полностью сухом датчике выходное напряжение и показания на аналоговом входе будут равны нулю, чем больше датчик будет погружен в воду, тем больше будут его показания (от 0 до 1023).
Скетч ультразвукового дальномера на arduino с помощью HC-SR04 и TM1637
// подключение индикатора TM1637 #include <TM1637.h> #define CLK 3 #define DIO 2 TM1637 tm1637(CLK,DIO); // пины для HC-SR04 int echoPin = 12; int trigPin = 11; void setup() { Serial.begin (9600); // для вывода в мониторе порта pinMode(trigPin, OUTPUT); // пин отправки сигнала pinMode(echoPin, INPUT); // пин приема сигнала // инициализация индикатора tm1637.init(); tm1637.set(BRIGHT_TYPICAL); } void loop() { int duration, mm; // переменные для хранения расстояния // останавливаем отправку сигнала digitalWrite(trigPin, LOW); delayMicroseconds(2); // отправляем ультрозвуковой сигнал digitalWrite(trigPin, HIGH); // ждем 10 микроскунд delayMicroseconds(10); // останавливаем отправку сигнала digitalWrite(trigPin, LOW); // замеряет длину положительного импульса на пине echoPin duration = pulseIn(echoPin, HIGH); // высчитываем расстояние до препядствия mm = duration / 5.8; // вывод данных в монитор порта Serial.print(mm); Serial.println(" mm"); // вывод данных на индикатор tm1637.display( mm ); delay(100); }
Краткие выводы
Ультразвуковые датчики расстояния достаточно универсальны и точны, что позволяет их использовать для большинства любительских проектов. В статье рассмотрен крайне популярный датчик HC SR04, который легко подключается к плате ардуино (для этого следует сразу предусмотреть два свободных пина, но есть вариант подключения и с одним пином). Для работы с датчиком существуют несколько бесплатных библиотек (в статье рассмотрена лишь одна из них, NewPing), но можно обойтись и без них – алгоритм взаимодействия с внутренним контроллером датчика достаточно прост, мы показали его в этой статье.
Исходя из собственного опыта, можно утверждать, что датчик HC-SR04 показывает точность в пределах одного сантиметра на расстояниях от 10 см до 2 м. На более коротких и дальних дистанциях возможно появление сильных помех, что сильно зависит от окружающих предметов и способа использования. Но в большинстве случаев HC-SR04 отлично справлялся со своей работой.
Краткие выводы
Ультразвуковые датчики расстояния достаточно универсальны и точны, что позволяет их использовать для большинства любительских проектов. В статье рассмотрен крайне популярный датчик HC SR04, который легко подключается к плате ардуино (для этого следует сразу предусмотреть два свободных пина, но есть вариант подключения и с одним пином). Для работы с датчиком существуют несколько бесплатных библиотек (в статье рассмотрена лишь одна из них, NewPing), но можно обойтись и без них – алгоритм взаимодействия с внутренним контроллером датчика достаточно прост, мы показали его в этой статье.
Исходя из собственного опыта, можно утверждать, что датчик HC-SR04 показывает точность в пределах одного сантиметра на расстояниях от 10 см до 2 м. На более коротких и дальних дистанциях возможно появление сильных помех, что сильно зависит от окружающих предметов и способа использования. Но в большинстве случаев HC-SR04 отлично справлялся со своей работой.