Содержание статьи
На мой взгляд, основное достоинство Python — универсальность: с его помощью можно решить практически любую задачу благодаря огромному количеству сборок. Это привносящий магию C++ Cython, браузерный Brython, позволяющий работать с Java Jython и множество библиотек на все случаи жизни.
Но до сравнительно недавнего времени, если Python-программист хотел сделать девайс для умного дома или машинку на радиоуправлении, он был вынужден либо использовать Arduino и волей‑неволей учить C++, либо довольствоваться микрокомпьютером вроде Raspberry Pi и искать (а порой и писать свои) библиотеки для управления теми или иными китайскими модулями. Иногда вообще приходилось создавать хтонических чудовищ, подключая проводом Arduino к Raspberry и опрашивая датчики через serial port, но все равно при этом нужно было писать прошивку для Arduino или другого контроллера на C++.
Но уже примерно пять лет, если судить по дате моей статьи про MicroPython, можно заниматься DIY-проектами, не переключаясь с одного языка программирования на другой. За это время многое в мире MicroPython поменялось, вышли новые сборки, появились одни библиотеки и полностью перестали поддерживаться другие, а Arduino официально приняла MicroPython в свою экосистему.
С каждым годом число поддерживающих MicroPython плат растет, но значительный их процент все еще базируется на ESP32. И действительно, у этого контроллера масса достоинств, таких как встроенные Wi-Fi и BLE, а еще, если говорить честно, отсутствие конкурентов в том же ценовом диапазоне. Но вот что касается плат, базирующихся на этом контроллере, — тут глаза разбегаются. Это и базовые версии от WeMos, целые наборы и модули от M5Stack и LILYGO. Не отстают, кстати, и российские инженеры: магазин iArduino не так давно выпустил свою отладочную плату Piranha.
К тому же нельзя забывать про Великий Китайский Ноунейм, которым завален «Алиэкспресс». Кстати, в нашем проекте мы будем использовать одну из таких плат — ESP32-CAM (я так и не смог разобраться, кто же ее официальный производитель). Как несложно догадаться по названию, это модуль на основе ESP32 с подключенной камерой, чаще всего это OV2640, но если ты хочешь добиться лучшего качества, то можно подключить и другие.
![Pinout Map Pinout Map](https://static.xakep.ru/images/256f17ae09041ad7eb0d37991e4138e9/31075/pinout.png)
Вот список необходимого ПО:
- твоя любимая IDE для разработки — я использую PyCharm;
- ESP32 MPY-Jama — кросс‑платформенная IDE для MicroPython;
- Telegram.
Итак, что же мы будем делать? Как ты уже, наверное, догадался, судя по тому, что я выбрал плату с камерой, — систему видеонаблюдения. Но не простую, с постоянной трансляцией, а с возможностью мгновенно получить фотографию. Управлять ею мы будем через Telegram-бота, а чтобы не пришлось покупать статический IP-адрес, для общения бота и девайса используем протокол MQTT.
info
MQTT (Message Queuing Telemetry Transport) — это легковесный протокол передачи сообщений, который используется для обмена данными между устройствами в интернете вещей (IoT). Он призван обеспечивать надежную связь между множеством устройств, которые работают с ограниченными ресурсами и могут быть подключены к интернету только временно или с периодическими задержками.
MQTT работает по принципу «издатель — подписчик», где одни устройства могут публиковать сообщения в топики (topics), а другие подписываться на них, чтобы получать сообщения, которые им нужны. Протокол предоставляет гибкий и простой способ передачи сообщений, что делает его идеальным для использования в системах IoT, где устройства могут иметь разные функциональные возможности и ограничения.
Настройка инфраструктуры
Перед тем как непосредственно перейти к программированию, необходимо настроить так называемый MQTT-брокер. Это сервер, на котором располагаются топики и к которому подключаются подписчики и издатели.
Разумеется, можно настроить его самостоятельно, например используя Mosquitto. Но стоит только подумать, что, кроме самого брокера, придется настраивать сервер, беспокоиться о его безопасности и так далее, как желание заниматься проектом куда‑то пропадает.
Так что в качестве брокера мы будем использовать сервис shiftr.io. Его бесплатного тарифа нам хватит с головой. Среди достоинств этого сервиса — интуитивно понятный интерфейс, подробная документация и визуализация всей системы. На главной странице твоего проекта можно увидеть, какие топики созданы и какое в них было последнее сообщение, какие устройства подключены, а когда начнутся рассылки пакетов — их тоже будет видно!
![Пример, как может все отображаться Пример, как может все отображаться](https://static.xakep.ru/images/256f17ae09041ad7eb0d37991e4138e9/31073/example.png)
Чтобы наши устройства — телеграм‑бот и ESP32-CAM — могли взаимодействовать с нашим MQTT-брокером, необходимо выпустить токен. Это можно сделать в настройках твоего пространства.
![](https://static.xakep.ru/images/256f17ae09041ad7eb0d37991e4138e9/31078/new-token2.png)
После этого в списке токенов появится такой элемент: mqtt://
, где xakep
— это логин, а utBmi6LTWS7b4l5
— пароль. Запомни их, они нам еще пригодятся. Инфраструктура настроена, можно приступать к программированию.
ESP32-CAM
Для программирования ESP32 на MicroPython существует несколько IDE. Я остановил свой выбор на ESP32 MPY-Jama — опенсорсном решении со множеством удобных функций.
Одна из них — графический интерфейс для утилиты esptool. Которую, впрочем, все равно нужно установить через pip: pip
.
![Так выглядит загрузчик Так выглядит загрузчик](https://static.xakep.ru/images/256f17ae09041ad7eb0d37991e4138e9/31071/burner.png)
Мы будем использовать специальную прошивку для ESP32-CAM, она доступна в этом GitHub-репозитории. Скачиваем файл прошивки и, используя IDE, прошиваем, не забыв перед этим отформатировать Flash-память.
Теперь мы можем подключиться и загрузить необходимые файлы на нашу плату. Для работы, кроме встроенных библиотек, нам понадобятся библиотеки micropython-umqtt.
и micropython-umqtt.
. Их можно установить с помощью встроенного менеджера пакетов upip. Для этого подключись к интернету через Wi-Fi, а затем выполни следующие команды:
import networkimport upip# Не забудь вставить имя своей Wi-Fi-сети и пароль от нееdef wifi_setup(): global sta_if sta_if.active(True) sta_if.scan() sta_if.connect('SSID', 'PASSWORD') print("Waiting for Wifi connection") while not sta_if.isconnected(): time.sleep(1) print("Connected to WiFi")wifi_setup()upip.install("micropython-umqtt.robust")upip.install("micropython-umqtt.simple")
Теперь у нас все готово для работы. Чтобы облегчить задачу, я написал небольшую библиотечку — со всеми необходимыми функциями. Давай посмотрим, что в нее входит.
Вначале импортируем необходимые библиотеки:
-
network
— для подключения к интернету; -
umqtt.
— для взаимодействия с MQTT-брокером;robust -
camera
— в этой библиотеке находятся функции для работы с камерой; -
time
— похож на одноименную библиотеку из обычного Python; -
machine
— это базовый модуль MicroPython, позволяющий управлять пинами.
# Импорт библиотекimport networkfrom umqtt.robust import MQTTClientimport cameraimport timeimport machine# Инициализация глобальных переменныхsta_if = network.WLAN(network.STA_IF); # Wi-Fi-модульcamera.init(0, format=camera.JPEG, fb_location=camera.PSRAM) # Непосредственно камераmqtt_client = None # Заготовка для MQTT-клиентаled = machine.Pin(4, machine.Pin.OUT) # Встроенный светодиод
С одной из функций библиотеки мы познакомились раньше, когда подключались к Wi-Fi, теперь рассмотрим остальные.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»