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

Задание 1. Подключение датчика HC-SR04

Результат работы: Исправление ошибки в коде и измерение расстояния до предмета.

Подключаем датчик:

  • VCC - Pin 2 (VCC)
  • GND -  Pin 6 (GND)
  • TRIG  - Pin 12 (GPIO18)
  • 330Ω resistor - ECHO - Pin 18 (GPIO24) и 470Ω resistor - Pin6 (GND).
Важно. Выходной сигнал датчика (ECHO) на HC-SR04 рассчитан на 5В. Однако входной  сигнал на GPIO рассчитан на 3,3 В. Отправка сигнала 5V на этот незащищенный входной порт 3.3V может повредить контакты GPIO! Нам нужно будет использовать небольшую цепь делителя напряжения, состоящую из двух резисторов, чтобы снизить выходное напряжение датчика до того, с которым может справиться Raspberry Pi.

Программный код
#Libraries
import RPi.GPIO as GPIO
import time

#GPIO Mode (BOARD / BCM)
GPIO.setmode(GPIO.BCM)
#set GPIO Pins
GPIO_TRIGGER = 18
GPIO_ECHO = 24

#set GPIO direction (IN / OUT)
GPIO.setup(GPIO_TRIGGER, GPIO.OUT)
GPIO.setup(GPIO_ECHO, GPIO.IN)

def distance():
    # set Trigger to HIGH
    GPIO.output(GPIO_TRIGGER, True)
    # set Trigger after 0.01ms to LOW
    time.sleep(0.00001)
    GPIO.output(GPIO_TRIGGER, False)
    StartTime = time.time()
    StopTime = time.time()
    # save StartTime
    while GPIO.input(GPIO_ECHO) == 0:
        StartTime = time.time()
    # save time of arrival
    while GPIO.input(GPIO_ECHO) == 1:
        StopTime = time.time()
    # time difference between start and arrival
    TimeElapsed = StopTime - StartTime
    # multiply with the sonic speed (34300 cm/s)
    # and divide by 2, because there and back
    distance = (TimeElapsed * 34300) / 2
    return distance

if __name__ == '__main__':
    try:
        while True:
            dist = distance()
            print ("Measured Distance = %.1f cm" % dist)
            time.sleep(1)
        # Reset by pressing CTRL + C
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()