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

Датчик JSN-SR04T представляет собой водонепроницаемый ультразвуковой дальномер, широко используемый в различных проектах, связанных с измерением расстояний в условиях повышенной влажности или прямого контакта с водой. Это делает его идеальным для таких решений, как уровнемеры для воды, робототехника и автомобильные системы помощи при парковке.

Основные характеристики JSN-SR04T:

  • Диапазон измерения: от 20 см до 600 см, что обеспечивает достаточную гибкость для большинства приложений.

  • Водонепроницаемость: Модуль способен функционировать во влажной среде, что расширяет возможности его применения.

  • Точность измерения: Высокая точность измерений благодаря ультразвуковой технологии, которая позволяет избежать ошибок, связанных с изменением температуры и других условий окружающей среды.

  • Рабочее напряжение: 5 В, что делает его совместимым с большинством микроконтроллеров, включая Arduino и Raspberry Pi.

  • Простота интеграции: Использует стандартные цифровые сигналы для связи, что упрощает подключение к большинству систем управления.

Принцип работы:

JSN-SR04T работает по принципу эхолокации — излучает ультразвуковой сигнал и измеряет время, за которое эхо сигнала возвращается от препятствия. Это время пропорционально расстоянию до объекта, позволяя точно определять его положение.

Применение:

Датчик JSN-SR04T часто используется в таких проектах, как:

  • Автоматизация и контроль уровня жидкости: Измерение уровня воды в баках, резервуарах и других емкостях.

  • Робототехника: Навигация и избегание препятствий для подводных или влажных сред.

  • Автомобильные приложения: Ультразвуковая парковочная система, которая помогает водителю оценивать расстояние до ближайших объектов при парковке.

Пример кода

import OPi.GPIO as GPIO
import time

# Настройка пинов
TRIG_PIN = 23
ECHO_PIN = 24

def setup():
    GPIO.setboard(GPIO.PC)  # Установите вашу модель платы
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(TRIG_PIN, GPIO.OUT)
    GPIO.setup(ECHO_PIN, GPIO.IN)
    GPIO.output(TRIG_PIN, GPIO.LOW)
    time.sleep(2)

def get_distance():
    # Генерация 10 микросекундного импульса на триггер
    GPIO.output(TRIG_PIN, True)
    time.sleep(0.00001)
    GPIO.output(TRIG_PIN, False)

    # Измерение длительности сигнала
    while GPIO.input(ECHO_PIN) == 0:
        start_time = time.time()

    while GPIO.input(ECHO_PIN) == 1:
        end_time = time.time()

    # Вычисление расстояния
    duration = end_time - start_time
    distance = (duration * 34300) / 2  # 34300 см/с - скорость звука

    return distance

def loop():
    try:
        while True:
            distance = get_distance()
            print(f"Distance: {distance:.2f} cm")
            time.sleep(1)
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()

if __name__ == '__main__':
    setup()
    loop()

Этот код представляет собой программу для измерения расстояния с использованием ультразвукового датчика с использованием библиотеки OPi.GPIO. Программа отправляет звуковой импульс с триггерного пина датчика, измеряет время, за которое импульс отражается обратно, и рассчитывает расстояние до объекта, основываясь на времени прохождения звукового сигнала. Далее я поясню код по частям.

Описание кода:

Импорт библиотек:

import OPi.GPIO as GPIO
import time
  • OPi.GPIO — это библиотека для работы с GPIO-пинами (ввод/вывод общего назначения) на микрокомпьютерах Orange Pi. Она схожа с библиотекой RPi.GPIO для Raspberry Pi.

  • time — стандартная библиотека Python для работы со временем. В коде она используется для задержек и измерения времени.

Настройка пинов:

TRIG_PIN = 23
ECHO_PIN = 24

Здесь определяются два пина, к которым подключены триггер и эхо-вывод ультразвукового датчика. Пин TRIG_PIN будет выводить сигнал, а пин ECHO_PIN будет его считывать.

Функция setup():

def setup():
    GPIO.setboard(GPIO.PC)  # Установите вашу модель платы
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(TRIG_PIN, GPIO.OUT)
    GPIO.setup(ECHO_PIN, GPIO.IN)
    GPIO.output(TRIG_PIN, GPIO.LOW)
    time.sleep(2)
  • GPIO.setboard(GPIO.PC) — указывает модель платы Orange Pi, которую вы используете.

  • GPIO.setmode(GPIO.BCM) — устанавливает режим нумерации пинов в соответствии с их физическим расположением на плате (Broadcom SOC channel).

  • GPIO.setup(TRIG_PIN, GPIO.OUT) — устанавливает пин TRIG_PIN как вывод (output).

  • GPIO.setup(ECHO_PIN, GPIO.IN) — устанавливает пин ECHO_PIN как ввод (input).

  • GPIO.output(TRIG_PIN, GPIO.LOW) — задаёт низкий сигнал на триггерный пин (готовит датчик к отправке импульса).

  • time.sleep(2) — даёт две секунды на инициализацию системы.

Функция get_distance():

def get_distance():
    # Генерация 10 микросекундного импульса на триггер
    GPIO.output(TRIG_PIN, True)
    time.sleep(0.00001)  # 10 микросекунд
    GPIO.output(TRIG_PIN, False)

    # Измерение длительности сигнала
    while GPIO.input(ECHO_PIN) == 0:
        start_time = time.time()

    while GPIO.input(ECHO_PIN) == 1:
        end_time = time.time()

    # Вычисление расстояния
    duration = end_time - start_time
    distance = (duration * 34300) / 2  # Скорость звука в см/с (343 м/с)

    return distance
  1. Генерация импульса:

    • GPIO.output(TRIG_PIN, True) — отправляет короткий импульс длительностью 10 микросекунд на триггерный пин для генерации ультразвукового сигнала.

    • time.sleep(0.00001) — задержка на 10 микросекунд, после чего триггер выключается.

  2. Измерение времени прохождения сигнала:

    • while GPIO.input(ECHO_PIN) == 0 — цикл ожидает, пока на эхо-пине не появится высокий сигнал (начало приема эхо-сигнала), фиксируя момент начала измерения времени в переменной start_time.

    • while GPIO.input(ECHO_PIN) == 1 — этот цикл фиксирует момент окончания эхо-сигнала в переменной end_time.

  3. Расчёт расстояния:

    • duration = end_time - start_time — вычисляет время, которое прошло от отправки сигнала до получения эхо.

    • distance = (duration * 34300) / 2 — рассчитывает расстояние до объекта по формуле. 34300 см/с — это скорость звука в воздухе. Деление на 2 необходимо, так как сигнал проходит расстояние дважды (туда и обратно).

    В результате функция возвращает расстояние до объекта в сантиметрах.

Функция loop():

def loop():
    try:
        while True:
            distance = get_distance()
            print(f"Distance: {distance:.2f} cm")
            time.sleep(1)
    except KeyboardInterrupt:
        print("Measurement stopped by User")
        GPIO.cleanup()
  • while True — бесконечный цикл, в котором происходит измерение расстояния каждую секунду.

  • get_distance() — вызов функции для получения текущего расстояния до объекта.

  • print(f"Distance: {distance:.2f} cm") — вывод расстояния с точностью до двух знаков после запятой.

  • time.sleep(1) — задержка в 1 секунду между измерениями.

  • try/except KeyboardInterrupt — программа продолжает работу в цикле, пока пользователь не прервёт её (например, нажатием Ctrl+C). Когда происходит прерывание, выполняется блок except, который выводит сообщение и очищает настройки GPIO с помощью GPIO.cleanup().

Основной блок программы:

if __name__ == '__main__':
    setup()
    loop()
  • setup() — выполняется начальная настройка GPIO и датчика.

  • loop() — запускается основной цикл для постоянного измерения расстояния.

Last updated