Главная » Статьи » Proton PICBasic

Ультразвуковая рулетка своими руками!
НЕМНОГО ТЕОРИИ

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

Скорость распространения звука в воздухе, как наиболее приближенному к состоянию идеального газа равна:
C= sqrt(Y*R*T)
sqrt - корень квадратный
Y - показатель адиабаты = 1,4 
R - универсальная газовая постоянная = 286,9
T - температура газа, К = 273,16
Все это относится к измерениям в воздухе.

Попробуем теперь вычислить, какова будет скорость распространения звука в простой, советской застройки, квартире.
Температуру мы примем самую, что ни на есть домашнюю - 22° С
Имеем:
C=sqrt(1,4*(22+273,16)*286,9) = 344,31 м/с
Вот так вот.

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

А ТЕПЕРЬ ПРАКТИКА
Это ультразвуковой приемопередатчик SR04.
 
 
Как видно на фото, элемент имеет 4 ножки - плюс питания, ноль, триггер и эхо. Так вот, на вход Trig подаем импульс не менее 10 мкС, а по выходу Echo меряем длину пришедшего импульса, пропорционального расстоянию до объекта.
Его работу иллюстрирует следующий рисунок:
Для basic, как вы уже наверное, начали догадываться, эта задача является простой, как три копейки. 
Итак, алгоритм:
1) Подаем импульс длиной 15 мкС на линию Trig
2) Ждем и считаем длину импульса, пришедшего с линии Echo
3) Преобразуем в расстояние
4) Отображаем длину
 
Исходя из того, что прибор для измерения длины должен быть портативно-переносным, было принято решение питать его от "Кроны", но только включать по обыкновенному переключателю, для экономии энергии. Сам приемопередатчик потребляет 15 мА (см документацию в приложенном архиве). Сколько потребляет PIC и дисплей по раздельности, я не догадался померить, но в среднем прибор потребляет 23 мА по моим наблюдениям. На сколько хватит довольно-таки старенькой батарейки, не знаю.
Плату делал, как обычно (травил, правда, не сам).
В архиве имеется проект протеуса с разведенной платой в ARES. Разводку делал под коробку G407. Просто они у нас продавались вроде как более или менее симпатичные. Если вы помните, бесконтактный тахометр сделан в такой же коробке.
Применить решил микроконтроллер PIC16F628A, исключительно от того, что он давным давно лежит заброшенный и никому не нужный в дальнем углу стола. Все ждал своего часа.
Поскольку времени, как обычно, ни на что не хватает, то делал я девайс урывками. Вначале были амбициозные планы по внедрению меню с выбором и запоминанием единиц измерения, количества сэмплов для усреднения точности, включения и выключения подсветки и т. д. и т. п. Но потом передумал, поскольку решил, что это растянется еще на неопределенный срок и решил выложить основную суть.
Принцип измерения длительности входящего импульса основан на подсчете количества импульсов внутреннего генератора, который работает от фронта до среза входного измерительного импульса. Длительность этих импульсов нам известна, так как известна тактовая частота микроконтроллера. Вот сложив эти импульсы, мы и получим длительность импульса, пропорциональную расстоянию до объекта. Остается лишь подобрать коэффициент пропорциональности. Проблема лишь в том, что подсчет может начинаться с запаздыванием относительно фронта входного импульса, а может и совпадать с ним. Отсюда мы имеем некоторую погрешность. Но, как показывают наблюдения, погрешность в ±3 мм не столь критична для домашнего использования. Естественно, точность измерения напрямую зависит от тактовой частоты микроконтроллера. Чем она выше, тем более высоким разрешением обладает механизм измерения. 
К тому же, совершенству нет предела, и всегда существует возможность улучшить точность измерения. Все в ваших руках!
Предлагаю ознакомиться с программой:

Код

'-------------------------- Описание проекта ---------------------------------

'Проект : My_Project

'Автор : Анисимов М.А.

----------------------- Опции компилятора --------------------------------

Declare SHOW_SYSTEM_VARIABLES = OFF ' При симуляции в Proteus не показывать внутренние переменные

Declare FSR_CONTEXT_SAVE On ' Заботиться о сохранении содержимого регистра FSR

Declare Reminders = OFF ' Выключить напоминания компилятора

Declare Warnings = OFF ' Выключить предупреждения компилятора

Declare Optimiser_Level ' Включить оптимизацию программы

;-------------------------- Общие настройки------------------------------------

Device 16F628A

Config FOSC_HS, WDTE_OFF, PWRTE_ON, MCLRE_OFF, BOREN_OFF, LVP_OFF, CPD_ON, CP_ON

;-------------------------------------------------------------------------------

Xtal = 20 ' Частота осциллятора 4 МГц

'-------------------------- Настройки подключения ЖКИ ------------------------

Declare LCD_Type ALPHA ' Тип ЖКИ - буквенно -цифровой

Declare LCD_DTPin PORTB.4 ' Порт данных ЖКИ

Declare LCD_ENPin PORTB.2 ' Управление линией E

Declare LCD_RSPin PORTB.1 ' Управление линией RS

Declare LCD_Interface ' Разрядность шины данных

Declare LCD_CommandUs 2000 ' Задержка перед посылкой команды

Declare LCD_DataUs 50 ' Задержка перед посылкой данных

Declare LCD_Lines ' Количество строк ЖКИ
 

'-------------------------- Настройки портов ---------------------------------

Declare PortB_Pullups = OFF ' Выключить подтягивающие резисторы на PORTB

Declare All_Digital On ' Установить все порты цифровыми входами/выходами

'-------------------------- Регистры специального назначения-------------------

Symbol INTF = INTCON.1 ' Флаг внешнего прерывания INT

Symbol T0IF = INTCON.2 ' Флаг переполнения TMR0

Symbol INTE = INTCON.4 ' Бит разрешения прерывания по PORTB.0(INT)

Symbol T0IE = INTCON.5 ' Бит разрешения прерывания по переполнению TMR0

Symbol GIE = INTCON.7 ' Бит глобального разрешения прерываний

'-------------------------- T1CON ---------------------------------------------------

Dim RANGE As Float ' Переменная для измеренного расстояния

Dim Adv As Dword ' Промежуточная переменная для приема данных

Dim EdArr As Byte ' Переменная для отображения текущих единиц измерения

Dim EdIzm As Bit ' Текущая единица измерения (мм или см)

Symbol Koeff = 29.0 ' Коэффициент для расчета расстояния

Symbol ECHO = PORTA.1 ' Линия приема данных

Symbol TRIGGER = PORTA.3 ' Линия запуска измерения

Symbol Light = PORTA.2

Symbol ModeBtn = PORTB.0

TRISB = %00000001 ' Порт В.0 - под кнопку

TRISA = %00000010 ' Порт А.1 - на вход

CMCON = %00000111 'Отключим компараторы

OPTION_REG = %10000111

EdIzm=0

Light = 1 'Включим подсветку дисплея

DelayMS 100

Cls 'Очистим дисплей

On_Interrupt GoTo IntLabel 'В случае нажатия кнопки переход на IntLabel

INTE = 1 'Разрешим прерывание по входу INT

GIE = 1 'для изменения единиц измерения

GoTo main

IntLabel:

Context Save

If INTF=1 Then 'Если была нажата кнопка

INTF = 0

EdIzm = ~EdIzm 'то изменим единицы измерения

EndIf

Context Restore

'-------------------------- Главная программа -------------------------
Take:

TRIGGER = 1 'Подаем команду на измерение расстояния

DelayUS 15 'Ожидаем 15 мкС

TRIGGER = 0

Adv = PulseIn ECHO,High 'Считаем длину пришедшего импульса

DelayMS 10

Return

main:

If EdIzm = 0 Then

EdArr = $63 'Буква "c"

Else

EdArr = $BC 'Буква "м"

EndIf

Print At 1, 1,$A5,$B7,$BC,$2E,EdArr,$BC,": " 'Изм.мм:'

Print At 2, 1, Dec1 RANGE," " ' Печатаем на дисплей расстояние

GoSub Take

RANGE = Adv/Koeff 'Расчет расстояния(коэффициент подбирается)

RANGE = RANGE + 12.8 ' Прибавляем длину коробки

If EdIzm = 1 Then

RANGE =RANGE * 10 ' Если единицы измерения - мм, то умножаем результат на 10

EndIf

DelayMS 500 ' Задержка для отображения

GoTo main

  
Как видите, в программе используются прерывания по входу INT для переключения единиц измерения.
В приведенной статье приводятся некоторые моменты, относящиеся к усреднению результата. Но, это, скорее, не усреднение,а какая-то качественная выборка, наверное. Не знаю, как назвать это. 
Думаю, удобнее будет усреднять результат старым дедовским способом - две выборки сложить и поделить на два. Можно и больше, естественно. Нужно учитывать при этом, что время измерения увеличивается с увеличением количества выборок.
 
Такой вот получился у меня аппарат Елизарова :)
 
 
Если немного пофантазировать, то можно найти много применений такому устройству. 
 
Вот я думаю, например: у меня на блюберде нет парктроника. Может сделать? А то заднее затонировано по нижнему краю, да зад поднят. Плохо видно в зеркало, когда задом пятишься. А так бы какая была бы помощь при разворотах и парковке.
Тут вам, собственно, карты в руки.
 
И, наконец, самое интересное!
 
Я решил закинуть удочку и попытаться втянуть вас в процесс озеленения сайта. Если кого-то заинтересовало такое устройство, то, наверняка захочется где-то раздобыть приемопередатчик HC-SR04. 
 
Дело в том, что у меня их есть, но с целью стимулирования интереса хотелось бы объявить что-то типа конкурса на интересную статью для нашего сайта.
 
В общем, правила, будут такими:
1) Статья должна быть интересной, с фотографиями, желательно красиво оформленной (если не получается, ко мне обращаемся).
2) Конкурс длится 1 месяц.
3) Все статьи, добавленные за этот месяц, рассматриваются и принимается решение о победителях.
Призы будут самыми разнообразными:
1 место - HC-SR04 - 3 шт
2 место - HC-SR04 - 2 шт
3 место - HC-SR04 - 1 шт
Все просто. Лично вышлю каждому победителю обещанную награду.
В общем, думайте, повторяйте, спрашивайте, если что непонятно.



Категория: Proton PICBasic | Добавил: ADMIN (05.03.2014)
Просмотров: 6533 | Комментарии: 12 | Теги: Ультразвук, конкурс, дальномер, парктроник, HC-SR04, PIC | Рейтинг: 4.8/5
Всего комментариев: 12
1 Andriy76   (05.03.2014 21:46)
Отличная статья . 
Постараюсь и я выложить материал - ради олимпийского принципа .

2 ivan_fd   (06.03.2014 19:33)
Интересно, да и заманчивое предложение. biggrin

Из Украины могут принимать участие?

3 Broka   (06.03.2014 20:32)
Спасибо Большое  Админ !  Вопрос к Вам..... Обязательно интересный проект в железе? 
Просто тоже кое чего есть...., но в железе пока не собранно.

4 vanish   (08.03.2014 21:10)
Прикольно! А какова максимальная дальность измерения?

5 vanish   (09.03.2014 10:22)
Хотелось бы для слепых девайс сделать, в зависимости от расстояния до преграды тональность звука меняется.
Если освобожусь, займусь.

6 dimon-k714   (23.06.2014 22:43)
Класно!! Непогано добавитиб ще датчик температури и вибір середи вимірювання(повітря, стіна, дерево, бетон)

7 MiXaS   (21.07.2014 17:49)
Получил я свой приз. Опробовал. Даже датчик температуры встремил для точности измерения скорости звука. Но честно говоря точность не фантан. Еще непонятно вот это: Formula: uS / 58 = centimeters, см datasheet. Для измерения длины не совсем подходит. Возможно у меня погрешности из-за проводов китайских, которые от контроллера до уз железки.

8 MiXaS   (22.07.2014 08:23)
Я просто не очень люблю тыкать пальцем в небо. Хотелось бы понимать физику процессов, ну да ладно! Все–равно спасибо! Думаю для сына игруху сделать на основе этого дальномера

9 MiXaS   (22.07.2014 11:15)
Я чуток доработал устройство, добавил кнопку для измерения. Чтобы измерения происходили по нажатию на кнопку. Еще думаю надо добавить лазерный луч, для понимания куда "светишь". Максим, еще раз спасибо за статью!

0
10 ADMIN   (31.03.2015 06:52)
Не понятно, куда мои комменты с ответами делись....

11 Diaz   (07.06.2016 17:17)
коэффициент как получить ?

1
12 ADMIN   (08.07.2016 07:29)
Методом научного тыка. Для китайских модулей он плавает

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]