Блог о программировании, электронике и рыбалке

Подключение дальномера HC-SR04 к Arduino

HC-SR04Пошаговая инструкция по подключению ультразвукового дальномера HC-SR04 к Arduino.

Часто в проектах на Arduino необходимо определить расстояние до препятствия. Для этих целей обычно используют инфракрасные или утразвуковые дальномеры.

Под рукой у меня есть только ультразвуковой сонар HC-SR04, поэтому в этой статье я опишу как с ним работать.

HC-SR04

Подключение HC-SR04 к Arduino

В модели HC-SR04 есть 4 контакта, которые мы и будем использовать для подключения к Arduino.

  • VCC подключим к +5V на Arduino
  • Trig к цифровому пину 8 на Arduino
  • Echo к цифровому пину 9 на Arduino
  • GND к GND на Arduino

Для наглядности я еще подключил светодиод между GND и 11 цифровым пином Arduino. Если у вас светодиода под рукой не оказалось, то тогда можете использовать светодиод на 13 пине Arduino.

В результате должно получиться что-то подобное:

HC-SR04

Теперь нам надо загрузить скетч. Он написан так, что при расстоянии менее 50 сантиметров наш светодиод загорается, а  в окне Serial Monitor выводилось расстояние в сантиметрах.

HC-SR04

Код скетча:

const int Trig = 8;
const int Echo = 9;
const int ledPin = 11;  // 13 – если будете использовать встроенный в Arduino светодиод

void setup()
{
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
pinMode(ledPin, OUTPUT);

Serial.begin(9600);
}

unsigned int time_us=0;

unsigned int distance_sm=0;

void loop()
{
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
Serial.println(distance_sm); // Выводим на порт

if (distance_sm<50) // Если расстояние менее 50 сантиметром
{
digitalWrite(ledPin, 1); // Зажигаем светодиод
}
else
{
digitalWrite(ledPin, 0); // иначе тушим
}

delay(100);
}

Демонстрация работы

Присоединяйтесь к нашей группе в Telegram @GeekElectronics
  • keyboard_arrow_downПодключение дальномера HC-SR04 к Arduino
    • Автор:
    • Миниатюра: Подключение дальномера HC-SR04 к Arduino
    • Рубрика: Arduino от А до Я
    • Обновлено: 18.04.2020
    • Комментариев: 31
    • Просмотров: 56 511
  • Оцените пожалуйста статью
    1 Star2 Stars3 Stars4 Stars5 Stars
    Загрузка...
  • Поделитесь с друзьями
Geek Electronics

Комментариев: 31

  • Avatar for source
    Евгений:

    Спасибо за статью! Всё работает, комментарии в программе дают ясное представление о алгоритме работы.

  • Avatar for source
    Фахри:

    Такой вопрос. Код работает на любом дальномере или именно на этом?

      • Avatar for source
        Фахри:

        А для работы с другими видами в скетче что изменить надо? или это зависит от модели дальномера?

        • Avatar for source
          source:

          От модели. В разных датчиках могут быть использованы разные шины передачи данных.

  • Avatar for source
    Константин:

    Замечательная статья!! Благодарю! А то голову изломал - сори не программист =).
    Удачи в Ваших проектах!

  • Avatar for source
    Strannix:

    добрый день, такой вопрос, а какова минимальная величина объекта обнаружения??интерес составляет например с помощью таких сенсоров нескольких собрать схему которая будет определять расположение в пространстве обьекта

    • Avatar for source
      source™:

      не могу вам ответить
      на мелких объектах не проверял

  • Avatar for source
    Евгений:

    Спасибо большое! Всё работет как надо, пояснения оч. в тему!!!

  • Avatar for source
    Станислав:

    Спасибо, все понятно! А я думал нужно библиотеку подключать Ultrasonic. А какие возможности она дает?

    • Avatar for source
      source™:

      Ultrasonic, как и любая другая библиотека создана для сокращения количества кода.

  • Avatar for source
    noob:

    Подскажите пожалуйста, вместо диода можно подключить реле какое-нибудь, например чтобы моторчик крутило? Спасибо.

  • Avatar for source
    Константин:

    Спасибо за статью. Все работает. Но я еще прикрутил дисплей 128*64 пишет расстояние и рисует линию - это так для визуализации)))

  • Avatar for source
    Илья:

    Спасибо автору сайта. На днях получил свой первый Arduino Uno и собрал в тот же день первый свой проект с помощью этой статьи. Потом добавил звуковое оповещение в зависимости от дистанции - дети были счастливы при попытке незаметно проскользнуть на "охраняемую" территорию :)

  • Avatar for source
    николай:

    Подключил к ArduinoMega два таких датчика. Соответственно изменил код. Второй датчик всегда показывает 0. Экспериментальным путем выяснил, что работает только тот из 2 датчиков, для которого раньше прописана функция pulseIn в скетче. Не подскажете, как решить проблему?

  • Avatar for source
    Виктор:

    Подскажите код что бы удерживла 20сек и сробатывала толь ко в темноте.

    • Avatar for source
      Владимир:

      Удерживала что??? После того как датчик обнаружит присутствие, то зажигает светодиод на 20 сек., я правильно понял??? для этого нужно сделать задержку сразу после того как зажигается светодиод. А что бы срабатывал в темноте, необходимо использовать фоторезистор.

  • Avatar for source
    vasilii:

    Всех приветствую !

    Такая проблема :

    На ECHO постоянно висит в 5В, несмотря на все старания: я перепробовал все выходы дурино, отпаивал R1 и притягивал ECHO к нулю - то же самое.
    Осциллографа у меня нет, триггер на ECHO делать не хочется - уверен: там постоянно +5В.
    Грешу на датчик.
    Есть иные мнения?
    Поделитесь пож-ста.

  • Avatar for source
    Андрей:

    Привет подскажите как перевести значение не в сантиметры а в проценты
    Скажем что 1150 см = 0%, а 15 см= 100% ну дальше как то так

  • Avatar for source
    Kanan:

    Был ли у кого-нибудь опыт работы с несколькими датчиками? По поиску все сводится с сдвиговым регистрам и мультиплексорам.

    Кому интересно - некоторое время игрался с датчиками оценивая точность измерения ( с шагом 1 см). Итог:
    - в 90% случаев, начиная от 4 см погрешность ~ -1 см. Т.е как-бы с запасом.
    - если датчики рядом друг с другом и есть пересечение направлений работы - данные скачут
    - если расстояние до цели больше 60-70 см резко увеличивается частота появления нулевых результатов. Это для меня стало понятно не сразу, но оказалось причиной "зависания" - т.е. сенсор долго ждет сигнала, что воспринимается как зависание, а не получив его выдает 0

    Есть задача: Нужно подключить около 50-ти таких датчиков.
    В связи с чем, не обладая глубокими познаниями, пока что пытаюсь решить следующие вопросы:
    1) Т.к. нужно много входов - берется Arduino Mega. Возможен ли такой вариант работы: каждый выход Echo на каждом датчике получает свой вход на ардуине. В то же время, для экономии выходов - все входы Trig получают сигнал от одного выхода на ардуине. Пробовал с 2-мя датчиками - работает. Жду прихода остальных 48 - к каким проблемам готовиться? В итоге на 50 датчиков: занят 50 входов + 1 выход.
    2) Предполагаю, что на такое количество датчиков будет нужно доп питание для сенсоров - из каких пропорций исходить? Что посоветуете?
    3) Уже потратил время на входные сдвиговые регистры. Принцип работает, но с датчиками типа 0/1. Для hs-sr04 в таком виде не подходит - выдает 0 (при минимальном расстоянии)/1. НО! Т.к. при стандартном подключении используются цифровые входы - предполагаю что и в случае со сдвиговыми регистрами есть способ заставить это работать... при наличии головы)) Так ли это?
    4) какие минусы решение за счет увеличения количества портов (-> mega 2560) имеет по сравнению с использованием мультиплексоров/СР... или можно так работать?

  • Avatar for source
    Андрей:

    Здравствуйте. А как сделать так, чтобы светодиод зажигался плавно?

  • Avatar for source
    геннадий:

    Загрузил свиип аудио генератор с целью определения расстояния уз локатор о тональности свиппа желательно по логарифмичнской зависимомти подскажите пожалуйста.

  • Avatar for source
    Олег:

    нашел в инете вот такой скетч....(машинка для объезда препятствий. драйвер l298n) но почему то не работает. загружается в уно, но ничего не пашет. можете указать причину? заранее благодарен!
    #include

    Ultrasonic ultrasonic(A1, A0);

    void setup()
    {
    Serial.begin(9600);
    digitalWrite(2, OUTPUT);
    digitalWrite(4, OUTPUT);
    digitalWrite(7, OUTPUT);
    digitalWrite(8, OUTPUT);
    analogWrite(10, OUTPUT );
    analogWrite(5, OUTPUT);
    }
    void forvard() { //в перед
    analogWrite(5, 255);
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    analogWrite(10, 255);
    }
    void back() { //на зад
    analogWrite(5, 255);
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW );
    analogWrite(10, 255);
    }
    void loop()
    { if (ultrasonic.read() < 10)
    {
    forvard;
    }
    else
    {

    back;
    }
    }

  • Avatar for source
    Олег:

    #include

    Ultrasonic ultrasonic(A1, A0);

    void setup()
    {
    Serial.begin(9600);
    digitalWrite(2, OUTPUT);
    digitalWrite(4, OUTPUT);
    digitalWrite(7, OUTPUT);
    digitalWrite(8, OUTPUT);
    analogWrite(10, OUTPUT );
    analogWrite(5, OUTPUT);
    }
    void forvard() { //в перед
    analogWrite(5, 255);
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(7, LOW);
    digitalWrite(8, HIGH);
    analogWrite(10, 255);
    }
    void back() { //на зад
    analogWrite(5, 255);
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    digitalWrite(7, HIGH);
    digitalWrite(8, LOW );
    analogWrite(10, 255);
    }
    void loop()
    { if (ultrasonic.read() < 10)
    {
    forvard;
    }
    else
    {

    back;
    }
    }

Добавить комментарий

arrow_upward