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

Работа модуля HC-SR04 основана на принципе эхолокации. Модуль посылает ультразвуковой сигнал и принимает его отражение от объекта. Измерив время между отправкой и получением импульса, не сложно вычислить расстояние до препятствия.

 

Характеристики:
  • Напряжение питания: 5 В.
  • Потребление в режиме тишины: 2 мА.
  • Потребление при работе: 15 мА.
  • Диапазон расстояний: 2–400 см.
  • Эффективный угол наблюдения: 15°.
  • Рабочий угол наблюдения: 30°.
Выходы:
  • VCC – питание.
  • GND – общий провод.
  • Trig – цифровой вход для включения измерения.
  • Echo – после завершения измерения, на этот выход будет подана логическая единица на
    время, пропорциональное расстоянию до объекта.
Принцип работы:

На вход Trig датчика подаем импульс высокого уровня длительностью 10–15
микросекунд(μs). Датчик отправляет ультразвуковой сигнал «chirp» из восьми коротких
импульсов частотой выше предела диапазон слуха человека 40 кГц. Электроника датчика знает
скорость звука в воздухе. Измеряя время между отправленным и принятым ультразвуком,
ультразвуковой датчик HC-SR04 формирует выходной сигнал. Спустя примерно микросекунду ультразвуковой датчик HC-SR04 выдает на выходе Echo импульс высокого уровня длительностью до 38 миллисекунд(ms). Если препятствий не обнаружено, то на выходе будет сигнал с
длительностью 38 мс. Длина импульса на выходе Echo пропорциональна расстоянию до препятствия.
Расстояние вычисляется по формуле: S=F/58, где
S – расстояние в сантиметрах,
F – продолжительность импульса в микросекундах.

Следующее измерение рекомендуется выполнять не ранее чем через 50 мс.

Поскольку в основе работы устройства используется звук, сонар плохо подходит для определения расстояния до звукопоглощающих объектов таких как мебель с высоким ворсом или персидских котов. Для определения расстояний в таком окружении подойдёт инфракрасный дальномер.

Код:
// Укажем, что к каким пинам подключено
int trigPin = 10; 
int echoPin = 11;  
 
void setup() { 
  Serial.begin (9600); 
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
}
void loop()
 { 
int duration, distance; // для большей точности установим значение LOW на пине Trig 
digitalWrite(trigPin, LOW); 
delayMicroseconds(2); // Теперь установим высокий уровень на пине Trig 
digitalWrite(trigPin, HIGH); // Подождем 10 μs  
delayMicroseconds(10); 
digitalWrite(trigPin, LOW); // Узнаем длительность высокого сигнала на пине Echo 
duration = pulseIn(echoPin, HIGH); // Рассчитаем расстояние 
distance = duration / 58; 
// Выведем значение в Serial Monitor 
Serial.print(distance); 
Serial.println(" cm"); 
delay(100); 
}

Функция pulseIn() считывает длину сигнала на заданном порту (HIGH или LOW). Например, если задано считывание HIGH функцией pulseIn(), функция ожидает пока на заданном порту не появиться HIGH. Когда HIGH получен, включается таймер, который будет остановлен когда на порту вход/выхода будет LOW. Функция pulseIn() возвращает длину сигнала в микросекундах. Функция возвращает 0, если в течение заданного времени (тайм аута) не был зафиксирован сигнал на порту.

Это очень простой по принципу работы сенсор. Его легко подключается, простота в работе. Но есть и другие сенсоры с разными интерфейсами подключения , более умны и т.д. Например URM37.