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

В этом видео:
– Что такое ультразвуковой дальномер и как он работает;
– Как подключить ультразвуковой дальномер к Raspberry Pi;
– Скрипт для работы с ультразвуковым дальномером;
– Измерение расстояния до объекта.

Сегодня о ультразвуковом сенсоре-дальномере. Я планирую использовать этот сенсор для автоматизации работы машинки с управлением с raspberry pi. С его помощью машинка сможет ориентироваться в пространстве и прокладывать маршрут.
Я купил популярную модель HC-SR04.
Данный сенсор как понятно из названия делает измерения используя ультразвуковые волны.
ultrasonic sensor HC-SR04
У сенсора есть 4 пина:
* Vcc – питание сенсора. 5 Вольт – в своей схеме я подаю напрямую с пина номер 2 моего Raspberry;
* Пин Grd – просто подключить к Земле. Например, пин 6 на Raspberry Pi;
* Пин Trig. На этот пин необходимо послать сигнал длительностью 10 микросекунд для того чтобы сенсор заработал. Сенсор срабатывает и посылает звуковой ряд из 8 импульсов в 40кГц и принимает их на свой датчик – тот цилиндр что справа;
* Пин Echo. С этого пина мы считываем информацию с сенсора. Особенностью работы данного сенсора я вляется, то что после запуска измерения, отправки на пин Trig импульса в 10мк сек, сенсор генерирует ту самую серию импульсов, ждёт ответа и потом отправляет на пин Echo сигнал, длительность которого равна времени которое потребовалось чтобы получить свой отправленный сигнал, т.е. удвоенное расстояние до объекта.

Из этих данных мы можем посчитать на сколько часто мы можем получать данные о ближайших объектах. Из чего всё складывается?
– Минимальная задержка между измерениями должна быть 50 мс;
– 10 микросекунд на генерацию возбуждающего сигнала (можно опустить);
– 1/340 секунды = 3мс на измерение максимально доступного расстояния. Как это получилось? 500см максимально доступное расстояние. Звук будет проходить в обоих направлениях, т.е. ему нужно пройти 1м. Скорость звука примерно 340мс. Получает звук пролетит этот метр за 1/340-вую секунды или примерно 3мс.
– ещё 3мс. это время требует датчику чтобы передать сигнал на пин Echo.

В итоге. 50+3+3= 56мс. Это минимально разрешение между получаемой информации о расстоянии до объекта. Это не самые точные измерения, по этому нужно быть аккуратным и сильно не разгоняться. Например, если у вас машинка двигается со скоростью 20км/ч(вы хорошенько газанули) это ровняется 5,5мс, то за указанное время 56мс она проедет 30см. Что не мало для дома. Если скорости у вас не высокие, точности измерений будет достаточно.
it-v41.6 - schema-01
Дополнительная особенность. Питание схемы идёт от 5В и выходное напряжение она выдаёт 5В с Echo пина, по этому нужно его уменьшить перед подачей на входной пин Raspberry pi. Это можно сделать простейшим делителем напряжения состоящем из двух резисторов. В моей схеме два резистора в 1КОм. Снимая сигнал с одного из них я получаю 2,5Вольтовый сигнал. Данного уровня достаточно для распознование сигнала. Минимальный уровень сигнала для определения наличия сигнала и определения его как High это 1,3В. Максимальный уровень 3,3В. Поэтому 2,5В более чем достаточно.

Переходим к скрипту.
v46.1-script-01
В скрипте я определяю два пина. Один как входной, другой как выходной. С последнего я буду отправлять импульс для возбуждения датчика, а с первого я буду считывать информацию с сенсора.
GPIO.setmode(GPIO.BOARD)
TRIG = 16
ECHO = 18
GPIO.setup(TRIG, GPIO.OUT, initial=0)
GPIO.setup(ECHO, GPIO.IN)

Далее необходимо выждать минимум 50мс – минимальная задержка между измерениями. В этом скрипте она не особо нужна, но если использовать этот скрипт как модуль в большой программе, которая будет его вызвать, то лучше использовать эту задержку. Плюс дальше я покажу скрипт с зацикленным измерением расстояния, там это необходимо (смотри в конеце поста).
После это необходимо послать сигнал на пин Trig сенсора. Длительность сигнала 10мк сек:
# Send a probe signal to the sensor. Signal should be 10 micro sec long.
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)

Далее необходимо ждать пока не начнёт поступать сигнал на порт Echo. Нужно отметить начальное время сигнала. Как только сигнал начнёт поступать, необходимо понять когда он закончится. Как только он прервётся – отметить когда он закончился. Далется это с помощью переменных start и stop, плюс модуль времени time.
while GPIO.input(ECHO) == 0:
pass
start = time.time()

while GPIO.input(ECHO) == 1:
pass
stop = time.time()

Зная начальное и конечное время сигнала можно найти его длительность и следовательно расстояние пройденное сигналом. Не забываем, что сигнал проходит двойное расстояние и результат (Ратояние= Скорость / Время ) нужно делить на 2:
# Print distance to object in santimeters. Sound speed = 340 m/s
print "Distance = ",(stop - start) * 17000,"sm"

Вот так можно производить измерение расстояния до объектов. Подробности в видео.
Удачи!

Скриаты и ссылки:

-------------------------
$cat 5_ultrasonic_distance_01.py
import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
TRIG = 16
ECHO = 18
GPIO.setup(TRIG, GPIO.OUT, initial=0)
GPIO.setup(ECHO, GPIO.IN)

# Minimum delay between measurements is 50ms. 100ms is fine:
time.sleep(0.1)

# Send a probe signal to the sensor. Signal should be 10 micro sec long.
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)

while GPIO.input(ECHO) == 0:
pass
start = time.time()

while GPIO.input(ECHO) == 1:
pass stop = time.time()

# Print distance to object in santimeters. Sound speed = 340 m/s
print "Distance = ",(stop - start) * 17000,"sm"
print "start time = ", start
print "stop time = ", stop

GPIO.cleanup()

--------------

$ cat 5_ultrasonic_distance_02_infinit-loop.py
import RPi.GPIO as GPIO
import time #GPIO.cleanup()

GPIO.setmode(GPIO.BOARD)
TRIG = 16
ECHO = 18

GPIO.setup(TRIG, GPIO.OUT, initial=0)
GPIO.setup(ECHO, GPIO.IN)

try:
while True:
# Minimum delay between measurements is 50ms. 100ms is fine:
time.sleep(0.1)

# Send a probe signal to the sensor. Signal should be 10 micro sec long.
GPIO.output(TRIG,1)
time.sleep(0.00001)
GPIO.output(TRIG,0)

while GPIO.input(ECHO) == 0:
pass start = time.time()

while GPIO.input(ECHO) == 1:
pass stop = time.time()

# Print distance to object in santimeters. Sound speed = 340 m/s
print "Distance = ",(stop - start) * 17000,"sm"
print "start time = ", start
print "stop time = ", stop

except KeyboardInterrupt:
GPIO.cleanup()
----------------------

v46.1-script-02-looped
Ultrasonic Sensor with the Raspberry Pi.
Ультразвуковой дальномер HC-SR04