URC - Rotor Controller

Rotor controller

Key features of URC:

  • Interfaces directly to incremental encoders on popular slewdrives from Coresun etc.
  • Drives DC motors from 12 to 24VDC, PWM controlled from 0 to 100% speed.
  • Maximum combined motor current is 13ADC (10A for a single axis).
  • Acceleration, deacceleration, maximum speed, deadband and hysteresis configurable.
  • Capacitive touch, 4.3 inch color display.
  • Gets it time from NTP (Internet time) or manually set, maintained in battery backed clock for true "mobile or off grid" operations.
  • VNC support for remote operation.
  • Web server, handles settings, upload of new (html) files, live dataview, control tracking etc.
  • User can upload own webpages to the device and use the commands/status messages, see below.
  • Firmware updates can be fetched directly from internet (or uploaded via the web interface)
  • Numerous failsafe features, overcurrent, stuck encoders/blocked motors, hunting/oscillations.
  • Autonomous tracking of moon and sun (with high precision).
  • Settable Park position and three "one touch" preset positions.
  • Support for various protocols:
    • Yaesu GS-232A/B (via RS-232 port)
    • PstRotator
    • URC UDP
    • socket interfaces
    • Rotctld (interfaces to PstRotator)
  • Future support for various absolute encoders via RS-485 bus.
  • CAN Bus included for future expansion.
  • Supply voltage between 12 and 24VDC (fuse on back of box).


I designed my first revision of the URC Rotor controller back in 2022. The idea was to make a controller for my  own satellite system back then (which later became my 70cm EME system). Since 2025, the URC also controls my 4.8m dish for EME.


Since 2022, I have got a lot of requests from people asking if I would make the URC controller available for others. to purchase at some point. Initially, the URC was only meant to be an "internal project", the design was not really made for "production", the mechanics, housing and general design was not optimized for that.


I have now decided to make a "revision B" of the URC. This version has been optimized, easier to assemble, all connectors are on the PCB board etc. The actual design (electronics and software) are exactly the same as the "revision A" that have been running for 4 years, doing 10.000+ QSO's on both satellites and EME.


The URC has from the start, been designed with substantial processing power. The processor is a Cortex M7 (i.MXRT1064 from NXP) running at 600 MHz. On the board is 32 MByte SDRAM, 512 Byte FRAM (for storage of current incremental encoder positions), 128 MByte NAND Flash (disk system), a USB service port interface, SMPS for 3.3V and 12V (for encoders, CAN/RS485/RS23 devices etc), 10/100 MBit Ethernet, RS232 port (for connection to PC ,tracking programs), 2 x incremental encoder interfaces, RS485 port (for connection to f.ex absolute encoders etc), CAN Bus interface and a 4.3 inch capacitive touch TFT display (480 x 272 pixels).


The motor drivers can deliver close to 13 amp (the actual devices used on the board are rated to 50 Amp). They will deliver 24 VDC to the Az/El motors (PWM controlled individually for speed ramping etc).


The URC controller contains a webserver and a VNC server (for remote control), more info/video below.


URC interfaces directly with the popular slewdrives from (among others) Coresun in China, feedback comes directly from the Hall effect sensors in the slewdrives, so no extra position sensors are needed in that case.


PLEASE NOTICE that the following pictures and descriptions will change over the coming weeks as small tweaks and additions are being made to the URC!


Demo of a SVH3 Az/El slewdrive being driven by a 12V battery for true mobile operation. SVH3 nominal voltage is 24VDC but runs perfectly fine (although slower) at 12V:

Changing settings via web browser:

Menu system of URC

There is a number of parameters that can be configured on the URC. Below are screenshots of the various screens. The values shown are those that I use on my 4.8m EME dish, this is controlled by a SVH7 slewdrive from Coresun.

Remote control using VNC

You can remote control the URC via a normal VNC client

Web server

The URC features an integrated web server for convenient monitoring and operational control through a standard web browser. Access the webpage to initiate sun/moon tracking, position the dish, adjust to specific azimuth and/or elevation angles, and view motor current graphs. By providing your antenna's band and HPBW (-3 dB beamwidth), the calculated sky noise levels (in °K) for both the antenna's direction and the new target direction will be displayed.

Using the upload feature of the file manager webpage, the user can upload own webpages adding personal features to the system.


You have the capability to modify all controller settings and manage setting configurations by uploading and saving files directly through the web interface.

Mobile application

During the construction of my 4.8M EME dish, I felt the need for some way of remote controlling the rotor controller. I made a small .NET MAUI application for mobile phones (cross platform). This (very) small application lets you control the dish when I stand next to it and the URC controller is located in my shack. Very handy. The mobile application ("RURC") lets me enter target azimuth and/or elevation, park or activate Sun or Moon tracking etc.

The application also shows a graph of the current (in mA) for each axis when moving.

Back of URC

The back of the URC has a number of connectors, please notice that all the "12V" connections shares a common resettable (automatic) fuse of 400mA. Do NOT draw more than 400mA combined on these outputs!


  • DC INPUT: This is the main power for the device, it uses 15 to 24VDC (will also run at 12V just fine). Max current 13Amp.
  • FUSE: This is the main fuse for the DC input, use a fuse of maximum 13A (T).
  • MOTORS: This connects to the two brushed DC motors (Az/El). Max current is 10A for a motor, maximum 13A total (set by the fuse).
  • ENCODERS: This is the incremental encoder inputs (directly from the slewdrive).
  • RS485: This is the RS485 communication bus, this is used to interface to absolute encoders etc.
  • RS232: A serial port, this can interface to legacy tracking programs that for example use Yaesu GS-232A/B protocols.
  • CAN: Connection to CAN Bus, this is for future expansion and features.
  • USB port: This is a "service connector" and is not for use by users.
  • 10/100 MBit: This is connection to Ethernet/network, supports 10/100 MBit, DHCP or static IP address.

Internal pictures

Mechanical

Below are a few pictures of the "revision A" of the URC, more pictures will follow once "revision B" is ready.

Two complete controllers of "revision A". One is in use in my 70cm EME system and the other in my 4.8m dish for EME.


2022-08-26 18.31.40
2022-08-26 16.52.26
2022-08-26 18.34.40
2022-08-26 18.31.45
2022-08-26 16.50.57
2022-08-26 16.51.01
2022-08-26 17.27.00
2022-08-26 17.27.05
2022-08-26 17.27.08
2022-08-26 16.51.07

A short (older) video of the current state of the controller. In the video, the controller is running with simulated motors/encoders

URC driving a SVH7 Slewdrive for my 4.8 meter dish for EME

Communication with URC

This section will be updated soon

Dynamic data via HTTP GET command

Using a HTTP GET command, it is possible to get dynamic data from the UTC controller. This is the method the main page (index.html) of URC uses. It requests the data from the URC 30 times each second.


Data will be returned if you do a HTTP GET:

http://urc1234.local/dynamic.json


The format of the data are shown below:


{
  "NAME": "URC 4.8m Dish",
  "UPTIME": 2824,
  "TIME": "2026-08-05 11:56:27",
  "MODE": 0,
  "AZ": 2.01,
  "EL": 3.01,
  "NEWAZ": 2.01,
  "NEWEL": 3.01,
  "ERRAZ": 0,
  "ERREL": 0,
  "SPEEDAZ": 0,
  "SPEEDEL": 0,
  "LOADAZ": 0,
  "LOADEL": 0,
  "ETAAZ": -1,
  "ETAEL": -1,
  "SUNAZ": 190.97,
  "SUNEL": 50.72,
  "SUNNEXTEVENT": 26191,
  "SUNMAXEL": 50.84,
  "SUNTRANSIT": 84650,
  "MOONAZ": 297.41,
  "MOONEL": 2.31,
  "MOONNEXTEVENT": 1208,
  "MOONMAXEL": 54.95,
  "MOONTRANSIT": 62055,

  "WDTWARNAZ":0,

  "WDTWARNEL":0,

}


The individual fields:

  • NAME: This is a symbolic name of the URC, can be set in settings.
  • UPTIME: Number of seconds since URC was powered on/reset
  • TIME: The current UTC time
  • MODE: The current mode the URC is in:
    • 0=stopped
    • 1=Park (moving towards park)
    • 2=Sun (tracking the sun)
    • 3=Moon (tracking the moon)
    • 4=Remote control (using the protocol set in settings)
    • 5=Manual (currently moved using buttons on manual window)
    • 6=Preset 1 (moving towards preset position)
    • 7=Preset 2 (moving towards preset position)
    • 8=Preset 3 (moving towards preset position)
  • AZ/EL: current position in degrees
  • NEWAZ/NEWEL: New target position in degrees
  • ERRAZ/ERREL: Number of degrees difference between target and current position
  • SPEEDAZ/SPEEDEL: Current PWM motor speed in % (0..100) 
  • LOADAZ/LOADEL: Current motor current in mA
  • ETAAZ/ETAEL: Number of seconds before the new target position has been reached (-1 if not moving)
  • SUNAZ/SUNEL: Current azimuth/elevation of sun
  • SUNNEXTEVENT: number of seconds until sun either sets or rises (if SUNEL>0, next event will be set)
  • SUNMAXEL: Maximum elevation of sun (will be at AZ 180 or AZ 0)
  • SUNTRANSIT: Number of seconds before sun is at maximum elevation
  • MOONAZ/MOONEL: Current azimuth/elevation of moon
  • MOONNEXTEVENT: number of seconds until moon either sets or rises (if MOONEL>0, next event will be set)
  • MOONMAXEL: Maximum elevation of moon (will be at AZ 180 or AZ 0)
  • MOONTRANSIT: Number of seconds before moon is at maximum elevation
  • WDTWARNAZ/WDTWARNEL: is an early warning that the watchdog for position change for axis is about to fire


URC Socket protocol

I have developed a number of PC applications (SkyScanner, SatTrack etc.) and these supports communication with my URC controller using either UDP or TCP/IP Socket communications. 


When using the socket protocol, the URC acts as a "server". It creates and accepts (multiple) connections to a socket it creates (port number can be defined in settings). As default, URC will listen on port 1111, but you can freely configure that.


All messages are formatted as JSON text. Every time you send URC a request, it will reply back with its status message.


Status message:


{

  "TICK":143,

  "UPTIME":53,

  "CPULOAD":15.4,

  "VERSION":1.08,

  "MODE":0,

  "AZ":160.02,

  "EL":89.98,

  "NEWAZ":160.02,

  "NEWEL":89.98,

  "SPEEDAZ":0,

  "SPEEDEL":0,

  "LOADAZ":0,

  "LOADEL":0,

  "ETAAZ":-1,

  "ETAEL":-1,

  "SUNAZ":158.82,

  "SUNEL":53.83,

  "MOONAZ":109.48,

  "MOONEL":14.71

}


The individual fields:

  • TICK: is just a incrementing sequence number
  • UPTIME: is the time the rotor controller (in sec) has been running
  • CPULOAD: is the current CPU load in %
  • VERSION: is the firmware version
  • MODE: is the current mode of the URC:
    • 0=stopped
    • 1=Park (moving towards park)
    • 2=Sun (tracking the sun)
    • 3=Moon (tracking the moon)
    • 4=Remote control (using the protocol set in settings)
    • 5=Manual (currently moved using buttons on manual window)
    • 6=Preset 1 (moving towards preset position)
    • 7=Preset 2 (moving towards preset position)
    • 8=Preset 3 (moving towards preset position)
  • AZ/EL: is the current position of the antenna
  • NEWAZ/NEWEL: is the target position
  • SPEEDAZ/SPEEDEL: is the speed in % of the motor (0..100)
  • LOADAZ/LOADEL: is the motor current for the motor in mA (negative value is CCW, positive is CW)
  • ETAAZ/ETAEL: is the number of seconds before motor has reached its new destination
  • SUNAZ/SUNEL: is the current position of the sun
  • MOONAZ/MOONEL: is the current position of the moon



Commands the URC can receive:

The status message above is sent back from URC on every command it receives.


{"POLL"}

POLL is just a request for current information (typically Az/El position is needed)


{"GOTO":[35.42,10.52]}

GOTO will send a new Az/El position to the URC. If the URC is in "REM" mode, the antenna will move to this position.


{"MANAZ":[160.42]}

This will move the azimuth to the defined position


{"MANEL":[12.54]}

This will move the elevation to the defined position


{"STOP":[]}

Stop all movement


{"PARK":[]}

Activate the park function (same as pressing "PARK" on the "Track" window


{"SUN":[]}

Activate tracking of sun (same as pressing "SUN" on the "Track" window


{"MOON":[]}

Activate tracking of moon (same as pressing "MOON" on the "Track" window


{"PRESET1":[]}, {"PRESET2":[]}, {"PRESET3":[]}

Move to Preset 1/2/3 position (same as pressing "Preset1/2/3" on the "Presets" window


{"UPDATE"}

Same as pressing "update from internet" in System window. Will fetch new firmware from internet (from moonbounce.dk)



UDP broadcast message from URC

The URC broadcasts status messages (as JSON) 10 times per second on UDP port 30201 to the local network.


The format is as follows:


 {

   "uptimeURC":21,
   "serial":1044955607,
   "az":155.09,
   "el":80.08,
   "azLoad":0,
   "elLoad":0,
   "azPWM":0,
   "elPWM":0
 }


The individual fields:

  • uptimeURC: is the number of seconds since URC was powered on
  • serial: is the serial number of the URC
  • az/el: is the current position
  • azLoad/elLoad: is the motor current in mA
  • azPWM/elPWM: is the PWM commanded speed (0..100%) for motor

Third-party open source software used in URC

The URC uses a number of open source products in its firmware, details are here: