Share This
Связаться со мной
Крути в низ
Categories
//👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Создаем охранную систему с помощью Raspberry Pi, датчика расстояния HC-SR04 и камеры. Снимки нарушителя границ безопасности отправляем на почту и получаем уведомление в мобильное приложение IFTTT.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 2c2e33a - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Что делаем?

Делаем простую сигнализацию на ультразвуковом датчике расстояния HC-SR04. Когда датчик обнаруживает препятствие, мы получаем уведомление в мобильном приложении IFTTT о срабатывании сигнализации, а камера делает 3 снимка, которые отправляются с Gmail-почты на любую другую почту.

IFTTT – платформа, связывающая сервисы, системы умного дома для создания автоматических процессов. Например, включить музыку в Spotify в 9:55 минут, если температура за окном меньше 10°C и в Google-календаре нет событий. В IFTTT доступны тысячи готовых апплетов.

Что понадобится?

  • Raspberry Pi 3/4.
  • Резисторы 1 кОм и 2 кОм по 1 шт.
  • Ультразвуковой датчик расстояния HC-SR04.
  • Модуль камеры Raspberry Pi Camera v1.3 или v2.1.

Установка операционной системы

Скачаем операционную систему Raspberry Pi OS и установим ее на microSD-карту с помощью balenaEtcher.

Ультразвуковой датчик HC-SR04

Что такое ультразвук?

Человек слышит звуки в диапазоне от 20 (низкий бас) до 20 000 Гц (высокочастотный свист). Ультразвук имеет частоту более 20 000 Гц и поэтому человек его не слышит.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 4b0c622 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Датчик HC-SR04 работает, как сонар:

  • Отправляет ультразвуковой импульс.
  • Ловит отраженный от препятствия импульс.
  • Вычисляет сколько времени потребовалось импульсу, чтобы достигнуть препятствия и вернуться обратно.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery a13bb77 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Принцип работы ультразвукового датчика расстояния HC-SR04

Характеристики датчика HC-SR04:

  • Напряжение питания: 5 В.
  • Диапазон расстояний: 2-400 см.
  • Эффективный угол наблюдения: 15°.
  • Рабочий угол наблюдения: 30°.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery cabab7c - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Диаграмма направленности ультразвукового датчика расстояния HC-SR04

Как вычислить пройденное расстояние?

Зная скорость распространения звука в среде и временной интервал, можем вычислить расстояние:

S=V×t

Датчик считает расстояние туда-обратно. Нам нужна половина этого значения:

S=V×t2

Скорость звука при температуре 20°C составляет 34 300 см/с.

После подстановки значений получаем:

S=17150×t

Нумерация пинов Raspberry Pi

В Малине используют две системы нумерации пинов:

  • GPIO.BOARD – пины нумеруются слева направо и сверху вниз от 1 до 40.
  • GPIO.BCM – пины нумеруются по Broadcom SOC и называются GPIO [номер]. На рис. в скобках указаны альтернативные значения пинов.

Мы будем использовать нумерацию GPIO.BCM со значениями пинов по умолчанию.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 8a02ccb - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Распиновка GPIO на Raspberry Pi 4

Схема подключения HC-SR04 к Raspberry Pi

  • Пин питания VCC подключаем к пину 5V на Малине (красная линия).
  • Пин земли GND подключаем к пину GND на Малине (синяя линия).
  • Пин Echo подключаем к GPIO 26 (зеленая линия).
  • Пин Trig подключаем к GPIO 19 (оранжевая линия).

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 08dd6a4 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Схема подключения ультразвукового датчика расстояния HC-SR04 к Raspberry Pi 4

После получения импульса на пине Echo устанавливается логический уровень 5 В, а Малина работает с логикой 3.3 В. Чтобы понизить напряжение добавим в схему два резистора разных номиналов, образующих делитель напряжения. Для расчета номиналов воспользуемся онлайн-калькулятором:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery f05860b - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Расчет делителя напряжения

Нам нужны резисторы 1 и 2 кОм. Можно подобрать резисторы других номиналов. Главное – получить напряжение не выше 3.3 В, чтобы не испортить Малину.

На макетной плате поменяем положение датчика на «от» Raspberry Pi:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 46349e1 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Подключения датчика расстояния HC-SR04 к Raspberry Pi 4 на монтажной плате

Подключение камеры

Установим шлейф камеры в Малину:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 1ec2ef1 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Подключение камеры к Raspberry Pi 4

Присоединим шлейф к камере аналогичным образом:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 3565b5b - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Камера по умолчанию отключена. Для активации камеры зайдем в Меню PreferencesRaspberry Pi Configuration:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 88a33a8 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Перейдем во вкладку Interfaces и активируем камеру:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery e78bf76 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Активация камеры в Raspberry Pi 4

Создание апплета IFTTT

Зарегистрируемся на сайте IFTTT и перейдем на страницу создания апплета.

В условие If This добавим Receive a web request, в условие Then ThatSend a notification from IFTTT app.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery c38d04c - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Создание апплета IFTTT

В условии If This назовем событие signal:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery a5ff4e1 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Теперь перейдем на страницу Вебхуков и кликнем по кнопке Documentation:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery cb57aa5 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Впишем название события signal и получим ссылку, которая активирует наше событие.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 4a55ba4 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Установим мобильное приложение IFTTT на Android или iOS, чтобы получать уведомления.

Установка библиотек

Установим библиотеку yagmail для отправки почты с аккаунта Gmail:

         pip3 install yagmail     

Остальные библиотеки – RPi.GPIO для работы с пинами и picamera для управления камерой – предустановлены.

Запускаем код

Импортируем необходимые библиотеки:

         from picamera import PiCamera import RPi.GPIO as GPIO import datetime import requests import yagmail import time import os     

Напишем функцию create_shots_folder(), которая создает папку для снимков:

         # функция, проверяющая наличие/создающая папку shots def create_shots_folder():     # если папки shots не существует     if not os.path.exists('shots'):         # то создать папку shots в текущем каталоге         os.mkdir('shots')     

Функция take_shots(number_of_shots) управляет камерой и принимает на вход в качестве аргумента количество снимков number_of_shots:

         # функция, управляющая камерой def take_shots(number_of_shots):     # инициализация камеры     camera = PiCamera()     # задаем разрешение снимка     camera.resolution = (1024, 768)     # список, в который добавим пути к снимкам     shots = []     # цикл, который number_of_shots-раз сделает снимки с паузой 0.5 сек     for i in range(number_of_shots):         # получим текущую дату и время без миллисекунд         time_of_the_crime = datetime.datetime.today().replace(microsecond=0)         # присвоим снимку имя: текущая дата и время плюс расширение .jpg         shot_name = str(time_of_the_crime) + '.jpg'         # получим путь к снимку         shot_path = os.path.join(os.getcwd(), 'shots', shot_name)         # сделаем снимок и сохраним его в папку shots под именем shot_name         camera.capture(shot_path)         print('Сделал снимок:', shot_name)         # добавим путь к снимку в список снимков shots         shots.append(shot_path)         # пауза между снимками в секундах         pause = 0.5         time.sleep(pause)      # отключим камеру     camera.close()      return shots     

Здесь:

  • shot_name – название снимка: текущая дата и время без миллисекунд.
  • shot_path – путь к снимку.
  • shots – список с путями.
  • pause – пауза между снимками.

Функция send_email() отправляет снимки с Gmail-почты на любую другую почту:

         def send_email(sender_email, sender_email_password, recipient_email, number_of_shots):     # список с путями снимков     shots = take_shots(number_of_shots)     # senders_email - Gmail-адрес отправителя     # senders_email_password - пароль от Gmail     email = yagmail.SMTP(user=sender_email, password=sender_email_password)     # subject - тема письма     # contents - содержимое письма     # attachments - вложения (снимки)     email.send(to=recipient_email, subject='Проникновение в помещение', contents='Тревога!', attachments=shots)     print('Снимки отправлены на почту.n')     
  • sender_email – адрес Gmail-почты и пароль от нее sender_email_password.
  • recipient_email – почтовый адрес получателя.

Чтобы отправить почту через скрипт, нужно открыть доступ для небезопасных приложений. Для этого зайдите в профиль Гугл-почтыБезопасностьНенадежные приложения, у которых есть доступ к аккаунту и откройте доступ ненадежным приложениям.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 4d668ca - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Функция send_ifttt_notification() отправляет POST-запрос в IFTTT, активируя апплет:

         def send_ifttt_notification():     # ссылка на апплет IFTTT     link = 'https://maker.ifttt.com/trigger/НАЗВАНИЕ_ПРИЛОЖЕНИЯ/with/key/КЛЮЧ'     # отправляем post-запрос в IFTTT, чтобы сработал апплет     requests.post(link)     print('Уведомление отправлено в приложение IFTTT.')     

Пины нужно объявлять один раз, поэтому напишем отдельную функцию setup_GPIO() и вызовем ее в начале работы отдельно один раз:

         def setup_GPIO():     # отключим уведомления об ошибках     GPIO.setwarnings(False)     # используем нумерацию выводов BCM     GPIO.setmode(GPIO.BCM)     # пин Trig     TRIGGER = 19     # пин Echo     ECHO = 26     # установим режим работы пина TRIGGER на Выход     GPIO.setup(TRIGGER, GPIO.OUT)     # установим режим работы пина ECHO на Вход со стягивающим резистором     GPIO.setup(ECHO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)     return TRIGGER, ECHO     

Здесь:

  • TRIGGER и ECHO подключены к пинам GPIO 19 и 26 соответственно.
  • GPIO.setup(TRIGGER, GPIO.OUT) – пин TRIGGER установлен на выходной сигнал.
  • GPIO.setup(ECHO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN) – пин ECHO установлен на входной сигнал со стягивающим резистором GPIO.PUD_DOWN, который устанавливает на пине изначальное значение LOW. Без этой опции на пине из-за помех может появиться логическая единица и мы получим ложное срабатывание и первый цикл while в функции ultrasonic_detection() не сработает.

Функция pause() добавляет паузу после объявления пинов. Без паузы датчик работает некорректно.

         def ultrasonic_detection(TRIGGER, ECHO):     # подадим импульс, т . е. установим состояние пина на HIGH     GPIO.output(TRIGGER, GPIO.HIGH)     # длительность импульса 0.00001 сек     time.sleep(0.00001)     # установим состояние пина TRIGGER на LOW     GPIO.output(TRIGGER, GPIO.LOW)     # считываем состояние пина ECHO     # пока ничего не происходит, фиксируем текущее время start     while GPIO.input(ECHO) == 0:         start = time.time()     # если обнаружено движение, зафиксируем время end     while GPIO.input(ECHO) == 1:         end = time.time()     

Здесь:

  • GPIO.output(TRIGGER, GPIO.HIGH) – чтобы запустить датчик в работу, подаем на пин Trigger импульс длительностью 10 микросекунд (time.sleep(0.00001))
  • while GPIO.input(ECHO) == 0 – пока отраженного сигнала нет, присваиваем переменной start текущее время.
  • while GPIO.input(ECHO) == 1 – при получении отраженного сигнала, фиксируем время end.
         # рассчитаем длительность сигнала     signal_duration = end - start     # рассчитаем расстояние до объекта     distance = round(signal_duration * 17150, 2)     
  • distance – длительность сигнала, округленная до второго значения после запятой.
             # если объект обнаружен на расстоянии от 3 до 15 см     if 3 < distance < 15:         print("Замечено движение на расстоянии", distance, "см. от датчика.")         # отправим уведомление в приложение IFTTT         send_ifttt_notification()         # отправим снимки на почту         send_email(sender_email='gmail', sender_email_password='gmail_password',                  recipient_email='email', number_of_shots=3)     

Если препятствие обнаружено на расстоянии 3-15 см, то в приложение IFTTT отправляется уведомление, а на почту – снимки.

         def main():     create_shots_folder()     TRIGGER, ECHO = setup_GPIO()     pause(10)     while True:         try:             ultrasonic_detection(TRIGGER, ECHO)         except KeyboardInterrupt:             GPIO.cleanup()   if __name__ == "__main__":     main()     

Здесь:

  • except KeyboardInterrupt: GPIO.cleanup() – возвращает пины в начальное состояние при выходе из программы через CTRL + C.

При обнаружение движения скрипт будет выводить следующее:

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 580e0a1 - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

У меня ничего не работает

На СтакОверфлоу у многих возникает проблема с тем, что второй цикл while GPIO.input(ECHO) == 1: не срабатывает, то есть сигнал ECHO всегда равен 0. Возможно, резисторы не касаются дорожек макетной платы. Установите ножки строго вертикально, чтобы они не изгибались и попадали на дорожку.

raspberry pi nacheku delaem za chas ohrannuju sistemu s pomoshhju datchika rasstojanija i kamery 966c92e - 👮 Raspberry Pi начеку: делаем за час охранную систему с помощью датчика расстояния и камеры

Расположение дорожек на макетной плате

Если и это не помогло, то запустите скрипт и завершите работу, нажав Ctrl + C, чтобы сработало исключение KeyboardInterrupt: GPIO.cleanup() и пины вернулись к исходным значениям.

Если температура окружающей среды изменилась, то подкорректируйте скорость звука в среде.

Со звукопоглощающими материалами датчик HC-SR04 работать не будет.

GitHub

Код лежит в репозитории ultrasonic-rpi-alarm.

***

В этой статье мы:

  • научились программировать Raspberry Pi 3/4;
  • работать с пинами GPIO;
  • управлять камерой Raspberry Pi Camera и датчиком расстояния HC-SR04;
  • отправлять почту с вложениями;
  • создавать апплеты IFTTT.

Материалы по теме

  • Что должен знать начинающий IoT-разработчик в 2021 году?
  • 25 ресурсов для изучения IoT-разработки в 2021 году: онлайн-университеты, каналы, блоги и подкасты
  • 37 лучших каналов YouTube про робототехнику: от новичка до профессионала
  • Планирование маршрута роботом при помощи RRT
  • Робот в лабиринте: обрабатываем в Python очереди с приоритетом

  • 1 views
  • 0 Comment

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Связаться со мной
Close