MULTI-AXIS MOTION CONTROLLER

The OMNI3 controller

The OMNI3 is a high-level motion engine and command interpreter. It runs asynchronous, synchronous, and continuous motion together in a non-blocking scheme. A direct, dual-channel VNA trigger system is built in. Engineered from the ground up for antenna positioning.

As uncomplicated as it should be

As an evolution of the current controller, the OMNI3 motion controller adds significant functionality while keeping antenna measurement automation programming straightforward. There is no SDK, API, or PC-OS-Python latency involved. Sending high-level ASCII commands, and the controller will manage the execution:

Python:             ser.write(b'X45.50 Y30.80\n')
MATLAB R2019b+:     writeline(s, "X45.50 Y30.80")
C#:                 port.WriteLine("X45.50 Y30.80")

So, axes can run alone, together, or be coordinated to start and land in sync. They can roll continuously for circular polarization while others reposition. Mix as needed; the controller deterministically handles timing for measurement accuracy.

Non-blocking architecture

The motion engine’s frontend takes the ASCII commands, converts them, schedules, and manages reporting. The backend handles all motion channels, and VNA triggers concurrently, responds to frontend requests, and starts the next action when a channel finishes.
Nothing in the architectural structure blocks motion, flexibility, or concurrency.
The ASCII command set is as compact yet readable as it can be: Easy to read and type, with nothing to decode. The interface uses Serial-over-USB, so it works with Python, LabVIEW, C#, MATLAB, or a plain terminal; any of these can drive the controller.

A move is X90.00. A 2-axis coordinated move is X45.50 Y30.80, a three-axis coordinated move is X10.20 Y34.21 Z.90.00.

As the controller manages all timing-sensitive and complex tasks, the application code is similarly less complicated — with no threads to coordinate motion with measurement and no need to handle operating-system scheduling. Simply send the motion command; the engine handles the rest.

Built-in direct VNA trigger

The built-in VNA trigger is 100% hardware-based, so PC scheduling, Python timing, and USB latency never affect the measurement. The function is enabled with a single high-level command, giving full control over the trigger conditions, and the trigger range can be set wider or narrower than the sweep range.

$VNA_trigger1 X 1.0 -90 90 (VNA1: every 1° across the sweep)

OMNI3 has two independent trigger channels; you can fire on one or two axes, enabling spiral patterns and other advanced schemes, such as a mix of azimuth and roll (polarization), in which one channel follows one axis and the second follows the other. Arming a trigger looks like this:

$VNA_trigger1 X 1.0 -90 90 (VNA1: every 1° across azimuth changes)
$VNA_trigger2 Y 1.0 -90 90 (VNA2: every 1° across elevation changes)

The firmware also supports pre-trigger offsets to fire ‘early’ and center the measurement. “Early” always means “early,” regardless of axis direction; both trigger functions are direction-aware.

The VNA trigger is precise and reliable, with no drift or hiccups. It is an inherent part of the OMNI architecture.

UNO Positioners

MmWaveTest

UNO6 spherical antenna positioner

DUO Positioners

MmWaveTest

DUO positioners from mmWaveTest