Последние несколько месяцев я работал над системой связи для стратостата. И хотя в первую очередь мне бы хотелось поговорить о высокоскоростной передаче данных на Землю, в этой статье я задокументировал всё, над чем работал.
На нашем стратостате используется три передатчика: передатчик на протоколе APRS (Automatic Packet Reporting System, протокол пакетной любительской радиосвязи), авиационный транспондер ADS-B и высокоскоростной канал нисходящей передачи.
APRS
Для отслеживания стратостата на больших расстояниях мы используем APRS-передатчик, потому что здесь, в Нью-Брансуик, у нас много цифровых репитеров и I-Gate. Даже если мы не будем получать его маяки, наверняка их получит кто-то другой, и тогда можно будет просто опросить сеть APRS-IS.
Мы используем модель MicroTrak 1000. Её выбрали ещё до того, как я присоединился к проекту. Мне эта модель не нравится – было бы здорово задействовать что-то с возможностью получения пакетов, чтобы иметь простой канал восходящей связи, но это скорее придирка. Мне также не нравится, что MicroTrak 1000 работает на проприетарном ПО – я бы предпочёл что-то доступное для хакинга. Тем не менее в роли APRS-передатчика эта модель функционирует отлично.
На стороне наземной станции мы получаем от него пакеты, используя антенну Arrow II и приёмник TM-231A. Аудиосигнал передаётся на ноутбук с программой Direwolf. Для визуализации этих пакетов и пакетов, поступающих через APRS-IS, используется Xastir.
▍ Кастомное ПО
В качестве альтернативы Xastir я написал программу balloon-aprs-util. Знаю, название очень креативное :) Она прослушивает пакеты APRS, поступающие от Direwolf и APRS-IS, выводя их в терминал. Кроме того, эта программа вычисляет расстояние от наземной станции до стратостата и азимут/высоту антенны. Идея состоит в том, чтобы максимально разгрузить людей – предоставлять только полезную информацию и не более. Xastir мы используем по необходимости для получения более широкой картины.
ADS-B
Полезная нагрузка у нас большая – настолько большая, что пришлось установить на борту авиационный транспондер ADS-B. В связи с этим возникли всякие технические сложности. Вы знали, что эти устройства передают сигнал при 250 Вт? Я вот не знал! Такая высокая мощность может легко создавать помехи для бортовых систем, с чем мы и столкнулись.
Этот транспондер, по сути, является автономной единицей оборудования, как и APRS-передатчик. В этом есть смысл, поскольку ему нужна серьёзная защита от дурака. В конце концов он требует соблюдения множества установленных нормативов.
На Земле мы также декодируем пакеты ADS-B. В основном это решение используется в качестве резервного дублирования, поскольку не предоставляет никакой дополнительной информации сверх APRS-передатчика. Схема очень проста – мы используем подключённый к диполю приёмник RTL-SDR за ~$50 для получения пакетов, передаваемых в dump1090. Это, пожалуй, наиболее готовая к использованию часть всей системы – никакого кастомного ПО.
Высокоскоростной нисходящий канал связи
Именно в работу со скоростной нисходящей линией связи я вложил свои основные усилия. Целью является отправка на Землю изображений высокой чёткости в реальном времени. На мой взгляд, это очень утончённая система, но в ней также есть множество подвижных деталей.
▍ Техническая часть
Мы используем модуль RF4463F30 для передачи пакетов с частотной манипуляцией (FSK, frequency shift keying) в диапазоне 70 см при мощности 1 Вт. Эти пакеты кодируются в формате LDPC (low-density parity-check code, код с низкой плотностью проверок на чётность). На Земле мы получаем их с помощью приёмника SDRPlay. Конечно, можно было взять ещё один RF4463F30 – он явно дешевле – но у него ниже чувствительность, и с ним не получится использовать программное декодирование битов. Один только он забрал бы на себя 6 дБ от нашего бюджета канала связи – точно не вариант.
SDRPlay подключён к 70 см сегменту антенны Arrow II, то есть нам нужно направить только одну антенну для работы APRS и скоростного нисходящего канала.
Эта система способна передавать до 500 Кбит/с в чистую или около 350 Кбит/с с учётом накладных издержек (в основном кодирования LDPC). Этой скорости достаточно для отправки высокоточных изображений всего за несколько секунд.
Изначально задумывалась прямая связь с RF4463 при помощи Pi Zero. К сожалению, его крохотный буфер объёмом 129 байт при 500 Кбит/с опустошается каждые несколько миллисекунд. Я выяснил, что при такой скорости передачи Pi не поспевает и иногда теряет пакеты, а его процессор оказывается постоянно загружен на 100%.
Изначальный дизайн платы. Трансивер RF4463 – металлический прямоугольник – подключён напрямую к Pi. Взаимодействие между ними происходит через SPI
Решением стала установка между Pi и RF4463 микросхемы STM32F411. По сути, она выступает в качестве огромного буфера – Pi передаёт данные STM32 пачками через UART, а STM32 отвечает за их последующую передачу RF4463 через SPI. Это супернадёжная схема, которая обеспечивает загрузку процессора Pi всего на несколько процентов. Честно говоря, я уверен, что STM32F411 – это перебор. Как только я разберусь с DMA (direct memory access, прямой доступ к памяти), то обязательно подберу микросхему попроще. В будущей ревизии печатной платы я избавлюсь от дочерней платы и добавлю микроконтроллер. Учтите, это всего лишь прототип.
А вот и новая плата. Я изменил цвет и добавил микроконтроллер. Для тестирования я использую Raspberry Pi первого поколения, но в полезной нагрузке мы задействуем Pi Zero.
Вам может стать интересно, зачем на плате место под второй RF4463. Идея состоит в том, чтобы при необходимости использовать вариант на 33 см для восходящего канала связи. Пока же у нас есть другая система для отправки команд. Ввиду большой массы полезной нагрузки нам необходим способ удалённого завершения миссии (то есть взрыва стратостата). Это основная причина для реализации восходящего канала.
▍ Программное обеспечение (полезная нагрузка)
Теперь поговорим о ПО. Почти все части этой системы коммуникации, по крайней мере на стороне полезной нагрузки, написал я. Состоит она из следующих компонентов:
- balloon-tx-monolith – выполняется на Pi Zero. Эта программа отвечает за выбор изображений для отправки, генерацию пакетов (включая кодирование LDPC), отправку их по UART и мониторинг температуры RF4463 (соответствующие данные также передаются по нисходящему каналу). Здесь используется очень простой протокол UART, который также включает восстановление на случай потери байта данных или добавления ошибочного. В противном случае конечный автомат STM32 оказался бы неточен.
- pi-transceiver-firmware – выполняется на STM32. Сначала эта прошивка устанавливает для RF4463 правильную конфигурацию. Затем она начинает прослушивать поступление пакетов по UART для их отправки RF4463 (естественно, с буферизацией). Эта программа довольно проста и даже не понимает пакеты, которые передаёт. Она также получает информацию о температуре RF4463 и отправляет её Pi по UART.
- rf4463-lib – библиотека Rust, которую я написал для взаимодействия с RF4463. Технически она будет работать с любыми трансиверами Si4463, на которых основан RF4463. Сейчас она выполняется на STM32, но раньше я запускал её на Pi.
▍ Программное обеспечение (Земля)
ПО наземной станции. Слева фото, а справа графики отладки и логи состояний
На Земле я использую свой форк проекта Wenet. Заставить эту систему работать оказалось сложнее, чем я ожидал. На пути от RTL-SDR к SDRPlay возникло немало проблем, связанных с пропускной способностью. Мне также пришлось избавиться от дефрейминга на RS-232 – передатчик Wenet работает посредством программной эмуляции (bit-banging) Si4463, что вносит издержки, которые необходимо устранять на стороне получения. Я внёс и другие небольшие изменения, но эти два были самыми значительными.
Хочется выразить огромную благодарность всем, кто работал над Wenet – это реальная жемчужина опенсорса, и она послужила прекрасной отправной точкой для всей системы. Единственное, что мне не нравится в SDRPlay – это то, что у него проприетарный драйвер. Если бы я знал об этом изначально, то купил бы что-то другое.
Дальнейшие шаги
Все эти системы совершат свой первый полёт 17 июня 2023 года (оригинал статьи был опубликован 13 июня). Больше всего у меня вызывает восхищение то, как работает высокоскоростной канал нисходящей связи, особенно на дальних расстояниях.
Я также планирую запустить собственный стратостат, уже вне текущей команды. Он будет намного меньше и включать в себя высокоскоростной канал связи с Землёй, Pi Zero, камеру и GPS. Я хочу немного переписать ПО, чтобы данные GPS отправлялись по нисходящему каналу, а не через отдельный передатчик.
Надеюсь, что другие любители, интересующиеся запуском стратостатов, найдут моё ПО или аппаратное обеспечение полезным. Если программу balloon-tx-monolith доработать, то скорости в 500 Кбит/с должно быть достаточно для поддержания видеопотока среднего качества в реальном времени. Кстати говоря, думаю, эта система вполне подошла бы роботу или квадрокоптеру, так что впереди у меня ещё много интересных задач.
Выиграй телескоп и другие призы в космическом квизе от RUVDS. Поехали? 🚀
Автор: Дмитрий Брайт