Недавно попалось на глаза поворотное устройство для видеокамер PTZ 3050DZ, которое заинтересовало меня невысокой стоимостью и приличным заявленным весом поворачиваемой видеокамеры в 10 килограмм. Подумалось, что оно вполне может подойти для использования с небольшими спутниковыми антеннами. По ходу дела пришлось смастерить для него еще и дистанционное управление с применением модулей LoRa. Жмите кнопку ниже, чтоб узнать подробности.

Тема поворотных устройств для спутниковых антенн всегда занимала радиолюбителей. В интернете можно найти десятки конструкций двухкоординатных поворотных устройств, которые собирают студенты и школьники с использованием Arduino, Raspberry PI и разных других контроллеров. Простые в изготовлении конструкции радиолюбителей обычно недороги, но сделаны без серьёзной защиты от погодных фактов – дождя, снега, наледи и пр., помимо этого, не рассчитаны на серьезные ветровые нагрузки. Для разового выхода в поле такие конструкции вполне годятся, а для постоянной установки на улице лучше поискать что-то более крепкое. И тут выбор не очень большой, а цены кусаются. Приобретение и установка одного из наиболее удачных и популярных устройств Yaesu G-5500 облегчит ваш кошелёк на добрую сотню тысяч рублей. Мне показалось, что это избыточно для приёма большинства низкоорбитальных спутников, поэтому использование недорогого PTZ для видеокамер выглядит привлекательно.

Надо сказать, что в наше время китайские PTZ поворотные устройства активно используются для всяких радаров, глушилок и пр., что сильно подняло на них цены, они порой гораздо выше, чем у Yaesu. Но PTZ 3050DZ на этом фоне приятно удивляет соотношением цены и качества. В настоящее время за него просят около 15000 рублей, что практически на порядок дешевле решения Yaesu. При том, что типичная антенна для работы через спутники редко весит больше нескольких килограммов и обладает низкой парусностью, нагрузочной способности 3050DZ в 10 кг вполне должно хватить для поворота такой антенны даже с учетом веса противовеса, порывов ветра, обледенения и отдыхающей на антенне стаи птиц.

Однако есть у 3050DZ и недостатки. Корпус защищен от дождя и брызг, но негерметичен. Отсутствует подогрев, что ставит под вопрос работу в условиях налипания снега и обледенения. Так что это решение зимой может дать сбой. Есть и более тонкие проблемы с прошивкой, которая не позволяет использовать низкие скорости вращения, хотя по стандарту должна, но об этом позже. Некоторое неудобство вызывает и то, что при каждом включении питания происходит довольно длительная автокалибровка поворотного устройства: оно вращается во всех направлениях до срабатывания концевых выключателей и только после окончания калибровки начинает реагировать на команды.

В качестве антенны я решил использовать проверенную конструкцию 7 элементной антенны на диапазон 430 МГц RZ9CJ. У этой антенны, с одной стороны, неплохой коэффициент усиления, а с другой стороны, небольшой размер и довольно широкая диаграмма направленности, прощающая всякие погрешности и люфты при наведении антенны на спутник.

В процессе доработок антенна была превращена в антенну с круговой поляризацией для более уверенного приёма спутников. На одной траверсе были совмещены две одинаковых антенны под прямым углом, а сдвиг фаз между ними на четверть длины волны обеспечивается согласующим устройством. При этом хоть и теряется 3 дб усиления, но всё же подобная конструкция позволяет более стабильно принимать популярные спутники ДОСААФ 85, старичка SO50, большинство студенческих спутников типа УМКА и ему подобных.

Обратимся теперь к вопросу управления поворотным устройством. Как типичный представитель PTZ для видеокамер, 3050DZ поддерживает протокол управления PELCO-D по интерфейсу RS485. В устройстве под герметичной крышкой есть несколько переключателей, с помощью которых можно сделать основные настройки скорости интерфейса и адреса устройства. Я использовал всё по умолчанию, самую низкую и стандартную скорость 2400 бод, в надежде на лучшую помехоустойчивость.

В протоколе PELCO-D есть довольно много команд, но для управления углами азимута и элевации можно использовать всего несколько. На первый взгляд, достаточно использовать команды протокола, которые позволяют сразу задать целевой угол поворота (SET PAN POSITION, SET TILT POSITION). Но у них есть недостаток: пока команда выполняется, то есть моторы поворачивают антенну на заданные углы, обмен информацией блокируется. Это не очень удобно, хочется видеть динамику движения антенны, а не просто дожидаться результата.

Более интересное решение предложил belovictor в своем репозитории на гитхабе https://github.com/belovictor/pelco_d_rotator . Там предлагается программа управления 3050DZ на Python, реализующая протокол управления поворотными устройствами hamlib. Одной из фишек является то, что цикл управления поворотом антенны выполняется программно: в зависимости от текущего положения поворотного устройства и заданных целевых координат вычисляется направление поворота, потом асинхронно запускается движение в этом направлении и в цикле считывается текущее положение антенны. При достижении заданных углов выдаётся команда на остановку движения.

К сожалению, с моим экземпляром 3050DZ такой цикл работал не очень хорошо – антенна часто поворачивалась быстрее, чем нужно. В результате проскакивала целевое положение, и система входила в автоколебания.

В итоге я несколько модернизировал скрипт, так чтоб, во-первых, при приближении к целевому углу уменьшалась скорость вращения, а, во-вторых, когда до целевого значения остается довернуть антенну на считанные градусы, то более не используется внешний цикл регулирования, а просто выполняется стандартная команда позиционирования, которая в таком случае, хоть и блокирует обмен, но выполняется достаточно быстро. Кстати, в ходе экспериментов с уменьшением скорости вращения было выявлено, что при установке низкой скорости движение вообще останавливалось, хотя по стандарту PELCO-D такого быть не должно. Эту особенность пришлось учитывать.

В таком виде программа вполне пригодна для использования с любыми радиолюбительскими трекерами спутников, которые совместимы с hamlib. Вот только я планировал разместить антенну на крыше и лишней пары проводов для обмена по RS485 для управления повороткой у меня не нашлось. Наиболее естественным было бы в таком случае использовать для управления какой-нибудь контроллер типа ESP32 c поддержкой WiFi, но экспериментально я выяснил, что мой WiFi не добивает до крыши, и связь установить не удаётся. Т.е. нужно было более дальнобойное решение. Тут я вспомнил про ранее закупленные для разных экспериментов модули LoRa EBYTE E220-T22D. С их помощью можно организовать обмен через последовательный порт (UART) на значительные расстояния. Для управления поворотным устройством не нужны высокие скорости и большой объем данных, поэтому решил попробовать использовать E220-T22D для своего проекта. Для организации обмена данными нужно каждому модулю присвоить свой адрес и выбрать канал передачи данных.

В качестве микроконтроллера у меня используются платы blackpill с чипами STM32F411CEU6, у них довольно много памяти и ничего особо оптимизировать не пришлось. Прошивку я для них традиционно написал на Rust, но в этот раз в первый раз с использованием асинхронной библиотеки embassy. Оказалось, использовать кооперативную многозадачность вполне удобно без всякой RTOS. Некоторым неудобством является то, что в embassy свой собственный набор методов работы с задачами и примитивов синхронизации типа критических секций, мьютексов, сигналов и пр. Именно их нужно использовать и не смешивать со стандартными для Rust.

Главный цикл программы у меня занимается выводом информации на экран, в то время как прочие коммуникационные задачи запущены отдельными тасками:

    spawner.spawn(idle().unwrap()); // бесконечный цикл для предотвращения сна
    spawner.spawn(blinky(p.PC13).unwrap()); // мигание светодиодом
    spawner.spawn(process_easycom(usart2).unwrap()); // управление повороткой
    spawner.spawn(process_e220(usart1, m0, m1, aux, random_start, ptz_pwr, lna_pwr).unwrap()); // работа в эфире
    spawner.spawn(process_adc(adc, p.DMA2_CH0, p.PA0, p.PA1, manual).unwrap()); // потенциометры

Обмен данными между задачами реализовал через статическую переменную, содержащую контекст приложения. Она использует объекты синхронизации из embassy:

static APP_CONTEXT: Mutex<CriticalSectionRawMutex, RefCell<AppContext>> =
    Mutex::new(RefCell::new(AppContext {
        target_az: AzAngle(0.0),
        target_el: ElAngle(0.0),
        current_az: AzAngle(0.0),
        current_el: ElAngle(0.0),
        seq: 0,
        noise_m: 0,
        signal_m: 0,
        noise_s: 0,
        signal_s: 0,
        power_control: Relays::new(),
        az_pot: AzAngle(0.0),
        el_pot: ElAngle(0.0),
        manual: false,
    }));

Реализовать необходимую функциональность с использованием embassy не составило особого труда, однако подключение дисплеев вызвало некоторые сложности. На момент написания кода наиболее популярным rust-крейтом для работы с графикой был embedded-graphics, который не поддерживает работу в асинхронном режиме. А без этого теряется весь смысл применения embassy.

У меня в проекте нет никакой графики, только текстовый вывод. По этой причине пришлось написать свой простой асинхронный рендерер шрифта, который поддерживает работу дисплеев с SPI интерфейсом. Я не стал доводить его до уровня библиотеки и публиковать крейт, но если кто столкнется с необходимостью использования LCD в embassy, может найти для себя что-то полезное.

В итоге система управления поворотным устройством состоит из двух блоков. Первый, условно назову его Контроллером, позволяет:

  1. Работать в ручном или автоматическом режиме

  2. Вручную задавать углы поворота по азимуту и элевации

  3. Подключаться к компьютеру по USB и поддерживать протокол управления поворотным устройством EASYCOM

  4. Отображать на LCD экране режим работы и статус канала связи LoRa

  5. Дистанционно управлять 2 реле включения PTZ 3050DZ и малошумящего усилителя

Второй блок, назовем его Исполнителем, размещается около антенны и умеет:

  1. По команде включать PTZ 3050DZ и МШУ

  2. Получать от Контроллера заданные координаты поворота и осуществлять управление 3050DZ по протоколу PELCO-D

  3. Сообщать Контроллеру о текущих значениях углов и телеметрии канала связи

Как и Контроллер, Исполнитель снабжен OLED экраном для отображения своего состояния. Понятное дело, этот экран нужен только для отладки, но оказался очень полезным для настройки и решения проблем со связью.

Несколько слов про протокол обмена данными между Контроллером и Исполнителем.

Применяемый мной модуль EBYTE E220-T22D использует безлицензионный диапазон 868 МГц для передачи данных. По факту он просто организует UART между двумя модулями. Тут важно помнить о нескольких ограничениях работы в безлицензионном диапазоне в РФ, которые нужно учитывать при настройке и использовании модуля. Первое, нужно выбрать канал настройки модуля, чтоб он был разрешен частотным планом РФ. Второе, нужно учитывать действующие ограничения на выходную мощность модуля, которая подводится к антенне. Последнее, существуют ограничения на длительность передачи, в силу которых между передачей пакетов данных может потребоваться внесение временных задержек.

Последнее ограничение оказалось достаточно существенным, поскольку в практическом использовании делает систему несколько «тормозной». Так, при быстром пролете спутника задержка слежения может достигать 10 градусов в тяжелых случаях. Для используемой антенны с довольно широкой диаграммой направленности это не особо критично. Пока использую так, но тут есть еще поле для оптимизаций.

У EBYTE E220-T22D не так много сервисных настроек. Из важных возможностей стоит упомянуть наличие какого-то примитивного шифрования, а также функций мониторинга RSSI уровня сигнала и шума в канале связи. Коррекции ошибок нет. Мне показалось, что тут есть поле для улучшений. Во-первых, команды и ответы на них я в протоколе организовал в пакеты, сопровождаемые контрольной суммой для простой проверки целостности данных. Во-вторых, в каждом пакете передается серийный номер пакета, который каждый раз увеличивается на 1. При этом первый номер после включения питания Контроллера генерируется как случайное число. Это позволяет добиться того, что передаваемые в эфир пакеты данных практически никогда не повторяются, что повышает помехоустойчивость системы. В случае получения одного и того же пакета второй раз, Исполнитель его игнорирует. В целом управление работает устойчиво, так что результатом доволен.

Исходники прошивок для Контроллера и Исполнителя можно посмотреть на гитхабе здесь https://github.com/lesha108/rotorm и здесь https://github.com/lesha108/rotors

Несколько слов о том, как установлено и закреплено поворотное устройство.

Поскольку планируется установка антенны на крыше жилого дома, где нет подходящего крепления для поворотного устройства, была создана конструкция, которую можно видеть на картинке.

В качестве мачты используется переделанный усиленный осветительный штатив с лебедкой REXPO. Просто так устанавливать его на залитую битумом крышу не получится. Поэтому штатив был дополнен кровельными опорами Solid Foot. Они позволяют регулировать наклон и высоту опоры, что даёт возможность на неровной крыше выставить мачту строго вертикально. 3050DZ крепится к мачте через промежуточную опорную площадку из дюраля. Все соединения разборные, что позволяет быстро собрать антенну и поднять лебедкой на требуемую высоту.

Сама антенна сделана из алюминиевого профиля 20х20 мм. Вибраторы нарезаны из алюминиевой трубки диаметром 6 мм. В качестве противовеса используется свинцовый груз для дайвинга. Противовес немного приподнят над антенной, поскольку иначе при элевации 90 градусов противовес задевал за кабель управления. Крепление вибраторов к антенне – напечатанные на 3D принтере изоляторы «Радиогорка».

Поскольку у антенны RZ9CJ сопротивление 50 ом, то для объединения сигнала от двух антенн применяется вот такой сплиттер с али с низкими потерями. За счёт различной длины питающих антенны кабелей достигается требуемая для круговой поляризации разность фаз сигнала. Сплиттер достаточно увесистый и служит частью противовеса.

На мачте антенны так же установлен вот такой МШУ производства ВОКС РАДИО.

Питание на него подается по команде от Контроллера. Включение и отключение МШУ работает медленно для нормальной работы на одном диапазоне, но при работе со спутниками быстрого переключения не требуется, поскольку ретрансляторы большинства КА, передающих в диапазоне 70 см, принимают сигналы в диапазоне 2 м. МШУ, установленный вблизи антенны, улучшает прием и позволяет компенсировать потери в коаксиальном кабеле, идущем к трансиверу.

Спасибо всем за внимание, радиолюбителям 73!

Комментарии (8)


  1. qwe101
    30.06.2026 20:30

    Для удаления птиц рекомендую что-то непроводящее (крепкую леску) натянуть по верхним вибраторам, и от концов боковых к соответствующему верхнему вертикальному. Над жесткой "веточкой для сидения" натянуть тонкое, на чём сидеть не получится так, чтоб на "веточку" не поместиться. Кстати, на краю балкона то же: тросик, леска в 5-10 см над краем, стоечки через полметра-метр - и балкон не за...гажен. Не садятся.


  1. dmitrytheman
    30.06.2026 20:30

    Поскольку планируется установка антенны на крыше жилого дома, где нет подходящего крепления для поворотного устройства, была создана конструкция

    а как данная конструкция будет вести себя в ветренную погоду? как она фиксируется к крыше?


    1. lesha108 Автор
      30.06.2026 20:30

      На крыше для каждой опоры будут пригрузы по 10 кг, ярус растяжек шнуром danline и еще стальной трос для заземления и молниеотвода. Парусность конструкции небольшая, унести сильным ветром не должно.


  1. xkspy
    30.06.2026 20:30

    интересная реализация, спасибо что поделились идеей.
    ранее встречал, более подходящий проект на instructables, с реализацией поворотного механизма, может кому-то пригодится и что-то для себя так же подчеркнёт нужное.

    73!


  1. okhsunrog
    30.06.2026 20:30

    Спасибо за статью! Побольше бы статей про embedded rust на хабр. Можете посмотреть на мою библиотеку для асинхронного управления дисплеями, это форк библиотеку mipidsi: https://github.com/okhsunrog/lcd-async


    1. lesha108 Автор
      30.06.2026 20:30

      Спасибо, посмотрю


  1. NutsUnderline
    30.06.2026 20:30

    использовать радиоканал для управления радиоантенной... есть в этом что то. еще бы и сама антенна работала с lora mweshtastic/meshcore/etc. на 433 диапазоне было бы вообще феерично.


    1. lesha108 Автор
      30.06.2026 20:30

      Я специально выбрал 868 МГц канал чтоб не создавать помех приёму слабого сигнала со спутников