Ультразвуковой сенсор расстояния. Как сделать ультразвуковой датчик расстояния на Ардуино: дальномер своими руками Пример подключения ультразвукового дальномера HC SR04 с одним пином

Дальномер — это устройство для измерения расстояния до некоторого предмета. Дальномер помогает роботам в разных ситуациях. Простой колесный робот может использовать этот прибор для обнаружения препятствий. Летающий дрон использует дальномер для баражирования над землей на заданной высоте. С помощью дальномера можно даже построить карту помещения, применив специальный алгоритм SLAM.

1. Принцип действия

На этот раз мы разберем работу одного из самых популярных датчиков — ультразвукового (УЗ) дальномера. Существует много разных модификаций подобных устройств, но все они работают по принципу измерения времени прохождения отраженного звука. То есть датчик отправляет звуковой сигнал в заданном направлении, затем ловит отраженное эхо и вычисляет время полета звука от датчика до препятствия и обратно. Из школьного курса физики мы знаем, что скорость звука в некоторой среде величина постоянная, но зависящая от плотности среды. Зная скорость звука в воздухе и время полета звука до цели, мы можем рассчитать пройденное звуком расстояние по формуле: s = v*t где v — скорость звука в м/с, а t — время в секундах. Скорость звука в воздухе, кстати, равна 340.29 м/с. Чтобы справиться со своей задачей, дальномер имеет две важные конструктивные особенности. Во-первых, чтобы звук хорошо отражался от препятствий, датчик испускает ультразвук с частотой 40 кГц. Для этого в датчике имеется пьезокерамический излучатель, который способен генерировать звук такой высокой частоты. Во-вторых, излучатель устроен таким образом, что звук распространяется не во все стороны (как это бывает у обычных динамиков), а в узком направлении. На рисунке представлена диаграмма направленности типичного УЗ дальномера. Как видно на диаграмме, угол обзора самого простого УЗ дальномера составляет примерно 50-60 градусов. Для типичного варианта использования, когда датчик детектирует препятствия перед собой, такой угол обзора вполне пригоден. Ультразвук сможет обнаружить даже ножку стула, тогда как лазерный дальномер, к примеру, может её не заметить. Если же мы решим сканировать окружающее пространство, вращая дальномер по кругу как радар, УЗ дальномер даст нам очень неточную и шумную картину. Для таких целей лучше использовать как раз лазерный дальномер. Также следует отметить два серьезных недостатка УЗ дальномера. Первый заключается в том, что поверхности имеющие пористую структуру хорошо поглощают ультразвук, и датчик не может измерить расстояние до них. Например, если мы задумаем измерить расстояние от мультикоптера до поверхности поля с высокой травой, то скорее всего получим очень нечеткие данные. Такие же проблемы нас ждут при измерении дистанции до стены покрытой поролоном. Второй недостаток связан со скоростью звуковой волны. Эта скорость недостаточно высока, чтобы сделать процесс измерения более частым. Допустим, перед роботом есть препятствие на удалении 4 метра. Чтобы звук слетал туда и обратно, потребуется целых 24 мс. Следует 7 раз отмерить, прежде чем ставить УЗ дальномер на летающих роботов.

2. Ультразвуковой дальномер HC-SR04

В этом уроке мы будем работать с датчиком HC-SR04 и контроллером Ардуино Уно. Этот популярный дальномер умеет измерять расстояние от 1-2 см до 4-6 метров. При этом, точность измерения составляет 0.5 — 1 см. Встречаются разные версии одного и того же HC-SR04. Одни работают лучше, другие хуже. Отличить их можно по рисунку платы на обратной стороне. Версия, которая работает хорошо выглядит так:

А вот версия, которая может давать сбои:

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

Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:
HC-SR04 GND VCC Trig Echo
Arduino Uno GND +5V 3 2
Принципиальная схема устройства Внешний вид макета

4. Программа

Итак, попробуем приказать датчику отправить зондирующий ультразвуковой импульс, а затем зафиксируем его возвращение. Посмотрим как выглядит временная диаграмма работы HC-SR04.
На диаграмме видно, что для начала измерения нам необходимо сгенерировать на выводе Trig положительный импульс длиной 10 мкс. Вслед за этим, датчик выпустит серию из 8 импульсов и поднимет уровень на выводе Echo , перейдя при этом в режим ожидания отраженного сигнала. Как только дальномер почувствует, что звук вернулся, он завершит положительный импульс на Echo . Получается, что нам нужно сделать всего две вещи: создать импульс на Trig для начала измерения, и замерить длину импульса на Echo, чтобы потом вычислить дистанцию по нехитрой формуле. Делаем. int echoPin = 2; int trigPin = 3; void setup() { Serial.begin (9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { int duration, cm; digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); cm = duration / 58; Serial.print(cm); Serial.println(" cm"); delay(100); } Функция pulseIn замеряет длину положительного импульса на ноге echoPin в микросекундах. В программе мы записываем время полета звука в переменную duration. Как мы уже выяснили ранее, нам потребуется умножить время на скорость звука: s = duration * v = duration * 340 м/с Переводим скорость звука из м/с в см/мкс: s = duration * 0.034 м/мкс Для удобства преобразуем десятичную дробь в обыкновенную: s = duration * 1/29 = duration / 29 А теперь вспомним, что звук прошел два искомых расстояния: до цели и обратно. Поделим всё на 2: s = duration / 58 Теперь мы знаем откуда взялось число 58 в программе! Загружаем программу на Ардуино Уно и открываем монитор последовательного порта. Попробуем теперь наводить датчик на разные предметы и смотреть в мониторе рассчитанное расстояние.

Задания

Теперь, когда мы умеем вычислять расстояние с помощью дальномера, сделаем несколько полезных устройств.
  1. Строительный дальномер. Программа каждые 100мс измеряет расстояние с помощью дальномера и выводит результат на символьный ЖК дисплей. Для удобства полученное устройство можно поместить в небольшой корпус и запитать от батареек.
  2. Ультразвуковая трость. Напишем программу, которая будет «пищать» зуммером с различной частотой, в зависимости от измеренного расстояния. Например, если расстояние до препятствия более трех метров — зуммер издает звук раз в пол секунды. При расстоянии 1 метр — раз в 100мс. Менее 10см — пищит постоянно.

Заключение

Ультразвуковой дальномер — простой в использовании, дешевый и точный датчик, который отлично выполняет свою функцию на тысячах роботов. Как мы выяснили из урока, у датчика есть недостатки, которые следует учитывать при постройке робота. Хорошим решением может стать совместное использование ультразвукового дальномера в паре с лазерным. В таком случае, они будут нивелировать недостатки друг друга.

Ультразвуковой датчик расстояния 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); }

По случаю приобрел себе ультразвуковой дальномер 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

Приветствую всех. Попал мне в руки недавно ультразвуковой датчик, который измеряет расстояние до объекта - US-100. Подобную вещь можно приобрести на торговых интернет площадках. На рынках своего города таких игрушек в продаже не удалось найти. Было решено построить схему на основе такого датчика на распространенном микроконтроллере AVR ATmega8. Назначение устройства состоит в измерении расстояния до объекта, а также измерения температуры. К слову о температуре. Модель US-100 это ультразвуковой датчик с температурной компенсацией. Скорость распространения звуковой (ультразвуковой) волны при разных температурах будет отличаться. Измерение датчика основано на времени прохождения звуковой волны от объекта до приемника датчика. Температурная компенсация, скорее всего не полностью, устранит погрешность вызванную температурой окружающей среды.

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

Для измерения датчик использует 2 головки, напоминающие большой микрофон или маленький динамик. По сути это и то, и то. Одна из головок излучает ультразвуковую волну, вторая принимает отраженный сигнал ультразвуковой волны. По времени прохождения определяется пройденное расстояние. По видимому ограничение измеряемого расстояния в 4,5 метра обусловлена мощностью излучателя.

Что относительно общения датчика с микроконтроллером, модель US-100 имеет два возможных интерфейса, выбираемые перемычкой на задней стороне платы датчика. Если перемычка стоит выбран интерфейс UART, если перемычка снята, используется интерфейс или режим работы GPIO. В первом случае для общения с микроконтроллером используется либо аппаратные средства микроконтроллера, либо программные. Во втором случае принимать и передавать данные придется только вручную. В схеме устройства задействуем более простой режим работы с использованием UART интерфейса.

Необходимо уточнить нюансы по распиновке и подключению датчика к микроконтроллеру. Обычно при передачи данных по UART линии Rx и Tx подключаются крест накрест - Rx на Tx, а Tx на Rx. Данный ультразвуковой датчик же нужно подключать в соответствии с подписанными контактами на печатной плате Rx на Rx, а Tx на Tx. Китайцы отожгли, согласен. Прежде чем это определилось, пришлось долго мучиться и в конце концов придти к этому. Итак, при работе по UART, для инициализации одного измерения расстояния ультразвуковому датчику US-100 необходимо на вывод Trig/Tx передать значение 0x55, что соответствует символу "U". В ответ датчик передаст два байта информации о расстоянии на вывод Echo/Rx - первый байт - это старшие 8 бит, второй байт - младшие 8 бит. Единицы измерения расстояния - миллиметры. Чтобы два байта перевести в одно значение расстояния, необходимо первый байт умножить на 256 и прибавить второй байт. Необходимо делать таким образом, потому что при переполнении младшего байта, старший байт увеличивается на единицу. Чтобы вывести текущее значение температуры окружающей среды, необходимо передать значение 0x50, что соответствует символу "P". В ответ датчик передаст значение температуры. Фактическое значение температуры будет равно полученному значению от датчика отнять 45.

Параметры ультразвукового датчика US-100:

  • напряжение питания - 2,4 - 5,5 вольт постоянного напряжения
  • потребляемый ток в режиме ожидания - 2 мА
  • рабочая температура - минус 20 - плюс 70 С
  • угол обзора - 15 градусов
  • интерфейс - GPIO или UART
  • измеряемое расстояние - от 2 см до 450 см
  • погрешность - плюс минус 3 мм + 1%

Конфигурация UART для датчика: 9600 baud rate, 8 data bits, parity: none, 1 stop bit.

Перейдем к схеме устройства.

Схема ультразвукового дальномера построена на основе микроконтроллера Atmega8 и ультразвуковом датчике US-100. Питание схема берется от линейного стабилизатора напряжения L7805, его можно заменить отечественным аналогом КР142ЕН5А, конденсаторы в обвязке стабилизатора обязательны, хотя может работать и без них. Некоторые стабилизаторы просто не запускаются без конденсаторов. Линейный стабилизатор можно заменить на импульсный, например MC34063 или LM2576, но придется немного изменить схему согласно подключению импульсных стабилизаторов в схеме. Конденсаторы С5-С7 необходимы для обеспечения стабильности работы микроконтроллера и датчика. Номиналы всех конденсаторов можно варьировать в разумных пределах. Резистор R2 необходим для предотвращения самопроизвольного перезапускания микроконтроллера и служит подтяжкой положительного питания на вывод reset. Резистор R1 регулирует контраст LCD-дисплея. В качестве информационной панели был взят жидкокристаллический (ЖК или по другому LCD) экран SC1602, 2 строки по 16 символов на основе контроллера HD44780. Заменить LCD-дисплей можно на любую другую модель на базе контроллера HD44780 с таким же количеством строк и символов в строке или больше. На печатной плате LCD-дисплея есть возможность задействовать подсветку экрана двумя способами - либо при помощи допаивания резистора и перемычки на самой плате экранчика или при помощи специальных выводов, обычно обозначенных как "А" и "К". Анод и катод соответственно. К ним через токоограничительный резистор подключается напряжение питания схемы 5 вольт. В данной схеме задействован первый способ, поэтому на схеме не обозначено. Вместо тактовых кнопок S1 - S5 можно использовать любые другие кнопки. Светодиод LED1 можно использовать любой подходящий по цвету или заменить его на транзистор и управлять какой-либо другой схемой в зависимости от превышения дистанции от датчика. В зависимости от примененного типа транзисторов (P-N-P или N-P-N) при превышении лимита дистанции или расстояния выход будет иметь положительное или отрицательное напряжение, то есть при высоком логическом сигнале микроконтроллера транзистор N-P-N будет открыт, а транзистор P-N-P закрыт. В прошивку микроконтроллера заложен параметр, при котором при превышении обозначенного лимита расстояния на вывод PB0 будет подаваться высокий логический уровень напряжения. В данной схеме светодиод просто сигнализирует о превышении. Данный сигнал дублируется на LCD-дисплее подчеркиванием данный о лимите дистанции. Данный параметр можно регулировать кнопками S1, S2. При нажатии происходит увеличение или уменьшение на 10 мм. Информация о дистанции на дисплей выводится также в миллиметрах. Информация о температуре окружающей среды выводится на дисплей в градусах Цельсия. К статье прилагается два варианта прошивок: 1) непрерывное измерение параметров дистанции и температуры (интервал примерно 0,2 секунды), при этом кнопки S4, S5 не задействуются, 2) при нажатии кнопок S4, S5 происходит однократный запрос к датчику на измерение температуры и расстояния. Видео к статье сделано с прошивкой номер 1. Для программирования микроконтроллера необходимо прошить фьюз биты:

Новичкам рекомендую пользоваться шестнадцатеричными значениями фьюз битов HIGH и LOW, чтобы не напортачить с расстановкой галочек. Скриншот из AVRstudio (есть отличия от дудки, sina prog и других программ для прошивки микроконтроллеров). Если Вы используете программы для прошивки микроконтроллеров AVR, в которых нет ввода параметров фьюзов, то можно воспользоваться фьюз калькуляторами для перевода галочек в шестнадцатеричную форму и наоборот.

Схема была собрана и проверена на макетной плате для Atmega8:

Конструктивно схему можно оформить, например, в виде пистолета с лазерным указателем направления ультразвукового датчика. Единственно ограничено измеряемое расстояния, при превышении которого погрешность резко возрастает. Также ограничение касается положения и размера предмета, до которого измеряется расстояние - расстояние до слишком мелких объектов или объектов находящихся под большим углом будет искажено. Идеальное сочетание достаточно большие предметы, находящиеся перпендикулярно направлению датчика. Погрешность измерений примерно соответствует заявленным производителем. Данное устройство при дальнейшем развитии можно использовать как обнаружитель препятствий, наподобие парктроника в комнатных условиях, так как на улице ультразвуковые головки данного датчика будут забиваться грязью.

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

К статье прилагаю 2 варианта HEX прошивок для МК, проект в (версия 7.7, ультразвукового датчика US-100 в базе proteus"а нет, но задействован UART отладчик), а также небольшое видео, демонстрирующее работу схемы.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
IC1 МК AVR 8-бит

ATmega8

1 В блокнот
VR1 Линейный регулятор

L7805AB

1 В блокнот
HG1 LCD-дисплей SC1602 1 На базе HD44780 В блокнот
U1 УЗ-датчик US-100 1 В блокнот
R1 Подстроечный резистор 10 кОм 1 3296W-1-103LF В блокнот
R2 Резистор

10 кОм

1 0.25 Вт В блокнот
R3 Резистор

390 Ом

1 0.25 Вт

HC-SR04 один из самых распространённых и самый дешевый дальномер в робототехники. Он позволяет измерять расстояния от 2см до 4м (может и больше) с приличной точностью 0,3-1см. На выходе цифровой сигнал, длительность которого пропорционально равна расстоянию до препятствий.

Ультразвуковой дальномер

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

УЗ дальномер HC-SR04

Характеристики датчика:

Питание — 5В
Потребляемый ток — менее 2мА
Эффективный угол обзора — 15гр
Измеряемое расстояние — 2см - 5м
Точность — 3мм
Взяты из документации к датчику

Принцип работы HC-SR04

Принцип работы

У модуля есть 4 вывода, два из которых это питание - земля и +5В, а еще два - данные. Опрос модуля производится следующим способом: на вывод Trig посылается импульс длительностью 10мкс. Дальномер генерирует посылку из 8 ультразвуковых 40КГц импульсов. Которые, отражаясь от большинства поверхностей, возвращаются обратно, если не угаснут в пути. Сразу после отправки сигнала на Trig начинаем ожидать ответного положительного сигнала выводе Echo, длительностью от 150мкс до 25мс, который пропорционален расстоянию до объекта. Точнее времени прохождения от датчика до препятствия и обратно. Если ответа нет (датчик не услышит своего эха) - то сигнал вернется длиною в 38 мс. Расстояние до объекта (препятствия) вычисляется по следующей простой формуле:

Где: L - расстояние в сантиметрах до объекта, а F - длина импульса на выводе Echo.
Рекомендуемое время опроса датчика 50мс или 20Гц.

Первые тесты этого модуля проводил при помощи цифрового осциллографа, который ловил ответ от модуля и в ручную, быстрым замыканием Trig на + питания, пытался получить стартовый 10мкс импульс. В половине случаев получалось [:)] .

Конструкция

Датчик был подключен к плате вольтметра с общим анодом, немного модифицированному для работы с ним (убраны ненужные делитель с конденсатором и добавлен вывод от RA3). Был применен микроконтроллер от 5 версии вольтметра - PIC16F688, с переработанной для УЗ дальномера прошивкой.