Измеритель расстояния на HC-SR04 без микроконтроллера / Хабр
В этой статье пошагово соберем схему измерителя расстояния из нескольких микросхем стандартной логики.
Зачем
Все just-for-fun. Конечная схема является тривиальной и не несет новых технических решений. Автор не является профессиональным конструктором электроники и некоторые решения могут не отвечать принятым стандартам.
Больше оправданийРазработка даже простейшего цифрового устройства без использования микроконтроллера все чаще становится практически нецелесообразным занятием в силу низкой цены микроконтроллеров, их гибкости и богатого набора периферии, упакованного в компактный корпус.
Несмотря на это, автор находит разработку схем на дискретных элементах интересным занятием-пазлом, что-то на уровне лампового звука. В мире где все описывается программным кодом, исполняемым черными ящиками с миллиардами транзисторов, испытываешь неподдельное удивление, когда видишь, как небольшой набор логических вентилей, счетчиков и триггеров образуют устройство имеющее непростое поведение.
Конечно, такое мнение смогут разделить в основном те, для кого работа с дискретной логикой не была обыденностью.
Задача
Хотим получать устройство, представляющее расстояние в сантиметрах в десятичной системе счисления. Минимальное значение – 1 см, максимальное – 254 см. Для отображения используем 7-сегментный индикатор с 3 знакоместами, для измерения расстояния – модуль ультразвукового датчика HC-SR04 или аналог.
Да, я понимаю, что в модуле датчика скорее всего используется микроконтроллер. Это не считается.
Собираем
HC-SR04 – очень популярный, дешевый и неточный ультразвуковой датчик. Кратко о интерфейсе. Датчик имеет две сигнальные линии TRIG
(вход) и ECHO
(выход).
На вход TRIG
подаем импульс запуска измерения и через некоторое время получаем положительный импульс на выходе ECHO
. Длительность импульса ECHO
умноженная на некоторую константу K равна измеренному расстоянию.
Вся задача сводится к измерению длительности импульса в единицах времени K, для чего нам понадобится 8-битный счетчик, который будем тактировать частотой 1/K Гц. Выход счетчика будет отражать расстояние в сантиметрах (в двоичном представлении).
При этом, мы не хотим, чтобы в процессе счета на индикаторе отображалось постепенно увеличивающееся значение – это будет мешать чтению результата. Поэтому возьмем счетчик 74HC590 со встроенным выходным буферным регистром.
Выводами СЕ
(разрешение счета) и OE
(включение выходов) мы управлять не будем. На вход тактирования счетчика CPC
подан сигнал CLK0
задающего генератора (~= 58мкс или 17240 Гц).
Нам нужно сбросить счетчик по фронту ECHO
и сохранить состояние счетчика в выходной регистр по спаду. Сбросом занимается вывод MRC
, а записью в выходной регистр – вывод CPR
. Сброс происходит по низкому уровню, как нам и нужно, а вот запись – по фронту (не по спаду, как хотелось бы). Придется добавить инвертор. Для уменьшения количества корпусов в качестве инвертора возьмем 74HC00 (4 элемента И-НЕ), далее нам еще понадобятся элементы И-НЕ.
Тут сталкиваемся с первой небольшой проблемой. После спада ECHO
сигнал на вывод MRC
придет чуть быстрее, чем на CPR
, так как инвертор вносит некоторую задержку. Состояние счетчика будет сохраняться сразу после сброса, то есть сохранится ноль. Обычно для дополнительной задержки сигала ставят буферы, но мы не будем разбрасываться элементами и внесем задержку с помощью RC цепочки.
Выбранный счетчик может считать только до 255, но от датчика может прийти сигнал большей длительности: когда измеренное расстояние более 255 см или если измерение не удалось (в этом случаи датчик намеренно выдает очень длинный импульс). В таких ситуациях наш счетчик просто переполнится (возможно, не один раз) и затем будет остановлен на каком-то случайном значении. Поэтому нужно останавливать счет по достижению максимального значения, что можно сделать используя выход переноса RCO
.
По достижению счетчиком значения 255 RCO
переходит в низкое состояние отключая тактирование счетчика, что «замораживает» его значение до сброса (следующего измерения). Еще мы тут «случайно» инвертировали сигнал тактирования (с целью не добавлять новый корпус и использовать оставшиеся элементы И-НЕ), в данном случаи это не приведет к проблемам.
Теперь нужно сформировать сигнал TRIG
, запускающий измерения. Его период должен быть на несколько порядков больше CLK0
(>60мс). Для этого можно использовать отдельный низкочастотный генератор или поставить делитель на сигнал тактирования. Снова стремясь уменьшить количество элементов, пойдем вторым путем.
Возьмём CD4060 – делитель с коэффициентом деления до 214 с двумя встроенными инверторами (на которых мы соберем задающий RC генератор).
Генератор по схеме из даташита CD4060 запускаться у автора отказался, поэтому схема была изменена.
Для запуска измерения подадим сигнал с Q13
(~4 Гц) на TRIG
. Частота у него подходящая, а коэффициент заполнения (50%) – нет. Нам не нужен сигнал высокого уровня длительностью в 125мс, нам нужно всего около 0.02-1 мкс. Решим эту проблему еще одной RC цепочкой в режиме high-pass фильтра.
Вы, наверное, заметили появление кнопки на схеме. Она реализует функцию «HOLD»: при ее удержании подавляются сигналы запуска измерения, тем самым на выходе счетчика будет удерживаться значение последнего измерения.
Запустив схему в таком виде с подключенными к выходу счетчика светодиодами мы уже сможем порадоваться значениям измеренного расстояния… в бинарном виде. Не сильно user-friendly, согласитесь, нужно срочно переводить в десятичную систему счисления. Сделать это можно несколькими способами, все они ужасны (требуют много корпусов), поэтому начинаем читерить (=.
Да, да, будет ПЗУ (параллельная EEPROM, в данном случаи). Тут многие могут возразить: «Как же так, без микроконтроллера, а программировать все равно нужно?! Заголовок – клик-бейт!» Что еще будет, когда придется показать, как прошивалась ПЗУ без покупки программатора.
«Программатор»В качестве программатора берем ардуину и кучку проводов. Прищурив глаза будем смотреть на ПЗУ как на гигантский декодер адреса и 8192 диода в одном корпусе.
Описание процесса программирования ПЗУ выходит за рамки статьи. Скажу лишь, что с ардуино сделать это довольно просто. Самое неудобное – необходимость формирования двух источников напряжения 14В (для стирания) и 12В (для записи). Скетч «программатора» приведен с файлами проекта в конце статьи.
При формировании содержимого ПЗУ, преобразование числа 255 было заменено на вывод трех прочерков «—«, что означает неудачное измерение.
Входов у ПЗУ много, а вот выходов хватит только на одну цифру 7-сегментного индикатора, потому будем использовать динамическую индикацию. Входы A8
и A9
в бинарном коде выбирают одну из трех отображаемых цифр, четвертое состояние не используется и соответствует погашенным сегментам. Для активации цифры индикатора (в зависимости от кода на A8
и A9
) понадобится 2-битный дешифратор с инвертированными выходами (т. к. нам нужно управлять общими катодами индикатора). Сделать дешифратор можно так (четвертый код мы не используем).
Теперь осталось подключить наш дешифратор и ПЗУ к делителю частоты, который будет заниматься формированием сигналов для A8
, A9
и IN0
, IN1
, тем самым последовательно перебирая десятичные цифры.
Цифры будут переключаться с частотой ~1кГц, поэтому не страшно, что они переключаются не по порядку, глазу это будет не заметно.
Однако, выходы делителя рассчитаны на нагрузку около 1мА, чего недостаточно для управления индикатором (на схеме выше сигнал CLK5
с делителя напрямую подключен к индикатору). Нас тут спас бы еще один инвертор (или буфер) перед CLK5
, но мы уже использовали все 4 элемента И-НЕ из 74HC00. Не добавлять же ради одного элемента еще один корпус. Используем вместо этого свободный выход D7
ПЗУ, запрограммировав его так, чтобы на D7
всегда была инверсия A9
. (Можно было бы и без инверсии, просто так сложилось.) Нагрузочная способность выхода ПЗУ достаточна для управления индикатором.
Собираем все вместе, добавляем регулятор питания и посыпаем схему щепоткой блокировочных конденсаторов.
Правильно собранное устройство настройки не требу —
Калибровка
Для правильного измерения расстояния нам нужно подстроить частоту задающего генератора подстрочным резистором. Сделать это можно так: размещаем датчик напротив ровной стены на известном расстоянии (чем больше, тем лучше точность калибровки). Расстояние выбираем как N+0.5 см, где N – целое. Далее ищем положение резистора, при котором значение на индикаторе самопроизвольно переключается между N и N+1. (Например, между 127 и 128, если выбранное расстояние – 127.5 см.)
Итог
Теоретическая точность измерений +/- 1см, не считая погрешность датчика. На самом деле все еще хуже, т.к. частота генератора плавает.
Потребление ~14мА, предполагается питание от «кроны». Даже плохой батарейки должно хватить на 6-8 часов.
Схема может измерять не только расстояние, но и другие физические величины. Нужен только преобразователь, который линейно переводит измеряемую величину в длительность сигнала.
Фото
Схема была отлажена на бредборде.
Потом решил заказать плату, для эстетического удовольствия.
Знаете, как называется, когда берешь первую непроверенную плату и впаиваешь в нее ПЗУ без каретки?
Это смелость.
Смелость и слабоумие, конечно.
В процессе переноса схемы с бредборда была допущена ошибка: перепутаны общие катоды двух крайних индикаторов (число 123 отображается как 321). Благо, это было исправлено через перепрошивку ПЗУ. Так что даже не пришлось резать и подпаивать проводки.
Ссылки
Схема/плата в Ki-CAD 5.1 и скетч для Arduino mega 2560, которым прошивалась ПЗУ
— На этом все, спасибо за внимание!
Лучшие модели 3D-принтеров Hc Sr04・Cults
Фильтровать по:
Без возрастных ограничений
Бесплатные
Лучшее
В продаже
С makes
Сортировка по:
ДатаНаградыЗагрузкиНравится
💡 Вот помощь в поискеСлишком много результатов? Вы можете попробовать еще раз:
- написав ваши ключевые слова между кавычками
"…"
, чтобы уточнить поиск - написав тире
-
перед термином, чтобы удалить конкретный термин из поиска - написав
by:
и имя дизайнера, чтобы отфильтровать поиск по имени дизайнера - написав номер дизайна для поиска конкретного дизайна
Вы заметили среди этих результатов один или несколько дизайнов, которые несочетаемы или не имеют отношения к вашему поиску? Пожалуйста, свяжитесь с нами, чтобы сообщить нам об этой проблеме, чтобы мы могли вмешаться.
Pelletfüllstand
Бесплатно
корпус ультразвукового датчика HC-SR04
Бесплатно
Модуль обнаружения HC-SR04
Бесплатно
Крепление кронштейна сервопривода HC-SR04 Ультразвуковой датчик
Бесплатно
Кронштейны для крепления сервоприводов Smart Robot для HC-SR04
Бесплатно
ЗАЩИТА УЛЬТРАЗВУКОВОГО ДАТЧИКА В СТИЛЕ WALL-E
0,91 €
TT-01 как автономный автомобиль
Бесплатно
Arduino HC-SR04 крепление для ультразвукового дальномера
Бесплатно
HC-SR04 Ультразвуковой датчик расстояния / пинг-датчик с креплением на сервопривод
0,90 €
корпус hc-sr04
Бесплатно
HC-SR04 v2
2 €
HC-SR04 Case
Бесплатно
Ender-3_Pro_Auto_Power_Off_Ultrasonic_Sensor
Бесплатно
Distance Sensor HC — 03 Ardurino Pro Micro
БесплатноSonar Module HC-SR04 Mount
Бесплатно
Ultrasonic sensor HC-SR04 Flange
Бесплатно
arduino robot platform ( case )
1 €
HC-SR04 Ultrasonic Sensor Case
Бесплатно
Calibration setup for HC-SR04- Sharp GP2Y0A02YK0F — VL53L0X
Бесплатно
My Compact Arduino Boxes
Бесплатно
HC-SR04 and nano
Бесплатно
my arduino boxes
Бесплатно
HC-SR04 sensor box
Бесплатно
Mounting for 3 HC SR04 15° sensors with 90° terminals
Бесплатно
Mounting for HC SR04 Multi-Angle (40°,90°,140°,45°,135°,105°,120°, 75° and 60°)
Бесплатно
Holder for an ultrasonic sensor
Бесплатно
HC-SR04 sensor bracket
Бесплатно
Kame: quadruped robot (version with cheap servo)
Spider Bug Robot(quad robot, quadruped)-MG90
Бесплатно
Ultrasound Turning Spider Head (Rear-Mount)
Бесплатно
Ultrasonic radar bracket
Бесплатно
badBrick HC-SR04 Sensor Brick Mount.
Бесплатно
SMARS V4 vertical Ultrasonic
Бесплатно
HC-SR04 ultrasonic sensor holder
Бесплатно
Ультразвуковой датчик расстояния— HC-SR04 — SEN-15569
Робот-искатель света
28 ноября 2017 г.
Мы используем детали из набора SparkFun Inventor’s Kit v4.0, чтобы создать робота, ищущего свет, который имитирует поведение одноклеточных организмов.
Избранное Любимый 8
Руководство по подключению преобразователя логического уровня с однополярным питанием
9 августа, 2018
Логический преобразователь с одним источником питания позволяет двунаправленно преобразовывать сигналы от микроконтроллера 5 В или 3,3 В без необходимости использования второго источника питания! Плата обеспечивает выход как для 5 В, так и для 3,3 В для питания ваших датчиков.
Он оснащен резистором PTH для возможности регулировки регулятора напряжения на нижней стороне TXB0104 для устройств на 2,5 В или 1,8 В.Избранное Любимый 0
Основные светодиодные анимации для начинающих (Arduino)
3 декабря 2019 г.
Давайте повеселимся со светодиодами! Мы еще раз изучим светодиоды с помощью SparkFun RedBoard Qwiic, создадим классные эффекты и заставим эти эффекты работать с помощью датчика.
Избранное Любимый 9
SparkFun Inventor’s Kit Руководство по экспериментам — версия 4.0
15 ноября 2017 г.
Руководство по экспериментам SparkFun Inventor’s Kit (SIK) содержит всю информацию, необходимую для создания всех пяти проектов, включающих 16 схем, в последней версии набора v4.0a.
Избранное Любимый 8
Хакеры в резиденции — ElectricBone
25 июня 2014 г.
Драм-машины и клавишные были стандартом для создания цифровой музыки, но как вам создавать электронную музыку, если вы обучены играть на тромбоне? Один из наших хакеров в резиденции, Карлос Мелло, взял на себя задачу найти решение именно этого вопроса.
Избранное Любимый 4
SparkFun Inventor’s Kit Руководство по экспериментам — v4.1
8 августа 2019 г.
Руководство по экспериментам SparkFun Inventor’s Kit (SIK) содержит всю информацию, необходимую для создания всех пяти проектов, включающих 16 схем, в последней версии набора v4.1.
Избранное Любимый 10
Основной навык:
ПрограммированиеЕсли плате нужен код или она каким-то образом взаимодействует, вам нужно знать, как программировать ее или взаимодействовать с ней. Навык программирования связан с общением и кодом.
2 Программирование
Уровень навыка: Новичок . Вам потребуется более глубокое понимание того, что такое код и как он работает. Вы будете использовать программное обеспечение начального уровня и инструменты разработки, такие как Arduino. Вы будете иметь дело непосредственно с кодом, но доступны многочисленные примеры и библиотеки. Датчики или экраны будут связываться с последовательным или TTL.
Просмотреть все уровни навыков
Основной навык:
Создание электрических прототиповЕсли для этого требуется питание, вам нужно знать, сколько, что делают все контакты и как их подключить. Возможно, вам придется обращаться к таблицам данных, схемам и знать все тонкости электроники.
Уровень навыка: Новичок . Вам может потребоваться узнать немного больше о компоненте, например, об ориентации или о том, как его подключить, в дополнение к требованиям к питанию. Вам нужно будет понять поляризованные компоненты.
Просмотреть все уровни навыков
Датчик расстояния Arduino с использованием HC-SR04
В этом руководстве я расскажу о том, как настроить датчик расстояния Arduino с помощью ультразвукового датчика HC-SR04.
Существует множество различных проектов, в которых этот учебник пригодится. Ниже я приведу лишь несколько примеров.
Датчик расстояния пригодится во многих проектах роботов, где пригодится знание расстояния до объектов. Например, вы можете использовать информацию о расстоянии, чтобы избежать препятствий, которые могут быть на вашем пути.
Вы также можете использовать датчик расстояния HC-SR04 для обнаружения радикального изменения расстояния до объекта. Вы можете использовать что-то вроде MyDevices Cayenne или свое собственное решение, чтобы предупредить вас об изменении.
Есть так много возможностей, и мы надеемся создать и поделиться некоторыми проектами, которые будут использовать этот датчик в ближайшем будущем.
Если вы предпочитаете Pi, вы также можете настроить HC-SR04 для работы с Raspberry Pi. И Arduino, и Raspberry Pi имеют множество применений датчика расстояния.
Если вы готовы к обучению, вы можете найти полное руководство прямо ниже. Мы даже включили видео, которое поможет вам выполнить все шаги по настройке этого датчика.
Оборудование
Все оборудование, которое вам понадобится для сборки этого датчика расстояния Arduino, указано ниже. Это руководство предназначено для HC-SR04, поэтому убедитесь, что вы выбрали один из них.
Рекомендуется
Видео
В видео ниже показаны все шаги по настройке ультразвукового датчика HC-SR04 с помощью Arduino.
Полное письменное объяснение можно найти прямо под видео, а также несколько дополнительных вещей, которых нет в видео.
Adblock удаляет видео? Поддержите нас, подписавшись на наш сервис без рекламы.
Ультразвуковой датчик HC-SR04
Ультразвуковой датчик расстояния HC-SR04 — это популярный недорогой датчик, обеспечивающий измерение от 2 см (0,7 дюйма) до 400 см (157 дюймов). Точность может достигать 3 мм (0,1 дюйма), но может варьироваться в зависимости от качества сенсора.
Ультразвуковые датчики — относительно простые устройства, чрезвычайно полезные во многих высокотехнологичных установках. Они работают, излучая звуковые волны, а затем ожидая, пока они отразятся от близлежащего объекта. Приемник обнаружит, когда звуковые волны отразятся обратно к датчику.
Вы можете измерить время, прошедшее с момента, когда вы испустили звуковую волну, до момента, когда вы ее получили, используя датчик и немного кода.
Поскольку мы знаем, что скорость звука 340 метров в секунду или 0,0343 сантиметра в микросекунду , мы можем рассчитать расстояние, используя время, которое требуется звуковой волне, чтобы отскочить назад. (Расстояние = Время * Скорость)
Важно помнить, что нам нужно вдвое уменьшить либо скорость звука, либо время, затрачиваемое на перемещение, поскольку мы хотим знать только расстояние до объекта. Если вы не уменьшите вдвое одно из значений, вы рассчитаете расстояние до объекта и обратно.
Я должен отметить, что математика, используемая для расчета расстояния, очень примитивна и не очень точна. Тем не менее, этого должно быть достаточно для большинства проектов.
Настройка схемы датчика расстояния
Схема этого ультразвукового датчика расстояния Arduino очень проста. На его настройку уйдет не более пары минут.
Либо выполните несколько шагов ниже, либо обратитесь к принципиальной схеме, чтобы собрать эту сверхпростую схему.
- VCC подключается к 5v
- Trig подключается к контакту 2
- Echo подключается к контакт 3
- GND подключается к GND
Код датчика расстояния Arduino
Существует несколько различных реализаций кода, которые можно использовать для расчета расстояния. Этот расчет всегда выполняется с использованием сигнала, создаваемого вашим датчиком расстояния.
Самый простой способ — использовать библиотеку, но в этом уроке мы будем писать код с нуля.
1. Код довольно прост, если вы предпочитаете просто скачать его, то вы можете найти его на нашем Github. Кроме того, вы можете продолжить и узнать, что делает код.
Сначала нам нужно найти все переменные, которые нам понадобятся в нашем скрипте. Нам нужно будет определить контакты для триггера и эха.
Нам также нужны две переменные для наших расстояний и длительности импульса.
Далее нам нужно закодировать нашу функцию установки. Эта функция инициализирует все, что нам нужно для нашей функции цикла.
Во-первых, мы запускаем последовательный вывод и устанавливаем скорость передачи 9600
.
Как мы упоминали ранее, спусковой штифт ( trigger_pin
) необходимо настроить как выход. Этот вывод сообщает нашему датчику, что нужно излучать ультразвуковую звуковую волну, которую улавливает приемник.
Вывод эха ( echo_pin
) должен быть установлен в качестве входа. Этот штифт станет высоким, когда ультразвуковая волна отразится и ударит по приемнику.
Далее мы рассмотрим нашу функцию цикла. Именно здесь мы будем запускать наш ультразвуковой датчик расстояния HC-SR04 и определять расстояние до ближайшего объекта.
Мы начинаем с установки высокого уровня для триггера trigger_pin
(эхо), и это будет излучать ультразвуковые волны для приема нашим echo_pin
(приемник). Мы сохраняем вывод высоким на 10 микросекунд , прежде чем установить его обратно на низкий .
Наконец, мы используем функцию pulseIn для измерения времени, которое требуется эхо-выводу ( echo_pin
) для перехода от low к high . Возвращает время в микросекундах.
В случае ошибки он просто вернет 0, а это означает, что он никогда не получал полный импульс в течение периода ожидания.
Теперь у нас есть расчеты расстояний, как вы можете видеть выше, их два. Один для сантиметров, другой для дюймов.
Математика для сантиметров и дюймов примерно одинакова, за исключением значения скорости звука. Я объясню расчет см.
Скорость звука в сантиметрах в микросекунду примерно равна 0,0343 . Мы делим это на два, поскольку мы измеряем только половину расстояния, пройденного ультразвуком. Это дает нам значение 0,0171 .
Наконец, нам нужно распечатать нашу информацию, чтобы мы могли ее просмотреть. Мы используем Serial.print, поэтому все наши данные будут напечатаны в последовательном мониторе.
Сначала печатаем расстояние, потом см. Вы можете изменить см на дюймы, если вам нужно. После этого мы отправляем Serial.println, поэтому наша следующая строка данных будет на новой строке.
Наконец, мы задерживаем скрипт на 500 миллисекунд.
Это весь код, помните, что вы можете загрузить его с GitHub, если у вас возникнут проблемы. Вы также можете найти окончательный код без комментариев прямо ниже.
2. Теперь вы должны быть готовы развернуть код на Arduino и увидеть свое творение в действии.
Проверка схемы и кода
1. Чтобы загрузить код , нажмите Подтвердить ( 1. ), а затем загрузить ( 2. ).
Если у вас возникнут проблемы, проверьте код, чтобы убедиться, что все в порядке.
Также убедитесь, что ваш Arduino подключен и выбран в разделе Tools->Port:
3. Теперь ваш датчик расстояния Arduino должен работать. Загрузите последовательный монитор, расположенный в меню инструментов, и вы должны увидеть распечатку некоторых измерений.
Устранение неполадок
В этом руководстве есть несколько ошибок. Я расскажу о некоторых наиболее распространенных проблемах, с которыми сталкиваются люди.
- Если компилятор Arduino выдает ошибки, вернитесь к коду, чтобы убедиться, что вы скопировали его правильно.