Поворотное устройство для 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 сделает всё остальное автоматически.
Результаты
Если всё настроено успешно, то поворотное устройство будет направлять антенну на спутник, когда тот окажется в зоне видимости. Вот пример работы моей конфигурации: