В этой статье мы узнаем, как работает ультразвуковой датчик HC-SR04 и как использовать его совместно с платой Ардуино.
Как это работает — ультразвуковой датчик HC-SR04
Датчик HC-SR04 излучает ультразвук с частотой 40 000 Гц, который распространяется по воздуху, и, если на его пути есть объект или препятствие, он отражается от этого объекта и возвращается обратно к модулю. Учитывая время прохождения и скорость звука, мы можете рассчитать расстояние до объекта.
Распиновка модуля HC-SR04
Ультразвуковой модуль HC-SR04 имеет 4 контакта: VCC, Trig и Echo, GND. Контакты GND и VCC модуля должны быть подключены к GND и + 5 В на плате Ардуино соответственно, а контакты Trig и Echo — к любым контактам цифрового ввода/вывода на плате Ардуино.
Чтобы сгенерировать ультразвук, нам необходимо установить Trig в высокое состояние на 10 мкс. Это отправит звуковой импульс за 8 циклов, который будет перемещаться со скоростью звука и будет принят контактом Echo. Вывод Echo будет выводить время в микросекундах, за которое прошла звуковая волна.
Например, если объект находится на расстоянии 50 см от датчика, а скорость звука составляет 340 м/с, то звуковой волне потребуется пройти около 147 мксек. Но то, что мы получите с вывода Echo, будет вдвое больше, потому что звуковая волна дополнительно отразится от объекта и вернется обратно, проделав такой же путь.
Таким образом, чтобы получить расстояние в сантиметрах, нам нужно умножить полученное время с вывода Echo на 0,034 и разделить его на 2.
Скетч ультразвукового датчика HC-SR04 для Ардуино
// определяет номера выводов const int trigPin = 9; const int echoPin = 10; // определяет переменные long duration; int distance; void setup() { pinMode(trigPin, OUTPUT); // Устанавливает trigPin как выход pinMode(echoPin, INPUT); // Устанавливает echoPin как вход Serial.begin(9600); } void loop() { // Очищаем trigPin digitalWrite ( trigPin, LOW ) ; delayMicroseconds ( 2 ) ; // Устанавливаем trigPin в HIGH состояние на 10 микросекунд digitalWrite ( trigPin, HIGH ) ; delayMicroseconds ( 10 ) ; digitalWrite ( trigPin, LOW ) ; // Считываем echoPin, получаем время прохождения звуковой волны в микросекундах duration = pulseIn(echoPin, HIGH); // Расчет расстояния distance= duration*0.034/2; // Результат в Serial Monitor Serial.print("Distance: "); Serial.println(distance); }
Разберем работу кода подробнее
Сначала нам нужно определить контакты Trig и Echo. В данном случае это контакты 9 и 10 на плате Ардуино, которые называются trigPin и echoPin. Затем нам понадобится переменная типа Long с именем «duration» для сохранения времени прохождения сигнала, которое мы получите от датчика, и целочисленная переменная для расстояния.
// определяет номера выводов const int trigPin = 9; const int echoPin = 10; // определяет переменные long duration; int distance;
В настройке мы должны определить trigPin как выход, а echoPin как вход, а также запустить Serial для отображения результатов в мониторе последовательного порта.
void setup() { pinMode(trigPin, OUTPUT); // Устанавливает trigPin как выход pinMode(echoPin, INPUT); // Устанавливает echoPin как вход Serial.begin(9600); }
Сначала в цикле мы должны убедиться, что триггерный вывод свободен, поэтому мы должны установить этот вывод в состояние LOW всего на 2 мкс. Теперь для генерации ультразвуковой волны мы должны установить триггер в состояние HIGH на 10 мкс. Используя функцию pulseIn(), мы должны прочитать время прохождения и поместить это значение в переменную «duration». Эта функция имеет 2 параметра, первый — это имя вывода эхо-сигнала, а для второго мы можете указать HIGH или LOW.
// Очищаем trigPin digitalWrite ( trigPin, LOW ) ; delayMicroseconds ( 2 ) ; // Устанавливаем trigPin в HIGH состояние на 10 микросекунд digitalWrite ( trigPin, HIGH ) ; delayMicroseconds ( 10 ) ; digitalWrite ( trigPin, LOW ) ;
В этом случае HIGH означает, что функция pulsIn() будет ждать, пока вывод перейдет в HIGH состояние, вызванное отраженной звуковой волной, и начнет отсчет времени. Затем она будет ждать, пока вывод перейдет в LOW, что приведет к остановки отсчета времени. В конце функция вернет длину импульса в микросекундах.
Чтобы получить расстояние, мы умножим это время на 0,034 и разделим на 2, как мы объясняли это ранее.
// Считываем echoPin, получаем время прохождения звуковой волны в микросекундах duration = pulseIn(echoPin, HIGH); // Расчет расстояния distance= duration*0.034/2; // Результат в Serial Monitor Serial.print("Distance: "); Serial.println(distance);
В конце мы напечатаем значение расстояния в мониторе последовательного порта.