Хочешь уверенно проходить IT-интервью?
Мы понимаем, как сложно подготовиться: стресс, алгоритмы, вопросы, от которых голова идёт кругом. Но с AI тренажёром всё гораздо проще.
💡 Почему Т1 тренажёр — это мастхэв?
- Получишь настоящую обратную связь: где затык, что подтянуть и как стать лучше
- Научишься не только решать задачи, но и объяснять своё решение так, чтобы интервьюер сказал: "Вау!".
- Освоишь все этапы собеседования, от вопросов по алгоритмам до диалога о твоих целях.
Зачем листать миллион туториалов? Просто зайди в Т1 тренажёр, потренируйся и уверенно удиви интервьюеров. Мы не обещаем лёгкой прогулки, но обещаем, что будешь готов!
Реклама. ООО «Смарт Гико», ИНН 7743264341. Erid 2VtzqwP8vqy
Что делаем?
Делаем простую сигнализацию на ультразвуковом датчике расстояния HC-SR04. Когда датчик обнаруживает препятствие, мы получаем уведомление в мобильном приложении IFTTT о срабатывании сигнализации, а камера делает 3 снимка, которые отправляются с Gmail-почты на любую другую почту.
Что понадобится?
- 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 Гц и поэтому человек его не слышит.
Датчик HC-SR04 работает, как сонар:
- Отправляет ультразвуковой импульс.
- Ловит отраженный от препятствия импульс.
- Вычисляет сколько времени потребовалось импульсу, чтобы достигнуть препятствия и вернуться обратно.
Характеристики датчика HC-SR04:
- Напряжение питания: 5 В.
- Диапазон расстояний: 2-400 см.
- Эффективный угол наблюдения: 15°.
- Рабочий угол наблюдения: 30°.
Как вычислить пройденное расстояние?
Зная скорость распространения звука в среде и временной интервал, можем вычислить расстояние:
Датчик считает расстояние туда-обратно. Нам нужна половина этого значения:
Скорость звука при температуре 20°C составляет 34 300 см/с.
После подстановки значений получаем:
Нумерация пинов Raspberry Pi
В Малине используют две системы нумерации пинов:
GPIO.BOARD
– пины нумеруются слева направо и сверху вниз от 1 до 40.GPIO.BCM
– пины нумеруются по Broadcom SOC и называются GPIO [номер]. На рис. в скобках указаны альтернативные значения пинов.
Мы будем использовать нумерацию GPIO.BCM со значениями пинов по умолчанию.
Схема подключения HC-SR04 к Raspberry Pi
- Пин питания
VCC
подключаем к пину5V
на Малине (красная линия). - Пин земли
GND
подключаем к пинуGND
на Малине (синяя линия). - Пин
Echo
подключаем кGPIO 26
(зеленая линия). - Пин
Trig
подключаем кGPIO 19
(оранжевая линия).
После получения импульса на пине Echo
устанавливается логический уровень 5 В, а Малина работает с логикой 3.3 В. Чтобы понизить напряжение добавим в схему два резистора разных номиналов, образующих делитель напряжения. Для расчета номиналов воспользуемся онлайн-калькулятором:
Нам нужны резисторы 1 и 2 кОм. Можно подобрать резисторы других номиналов. Главное – получить напряжение не выше 3.3 В, чтобы не испортить Малину.
На макетной плате поменяем положение датчика на «от» Raspberry Pi:
Подключение камеры
Установим шлейф камеры в Малину:
Присоединим шлейф к камере аналогичным образом:
Камера по умолчанию отключена. Для активации камеры зайдем в Меню
→ Preferences
→ Raspberry Pi Configuration
:
Перейдем во вкладку Interfaces
и активируем камеру:
Создание апплета IFTTT
Зарегистрируемся на сайте IFTTT и перейдем на страницу создания апплета.
В условие If This добавим Receive a web request
, в условие Then That
– Send a notification from IFTTT app
.
В условии If This
назовем событие signal
:
Теперь перейдем на страницу Вебхуков и кликнем по кнопке Documentation
:
Впишем название события signal
и получим ссылку, которая активирует наше событие.
Установим мобильное приложение IFTTT на Android или iOS, чтобы получать уведомления.
Установка библиотек
Установим библиотеку yagmail для отправки почты с аккаунта Gmail:
Остальные библиотеки – RPi.GPIO
для работы с пинами и picamera
для управления камерой – предустановлены.
Запускаем код
Импортируем необходимые библиотеки:
Напишем функцию create_shots_folder()
, которая создает папку для снимков:
Функция take_shots(number_of_shots)
управляет камерой и принимает на вход в качестве аргумента количество снимков number_of_shots:
Здесь:
shot_name
– название снимка: текущая дата и время без миллисекунд.shot_path
– путь к снимку.shots
– список с путями.pause
– пауза между снимками.
Функция send_email()
отправляет снимки с Gmail-почты на любую другую почту:
sender_email
– адрес Gmail-почты и пароль от нееsender_email_password
.recipient_email
– почтовый адрес получателя.
Чтобы отправить почту через скрипт, нужно открыть доступ для небезопасных приложений. Для этого зайдите в профиль Гугл-почты
→ Безопасность
→ Ненадежные приложения, у которых есть доступ к аккаунту
и откройте доступ ненадежным приложениям.
Функция send_ifttt_notification()
отправляет POST-запрос в IFTTT, активируя апплет:
Пины нужно объявлять один раз, поэтому напишем отдельную функцию setup_GPIO()
и вызовем ее в начале работы отдельно один раз:
Здесь:
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()
добавляет паузу после объявления пинов. Без паузы датчик работает некорректно.
Здесь:
GPIO.output(TRIGGER, GPIO.HIGH)
– чтобы запустить датчик в работу, подаем на пинTrigger
импульс длительностью 10 микросекунд (time.sleep(0.00001)
)while GPIO.input(ECHO) == 0
– пока отраженного сигнала нет, присваиваем переменнойstart
текущее время.while GPIO.input(ECHO) == 1
– при получении отраженного сигнала, фиксируем времяend
.
distance
– длительность сигнала, округленная до второго значения после запятой.
Если препятствие обнаружено на расстоянии 3-15 см, то в приложение IFTTT отправляется уведомление, а на почту – снимки.
Здесь:
except KeyboardInterrupt: GPIO.cleanup()
– возвращает пины в начальное состояние при выходе из программы черезCTRL + C
.
При обнаружение движения скрипт будет выводить следующее:
У меня ничего не работает
На СтакОверфлоу у многих возникает проблема с тем, что второй цикл while GPIO.input(ECHO) == 1:
не срабатывает, то есть сигнал ECHO
всегда равен 0
. Возможно, резисторы не касаются дорожек макетной платы. Установите ножки строго вертикально, чтобы они не изгибались и попадали на дорожку.
Если и это не помогло, то запустите скрипт и завершите работу, нажав 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 очереди с приоритетом
Комментарии