Ультразвуковой датчик расстояния своими руками схема. Как сделать ультразвуковой датчик расстояния на Ардуино: дальномер своими руками

Ультразвуковой датчик расстояния HC-SR04 (и схожие модули) используют ультразвуковые волны, чтобы определить дистанцию до объекта.

Вообще говоря, нам нужно будет выяснить расстояние до объекта, потому что сам датчик просто учитывает время, которое уходит на то, чтобы поймать эхо от отправленных им звуковых волн. Это происходит таким образом:

  1. Модуль посылает звуковые волны, в то же время подавая напряжение на особый пин эха.
  2. Модуль ловит отраженный сигнал и снимает напряжение с пина.

Это все, что делает ультразвуковой дальномер. Дистанцию мы можем определить сами, ведь мы знаем, сколько времени заняло у звука на то, чтобы совершить путешествие от модуля и обратно (по тому, насколько долго пин эха был под напряжением), а также мы знаем скорость звука в воздухе. Но мы не будем сильно вдаваться в детали и позволим Arduino сделать все вычисления.

Кстати, несмотря на то, что принцип работы всех ультразвуковых датчиков одинаков, НЕ ВСЕ ИЗ НИХ производят одинаковый вывод напряжения на пин эха. Так что, если у вас модуль, отличный от HC-S04, то уделите внимание четвертому шагу, где описаны возможные проблемы, и проверьте, возможно, ваш модуль есть в списке. Если его там нет, то придётся разбираться своими силами.

Шаг 1: Сборка железа своими руками

Сборка очень проста (собирайте всё отключенным от напряжения):

  1. Соедините 5V от Ардуино с пином VCC на модуле
  2. Соедините GND от Ардуино с GND на модуле
  3. Соедините цифровой пин 7 на Ардуино с пином Trig на модуле
  4. Соедините цифровой модуль 8 на Ардуино с пином Эхо на модуле

Шаг 2: Программирование модуля HC-SR04

Для того чтобы видеть результаты работы программы, нужно запустить serial monitor на Ардуино. Если вы не знакомы с этой функцией, то сейчас самое время открыть её и узнать о ней побольше — это отличная вещь, помогающая отладить код. В интерфейсе Ардуино посмотрите в правый угол, там вы найдёте кнопку, запускающую серийный монитор, она похожа на увеличительное стекло, кликните на ней и монитор откроется (или выберите TOOLS/Serial Monitor, или нажмите Ctrl+Shift+M).

Вот набросок рабочей программы:

// Начала Скетча для Аруино —
// Определяем константы (константы не изменяются и если вы попробуете переопределить их то получите ошибку во время компиляции)
const int triggerPin = 7; // создаёт константу с именем «triggerPin» и назначает на неё цифровой пин 7
const int echoPin = 8; // создаёт константу с именем «echoPin» и назначает на неё цифровой пин 8
// Определяем переменные (переменные могут изменяться и обычно изменяются по ходу программы, в них могут содержаться какие-либо рассчитываемые значения)
int duration = 0; // создаёт переменную с именем «duration» для хранения значения, возвращаемого pulseIn, изначально значение задаётся равным «0»
int distance = 0; // создаёт переменную для хранения значения, рассчитанного в качестве расстояния до объекта, находящегося перед датчиком, изначально значение задаётся равным «0»
void setup() // В этой секции можно настроить вашу плату и другие параметры, необходимые для работы вашей программы.
{
Serial.begin(9600); // инициализирует последовательную коммуникацию через USB между Ардуино и компьютером, нам это понадобится
//определяем режимы пинов
pinMode(triggerPin, OUTPUT); // «triggerPin» будет использоваться для ВЫВОДА, номер пина объявлен выше в секции «Определяем переменные»
pinMode(echoPin, INPUT); // «echoPin» будет использоваться для ВВОДА, номер пина объявлен выше в секции «Определяем переменные»
} // конец настройки
// всё, что было написано выше считывается программой лишь один раз — при Запуске или Сбросе (Reset)
void loop() // код программы в зацикленной части считывается беспрестанно и повторяется до тех пор, пока не выключится питание, или пока не будет сделан сброс
{
digitalWrite(triggerPin, HIGH); //начинает подавать ультразвуковые волны с модуля HC-SR04
delay(5); // небольшая пауза, она нужна для того, чтобы модуль функционировал правильно (можно уменьшить это значение, другие мои программы работают при значении 1)
digitalWrite(triggerPin, LOW); //останавливает ультразвуковые волны, идущие от модуля HC-SR04
duration = pulseIn(echoPin, HIGH); //особая функция, позволяющая определить продолжительность времени, при котором на пин эха подавалось напряжение в последнем завершенном цикле подачи ультразвука
delay(10); // опять небольшая пауза. Она нужна для стабильности, слишком короткая пауза может не дать результата
distance = (duration/2) / 58; //преобразовываем продолжительность в расстояние (значение, сохранённое в «duration» делится на 2, затем это значение делится на 58**) ** для сантиметров
delay(500); // еще одна пауза для стабильности — можете поиграть со значением, но это может испортить работу программы, так что по умолчанию используйте 500
Serial.print(distance); //отправляет вычисленное значение расстояния на серийный монитор
Serial.println(» cm»); //добавляет слово «cm» после значения расстояния и переводит каретку на серийном мониторе на новую строку
Serial.println(); //добавляет пустую строку на серийном мониторе (для удобства чтения)
} // Конец цикла

_________________________________________________

Итак, после прочитывания моей инструкции я понял, что набросок программы не соответствует моему пониманию простоты. Поэтому я выкладываю тот же самый набросок с лёгкими комментариями.

// Программа модуля ультразвукового датчика расстояния HC-SC04
const int triggerPin = 7; //триггер на 7
const int echoPin = 8; // ECHO на 8
int duration = 0; // хранит значение из pulseIn
int distance = 0; // хранит значение рассчитанного расстояния
void setup()
{
Serial.begin(9600);
pinMode(triggerPin, OUTPUT); //определяет режимы пинов
pinMode(echoPin, INPUT);
}
void loop()
{
digitalWrite(triggerPin, HIGH); // начинает отправлять ультразвук
delay(5); //необходимая команда, настраивается (но не ниже 10микросекунд)
digitalWrite(triggerPin, LOW); // модуль прекращает отправлять ультразвук
duration = pulseIn(echoPin, HIGH); // определяет, как долго подавалось напряжение на пин ECHO
delay(10); //необходимая команда, настраивается, но аккуратно
distance = (duration/2) / 58; // высчитываем расстояние в см до объекта
delay(500); // пауза для стабильности, уменьшение может сломать ход программы, лучше оставить как есть
Serial.print(distance); // отправляет текущее значение, хранимое в distance на серийный монитор
Serial.println(» cm»); // отображает слово «cm» сразу после расстояния
Serial.println(); // создаёт одну пустую строку в серийном мониторе (для удобства чтения)
}

К инструкции я также приложу файлы.ino

Файлы

  1. HCSR04BareBones.ino — этот файл сильно закомментирован и содержит кое-какую информацию по модулю HC-SR04, а также инфу по сборке.
  2. BareBonesLight.ino — модуль с небольшим количеством комментариев

Вот мой совет. Я знаю, что код работает, но перед тем, как прикреплять файлы к инструкции, я перепроверил всё и серийный монитор стабильно показывал «0 cm». Проблема оказалась в сгоревшем модуле, а его замена исправила ситуацию.

Смотрите на то, как откликается программа, если решите поиграть со значениями команд delay. Опытным путём я обнаружил, что уменьшение значений delay или приравнивание их к 0 может привести программу к нерабочему состоянию.

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

Схема выше использовалась мной для того, чтобы определять, что от датчика все объекты находятся на расстоянии дальше, чем 60 см. В проекте использовалось три диода и пищалка. Когда все предметы были дальше 60 см, горел зеленый диод. Когда что-то приближалось менее чем на 60см, зеленый диод гас, а красный загорался. Если объект оставался на близком расстоянии на какой-то время, то загорался второй красный диод, а пищалка начинала пищать. Когда объект удалялся на 60см, пищалка умолкала, красные диоды гасли, и снова загорался зеленый. Это не предотвращало все ложные тревоги, но работало с большинством случаев, когда мимо датчика пролетала птица или любопытная белка пробегала мимо.

Шаг 4: Известные проблемы

Если вы видите модель вашего ультразвукового модуля в этом пункте, то листайте ниже. Надеюсь, вы найдёте вашу проблему и решите её.

  1. US-105
  2. DYP-ME007TX

Модуль US-105

Ультразвуковой модуль US-105 использует вывод GPIO на пин ECHO, что подразумевает другие вычисления для определения расстояния. При выводе GPIO на пин ECHO, пин не удерживается под напряжением во время отправки волны. Вместо этого, при получении отраженного ультразвука на пин ECHO подается конкретное напряжение, которое пропорционально времени, потребовавшемуся ультразвуковой волне для того, чтобы отправиться и вернуться обратно на датчик. С этим модулем будет работать такой код:

// Код для ультразвукового модуля US-105 unsigned int EchoPin = 2; unsigned int TrigPin = 3; unsigned long Time_Echo_us = 0; //Len_mm_X100 = length*100 unsigned long Len_mm_X100 = 0; unsigned long Len_Integer = 0; // unsigned int Len_Fraction = 0; void setup() { Serial.begin(9600); pinMode(EchoPin, INPUT); pinMode(TrigPin, OUTPUT); } void loop() { digitalWrite(TrigPin, HIGH); delayMicroseconds(50); digitalWrite(TrigPin, LOW); Time_Echo_us = pulseIn(EchoPin, HIGH); if((Time_Echo_us 1)) { Len_mm_X100 = (Time_Echo_us*34)/2; Len_Integer = Len_mm_X100/100; Len_Fraction = Len_mm_X100%100; Serial.print("Растояние: "); Serial.print(Len_Integer, DEC); Serial.print("."); if(Len_Fraction < 10) Serial.print("0"); Serial.print(Len_Fraction, DEC); Serial.println("mm"); delay(1000); } // Конец программы

Модуль DYP-ME007TX

// Код для ультразвукового модуля DYP-ME007TX /* Инструкции по подключению * 5V от Ардуино к VCC на модуле * GNG от Ардуино к GND на модуле * OUT от модуля к цифровому пину 7 на Ардуино */ #include #define RXpin 7 #define TXpin 7 SoftwareSerial mySerial(RXpin, TXpin); long mili = 0; byte mybuffer = {0}; byte bitpos = 0; void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { bitpos = 0; while (mySerial.available()) { if (bitpos < 4) { mybuffer = mySerial.read(); } else break; } mySerial.flush(); mili = mybuffer << 8 | mybuffer; Serial.print("Distance: "); Serial.print(mili / 25.4); Serial.print (" inches"); Serial.println(); delay(500); } Некоторые замечания:
Все детали, нужные для создания ультразвукового дальномера по этой схеме продаются в чипидипе, стоит около 500-900р за все(точно не помню - денег много было, не считал:-). (корпус, пищалки, разъемы прочее)
Некоторые коментарии по схеме ультразвукового дальномера:
1. Пищалки можно юзать любые, под разные задачки лучше разные ... для моей задачи - чем болше габариты тем лучше, угол 50.
2. Можно попробывать использовать только одну относительно дорогую AD822 а на место компаратора чего-нить по дешевле (у меня просто не было ничего другого под рукой вообще)
3. В меге для генерации 40 килогерц можно использовать таймер, для этого нужно подобрать другой резонатор. (у меня были только 16 и 12.. они не подходят)
4. Скорость звука в воздухе вообще-то зависит от температуры - если очень важна точность (мне она пофигу) то учитывай это
5. Заметь- что на картинке дальномера в корпусе - пищалки не касаются пластмассы - один чел говорил, что при мегаточной настройки (данная схема способна и на такое) звук от пищалки до микрофона будет передаваться по корпусу, по этому лучше перестраховаться
6. Пример простейшей прошивки меги на си(под эту схему) можно посмотреть
7. Программатор лучше использовать STK200/300 он же avreal - софт и схему можно дернуть
8. По уму в прошивке надо отслеживать и начало и конец "пачки", в примере только начало(точность вырастет конкретно).. может допишу - выложу.
9. Пищалка очень любит 40кгц - чуть в сторону уже совсем не то... наверное правду в мануале пишут, что резонансная:-)
10. НА схеме неспроста в излучателе понапиханы транзисторы - желающим дать больше вольт чем 12 - велком - один чел говорил, что будет пищать громче(считай дальше). Я этого делать не стал по трем причинам: во первых 24 вольта еще где-то найти надо, во вторых текущаа версия при соотв настройке ризистора итак видит стену за 4 метра, т.е. мне не где испытывать его, да и не нужно. Ну а третья причина этот же чел говорил, что пищалки имеют тенденцию дохнуть на этом вольтаже
11. Общий совет: можно найти все резисторы и конденсаторы в нерабочем блоке питания от компа ATX(они там все где-то 1/8 вата) - денег сэкономишь!
12. Ошибочное мнение, что ультразвук издаваемый пищалкой как-то могут услышать собики и прочие твари, он на них плохо влияет: у меня собака пришла как то ночью и уснула напротив пищалки включенной.
13. Еще - так просто к сведенью - меги и прочие 8битный контроллеры от атмела - гонятся отлично.. у меня в некоторых задачках вместо положенных 16 работают на 24 и нормально.
14. При устрановке R5 выше килоома (10, 50, 100) получится очень большое усиление, и скорее всего понадобятся рупора, зато дальность измерений сильно вырастет.
15. Вместо устрановки рупоров (при большом R5) см. выше, можно модернизировать прошивку, что б она не ждала в начальный момент времени полезный сигнал. Но тогда нельзя будет мерять расстояния около 10 см и меньше.

Коментраий к совету 8 - желтым обозначен момент срабатывания прерывания МК ультразвукового дальномера на приеме, собственно можно ограничится именно этим первым моментом, подождать чуть-чуть и делать следующее измерение, генерая следущюю пачку импульсов - а время полета звука считать временем от первого посланного импульса(или последнего не суть важно) до ПЕРВОГО принятого.
Второй вариант - обозначен красным - более точный - поскольку пачка импульсов как правило доходит отнюдь не в идеальном виде и не полностью (может не быть пары тройки первых или последних импульсов), собствено даже на картинке видно, что она "сплющилась" по краям, хотя отправлялся идеальный прямоугольник импульсов - так вот: суть в том, что середина пачки должна оставаться на месте несмотря на то, что края ее уже могут не почувствоваться компаратором. Так что точность в несколько.. (милиметров надо думать) зависит от того учитывалась в прошивке ультразвукового дальномера середина или только начало пачки при приеме ее обратно.

Этот прибор, который до сих пор считается уникальным, смог найти применение практически во всех сферах человеческой жизни. Сегодня лазерный дальномер можно увидеть в руках геологов и геодезистов. Иными словами, в тех областях человеческой деятельности, где необходимо замерить расстояние с особой точностью. Поэтому высокую популярность завоевали лазерные рулетки, отличающиеся высокой точностью, повышенной надежностью и вполне доступной ценой. Вполне естественно звучит вопрос, можно ли сделать дальномер лазерный своими руками.

К группе приборов, которые измеряют расстояние при помощи электроники, относятся: лазерный дальномер, ультразвуковой дальномер.

Измерения лазерным дальномером делаются на основе световых потоков, носителем сигнала является электромагнитное излучение, окрашенное в соответствующий оттенок. В большинстве случаев за основу берется красный свет.

Согласно законам физики, скорость света намного превышает скорость звука, поэтому и время измерения одинакового расстояния будет отличаться.

Основные причины для монтажа лазерного дальномера

Пользоваться механической рулеткой не всегда удобно. Порой она не дает положительного эффекта. В последние 10 лет все большее предпочтение отдается электронным дальномерам. К этой группе приборов, которые измеряют расстояние при помощи электроники, относятся:

  • лазерный дальномер;
  • ультразвуковой дальномер.

Все эти приборы функционируют по принципу бесконтактного метода. Такой дальномер своими руками сегодня создают отечественные мастера. Приборы работают не хуже тех, которые были выпущены в заводских условиях.

Лазерный дальномер, сделанный своими руками, состоит из нескольких частей:

  • плата;
  • микроконтроллер;
  • усилитель лазерного сигнала;
  • лазер;
  • фотоприемник;
  • фильтр.

В основном излучение лазера возникает при помощи синусоидального сигнала.

Довольно сложно получить такой сигнал, имеющий частоту 10 МГц. Простой контроллер здесь не подходит. Для этого лучше использовать меандр, у которого имеется нужная частота. Когда усиливается сигнал, приходящий из фотоприемника, удаляются ненужные гармоники специальным полосовым фильтром, который функционирует на частоте 10 МГц. На выходе появляется сигнал, сильно напоминающий синусоидальный.

Вернуться к оглавлению

Чтобы изготовить дальномер своими руками можно за основу взять схему лазерной связи. В данном случае передача данных происходит очень быстро, скорость равна 10 Мбит. Такая величина соответствует имеющейся частоте модуляции.

Для такого лазерного устройства берется самый простой усилитель мощности. Он состоит из одной микросхемы 74HC04, которая собрана из шести инверторов. Подача тока ограничивается специальными резисторами. Однако умельцы могут заменить резисторы более надежными деталями.

Пусконаладочная плата становится источником 5-вольтового напряжения. Таким образом усилитель получает питание. Чтобы убрать наводки сигнала на другую часть электрической схемы, усилительный корпус делается стальным, каждый провод экранируется.

В качестве лазера выступает привод, установленный в DVD-приставках. Такое устройство имеет вполне достаточную мощность для функционирования на частоте, достигающей 10 МГц.

В состав приемника входит:

  • фотодиод;
  • усилитель.

В состав усилителя входит полевой транзистор, специальная микросхема. Когда увеличивается расстояние, происходит падение освещенности фотодиода. Поэтому необходимо иметь мощное усиление. Собираемая схема позволяет достичь 4000 единиц.

Когда увеличивается частота, начинают уменьшаться сигналы фотодиода. Усилитель подобной конструкции является главной и сильно уязвимой частью. Его настройка требует очень высокой точности. Желательно отрегулировать коэффициент усиления таким образом, чтобы получать максимальные значения. Самым простым способом будет подача на транзистор 3 В. Можно установить обыкновенную батарейку.

Чтобы приемник начал работать, необходимо подать 12 В. Для этого устанавливается специальный блок питания.

У такого усилителя высокая чувствительность к любым наводкам, поэтому его нужно обязательно экранировать. Можно для этого воспользоваться корпусом оптического датчика. Экранирование фотодиода можно сделать из обычной фольги.

Описанная выше система позволит создать самодельный лазерный дальномер в бытовых условиях.


По случаю приобрел себе ультразвуковой дальномер HC-SR04. Девайс представляет из себя модуль с двумя пъезоизлучателями, один из которых служит излучателем, а второй - приемником ультразвуковой волны; плюс управляющая электроника для управления излучателем и приемником. Для подключения модуль имеет 4-х контактный разъем: два из которых питание (требуется 5 вольт), и еще два для общения с микроконтроллером.

Интерфейс связи тут организован очень просто: на вход подаем короткий умпульс длительностью 10-15 микросекунд и ждем импульса на выходе. Как только до приемника дойдет отраженная волна, модуль сам рассчитает расстояние и выдаст на ногу Echo импульс высокого уровня длинной до 25 мс. Длина выходного импульса будет пропорциональна расстоянию до препятствия от которого отразилась ультразвуковая волна. Нам остается только поймать этот импульс, посчитать его длину и перевести это значение в расстояние.

Технические характеристики:

  • Напряжение питания: 5V
  • Ток покоя: < 2 мА
  • Эффективный угол обзора: < 15 °
  • Диапазон расстояний: 2 см - 500 см
  • Разрешение: 0,3 см

Характеристики потырены с документации на модуль . Кроме этого производитель приводит формулу, по которой рассчитывать расстояние в зависимости от длительности импульса.

S=F/58 ; где S - дистанция в сантиметрах, F - длина импульса в микросекундах

Как видно, даже знать скорость звука не обязательно.

Для испытаний собрал вот такую схему:

Модуль соединяется к микроконтроллеру напрямую. Резисторы подтяжки ставить не нужно, они уже есть на плате модуля.

И так, нам нужно ловить всего один импульс, и затем посчитать его длину. По началу хотел подбить под это дело одно из внешних прерываний микроконтроллера, при этом прерывание должно было происходить как по переднему фронту (переход с низкого в высокое состояние), так и по заднему фронту (с высокого на низкое). Тоесть придется на лету менять конфигурацию этого прерывания. Плюс к этому нужно задействовать один из таймеров, который должен измерять длину импульса. Слишком сложно для маленькой операции фиксирования сигнала.. В Bascom-AVR на этот случай есть специальная команда Pulsein . Вот пример того, как поймать сигнал с помощью этой команды:

Pulsein A , Pind , 5 , 1

Здесь, в переменную A запишется значение длины импульса в десятках микросекунд , снятого с ноги Pind.5 . Единица на конце команды говорит, что нужно ловить сигнал высокого уровня. Если изменить на 0, тогда контроллер будет ловить сигнал низкого уровня.

Эта команда не использует прерываний и хардверного таймера, но способна определить появление импульса и зафиксировать его длину с разрешением 10 мкс. Команда использует для хранения длины импульса 2-х байтный тип переменной, поэтому максимальная длина принятого сигнала может быть 655,35 мс. Этого вполне хватает для поставленной задачи, но по необходимости можно отредактировать файл библиотеки mcs.lib и изменить максимальную длительность фиксируемого импульса.

Полный листинг программы представлен ниже

$regfile = "m8def.dat"

$crystal = 8000000

"конфигурация подключения дисплея к портам МК

Config Lcd = 16 * 2

Config Lcdpin = Pin , Rs = Portc . 5 , E = Portc . 4 , Db4 = Portc . 3 , Db5 = Portc . 2 , Db6 = Portc . 1 , Db7 = Portc . 0

Config Portd . 4 = Output "выход для подключения ноги Trigger

Trigger Alias Portd . 4

Trigger = 0

Config Portd . 5 = Input "вход для импульса Echo

Config Portd . 7 = Output "конфигурация для подключения светодиода

Led Alias Portd . 7

Led = 0

Dim A As Word "сюда копируется значение длины сигнала

Dim S As Single "переменная для хранения расстояния

Const K = 0 . 1725 "коэффициент для перевода длины импульса в расстояние

Waitms 50

Cursor Off

Cls

Lcd "Sonar HC-SR04"

Locate 2 , 1

Lcd "сайт"

Led = 1

Waitms 100

Led = 0

Wait 3

Do

Trigger = 1 "даем импульс на ногу Portd.4 длительностью 15 мкс

Waitus 15

Trigger = 0

Waitus 10

Pulsein A , Pind , 5 , 1 "ловим импульс высокого уровня на PinD.5



Читайте также: