- Необходимые материалы:
- Принципиальная электрическая схема:
- Как на самом деле работает модуль HC-SR04:
- Расстояние измерения между двумя ультразвуковыми датчиками (HC-SR04):
- Программа для датчика передатчика:
- Программа для датчика приемника:
- За работой:
- Импровизированная идея - калибровка датчика по известному расстоянию:
Ультразвуковой датчик (HC-SR04) обычно используется для определения расстояния до объекта от одной конкретной точки. Это было довольно легко сделать с помощью Arduino, и код также довольно прост. Но в этой статье мы собираемся попробовать что-то другое с этими популярными датчиками HC-SR04. Мы попытаемся рассчитать расстояние между двумя ультразвуковыми датчиками, то есть сделаем так, чтобы один датчик действовал как передатчик, а другой датчик - как приемник. Делая это, мы можем отслеживать местоположение одного передатчика, используя множество ультразвуковых приемников, это отслеживание называется триангуляцией и может использоваться для автоматической стыковки следящих за багажом роботов и других подобных приложений. Определение расстояния между двумя датчиками США Может показаться, что это довольно простая задача, но я столкнулся с несколькими проблемами, которые обсуждаются в этом проекте.
Техника, обсуждаемая в этой статье, не совсем точна и без модификаций может оказаться бесполезной в любых реальных системах. За время работы над этой документацией я не нашел никого, кто получил бы результаты так близко, как мой, поэтому я просто поделился своими взглядами на то, как я заставил это работать, чтобы людям, которые пробуют это, не нужно было заново изобретать колесо.
Необходимые материалы:
- Arduino (2Nos) - любая модель
- Модуль HCSR04 (2 шт.)
Принципиальная электрическая схема:
Несмотря на то, что мы собираемся сделать так, чтобы один US (ультразвуковой) датчик работал как передатчик, а другой как приемник, обязательно соедините все четыре контакта датчиков с Arduino. Зачем нам? Подробнее об этом мы поговорим позже, а пока принципиальная схема будет следующей.
Как видите, принципиальные схемы передатчика и приемника идентичны. Также проверьте: Интерфейс ультразвукового датчика Arduino
Как на самом деле работает модуль HC-SR04:
Прежде чем мы продолжим, давайте разберемся, как работает датчик HC-SR04. Приведенная ниже временная диаграмма поможет нам понять принцип работы.
Датчик имеет два контакта Trigger и Echo, которые используются для измерения расстояния, как показано на временной диаграмме. Сначала, чтобы начать измерение, мы должны послать ультразвуковую волну от передатчика, это можно сделать, установив высокий вывод триггера на 10 мкс. Как только это будет сделано, вывод передатчика пошлет 8 звуковых импульсов американских волн. Эта волна США ударит по отраженному объекту и будет принята приемником.
Здесь временная диаграмма показывает, что как только приемник принимает волну, он заставляет вывод Echo переходить в высокий уровень в течение времени, равного времени, необходимому для того, чтобы волна прошла от датчика US и вернулась к датчику. Эта временная диаграмма не соответствует действительности.
Я накрыл передатчик (Tx) часть моего датчика и проверил, стал ли эхо-импульс высоким, и да, он действительно высокий. Это означает, что импульс эха не ожидает приема ультразвуковой волны. Как только он передает волну США, он становится высоким и остается высоким, пока волна не вернется. Итак, правильная временная диаграмма должна быть примерно такой, как показано ниже (извините за мои плохие навыки письма)
Чтобы ваш HC-SR04 работал только как передатчик:
Довольно просто заставить HC-SR04 работать только как передатчик. Как показано на временной диаграмме, вы должны объявить контакт триггера как выходной контакт и сделать так, чтобы он оставался высоким в течение 10 микросекунд. Это инициирует всплеск ультразвуковой волны. Поэтому всякий раз, когда мы хотим передать волну, нам просто нужно управлять пусковым выводом датчика Transmitter, код которого приведен ниже.
Чтобы ваш HC-SR04 работал только как приемник:
Как показано на временной диаграмме, мы не можем контролировать подъем вывода Echo, поскольку он связан с выводом триггера. Таким образом, мы не можем заставить HC-SR04 работать только как приемник. Но мы можем использовать хитрость, просто закрыв передающую часть датчика лентой (как показано на рисунке ниже) или ограничив волну США, которая не может выйти за пределы корпуса передатчика, и эта волна США не повлияет на вывод Echo.
Теперь, чтобы сделать вывод эхо-сигнала высоким, нам просто нужно поднять этот фиктивный триггерный вывод на 10 микросекунд. Как только этот датчик приемника получит американскую волну, переданную датчиком передатчика, эхо-контакт станет низким.
Расстояние измерения между двумя ультразвуковыми датчиками (HC-SR04):
До сих пор мы поняли, как заставить один датчик работать как передатчик, а другой датчик как приемник. Теперь мы должны передать ультразвуковую волну от датчика передатчика и принять ее датчиком приемника и проверить время, необходимое для прохождения волны от передатчика к приемнику, звучит просто, верно ?? Но, к сожалению, у нас возникла проблема, и это не сработает.
Модуль передатчика и модуль приемника находятся далеко друг от друга, и когда модуль приемника принимает волну США от модуля передатчика, он не будет знать, когда передатчик послал эту конкретную волну. Не зная времени начала, мы не можем рассчитать затраченное время и, следовательно, расстояние. Чтобы решить эту проблему, эхо-импульс модуля приемника должен быть повышен точно, когда модуль передатчика передал волну США. Другими словами, модуль передатчика и модуль приемника должны срабатывать одновременно. Этого можно добиться следующим способом.
На приведенной выше диаграмме Tx представляет датчик передатчика, а Rx представляет датчик приемника. Как показано, датчик Transmitter будет передавать волны США с известной периодической задержкой, и это все, что он должен делать.
В датчике приемника мы должны каким-то образом заставить спусковой штифт переходить в высокий уровень именно тогда, когда штифт передатчика становится высоким. Поэтому сначала мы случайным образом заставляем триггер приемника переходить на высокий уровень, который будет оставаться на высоком уровне до тех пор, пока вывод эхо-сигнала не станет низким. Этот вывод эхо переходит в низкий уровень только тогда, когда он принимает волну США от передатчика. Поэтому, как только он становится низким, мы можем предположить, что датчик передатчика только что сработал. Теперь, исходя из этого предположения, как только эхо станет низким, мы можем дождаться известной задержки и затем запустить триггер приемника. Это частично синхронизирует триггер как передатчика, так и приемника, и, следовательно, вы можете прочитать немедленную длительность эхо-импульса с помощью pulseIn () и вычислить расстояние.
Программа для датчика передатчика:
Полную программу для модуля передатчика можно найти внизу страницы. Он не делает ничего, кроме периодического срабатывания датчика передатчика.
digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Чтобы активировать датчик, мы должны сделать так, чтобы штифт триггера оставался высоким в течение 10 мкс. Код, который делает то же самое, показан выше.
Программа для датчика приемника:
В датчике приемника мы закрыли глазок передатчика датчика, чтобы сделать его фиктивным, как обсуждалось ранее. Теперь мы можем использовать вышеупомянутую технику для измерения расстояния между двумя датчиками. Полная программа представлена внизу этой страницы. Ниже поясняются несколько важных строк.
Trigger_US (); while (digitalRead (echoPin) == ВЫСОКИЙ); delayMicroseconds (10); Trigger_US (); duration = pulseIn (echoPin, HIGH);
Сначала мы запускаем датчик США с помощью функции Trigger_US (), а затем ждем, пока вывод эхо-сигнала не станет высоким, используя цикл while. Как только он станет низким, мы ждем заранее определенной продолжительности, эта продолжительность должна быть где-то между 10 и 30 микросекундами, которую можно определить методом проб и ошибок (или вы можете использовать импровизированную идею, приведенную ниже). После этой задержки снова запустите US, используя ту же функцию, а затем используйте функцию pulseIn () для вычисления длительности волны.
Теперь, используя те же старые формулы, мы можем рассчитать расстояние, как показано ниже.
расстояние = продолжительность * 0,034;
За работой:
Выполните подключения, как описано в программе. Закройте переднюю часть датчика приемника, как показано на рисунке. Затем загрузите код передатчика и код приемника, которые приведены ниже, в передатчик и приемник Arduino соответственно. Откройте последовательный монитор модуля приемника, и вы должны заметить расстояние между двумя модулями, как показано на видео ниже.
Примечание. Этот метод - всего лишь идеология, и он может быть неточным или удовлетворительным. Однако вы можете попробовать импровизированную идею ниже, чтобы добиться лучших результатов.
Импровизированная идея - калибровка датчика по известному расстоянию:
Метод, который до сих пор объяснялся странным образом, кажется удовлетворительным, однако для моего проекта этого было достаточно. Однако я также хотел бы поделиться недостатками этого метода и способом их преодоления. Одним из основных недостатков этого метода является то, что мы предполагаем, что вывод Echo приемника падает сразу после того, как датчик передатчика передал американскую волну, что неверно, так как волна займет некоторое время, чтобы пройти от передатчика к приемнику. Следовательно, триггер передатчика и триггер приемника не будут полностью синхронизированы.
Чтобы преодолеть это, мы можем сначала откалибровать датчик, используя известное расстояние. Если расстояние известно, мы будем знать время, за которое волна США достигнет приемника от передатчика. Давайте возьмем это время как Del (D), как показано ниже.
Теперь мы точно будем знать, через сколько времени мы должны перевести триггерный контакт приемника в высокий уровень, чтобы синхронизироваться с триггером передатчика. Эту продолжительность можно рассчитать с помощью Known Delay (t) - Del (D). Мне не удалось проверить эту идею из-за ограничений по времени, поэтому я не уверен, насколько точно она будет работать. Так что, если вам случится попробовать, дайте мне знать о результатах в разделе комментариев.