Поворотное устройство для r2cloud

Введение

Последние несколько недель я активно работал над поддержкой поворотных устройств в r2cloud. Тут стоит немного рассказать зачем вообще нужны поворотные устройства и направленные антенны.

Если совсем грубо, то существует несколько основных классов антенн: всенаправленные, направленные и фазовые решётки. Мой проект до недавнего времени поддерживал только всенаправленные антенны.

Причина достаточно проста: они просты в настройке и установке. При этом здесь нет движущихся частей и такие антенны могут работать сразу в нескольких диапазонах.

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

У таких антенн коэффициент усиления сигнала может быть до 20 dBi. Недостаток у них очевидный: их нужно направлять на спутник. Это не так-то просто сделать, если учесть, что спутник движется достаточно быстро и в разное время бывает в разных участках неба.

И тут на помощь приходит поворотное устройство. Специальный софт рассчитывает положение спутника относительно антенны и направляет антенну точно на спутник. Это позволяет принимать достаточно слабые сигналы.

Поворотное устройство

В центре всей системы стоит, конечно же, поворотное устройство. Некоторые покупают готовые, некоторые строят своё. Например, проект SATNOGS предоставляет модели для самостоятельной сборки. Главное отличие от готовых - стоимость. Готовые поворотные устройства начинаются от 600$. Если же распечатывать на 3D-принтере и делать самому, то материалы будут стоить около 200$. Я же решил попробовать другой, не менее популярный способ - использовать поворотное устройство от телескопа.

Многие современные телескопы идут в комплекте с треногами и поворотными устройствами. Эти устройства ничем не уступают классическим коммерческим. Мне же хотелось получить две вещи:

  • Мобильность. Я не могу установить антенну на крыше многоэтажного дома. На балконе тоже не вариант, так как качество приёма будет значительно хуже.
  • Простота в настройке. Мне хочется сфокусироваться на разработке софта, а не пытаться решить проблему питания на транзисторах. Для этого нужно просто купить гарантированно работающие компоненты.

После нескольких недель выбора модели и подборки компонент, я остановился на Skywatcher Allview.

Эта модель может управлять антенной в двух плоскостях: азимут и высота. Также в комплекте идёт пульт (SynScan), к которому можно подключить компьютер и с его помощью программно управлять моторами.

У этого пульта есть 3 разъёма:

  • RJ-45
  • RJ-11
  • USB Type-B

По RJ-45 пульт подключается к поворотному устройству, а по RJ-11 или USB к компьютеру. Тут есть интересная особенность. Оба порта работает как serial устройство. При этом кабеля-переходника с RJ-11 на RS-232 в комплекте не было. И чтобы его сделать, необходимо правильно распаять контакты на RJ-11. Я думал это просто и купил более дешёвый кабель, но он не подошёл. Устройство определяется, но при попытке отправить туда данные, ответа нет.

Уже почти отчаявшись, я решил попробовать кабель USB Type-B на USB Type-A и у меня получилось.

Настройка SynScan

В Linux устройство опознаётся как ttyUSB0. Это всё из-за того, что внутри есть специальный чип, который преобразует USB протокол в serial устройство.

Для того чтобы проверить, правильно ли всё работает, можно использовать простую утилиту tio:

tio -e -b 9600 /dev/tty.usbserial-1410

SynScan поддерживает несколько команд, все они - простые буквенные коды в ASCII. Например, для того чтобы проверить версию прошивки, нужно ввести “V”:

В данном примере версия 04270A.

Если всё работает как нужно, то можно переходить к настройке rotctrld. Это специальный демон, который принимает команды по TCP и управляет через serial порт устройством.

Настройка rotctrld

Демон rotctrld поставляется вместе с библиотекой hamlib. Эта библиотека предоставляет единый интерфейс для различных поворотных устройств и радиостанций. В стандартном пакете она ещё содержит набор CLI утилит для управления устройствами. Устанавливаются они стандартным образом:

sudo apt install libhamlib-utils

Список поддерживаемых устройств можно получить следующей командой:

rotctld --list

SkyWatcher в списке не оказалось, но я почитал протокол, и он оказался очень похож на Celestron. Команда для запуска выглядит следующим образом:

rotctld --model=1401 --port=4533 --listen-addr=127.0.0.1 --rot-file=/dev/ttyUSB0

В MacOS это тоже работает. Для этого достаточно поставить hamlib через homebrew и запустить так:

/usr/local/Cellar/hamlib/3.3/bin/rotctld --model=1401 --port=4533 --listen-addr=127.0.0.1 --rot-file=/dev/tty.usbserial-1410

rotctld откроет TCP порт, который будет принимать команды в текстовом виде. Единственное, чего не хватает - это автоматического старта/рестарта. По умолчанию демон стартует в foreground mode. Я написал небольшой конфиг для systemd, чтобы решить эту проблему:

[Unit]
Description=rotctrld Service

[Service]
WorkingDirectory=/home/pi/r2cloud/
ExecStart=rotctld --model=1401 --port=4533 --listen-addr=127.0.0.1 --rot-file=/dev/ttyUSB0
Restart=always
User=pi
Group=pi

[Install]
WantedBy=multi-user.target

Теперь демон будет стартовать при запуске системы и в случае крэша рестартовать. Для того чтобы общаться с ним из Java, Я написал небольшой клиент-обёртку - rotctrldClient. Не очень благозвучное название, зато делает свою работу хорошо:

Именно эта библиотека находится в сердце r2cloud для управления поворотными устройствами.

Настройка r2cloud

r2cloud может контролировать поворотное устройство во время пролёта спутника. Для этого нужно в общих настройках включить и задать параметры подключения к rotctrld:

В данном случае, r2cloud будет рассчитывать азимут и высоту спутника над горизонтом каждые 1000мс. Если спутник вышел за границы предыдущей зоны на ±5 градусов, то антенна корректируется. И это всё. r2cloud сделает всё остальное автоматически.

Результаты

Если всё настроено успешно, то поворотное устройство будет направлять антенну на спутник, когда тот окажется в зоне видимости. Вот пример работы моей конфигурации: