Найти тему
Алексей Кретов

Arduino радар на HY-SRF05

Оглавление

Для определения положения робота в пространстве можно использовать разные датчики и подходы. Самый универсальный из них - ультразвуковой датчик.

Результаты экспериментов в самом конце страницы!

Есть несколько основных вариантов дальномеров:

HC-SR04
HC-SR04
HY-SRF05
HY-SRF05

Принцип работы датчика

https://mirrobo.ru/modul-ultrazvukovogo-datchika-hy-srf05-rukovodstvo-polzovatelya/
https://mirrobo.ru/modul-ultrazvukovogo-datchika-hy-srf05-rukovodstvo-polzovatelya/

Модуль HY-SRF05 при получении импульса от ардуино запускает работу встроенного контроллера, который формирует несколько ультразвуковых импульсов, которые излучаются с динамика "Т". После отражения от объекта - эхо возвращается на приёмник "R". Встроенный контроллер определяет время между отправкой первого фронта и приходом отраженного фронта. Полученное значение времени соответствует сигналу HIGH на пине Echo, который формирует контроллер датчика.

На стороне ардуино обработка времени высокого сигнала от Echo обеспечивается командой pulseIn(Pin,High). Эта функция работает на прерываниях программных прерываниях ардуино, и принимает в качестве аргументов номер пина, на котором отслеживается изменение уровня, и уровень - HIGH или LOW

Код и подключение

Подключаем провода как на схеме
Подключаем провода как на схеме
Текст программы в конце страницы
Текст программы в конце страницы

Статья составлена при поддержке клуба робототехники и магазина "Робот и Я" на Кантемировской - лучшего магазина с интереснейшими роботами!

Код скетча

# define TRIG_PIN 12

# define ECHO_PIN 13  

void setup() { // открываем монитор порта на скорости 115200 bod

Serial.begin(115200);

//Конфигурируем порты 

pinMode(TRIG_PIN,OUTPUT);

pinMode(ECHO_PIN,INPUT); /*выполнять не обязательно, т.к. по умолчанию все порты работают на входы*/

}  

void loop() {

// создаём переменные

long duration, distanceCm, distanceIn;

  /*Задаем короткий импульс LOW заблаговременно, чтобы обеспечить чистый импульс HIGH:*/

digitalWrite(TRIG_PIN, LOW);

delayMicroseconds(2);

digitalWrite(TRIG_PIN, HIGH);

delayMicroseconds(10);

digitalWrite(TRIG_PIN, LOW);

duration = pulseIn(ECHO_PIN,HIGH); // Преобразуем время в расстояние

distanceCm = duration / 29.1 / 2 ;

distanceIn = duration / 74 / 2;

if (distanceCm <= 0){

Serial.println("Out of range");

}

else {

//расстояние в дюймах

Serial.print(distanceIn);

Serial.print("in, ");

//расстояние в сантиметрах

Serial.print(distanceCm);

Serial.print("cm");

Serial.println();

}

delay(200);

}