Dear all!
I’m working on station 3702, I hope to bring it online very soon.
The Setup
My setup is:
- Raspberry Pi running latest SatNOGS image
- Pluto SDR + Arrow II 14 element 2m/70cm Yagi
- Yaesu G5500 rotator
- RTC-200 (GS232B compatible) rotator controller
Currently I’m focused on getting the rotator to fully work. So far I’ve managed to configure everything via satnogs-setup
, here is my config:
satnogs-client config
“hamlib_utils_rig_opts”: “-T 0.0.0.0 -m 1”,
“hamlib_utils_rot_enabled”: true,
“hamlib_utils_rot_opts”: “-m 603 -r /dev/ttyUSB0 -s 9600 -T 0.0.0.0 -t 4533 --set-conf=max_el=180 -vvvv”,
“satnogs_antenna”: “A_BALANCED”,
“satnogs_log_level”: “DEBUG”,
“satnogs_rf_gain”: “50”,
“satnogs_rig_ip”: “0.0.0.0”,
“satnogs_rot_baud”: “9600”,
“satnogs_rot_enabled”: true,
“satnogs_rot_model”: “ROT_MODEL_NETROTCTL”,
“satnogs_rot_port”: “127.0.0.1:4533”,
“satnogs_rot_threshold”: “4”,
“satnogs_rx_samp_rate”: “2e6”,
“satnogs_scheduler_log_level”: “DEBUG”,
“satnogs_soapy_rx_device”: “driver=plutosdr”,
“satnogs_station_elev”: “120”,
“satnogs_station_id”: “3702”,
I’ve configured rotctld
service to run in background and satnogs-client
to connect to it via localhost. This allows me to specify more settings for rotctl, like the supported azimuth range.
The problem
When I connect to rotctl
(by using telnet localhost 4533
), I can send the commands and the rotator responds to the commands. Here is an example log from rotctld.service
:
rotctld.service + telnet connection
Aug 16 22:44:00 vega rotctld[20292]: Connection opened from 192.168.1.95:39466 // telnet connects
Aug 16 22:44:03 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:03 vega rotctld[20292]: serial_flush called
Aug 16 22:44:03 vega rotctld[20292]: tcflush
Aug 16 22:44:03 vega rotctld[20292]: write_block called
Aug 16 22:44:03 vega rotctld[20292]: rot_get_position: got az=184.00, el=90.00 // p command
Aug 16 22:44:14 vega rotctld[20292]: rot_set_position called az=180.00 el=180.00 // P 180 180
Aug 16 22:44:14 vega rotctld[20292]: rot_set_position: south_zero=0
Aug 16 22:44:14 vega rotctld[20292]: serial_flush called
Aug 16 22:44:14 vega rotctld[20292]: tcflush
Aug 16 22:44:14 vega rotctld[20292]: write_block called
Aug 16 22:44:14 vega rotctld[20292]: write_block called
Aug 16 22:44:18 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:18 vega rotctld[20292]: serial_flush called
Aug 16 22:44:18 vega rotctld[20292]: tcflush
Aug 16 22:44:18 vega rotctld[20292]: write_block called
Aug 16 22:44:18 vega rotctld[20292]: rot_get_position: got az=180.00, el=99.00 // Rotator responds to the command and starts moving
Aug 16 22:44:19 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:19 vega rotctld[20292]: serial_flush called
Aug 16 22:44:19 vega rotctld[20292]: tcflush
Aug 16 22:44:19 vega rotctld[20292]: write_block called
Aug 16 22:44:19 vega rotctld[20292]: rot_get_position: got az=183.00, el=103.00 // I spam the p command couple of times to show progress…
Aug 16 22:44:20 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:20 vega rotctld[20292]: serial_flush called
Aug 16 22:44:20 vega rotctld[20292]: tcflush
Aug 16 22:44:20 vega rotctld[20292]: write_block called
Aug 16 22:44:20 vega rotctld[20292]: rot_get_position: got az=180.00, el=105.00
Aug 16 22:44:21 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:21 vega rotctld[20292]: serial_flush called
Aug 16 22:44:21 vega rotctld[20292]: tcflush
Aug 16 22:44:21 vega rotctld[20292]: write_block called
Aug 16 22:44:21 vega rotctld[20292]: rot_get_position: got az=183.00, el=109.00
Aug 16 22:44:22 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:22 vega rotctld[20292]: serial_flush called
Aug 16 22:44:22 vega rotctld[20292]: tcflush
Aug 16 22:44:22 vega rotctld[20292]: write_block called
Aug 16 22:44:22 vega rotctld[20292]: rot_get_position: got az=183.00, el=112.00
Aug 16 22:44:23 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:23 vega rotctld[20292]: serial_flush called
Aug 16 22:44:23 vega rotctld[20292]: tcflush
Aug 16 22:44:23 vega rotctld[20292]: write_block called
Aug 16 22:44:23 vega rotctld[20292]: rot_get_position: got az=183.00, el=115.00
Aug 16 22:44:25 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:25 vega rotctld[20292]: serial_flush called
Aug 16 22:44:25 vega rotctld[20292]: tcflush
Aug 16 22:44:25 vega rotctld[20292]: write_block called
Aug 16 22:44:25 vega rotctld[20292]: rot_get_position: got az=183.00, el=119.00
Aug 16 22:44:26 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:26 vega rotctld[20292]: serial_flush called
Aug 16 22:44:26 vega rotctld[20292]: tcflush
Aug 16 22:44:26 vega rotctld[20292]: write_block called
Aug 16 22:44:26 vega rotctld[20292]: rot_get_position: got az=183.00, el=122.00
Aug 16 22:44:27 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:27 vega rotctld[20292]: serial_flush called
Aug 16 22:44:27 vega rotctld[20292]: tcflush
Aug 16 22:44:27 vega rotctld[20292]: write_block called
Aug 16 22:44:27 vega rotctld[20292]: rot_get_position: got az=183.00, el=126.00
Aug 16 22:44:42 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:42 vega rotctld[20292]: serial_flush called
Aug 16 22:44:42 vega rotctld[20292]: tcflush
Aug 16 22:44:42 vega rotctld[20292]: write_block called
Aug 16 22:44:42 vega rotctld[20292]: rot_get_position: got az=180.00, el=168.00
Aug 16 22:44:43 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:43 vega rotctld[20292]: serial_flush called
Aug 16 22:44:43 vega rotctld[20292]: tcflush
Aug 16 22:44:43 vega rotctld[20292]: write_block called
Aug 16 22:44:43 vega rotctld[20292]: rot_get_position: got az=183.00, el=171.00
Aug 16 22:44:44 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:44 vega rotctld[20292]: serial_flush called
Aug 16 22:44:44 vega rotctld[20292]: tcflush
Aug 16 22:44:44 vega rotctld[20292]: write_block called
Aug 16 22:44:44 vega rotctld[20292]: rot_get_position: got az=180.00, el=173.00
Aug 16 22:44:45 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:45 vega rotctld[20292]: serial_flush called
Aug 16 22:44:45 vega rotctld[20292]: tcflush
Aug 16 22:44:45 vega rotctld[20292]: write_block called
Aug 16 22:44:45 vega rotctld[20292]: rot_get_position: got az=183.00, el=178.00
Aug 16 22:44:46 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:46 vega rotctld[20292]: serial_flush called
Aug 16 22:44:46 vega rotctld[20292]: tcflush
Aug 16 22:44:46 vega rotctld[20292]: write_block called
Aug 16 22:44:46 vega rotctld[20292]: rot_get_position: got az=181.00, el=179.00
Aug 16 22:44:47 vega rotctld[20292]: rot_get_position called
Aug 16 22:44:47 vega rotctld[20292]: serial_flush called
Aug 16 22:44:47 vega rotctld[20292]: tcflush
Aug 16 22:44:47 vega rotctld[20292]: write_block called
Aug 16 22:44:47 vega rotctld[20292]: rot_get_position: got az=181.00, el=179.00 // Movement finished
Aug 16 22:46:38 vega rotctld[20292]: Connection closed from 192.168.1.95:39466 // q - telnet exits
Meanwhile when satnogs-client
connects during a scheduled pass, I can see that the commands are sent, but the rotor does not respond. Here is an example log from rotctld.service
:
rotctld.service + satnogs-client connection
Aug 16 23:00:48 vega rotctld[20292]: Connection opened from localhost:36618 // satnogs-client
connects
Aug 16 23:00:48 vega rotctld[20292]: rot_get_position called
Aug 16 23:00:48 vega rotctld[20292]: serial_flush called
Aug 16 23:00:48 vega rotctld[20292]: tcflush
Aug 16 23:00:48 vega rotctld[20292]: write_block called
Aug 16 23:00:48 vega rotctld[20292]: rot_get_position: got az=183.00, el=180.00 // get position
Aug 16 23:00:48 vega rotctld[20292]: rot_set_position called az=178.42 el=0.44 // set position
Aug 16 23:00:48 vega rotctld[20292]: rot_set_position: south_zero=0
Aug 16 23:00:48 vega rotctld[20292]: serial_flush called
Aug 16 23:00:48 vega rotctld[20292]: tcflush
Aug 16 23:00:48 vega rotctld[20292]: write_block called
Aug 16 23:00:48 vega rotctld[20292]: write_block called
Aug 16 23:00:51 vega rotctld[20292]: rot_get_position called
Aug 16 23:00:51 vega rotctld[20292]: serial_flush called
Aug 16 23:00:51 vega rotctld[20292]: tcflush
Aug 16 23:00:51 vega rotctld[20292]: write_block called
Aug 16 23:00:51 vega rotctld[20292]: rot_get_position: got az=183.00, el=179.00 // no movement
Aug 16 23:00:51 vega rotctld[20292]: rot_set_position called az=178.53 el=0.61 // set position
Aug 16 23:00:51 vega rotctld[20292]: rot_set_position: south_zero=0
Aug 16 23:00:51 vega rotctld[20292]: serial_flush called
Aug 16 23:00:51 vega rotctld[20292]: tcflush
Aug 16 23:00:51 vega rotctld[20292]: write_block called
Aug 16 23:00:51 vega rotctld[20292]: write_block called
Aug 16 23:00:54 vega rotctld[20292]: rot_get_position called
Aug 16 23:00:54 vega rotctld[20292]: serial_flush called
Aug 16 23:00:54 vega rotctld[20292]: tcflush
Aug 16 23:00:54 vega rotctld[20292]: write_block called
Aug 16 23:00:54 vega rotctld[20292]: rot_get_position: got az=182.00, el=179.00 // no movement
Aug 16 23:00:54 vega rotctld[20292]: rot_set_position called az=178.64 el=0.79
Aug 16 23:00:54 vega rotctld[20292]: rot_set_position: south_zero=0
Aug 16 23:00:54 vega rotctld[20292]: serial_flush called
Aug 16 23:00:54 vega rotctld[20292]: tcflush
Aug 16 23:00:54 vega rotctld[20292]: write_block called
Aug 16 23:00:54 vega rotctld[20292]: write_block called
Aug 16 23:00:57 vega rotctld[20292]: rot_get_position called
Aug 16 23:00:57 vega rotctld[20292]: serial_flush called
Aug 16 23:00:57 vega rotctld[20292]: tcflush
Aug 16 23:00:57 vega rotctld[20292]: write_block called
Aug 16 23:00:57 vega rotctld[20292]: rot_get_position: got az=183.00, el=180.00 // no movement
Aug 16 23:00:57 vega rotctld[20292]: rot_set_position called az=178.75 el=0.98
Aug 16 23:00:57 vega rotctld[20292]: rot_set_position: south_zero=0
Aug 16 23:00:57 vega rotctld[20292]: serial_flush called
Aug 16 23:00:57 vega rotctld[20292]: tcflush
Aug 16 23:00:57 vega rotctld[20292]: write_block called
Aug 16 23:00:57 vega rotctld[20292]: write_block called
Aug 16 23:01:00 vega rotctld[20292]: rot_get_position called
Aug 16 23:01:00 vega rotctld[20292]: serial_flush called
Aug 16 23:01:00 vega rotctld[20292]: tcflush
Aug 16 23:01:00 vega rotctld[20292]: write_block called
etc.
From what I can tell, when sending the commands by hand (I send one, and wait for the audible response of the rotator) it works fine. On the other hand satnogs-client
seems to set the position every second or so. This makes me think that it might somehow “break” my controller.
I’m trying to pin down at which level of the SatNOGS stack the issue is. Some questions:
- Is there a difference between how
telnet
andsatnogs-client
connects to therotctl
daemon, which could brake it? - Is my RTC-200 somehow overwhelmed, and the quicker pace of commands sent by
satnogs-client
breaks it? Is there a way to further debug the connection betweenrotctl
and the device? - Are there any config changes I could make, or additional logs I could provide to help debug it?
I feel like this issue goes beyond the scope of SatNOGS itself, but resources about the RTC-200 device and Hamlib/rotctl seem sparse. Perhaps some experts here could point me in the right direction and help troubleshoot this issue.