Создание проекта на основе ESP32
В последнее время всё популярнее становится протокол передачи данных LoRa. Уже несколько спутников вовсю его используют и существует целая сеть приёма сигналов - tinyGS. Конечно же, пропустить такое я не мог и начал исследовать как подключить протокол LoRa к r2cloud. К сожалению, это закрытый протокол, поэтому демодулировать его стандартным rtl-sdr не получится. Для получения сигнала нужно использовать специальный чип, который на выходе уже выдаст готовый пакет. Этот чип можно подключить напрямую к Raspberrypi, но обычно его используют в связке с ESP32. Для того, чтобы передать данные из ESP32 в Raspberrypi, я создал отдельный проект - r2lora.
Постановка задачи
Итак, нужно дать доступ к чипу LoRa из r2cloud. Желательно, чтобы интерфейс доступа был универсальный и подходил не только для проекта r2cloud. Это позволит другим проектам, не связанным с приёмом спутниковых сигналов, использовать проект, улучшать и вносить изменения.
Есть несколько вариантов:
- Полностью реализовать функционал r2cloud на ESP32. Сюда входит: составление расписания пролётов, получение параметров спутников, авто-обновление, отправка на центральный сервер. Это достаточно трудоёмкий процесс - ведь придётся переписать очень много уже готового и оттестированного кода. Опять же, непонятно хватит ли мощности ESP32 для расчёта орбит спутников.
- Написать минимальное приложение для управления чипом и контролировать приём сигнала из r2cloud.
Я решил пойти вторым путём. Во-первых, в r2cloud уже есть поддержка получения данных из внешних источников (plutosdr и sdr-server). Поэтому для добавления LoRa будет достаточно написать ещё один модуль. Во-вторых, логики на ESP32 будет минимальное количество. Чем меньше кода, тем меньше ошибок. В-третьих, такой дизайн позволит переиспользовать проект не только для приёма сигналов со спутников.
Дизайн
В общем виде дизайн r2lora выглядит следующим образом:
Клиенты взаимодействуют с сервисом с помощью REST API, в котором доступно несколько методов:
- начать получение данных
- получить все принятые пакеты данных. Нужно запускать периодически для скачивания принятых пакетов.
- окончить получение данных
- передать данные
- получить статус приложения
Я выбрал именно поллинг данных вместо вебсокетов, так как его наиболее просто реализовать на ESP32. А также потому, что он очень надёжный. При использовании вебсокетов пришлось бы реализовывать алгоритмы переподключения и дедубликации данных.
Помимо основного функционала, необходимо реализовать вспомогательный. Компонент “Configurator” предназначен для того, чтобы создать начальную конфигурацию устройства. Он работает следующим образом:
- Если устройство ещё не сконфигурировано, то необходимо поднять собственную точку доступа.
- Для того чтобы выполнить начальную конфигурацию, пользователь должен подключится к этой точке доступа, настроить логин, пароль к локальной WiFi точке доступа.
- Отсоединится
- После чего, устройство отключит собственную точку доступа и попытается подключиться к локальной
- Если подключение удалось, то приложение стартует WebServer и начинает слушать команды от пользователя
Если устройство уже сконфигурировано, то оно сразу должно подключатся к локальной точке доступа. Если же подключение не удалось, то оно должно возвращаться в начальное состояние и поднимать собственную точку.
Ещё одним обязательным компонентом является Firmware-Over-The-Air (FOTA). Все приложения содержат ошибки, одним из способов уменьшения их влияния является автообновление. FOTA позволяет автоматически скачивать прошивку с центрального сервера и обновлять устройство.
Выбор инструментов
Для разработки под ESP32 есть несколько инструментов: Arduino IDE, PlatformIO и ESP-IDF. На самом деле стандартом де-факто постепенно стал PlatformIO. Он позволяет не только разрабатывать проект на C/C++, но и собирать проект, управлять сторонними библиотеками, запускать тесты, анализировать код и многое другое.
PlatformIO - это просто плагин к Visual Studio Code. Для установки достаточно скачать VSCode и установить плагин.
Помимо IDE, PlatformIO предоставляет CLI. С помощью него можно делать всё то же самое, что и в IDE, но в консоли. Дизайн PlatformIO очень похож на cmake, который лишь вызывает gcc с нужными параметрами, генерирует makefile, собирает приложение и пр. PlatformIO скачивает многочисленные Python-зависимости и делегирует сборку тому же ESP-IDF. При этом он отлично интегрирует множество несвязанных инструментов между собой позволяя сосредоточится на разработке приложения, а не конфигурировании.
На самом деле PlatformIO покрывает 100% всех потребностей. За несколько месяцев разработки я не испытывал никаких неудобств, и всё было под рукой.
В следующей статье я постараюсь описать структуру проекта, процесс разработки приложения и раскрыть некоторые особенности программирования под микроконтроллеры.
Далее: настройка проекта