Блок датчика дальномера HC-SR04, по прерыванию

Решены следующие проблемы
1) Зависание датчика после длительного обратного ожидания импульса
2) Увеличена точность показания в зависимости от условий окружающей среды
3) Появилась возможность опроса с заданной частотой(позволяет разгрузить остальную часть программы)
4) Решена проблема с ожиданием ответа (в библиотеке есть DELAY)
5) Есть возможность запустить индикацию на отдельный вывод(идет измерение или что-то не так)
6) Вывод сообщений об ошибках

Блок осуществляет опрос показаний дальномера типа HC_SR04
с использованием аппаратных прерываний. В блоке использован код из библиотеки iarduino_HC_SR04_int.
Датчик надежно перезапускается при переподключениях во время работы.
===================================================================
Входы:
EN (boool) — разрешение работы.
T_ms(integer) — период опроса в ms. Может быть равен 0. В этом случае скорость опроса будет зависеть
исключительно от расстояния до препятствия — чем ближе,чем чаще. У процессора это отнимает
примерно 16мкс(на видео значение Т) — если период опроса больше 40 миллисекунд или не более
35мкс если меньше.
t_C (integer) — температура окружающего воздуха в Цельсиях — повышает точность измерения.
Если нет датчика температруры — установить на входе можно 23 градуса.
ECHO (byte) — номер пина, к которому подключается контакт ECHO датчика. Ниже описаны требования к этому пину.
TRIG (byte) — номер пина, к которому подключается контакт TRIG датчика.
Выходы:
Led (bool) — Меняет свое значение при каждом состоявшемся измерении.
Lcm (intrger) — измеренное значение(на видео значение L).
Если ECHO подключен к пину без прерывания Lcm=1;
Если ECHO подключен к пину без прерывания или завис датчик Lcm=2;
Если расстояние >400 см, Lcm=400;
===================================================================
Вывод ECHO датчика должен быть подключен к одному из прерываний:
Плата int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7
Due — позволяет ассоциировать функцию-обработчик прерывания с любым из доступных выводов.
Возможно под Due придется блок доработать
Примечание: В Mega2560 пины 21,20 используются интерфейсом i2c, пины 19,18 используются Serial3.
Вывод TRIG датчика подключается к любому пину, который может работать как дискретный вывод.
===================================================================
Описание работы.
При поднятом разрешении (вход EN=1):
1. Запускается процесс измерения — генерируется ультразвуковой импульс через пин TRIG.
2. После запуска измерения блок переходит в режим ожидания прерывания. Процесс при этом не занят блоком.
3. После прихода отраженного от предмета импульса — вход ECHO, вычисляется расстояние до предмета.
Блок по отношению к FLProg работает в фоновом режиме и минимально занимает процессорное время (16-35 мкс).

Если в течении 500 миллисекунд нет ответа от датчика, то делается попытка его перезапустить, в том числе и
как рекомендовали http://forum.arduino.cc/index.php?topic=55119.15 — замыкаем выход ECHO на землю в режиме вывода
на 100 миллисекунд. Процессор и в этом случае не занят.

Коды ошибок:
404 — расстояние больше 400 см;
403 — нет связи с датчиком, зависание(таймают более 500 мс);
402 — ECHO подключен не на пин с прерыванием;
401 — нет разрешения по EN;

 


3

Вложения

  • zip SR04_int
    Дата добавления: 02.02.2018 19:52 Размер файла: 59 КБ Кол-во скачиваний: 2653

Автор публикации

не в сети 3 недели

Сергей Глушенко

831
Комментарии: 15Публикации: 397Регистрация: 04-02-2018

3 комментария к “Блок датчика дальномера HC-SR04, по прерыванию”

  1. Добрый день. Хотел поставить 4 датчика HC-SR04 (ECHO 2 и 3 пин, TRIG 4 и 5 пин), но при подключении даже двух выдает ошибки.

    MAX6675_55_56_54_TT = millis() +1000;

    MAX6675_58_59_57_TT = millis() +1000;

    MAX6675_61_62_60_TT = millis() +1000;

    MAX6675_64_65_63_TT = millis() +1000;

    Как можно решить эту проблему.

    Заранее спасибо.

     

     

    0
  2. День добрый!

    Возможно Вам будет интересно — в проекте с двумя такими блоками выдаёт ошибку:

    exit status 1

    duplicate label ‘End1’

    Закомментировал строку с ошибкой, всё пошло.

    0

Оставьте комментарий

Войти с помощью: