В данной статье мы рассмотрим подключение ультразвукового датчика HCSR04 к плате Raspberry Pi и измерение расстояний с его помощью. Ранее на нашем сайте мы использовали совместно датчик HCSR04 и плату Raspberry Pi в проекте робота, объезжающего препятствия. Также на нашем сайте вы можете посмотреть статьи про подключение датчика HC-SR04 к микроконтроллеру AVR и плате Arduino. Также вы можете посмотреть все проекты, в которых был использован датчик HCSR04 – среди них много действительно интересных проектов.
Принцип работы ультразвукового датчика HC-SR04
Ультразвуковой датчик HC-SR04 используется для измерения расстояний в диапазоне 2-400 см с точностью 3 мм. Датчик состоит из ультразвукового передатчика, ультразвукового приемника и схемы управления.
Ультразвуковой датчик HC-SR04 обеспечивает на своем выходе сигнал, пропорциональный дистанции до препятствия. Датчик генерирует звуковые колебания в ультразвуковом диапазоне (после получения управляющего импульса) и после этого ждет когда они вернутся к нему (эхо), отразившись от какого-нибудь препятствия. Затем, основываясь на скорости звука (340 м/с) и времени, необходимом для того чтобы эхо достигло источника (нашего датчика), датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию до препятствия.
Как показано на рисунке сначала нам нужно инициировать датчик для измерения расстояний, для этого на его триггерный контакт (trigger pin) необходимо подать логический сигнал высокого уровня длительностью не менее 10 мкс, после этого датчик генерирует серию звуковых колебаний и после получения отраженного сигнала (эхо) датчик обеспечивает на своем выходе сигнал, пропорциональный расстоянию между ним и препятствием.
Ультразвуковой сигнал отражается от поверхности, возвращается обратно и улавливается приемником ультразвукового сигнала датчика. После этого на контакте Echo датчика устанавливается напряжение высокого уровня (high) на время, пропорциональное расстоянию до препятствия.
После этого расстояние до препятствия можно рассчитать по следующей формуле:
Distance= (Time x Speed of Sound in Air (343 m/s))/2
Таким образом, измеренное расстояние в сантиметрах можно определить по формуле: Distance in centimeter = 17150*T.
Необходимые компоненты
- Плата Raspberry Pi (купить на AliExpress).
- ЖК дисплей 16x2 (купить на AliExpress).
- Ультразвуковой датчик HC-SR04 (купить на AliExpress).
- Резистор 1 кОм – 2 шт. (купить на AliExpress).
- Конденсатор 1000 мкФ (купить на AliExpress).
- Источник питания.
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Схема проекта
Схема подключения ультразвукового датчика HC-SR04 к плате Raspberry Pi представлена на следующем рисунке.
В данной схеме мы использовали 8-битный (D0-D7) способ подключения ЖК дисплея к плате Raspberry Pi, хотя это не обязательно – можно использовать и 4-битный способ, но в этом случае программа будет немного сложнее. Поэтому мы и выбрали более простой для начинающих способ – 8-битный. Таким образом, мы подключили к плате Raspberry Pi 10 контактов ЖК дисплея: 8 контактов для передачи данных и 2 контакта для управления. Полная схема соединений между платой Raspberry Pi и ЖК дисплеем представлена в следующей таблице.
Ультразвуковой датчик HC-SR04 содержит 4 контакта:
- PIN1 – VCC или +5V – на него подается питающее напряжение.
- PIN2 – TRIGGER – на него подается импульс длительностью 10 мкс чтобы запустить датчик в работу.
- PIN3 – ECHO – на этом контакте формируется импульс, длительность которого пропорциональна расстоянию до препятствия.
- PIN4 – GROUND.
На контакте Echo датчика HC-SR04 формируется импульс напряжением +5V, поэтому данный контакт нельзя непосредственно подключать к плате Raspberry Pi. Поэтому для его подключения к плате мы использовали делитель напряжения (на резисторах R1 и R2) чтобы получить логику +3.3V вместо логики +5V.
Объяснение работы проекта
В данном проекте мы будем выполнять следующие действия:
- Подаем на контакт trigger датчика импульс длительностью 10 мкс.
- Датчик испускает ультразвуковую волну. После ее приема (после того как она отразится от препятствия), датчик на своем контакте ECHO формирует импульс, пропорциональный расстоянию до препятствия.
- Мы измеряем длительность импульса, то есть интервал времени от смены состояния контакта ECHO с LOW до HIGH до момента смены его состояния с HIGH на LOW.
- На основе измеренной длительности импульса рассчитываем расстояние до препятствия.
- Отображаем рассчитанное расстояние на экране ЖК дисплея 16x2.
Соответственно, в программе для Raspberry Pi на Python мы должны запрограммировать следующие действия:
- Подать запускающий импульс на контакт trigger датчика.
- Записать время начала и окончания импульса с датчика (с его контакта ECHO).
- Рассчитать расстояние на основе известных моментов времени START и STOP.
- Отобразить полученный результат на экране ЖК дисплея 16x2.
Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
import time # подключение библиотеки для работы с задержками import RPi.GPIO as IO # подключение библиотеки для работы с контактами ввода/вывода string_of_characters = 0 IO.setwarnings(False) # отключаем показ любых предупреждений IO.setmode (IO.BCM) # мы будем программировать контакты GPIO по их функциональным номерам (BCM), то есть мы будем обращаться к PIN29 как ‘GPIO5’ IO.setup(17,IO.OUT) # инициализируем GPIO17, 27, 24, 23, 18, 26, 5, 6, 13, 19, 21 в качестве цифровых выходов IO.setup(27,IO.OUT) IO.setup(24,IO.OUT) IO.setup(23,IO.OUT) IO.setup(18,IO.OUT) IO.setup(26,IO.OUT) IO.setup(5,IO.OUT) IO.setup(6,IO.OUT) IO.setup(13,IO.OUT) IO.setup(19,IO.OUT) IO.setup(21,IO.OUT) IO.setup(16,IO.IN) # инициализируем GPIO16 в качестве цифрового входа def send_a_command (command): # функция для передачи команд на ЖК дисплей pin=command PORT(pin); IO.output(17,0) #PORTD&= ~(1<<RS); IO.output(27,1) #PORTD|= (1<<E); time.sleep(0.001) #_delay_ms(50); IO.output(27,0) #PORTD&= ~(1<<E); pin=0 PORT(pin); def send_a_character (character): # функция для передачи символа на ЖК дисплей pin=character PORT(pin); IO.output(17,1) #PORTD|= (1<<RS); IO.output(27,1) #PORTD|= (1<<E); time.sleep(0.001) #_delay_ms(50); IO.output(27,0) #PORTD&= ~(1<<E); pin=0 PORT(pin); def PORT(pin): # функция для передачи данных на ЖК дисплей при помощи установки соответствующих логических уровней на контактах D0-D7 if(pin&0x01 == 0x01): IO.output(24,1) else: IO.output(24,0) if(pin&0x02 == 0x02): IO.output(23,1) else: IO.output(23,0) if(pin&0x04 == 0x04): IO.output(18,1) else: IO.output(18,0) if(pin&0x08 == 0x08): IO.output(26,1) else: IO.output(26,0) if(pin&0x10 == 0x10): IO.output(5,1) else: IO.output(5,0) if(pin&0x20 == 0x20): IO.output(6,1) else: IO.output(6,0) if(pin&0x40 == 0x40): IO.output(13,1) else: IO.output(13,0) if(pin&0x80 == 0x80): IO.output(19,1) else: IO.output(19,0) def send_a_string(string_of_characters): string_of_characters = string_of_characters.ljust(16," ") for i in range(16): send_a_character(ord(string_of_characters[i])) # передаем символы последовательно, один за другим while 1: send_a_command(0x38); # устанавливаем режим дисплея 16x2 send_a_command(0x0E); # включаем курсор send_a_command(0x01); # очищаем экран time.sleep(0.1) # задержка на 100msec IO.setup(21,1) time.sleep(0.00001) IO.setup(21,0) # подача запускающего импульса (trigger pulse) для измерения расстояния while (IO.input(16)==0): start = time.time() # сохраняем время начала выходного импульса while (IO.input(16)==1): stop = time.time() # сохраняем время окончания выходного импульса distance = ((stop - start)*17150) # рассчитываем расстояние distance = round(distance,2) # округляем результат до двух точек после запятой if(distance<400): # если расстояние менее 400 см отображаем его на ЖК дисплее send_a_command(0x80 + 0); send_a_string ("Dist=%s cm"% (distance)); time.sleep(0.15) if(distance>400): # если расстояние более 400 см, выводим 400+ на экран ЖК дисплея send_a_command(0x80 + 0); send_a_string ("Dist= 400+ cm"); time.sleep(0.15) |